本文涉及一种在容器中部署 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" hostname: "10.0.10.11" 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 运行 运行命令如下:
注意:启动耗时较长,大概数分钟(笔者使用性能较强的服务器测试,也要3~4分钟),需耐心等待。
停止命令如下:
初次登录时,会提示设置管理员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" hostname: "10.0.153.12" 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 仓库下载地址示例:
容器内部改了端口并做了映射,相应的下载地址示例:
构建基础镜像 1 yum install gcc gcc-c++ kernel-devel make bzip2 -y