DevOpS 环节中,代码托管是必不可少的。本文介绍如何利用 docker-compose 搭建 Gitlab 服务。
gitlab 镜像
gitlab 分为两个版本:
gitlab-ce
社区版gitlab-ee
企业收费版
本文的镜像,使用的是社区版本。社区办的镜像,可以在gitlab/gitlab-ce 查看。
硬件要求
查看 官宣-Requirements
CPU
- 1 core supports up to 100 users but the application can be a bit slower due to having all workers and background jobs running on the same core
- 2 cores is the recommended number of cores and supports up to 500 users
- 4 cores supports up to 2,000 users
- 8 cores supports up to 5,000 users
- 16 cores supports up to 10,000 users
- 32 cores supports up to 20,000 users
- 64 cores supports up to 40,000 users
- More users? Run it on multiple application servers
Memory
- 4GB RAM + 4GB swap supports up to 100 users but it will be very slow
- 8GB RAM is the recommended memory size for all installations and supports up to 100 users
- 16GB RAM supports up to 2,000 users
- 32GB RAM supports up to 4,000 users
- 64GB RAM supports up to 8,000 users
- 128GB RAM supports up to 16,000 users
- 256GB RAM supports up to 32,000 users
- More users? Run it on multiple application servers
docker-compose 示例
1 | version: "3" |
为了在我机器上 192.168.3.66
能够识别这个域名,我通过配置 hosts
文件,将容器的宿主机 IP 和这个域名做了映射:
1 | 192.168.3.43 gitlab.michael.com |
1 | docker exec -it devops-gitlab bash |
可以看到,在容器网络中,gitlab.michael.com 这个域名对应的 IP 是 192.168.240.2
。我在局域网里用我自己另一台机器 ping 这个 IP,是不通的。因为我在家是没有 DNS 域名服务器的。这个 IP 很关键,在后面的配置中起到了关键作用。
配置详解
ports
端口 81:80
的配置是因为我容器的宿主机的 80 端口是给 Nginx 用了。在同一台机器上,为了不引起端口冲突,将 81 端口和容器的 80 端口映射。 访问 gitlab 服务下面地址皆可:
宿主机 IP:81
,即192.168.3.43:81
gitlab.michael.com:81
这样的网址并不优美,因此,我在 Nginx 中增加了一个 gitlab.conf
的配置文件,这样就可以直接使用 gitlab.michael.com
访问了:
1 | upstream gitlab{ |
关于使用容器搭建 Nginx 可参考之前的文章:使用容器 Docker 创建开发环境
端口 '23:22'
表示将宿主机的端口 23 和容器的端口 22 映射。ssh 默认端口就是 22,我们使用 ssh 协议登录宿主机时,就是用的 22 端口。因此,如果 22:22
这种映射的话,会影响登录宿主机的。也有文章修改了宿主机的 sshd 默认端口,但是我没有这么做。有需要的话,可以查看通过 docker 搭建自用的 gitlab 服务
gitlab_rails['gitlab_shell_ssh_port'] = 23
这个环境变量的设置很关键,当我们选择 ssh 协议方式克隆代码库时,复制的地址将会自动变为:ssh://git@gitlab.michael.com:23/root/gitlab-demo.git
1 | michael @ Michael-MBP in ~/Code/00-Temp [15:25:21] |
external_url
这里的 external_url
配置的是外部 URL,会影响项目的访问地址,如果不配置,项目的访问地址会是一个随机字符串,在云服务器上搭建时尤其要注意这一点。
例如,新建项目的 HTTP 地址为:http://gitlab.michael.com/root/gitlab-demo
,这里的地址中的 gitlab.michael.com
就是我在 docker-compose.yml
文件中配置的环境变量。
开启邮件服务
我们在使用 github 等类似的平台工具的时候都会用到邮件服务,比如你在 github 上进行注册、密码重置、有人给你的开源项目提 issue 等等的时候,你通常都会收到邮件提醒。 gitlab 肯定也会有这个功能的,下面我们就来开启这个功能,在此之前需要准备一个邮箱账号,这个账号是用来负责发送邮件的,需要开启 smtp 协议支持。本文以 163 邮箱为例。
说明:
gitlab_rails['smtp_address']
:SMTP服务地址,不同的服务商不同gitlab_rails['smtp_port']
:服务端口gitlab_rails['smtp_user_name']
:用户名,自己注册的gitlab_rails['smtp_password']
:客户端授权秘钥(获取方式,下图讲解)gitlab_rails['gitlab_email_from']
:发出邮件的用户,注意跟用户名保持一致user["git_user_email"]
:发出用户,注意跟用户名保持一致
亲测,当你使用管理员账户登录时,添加用户之后,上面的配置能够成功发送邮件:
了解更多,查看 官网 SMTP 设置
数据持久化
通过挂卷的方式,将 gitlab 的相关数据保存到宿主机上:
当地的位置 | 容器的位置 | 作用 |
---|---|---|
/data/gitlab/config | /etc/gitlab | 用于存储GitLab配置文件 |
/data/gitlab/logs | /var/log/gitlab | 用于存储日志 |
/data/gitlab/data | /var/opt/gitlab | 用于存储应用数据 |
gitlab-runner
dockerhub 中有gitlab/gitlab-runner的景象。
Runner 的配置文件是 /etc/gitlab-runner/config.toml
,它的字段说明,可以查看文档:
- Gitlab-runner Advanced configuration
创建 runner 容器
先这种方式运行一下,将配置文件拷贝出来,之后再通过 docker-compose 的方式启动:
1 | mkdir -p /data/gitlab-runner |
上面这种方式,通过 network
的方式,将 runner 和 gitlab server 机器处于同一网络下。所以,当在 runner 中配置 host 之后,IP 就是可达的了。域名会被解析到。
1 | docker exec -it gitlab-runner bash |
将之前的 runner 容器停止:
1 | docker stop gitlab-runner |
docker-compose.yml 示例:
1 | version: "2.1" |
获取 Runner 信息
gitlab-runner 容器正常运行之后,注册到 gitlab 上的方式有两处:
- 管理员从 管理中心-Runner 中,注册时使用这里的
shared runner token
,这种方式添加的 Runner 将作为shared Runner
- 进入具体的项目 设置-CI/CD-Runner-专用 Runner,这种方式添加的 Runner 将作为
专用 Runner
注册 Runner
注册 Runner 时,关于 excutor 有好几种类型可以选择,我尝试了 shell 和 docker 两种类型。
shell
1 | docker exec -it gitlab-runner gitlab-runner register |
docker
添加共享 runner:
1 | docker exec -it gitlab-runner gitlab-runner register |
选择 docker 为 excutor 时,config.toml 内容配置成这样,实现了网络的畅通:
1 | cat config.toml |
主要就是添加了网络配置:
1 | extra_hosts = ["gitlab.michael.com:192.168.240.2"] |
gitlab-runner 虽然是基于 docker 安装的,但是它每个 stage 执行是由 runner 在主机另起一个 docker 容器来执行的,执行完毕后自动销毁,并不是在 gitlab-runner 容器内部启动新的容器。 runner 相当于一个在主机的 agent 程序,来负责接收任务、分发并创建新的容器执行任务,最后回传执行结果到 gitlab。
设置 runner
这时候,我们可以在「管理中心」的 Runner 中看到所有的 Runner 信息。
此外,同一个 gitlab-runner 我分别注册了两次,设置的 tag 不一样。使用的是项目的 token 和 共享的 token,二者皆是有效的。这时候注册的时候,会显示两个 runner,二者都会被成功调用。
CI/CD
关于 gitlab 的 CI/CD 功能,更多可以查看 GitLab Documentation GitLab CI/CD GitLab CI/CD Pipeline Configuration Reference。
流水线
要使用流水线功能,前提是 repo 中要有 .gitlab-ci.yml
文件。
一个示例:
1 | stages: |
参考
gitlab-ce
- Omnibus GitLab documentation
- Omnibus GitLab documentation Configuring omnibus settings Configuration options
- cnodejs-使用docker-compose搭建gitlab 挺全的,还介绍了 gitlab runner 的使用,推荐
- 掘金-通过 docker 搭建自用的 gitlab 服务
- segmentfault-使用docker搭建gitlab环境 邮箱配置参考
gitlab-runner
- Run GitLab Runner in a container
- 千峰教育-基于 Docker 安装 GitLab Runner
- Building Docker images with GitLab CI/CD 利用 Gitlab CI/CD 构建 Docker 镜像,可以查看
- Docker搭建自己的Gitlab CI Runner
CI/CD
- GitLab Documentation GitLab CI/CD GitLab CI/CD Pipeline Configuration Reference