一、前言


二、安装配置Gitlab

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

032310053118030

Gitlab大概流程,由于我是禁止gitlab自带Nginx,因此我们只需要两个端口,一个是github服务监听地址端口,一个是ssh端口

启动Gitlab

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文件

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..

重新配置docker exec -it gitlab gitlab-ctl reconfigure

配置Nginx反向代理

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

#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

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

location ~ /(\.user\.ini|\.ht|\.git|\.svn|\.project|LICENSE|README\.md) {
deny all;
}

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

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快速部署。

运行:

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机器上执行docker exec -it gitlab-runner gitlab-runner register 如图所示:

image-20210527013844171

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

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

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

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

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

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

369041052744369

优化Runner

修改config.toml文件
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

027043060125027


四、备份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函数,docker exec -t ${DOCKER_NAME} gitlab-backup create Gitlab 12.1低版本使用docker exec -t <container name> gitlab-rake gitlab:backup:create命令

# 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 目录的备份

添加定时任务

# gitlab_backup.sh
0 13 * * * /codex/shell/gitlab_backup.sh > /dev/null 2>&1

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