docker部署gitlab以及runner实现CICD
Fungit
2021年06月05日 18:22
收录于文集
共5篇

一、前言

二、安装配置Gitlab

ps: 全部配置均在gitlab.rb上,不用gitlab.yml。

启动Gitlab

代码块
Shell
自动换行
复制代码
mkdir -p /mount/gitlab/{config,logs,data}

sudo docker run --detach \
 --hostname gitlab.fungit.org \
 -p 127.0.0.1:2080:80 \
 -p 2022:22 \
 --name gitlab \
 --restart always \
 -v /mount/gitlab/config:/etc/gitlab \
 -v /mount/gitlab/logs:/var/log/gitlab \
 -v /mount/gitlab/data:/var/opt/gitlab \
 gitlab/gitlab-ce
复制成功

有关Docker容器端口映射,可以参考理解Docker容器端口映射

修改gitlab.rb文件

代码块
Shell
自动换行
复制代码
vim /mount/gitlab/config/gitlab.rb
# 配置域名地址
external_url 'https://gitlab.fungit.org'
# 配置 ssh 地址
gitlab_rails['gitlab_ssh_host'] = 'gitlab.fungit.org
# Nginx 授信地址
gitlab_rails['trusted_proxies'] = ['127.0.0.1',‘172.17.0.1’]
# SSH 端口
gitlab_rails['gitlab_shell_ssh_port'] = 2020
# 服务监听方式
gitlab_workhorse['listen_network'] = "tcp"
# 服务监听地址
gitlab_workhorse['listen_addr'] = "0.0.0.0:80"
# 禁用自带的 nginx
nginx['enable'] = false
复制成功

修改这些配置之后达到的效果:

gitlab 自带的 nginx 关闭了,换成了监听 tcp 80 端口,这样就能使用前置 nginx 反向代理该端口。

配置了域名地址和 ssh 地址,端口,这样页面上的克隆地址就会是这里配置的地址,ssh 端口使用 2022是到时候 nginx 上面会使用的端口,gitlab 本身还是 22 的 ssh 端口①。

①来源参考于使用 Nginx 代理内网 GitLab..

重新配置

配置Nginx反向代理

如果是使用oneinstack、lnmp等,请新建网站并申请证书。在网站的配置文件添加反代内容

代码块
Shell
自动换行
复制代码
#PROXY-START
  location / {
      client_max_body_size 100m;
      proxy_pass http://127.0.0.1:2080;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-Ssl on;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header REMOTE-HOST $remote_addr;
      add_header X-Cache $upstream_cache_status;
      expires 12h;
  }
#PROXY-END
复制成功

注意,反向代理一定需要配置: 否则会出现登录 422 的问题! 配置上传大小,还有就是如果使用oneinstack等,配置文件会拦截README  .git*等等文件,造成不能显示和在线修改保存,自行取消就好了

代码块
Shell
自动换行
复制代码
 location ~ /(\.user\.ini|\.ht|\.git|\.svn|\.project|LICENSE|README\.md) {
   deny all;
 }
复制成功

自此Gitlab已配置完成,自行测试

代码块
Shell
自动换行
复制代码
git remote -v
origin  ssh://git@gitlab.fungit.org:2022/Fungit/test.git (fetch)
origin  ssh://git@gitlab.fungit.org:2022/Fungit/test.git (push)
复制成功

三、部署Gitlab Runner

CI/CD 即持续集成、持续部署。我们也采用Docker快速部署。

运行:

代码块
Shell
自动换行
复制代码
docker run -d --name gitlab-runner --restart always \
   -v /mount/gitlab-runner/config:/etc/gitlab-runner \
   -v /var/run/docker.sock:/var/run/docker.sock \
   gitlab/gitlab-runner:latest
复制成功

配置Runner

Runner是为GitLab接收和执行CI/CD工作的进程。你可以将Runner注册成单独的用户,Runner可以部署在其他的服务器上,以及在你的本地机器上。你可以根据自己的需要注册任意数量的Runner。

Runners 有几种形式,我测试方便就是用共享(shared)

  • shared - Runs jobs from all unassigned projects.

  • group - Runs jobs from all unassigned projects in its group.

  • specific - Runs jobs from assigned projects.

  • locked - Cannot be assigned to other projects.

  • paused - Not available to run jobs.

在部署runner机器上执行 如图所示:

  • Gitlab instance URL:部署gitlab绑定的域名

  • Registration token: 注册token,我要搭建的是共享Runner,在管理面板下的Runner找到,域名路径https://domain/admin/runners

  • tags:Runner标签,多个标签用英文逗号分隔。这个标签会在以后写 CI 配置文件时用到,用来指定一个 Job 让哪个 Runner 来执行。

  • executor:执行器,我们选择docker

  • Docker image:我们选择轻量的alpine

提示成功之后,我们刷新刚才的Runner页面,查看

优化Runner

修改config.toml文件

代码块
Shell
自动换行
复制代码
vim /mount/gitlab-runner/config/config.toml

concurrent = 1
check_interval = 0

[session_server]
 session_timeout = 1800

[[runners]]
 name = "shared runner"
 url = "https://gitlab.fungit.org/"
 token = "siEsVLmYk9zDzcc3YEd2"
 executor = "docker"
 [runners.custom_build_dir]
 [runners.cache]
   [runners.cache.s3]
   [runners.cache.gcs]
   [runners.cache.azure]
 [runners.docker]
   # 镜像不存在时才拉取
   pull_policy = "if-not-present"
   tls_verify = false
   image = "alpine:latest"
   # DinD开启特权模式
   privileged = true
   disable_entrypoint_overwrite = false
   oom_kill_disable = false
   disable_cache = false
   # 挂载 Job 容器的 docker.sock
   volumes = ["/cache","/var/run/docker.sock:/var/run/docker.sock"]
   shm_size = 0
复制成功

自此Runner部署完成,自行参考gitlan文档编写CI

四、备份Gitlab

Gitlab自带备份命令,具体参考官方文档Back up and restore GitLab

这里介绍的是利用rclone备份到OneDrive、Google Drive等等,gitlab默认配置第三方云储存只支持AWS、Google Cloud。

docker部署的gitlab,备份文件在/mount/gitlab/data/backups。我使用的是秋大的backup脚本,去除mysql备份和ftp,添加gitlab备份处理,这里备份都是使用秋大备份目录结构,默认gitlab备份目录只保持最新的。

增加gitlab_backup函数, Gitlab 12.1低版本使用命令

代码块
Shell
自动换行
复制代码
# gitlab-backup
gitlab_backup() {
if ${DOCKER_COMMAND} ; then
   cd ${GITLAB_BACKUPS} || exit
   LS=($(ls *.tar))
   for f in ${LS[@]}; do
      rm -f ${f}
   done
   docker exec -t ${DOCKER_NAME} gitlab-backup create
fi
}
复制成功

# 脚本中添加/mount/gitlab/config 目录的备份

添加定时任务

代码块
Shell
自动换行
复制代码
# gitlab_backup.sh
0 13 * * * /codex/shell/gitlab_backup.sh  > /dev/null 2>&1
复制成功

以上没有在另一台机器做过还原测试,仅在本地做解密和验证文件完整性,仅供参考。