搭建本地 Git 服务器

基于 WSL2 后端 docker 搭建 GitLab、Gitea

Posted by Jerry Chen on April 28, 2021

搭建 GitLab 社区版

以下两种方式的环境均为 Docker Desktop(WSL2 后端);

docker run 方式安装

  1. 建立用于容器挂载的目录;

    也可不主动创建,运行第 2 步的 docker run 会自动创建这些目录;

    1
    2
    3
    4
    
    mkdir ~/gitlab
    mkdir ~/gitlab/config
    mkdir ~/gitlab/data
    mkdir ~/gitlab/logs
    
  2. 执行 docker run

    443 是 https 端口,80 是 http 端口,22 是 ssh 端口;

    因为 WSL2 后端容器的机制原因,运行时需要加入 --privileged=true 参数提权(即容器中的 root 有主机 root 权限);

    external_url 填写外部访问的 IP 和端口;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    docker run --detach \
        --hostname gitlab.example.com \
        --env GITLAB_OMNIBUS_CONFIG="external_url 'http://127.0.0.1:80'; gitlab_rails['lfs_enabled'] = true;" \
        --publish 443:443 --publish 80:80 --publish 22:22 \
        --name gitlab \
        --restart always \
        --privileged=true \
        --volume $HOME/gitlab/config:/etc/gitlab \
        --volume $HOME/gitlab/logs:/var/log/gitlab \
        --volume $HOME/gitlab/data:/var/opt/gitlab \
        gitlab/gitlab-ce:latest
    
  3. 等待 2~5 分钟,然后访问 http://127.0.0.1:80,默认用户是 root;

docker-compose 方式安装

参考这篇文章:https://blog.csdn.net/crper/article/details/81291034

  1. 建立用于容器挂载的目录;

    也可不主动创建,运行第 3 步的 docker-compose up 会自动创建这些目录;

    1
    2
    3
    4
    
    mkdir ~/gitlab
    mkdir ~/gitlab/config
    mkdir ~/gitlab/data
    mkdir ~/gitlab/logs
    
  2. 编写 docker-compose.yml

    443 是 https 端口,80 是 http 端口,22 是 ssh 端口;

    因为 WSL2 后端容器的机制原因,配置文件中需要加入 privileged: true 参数提权(即容器中的 root 有主机 root 权限);

    external_url 填写外部访问的 IP 和端口;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    version: '3.6'
    services:
      gitlab:
        container_name: gitlab
        image: gitlab/gitlab-ce:latest
        restart: always
        privileged: true
        environment:
          GITLAB_OMNIBUS_CONFIG: |
                external_url 'http://127.0.0.1:80'
                gitlab_rails['lfs_enabled'] = true
        ports:
          - "80:80"
          - "443:443"
          - "22:22"
        volumes:
          - "$HOME/gitlab/config:/etc/gitlab"
          - "$HOME/gitlab/logs:/var/log/gitlab"
          - "$HOME/gitlab/data:/var/opt/gitlab"
    
  3. 在 docker-compose.yml 同级目录启动 docker-compose

    1
    
    docker-compose up -d
    
  4. 等待 2~5 分钟,然后访问 http://127.0.0.1:80,默认用户是 root;

GitLab 的简单使用

概览

初次登入 GitLab 需要设置一个密码,然后可使用 root + 设置好的密码进行登录;

设置中文的方式:右上角头像 –> “Preferences(偏好)” –> 最下方的 “Localization(本地化)” –> “Language” 修改为 “Chinese, Simplified - 简体中文” –> 点击 “Save changes” 进行保存;

需要注意的是,你需要在 web 服务端添加客户机的 SSH 公钥,才能在客户机上通过 ssh 对服务端拉取和推送仓库;

尝试 CI/CD
从 url 克隆 libuv

新建项目 –> 导入项目 –> 从 URL 导入仓库;

  • 填写 URL:https://github.com/libuv/libuv.git
  • 填写可见性级别:公开;
WSL2 后端的 docker 方式创建 GitLab Runner
  1. 交互式注册到 GitLab

    如果 $HOME/gitlab-runner 目录存在就先删除它,以下命令会在 $HOME/gitlab-runner/config 目录下生成配置文件;

    --network host 表示使用 WSL2 主机侧的网络;

    1
    2
    3
    4
    
    docker run --rm -it \
    	--network host \
    	-v $HOME/gitlab-runner/config:/etc/gitlab-runner \
    	gitlab/gitlab-runner:latest register
    

    填入关键信息:

    • IP:GitLab 项目侧边栏 –> 设置 –> CI/CD –> Runner –> IP;
    • token:GitLab 项目侧边栏 –> 设置 –> CI/CD –> Runner –> token;
    • Enter a description for the runner:任意描述;
    • Enter tags for the runner:建议为空,如果非空,就需要在流水线脚本 .gitlab-ci.yml 的 jobs 配置中指定 tag;
    • Enter an executor:shell;
  2. 使用配置文件启动 GitLab Runner

    --network host 表示使用 WSL2 主机侧的网络;

    1
    2
    3
    4
    5
    
    docker run -d --name gitlab-runner --restart always \
    	--network host \
    	-v $HOME/gitlab-runner/config:/etc/gitlab-runner \
    	-v /var/run/docker.sock:/var/run/docker.sock \
    	gitlab/gitlab-runner:latest
    
WSL2 主机侧创建 GitLab Runner

更加建议使用 WSL2 后端 docker 的方式创建 GitLab Runner;

  1. 下载和安装二进制包

    1
    2
    3
    4
    5
    
    # 下载 gitlab-runner_amd64.deb
    curl -LJO "https://gitlab-runner-downloads.s3.amazonaws.com/latest/deb/gitlab-runner_amd64.deb"
       
    # 安装 gitlab-runner_amd64.deb
    sudo dpkg -i gitlab-runner_amd64.deb
    
  2. 注册 GitLab Runner

    1
    
    sudo gitlab-runner register
    

    填入关键信息:

    • IP:GitLab 项目侧边栏 –> 设置 –> CI/CD –> Runner –> IP;
    • token:GitLab 项目侧边栏 –> 设置 –> CI/CD –> Runner –> token;
    • Enter a description for the runner:任意描述;
    • Enter tags for the runner:建议为空,如果非空,就需要在流水线脚本 .gitlab-ci.yml 的 jobs 配置中指定 tag;
    • Enter an executor:shell;
  3. 重启 GitLab Runner

    1
    
    sudo gitlab-runner restart
    
编辑 .gitlab-ci.yml 文件

侧边栏 CI/CD –> 编辑器 –> 编写流水线配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
stages:
  - build
  - deploy
  - test

build:
  script: "echo Hello, build!"

deploy:
  script: "echo Hello, deploy!"

test:
  script: "echo Hello, test!"

提交后等待一段时间,在流水线面板可以看到 jobs 执行成功(依赖 GitLab Runner):

如果注册 GitLab Runner 时设置了 tags,那么运行 jobs 需要指定 GitLab Runner 的标签:

假设 GitLab Runner 的 tags 中有 wsl2-host 标签;

加入 tags 可以实现流水线跨平台编译(1* windows runner + 1* linux runner);

1
2
3
4
5
6
7
stages:
  - test

test:
  tags:
    - wsl2-host
  script: "echo Hello, test!"

搭建 Gitea

docker 容器方式安装

安装环境为 Docker Desktop(WSL2 后端);

  1. 编写 docker-compose.yml

    • 如果名为 gitea 的 docker network 不存在,将创建它(一般会是 xxx_gitea);
    • server、db 均连接到 gitea(docker network),容器内访问对方名称就可找到对应 IP;
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    
    version: "3"
       
    networks:
      gitea:
        external: false
       
    services:
      server:
        image: gitea/gitea:latest
        container_name: gitea
        environment:
          - USER_UID=1000
          - USER_GID=1000
          - GITEA__database__DB_TYPE=mysql
          - GITEA__database__HOST=db:3306
          - GITEA__database__NAME=gitea_db
          - GITEA__database__USER=gitea
          - GITEA__database__PASSWD=gitea
        restart: always
        networks:
          - gitea
        volumes:
          - ./gitea:/data
          - /etc/timezone:/etc/timezone:ro
          - /etc/localtime:/etc/localtime:ro
        ports:
          - "80:3000"
          - "8022:22"
        depends_on:
          - db
       
      db:
        image: mysql:5.7
        container_name: gitea_mysql
        restart: always
        environment:
          - MYSQL_ROOT_PASSWORD=root
          - MYSQL_DATABASE=gitea_db
          - MYSQL_USER=gitea
          - MYSQL_PASSWORD=gitea
        networks:
          - gitea
        volumes:
          - ./mysql:/var/lib/mysql
    
  2. 在 docker-compose.yml 同级目录启动 docker-compose

    1
    
    docker-compose up -d
    
  3. 等待两分钟(否则 mysql 会连接不上),然后访问 http://127.0.0.1:80 的 web 页进行配置;

    • 数据库按照默认配置即可;
    • 管理员账户可以先不设置,第一个注册的用户自动成为管理员;

windows 二进制方式安装

下载
  • gitea:我选择的是 gitea-1.14.1-gogit-windows-4.0-amd64.exe;
  • phpEnv:用到了其中的 mysql 环境;
配置 mysql 工具
  1. 下载安装 phpEnv;

  2. 点击 phpEnv 菜单栏 “工具”–>“MySQL 工具”–>“修改密码”;

    • 需要在 MySQL 关闭的状态下通过该方式修改密码;
    • 这里我修改密码为 123456;
  3. 点击 phpEnv 右下角的 “数据库管理”,做如下操作:

    • 使用用户名 root、密码 123456 登入 mysql;
    • 新建一个名为 gitea 的数据库(后面安装的 gitea 站点将使用这个数据库);
  4. 在 phpEnv安装目录/server/mysql/mysql-5.7 中有个 “安装服务.bat” 的脚本,双击它创建 windows 服务:

    这样配置后可以使用 windows 服务启停 mysql,以及实现开机启动,而不用依赖 phpEnv;

  5. 打开 windows 服务,可以看到新建的 .phpEnv_MySQL

    • 启动类型为自动表示开机启动,状态为空表示当前没有运行;
    • 在服务上右键可以手动控制该服务的启停;

配置 Gitea 工具
  1. 新建目录 D:\gitea,将 gitea-1.14.1-gogit-windows-4.0-amd64.exe 移动至此并改名 gitea.exe;

  2. 创建 “安装服务.bat”、“卸载服务.bat” 两个脚本;

    • 安装服务.bat

      创建了名为 .gitea 的服务,依赖 .phpEnv_MySQL 服务;

      1
      2
      3
      4
      5
      6
      
      @echo off
      fltmc>nul||cd/d %~dp0&&mshta
      vbscript:CreateObject("Shell.Application").ShellExecute("%~nx0","%1","","runas",1)(window.close)&&exit
      set myPath=%~dp0
      sc create .gitea binPath= "%myPath%gitea web --config %myPath%custom\conf\app.ini" start= auto depend= .phpEnv_MySQL
      pause
      
    • 卸载服务.bat

      删除了名为 .gitea 的服务;

      1
      2
      3
      4
      
      @echo off
      fltmc>nul||cd/d %~dp0&&mshta vbscript:CreateObject("Shell.Application").ShellExecute("%~nx0","%1","","runas",1)(window.close)&&exit
      sc delete .gitea
      pause
      

    这样 D:\gitea 目录应该有这些文件:

  3. 双击 “安装服务.bat” 脚本,创建 windows 服务;

  4. 打开 windows 服务,可以看到新建的 .gitea,右键启动它;

    启动后会弹出一个窗口(进度条走的很慢),可以忽略它先进行后面的 web 配置;

Web 配置
  1. 浏览器访问 http://127.0.0.1:3000 进入 web 配置页面;

  2. 数据库设置

    • 数据库类型:MySQL;
    • 数据库主机:127.0.0.1:3306;
    • 用户名:root;
    • 数据库用户密码:123456;
    • 数据库名称:gitea;
    • 字符集:utf8mb4;
  3. 一般设置

    HTTP 服务端口:80;

    基础 URL:http://localhost:80/;

  4. 管理员账户设置

    可以先不设置,第一个注册的用户自动成为管理员;

  5. 设置完成后点击 “立即安装”;

    等待安装完成,后面就可以通过 http://localhost:80/ 访问 gitea 站点;

Gitea 的简单使用

git 操作
  1. web 登录 gitea,创建一个 git 仓库;

    只用填写下仓库名称,其他默认即可;

    创建完成后仓库(空)状态如下:

  2. 通过 windows cmd 克隆创建好的仓库;

    windows 上需要安装 git;

    克隆的仓库地址在 web 上会有提示(不同方式访问提示可能不一样);

    建议通过 HTTP 方式克隆(ssh 方式暂未验证);

    1
    
    git clone http://localhost:80/wlyb/uniform.git
    

    克隆完成后当前目录会多出一个目录 —— uniform;

  3. 进入 uniform 目录,拷贝代码到 uniform 目录中;

  4. windows cmd 提交更改,并推送到远程服务器;

    需要先设置 git 用户名和邮箱;

    下面的步骤进行了如下操作:

    • 提交了 1 次并推送到远程;
    • 创建了 1 个 tag 并推送到远程;
    1
    2
    3
    4
    5
    6
    
    cd .\uniform\
    git add .
    git commit -m "first commit"
    git push -u origin master
    git tag v1.0
    git push origin --tags
    

    推送后 web 中展示的仓库如图:

linux app 中的应用

顶层 CMakeLists.txt 从 git 仓库中下载指定版本的源但不编译:

1
2
3
4
5
6
7
8
9
# 使用 FetchContent 插件
include(FetchContent)
# 从 git 服务器仅下载(指定 tag 为 v1.0 的版本)
FetchContent_Populate(
  ecu_uniform
  GIT_REPOSITORY http://10.8.190.94:80/wlyb/uniform.git
  GIT_TAG        v1.0
  SOURCE_DIR ${PROJECT_SOURCE_DIR}/3_interface/msg_model/uniform
)

设置防火墙入站规则

为了让局域网中其他 PC 能通过 http://<myIP>:80 访问我的 PC 的 gitea 站点,需要开放 80 端口;

  1. 启用防火墙(控制面板 –> 系统和安全 –> Windows Defender 防火墙);

  2. 点击左侧高级设置;

  3. 新建入站规则开放 80 端口;

    在“入站规则”上右击新建规则 –> 选择端口规则 –> 选择 TCP、输入 80 端口 –> 选择允许连接 –> 应用规则方式默认即可 –> 输入规则名称,点击完成;