我的docker随笔34:gitlab服务部署

本文涉及一种在容器中部署 gitlab 服务的方法,并结合其自带的 gitlab-runner 实现 CICD 功能。其目的是为了在实际工作中使用代码托管及自动化操作。

一、引言

因工作需要,需部署 gitlab 服务器进行数据测试。与网上几分钟即可部署的文章相比,本文更注重个人的实践记录,故不会完整地将过程记录下来。

二、技术小结

  • gitlab 有官方的 Docker 镜像。
  • 建议将数据和配置目录映射到主机上,方便编辑和备份。
  • 如果使用非默认端口,需要配置自定义端口。
  • 在首次登录时,需要设置 root 密码,后面不再出现此提示,因此需记住密码。
  • gitlab-runner本文未有深入研究,等后续有时间再着手。

三、部署gitlab服务

3.1 部署脚本

本文使用 docker-compose 部署,在测试阶段,使用了多个版本。

版本一,使用默认端口,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
version: '2'
services:
llgitlab:
image: gitlab/gitlab-ce:13.10.0-ce.0
container_name: llgitlab
restart: always
volumes:
- ./gitlab_data/config:/etc/gitlab
- ./gitlab_data/logs:/var/log/gitlab
- ./gitlab_data/data:/var/opt/gitlab
ports:
- "8888:80"
- "8443:443"
#- "2222:22"
hostname: "10.0.10.11"
#command: /assets/wrapper
networks:
- llgitlab-net

networks:
llgitlab-net:
driver: bridge

脚本中将配置目录和数据目录映射到主机当前目录的gitlab_data目录,方便后续修改。对外提供8888端口。由于部署环境为内网,故设置hostname为部署机器的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
version: '2'
services:
llgitlab:
image: gitlab/gitlab-ce:13.10.0-ce.0
container_name: llgitlab
restart: always
volumes:
- ./gitlab_data/config:/etc/gitlab
- ./gitlab_data/logs:/var/log/gitlab
- ./gitlab_data/data:/var/opt/gitlab
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://10.0.153.12:8888'
nginx['listen_port']=8888
gitlab_rails['gitlab_shell_ssh_port']=8822
gitlab_rails['time_zone']='Asia/Shanghai'
ports:
- "8888:8888"
- "8443:443"
- "8822:8822"
hostname: "10.0.153.12"
networks:
- llgitlab-net
networks:
llgitlab-net:
driver: bridge

注意几点:

  • git 的访问方式,http默认为80,ssh默认为22,版本一未修改,但主机做了映射,此版本将 gitlab 默认端口修改了,分别为8888和8822,再将其映射到相同的主机端口。
  • 使用 GITLAB_OMNIBUS_CONFIG 环境变量进行一些参数的修改,相当于修改容器内的/etc/gitlab/gitlab.rb文件(当然,本文已经将目录映射到主机上了)。external_url从名称上看,其必须为一个 url 地址,可以是IP或域名,但不能是单纯的 IP,本文加了端口。
  • 当已经存在了本地数据时,使用 GITLAB_OMNIBUS_CONFIG 修改参数,也会生效。比如原先没有修改端口,修改端口后重启容器,即可生效。
  • 虽然设置了 TZ,容器的时间也为 CST,但查看 gitlab 的日志,依旧使用 UTC 时间。或许是一个特性。
  • hostname 不能加端口。

3.2 运行

运行命令如下:

1
docker-compose up -d

注意:启动耗时较长,大概数分钟(笔者使用性能较强的服务器测试,也要3~4分钟),需耐心等待。

停止命令如下:

1
docker-compose down

初次登录时,会提示设置管理员root密码,如图1所示:

设置完毕后需重新登录。在首页可以看到注册的提醒。默认开放注册,但需管理员确认,如内部使用,则该功能可去掉。如图2所示。

默认情况下,新用户注册,会有如图3的提示:

至此,已经将 gitlab 部署完毕,且已可正常使用。 如使用其 CICD 功能,则需要继续部署 gitlab-runner。

四、gitlab-runner

准备工作

使用管理员登录 gitlab,并获取token,如图4所示:

图4右侧给出了URL地址以及 token,后续将使用到。

准备docker-compose文件:

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
version: '2'
services:
llgitlab:
image: gitlab/gitlab-ce:13.10.0-ce.0
container_name: llgitlab
restart: always
volumes:
- ./gitlab_data/config:/etc/gitlab
- ./gitlab_data/logs:/var/log/gitlab
- ./gitlab_data/data:/var/opt/gitlab
ports:
- "8888:80"
- "8443:443"
#- "2222:22"
hostname: "10.0.153.12"
#command: /assets/wrapper
networks:
- llgitlab-net

llgitlab-runner:
image: gitlab/gitlab-runner:alpine-v13.10.0
container_name: llgitlab-runner
restart: always
volumes:
- ./gitlab-runner/config:/etc/gitlab-runner
- /var/run/docker.sock:/var/run/docker.sock
depends_on:
- llgitlab
networks:
- llgitlab-net

networks:
llgitlab-net:
driver: bridge

注意, gitlab-runner 和 gitlab 版本应相近。

注意,此时查看gitlab-runner容器,会不断提示 config.toml找不到:

1
2
3
4
5
6
7
8
9
10
Runtime platform                                    arch=amd64 os=linux pid=7 revision=54944146 version=13.10.0
Starting multi-runner from /etc/gitlab-runner/config.toml... builds=0
Running in system-mode.

Configuration loaded builds=0
listen_address not defined, metrics & debug endpoints disabled builds=0
[session_server].listen_address not defined, session endpoints disabled builds=0
ERROR: Failed to load config stat /etc/gitlab-runner/config.toml: no such file or directory builds=0
ERROR: Failed to load config stat /etc/gitlab-runner/config.toml: no such file or directory builds=0
....

因为未注册原故。注册方法有2种,一是根据提示一一填写,二是直接指定参数。

手动注册:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
docker run --rm -it -v $PWD/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner:alpine-v13.10.0 register
之后出现提示,根据提示填写内容
下面是示例
Runtime platform arch=amd64 os=linux pid=7 revision=54944146 version=13.10.0
Running in system-mode.

Enter the GitLab instance URL (for example, https://gitlab.com/):
http://10.0.153.12:8888/
Enter the registration token:
FXKUC2HtxFuICBC9961024
Enter a description for the runner:
[a2d8dbc3c305]: my-gitlab-runner
Enter tags for the runner (comma-separated):
gitlab
Registering runner... succeeded runner=FXKUC2H
Enter an executor: parallels, virtualbox, docker+machine, docker-ssh+machine, custom, docker, docker-ssh, shell, ssh, kubernetes:
docker
Enter the default Docker image (for example, ruby:2.6):
latelee/ubuntu
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

直接指定参数注册。

1
2
3
4
5
6
7
8
9
10
11
12
docker run --rm -v $PWD/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner:alpine-v13.10.0 register \
--non-interactive \
--executor "docker" \
--docker-image latelee/ubuntu \
--url "http://10.0.153.12:8888/" \
--registration-token "FXKUC2HtxFuICBC9961024" \
--description "docker-runner" \
--tag-list "docker,aws" \
--run-untagged="true" \
--locked="false" \
--access-level="not_protected"

生成的配置在/etc/gitlab-runner/config.toml文件。

说明:

  • 运行器 executor 选择 docker 即可,镜像使用自建的 latelee/ubuntu, 方便后续添加软件。

成功后,在 Runners 界面(与图4为同一界面)可以看到已注册的实例,如图5所示。

注意,注册之后,还是可以再编辑文件gitlab-runner/config/config.toml的,但需要重启容器。

过程记录

管理员登录,在Runners中找到项目,绑定到指定runner。(存疑:只有一个runner,是否不需要一一绑定项目?太麻烦了)

设置好 ci 脚本,提交,提示This job is stuck, because the project doesn‘t have any runners online assigned to it. 。解决:在Settings->CI/CD找到对应的runner,将Indicates whether this runner can pick jobs without tags打勾。

执行 CI 后,提示:

1
2
fatal: repository 'http://10.0.153.12/latelee/ci_test.git/' not found
ERROR: Job failed: exit code 1

原因:仓库带端口,但此处没有,何解?

遗留问题/思考

如果切换 gitlab,如果更新或添加?——由于是 docker 部署,在测试阶段容易重新启动新的 gitlab 服务。

五、进阶配置

这里列出一些配置,有空再研究

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
# 这个是针对请求钩子的,还有针对Git的这些
gitlab_rails['webhook_timeout'] = 60 #默认是10s

# 若是大体都需要求延长的,可以配置全局,后者是进程数
unicorn['worker_timeout'] = 100
unicorn['worker_processes'] = 8

# gitlab_rails['smtp_enable'] = true
# gitlab_rails['smtp_address'] = "smtp.exmail.qq.com"
# gitlab_rails['smtp_port'] = 465
# gitlab_rails['smtp_user_name'] = "xxxx@xx.com"
# gitlab_rails['smtp_password'] = "password"
# gitlab_rails['smtp_authentication'] = "login"
# gitlab_rails['smtp_enable_starttls_auto'] = true
# gitlab_rails['smtp_tls'] = true
# gitlab_rails['gitlab_email_from'] = 'xxxx@xx.com'

gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtpdm.aliyun.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "crperx@aliyun.com"
gitlab_rails['smtp_password'] = "Qwe456jkl?Asd789iop?"
gitlab_rails['smtp_domain'] = "smtpdm.aliyun.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = 'crperx@aliyun.com'
gitlab_rails['gitlab_email_display_name'] = 'noreply@aliyun.com'
gitlab_rails['gitlab_shell_ssh_port'] = 22
user['git_user_email'] = "crperx@aliyun.com"
nginx['enable'] = true
nginx['client_max_body_size'] = '250m'
nginx['redirect_http_to_https'] = true
nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab.key"
nginx['ssl_ciphers'] = "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256"
nginx['ssl_prefer_server_ciphers'] = "on"
nginx['ssl_protocols'] = "TLSv1.1 TLSv1.2"
nginx['ssl_session_cache'] = "builtin:1000 shared:SSL:10m"
nginx['listen_addresses'] = ["0.0.0.0"]
nginx['http2_enabled'] = true

参考

使用默认端口时,gitlab 仓库下载地址示例:

image-20210715100826319

容器内部改了端口并做了映射,相应的下载地址示例:

image-20210715100243798

构建基础镜像

1
yum install gcc gcc-c++ kernel-devel make bzip2 -y