树莓派上用docker自建gitlab以及gitlab-runner环境

背景

为在自己搭建的环境下使用gitlab-ci,
因此需要gitlab与runner环境.

简介

gitlab-runner是一个开源项目.
可以运行gitlab-ci的任务并将结果返回gitlab.
gitlab可以让多台runner同时执行任务(比如一台专门构建,一台专门部署).
runner可以是一台具体的机器,也可以是虚拟机,也可以是docker.
如果自己只有一台电脑,既想自己电脑能当runner跑,又不想搞乱环境,可以使用docker来搭建.

gitlab也的确提供了gitlab-runner的docker.名为 gitlab/gitlab-runner
不过并不是arm平台的.偷懒一下,使用了 klud/gitlab-runner
尽管可以自行使用docker命令慢慢搭建,
但更好的方法是用docker-compose来搭建gitlab和gitlab-runner.

docker-compose问题

官方给出的安装脚本,最终拼凑出了一个不支持armv7平台的发行版,
导致二进制程序为空.
因此只有通过apt安装docker-compose.

环境搭建

找一合适位置,编写 docker-compose.yml 如下

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
version: "3"
services:
gitlab:
image: gitlab:13.3.5-ce # 此处使用了自己编译的arm平台的gitlab docker
container_name: gitlab # 影响最终跑起来的container的名字,不然会随机为"文件夹名_service名"
restart: unless-stopped
hostname: pilab
environment:
GITLAB_OMNIBUS_CONFIG: |
puma['worker_processes'] = 0 # 此处直接影响容器中的gitlab.rb配置文件
sidekiq['max_concurrency'] = 10
gitaly['cgroups_count'] = 2
prometheus_monitoring['enable'] = false
ports:
- "443:443"
- "80:80"
- "522:22"
volumes:
- "~/gitlab/config:/etc/gitlab"
- "~/gitlab/logs:/var/log/gitlab"
- "~/gitlab/data:/var/opt/gitlab"
networks: # 专门创建了一个有别名的网络
- gitlab

gitlab-runner:
image: klud/gitlab-runner # 官方还是没有出arm平台的,也是别人编译好的
container_name: gitlab-runner-docker
restart: unless-stopped
depends_on:
- gitlab
privileged: true # 如果CI任务中需要在release阶段编译出docker镜像,会用到docker in docker
volumes:
- ./config:/etc/gitlab-runner
- /var/run/docker.sock:/var/run/docker.sock # 可能是让docker in docker共享宿主的daemon程序
networks:
- gitlab

networks:
gitlab:

然后使用命令启动即可

1
docker-compose up -d

大致等效的gitlab启动脚本

1
2
3
4
5
6
7
8
docker run \
--hostname pilab
-p 443:443 -p 80:80 -p 522:22 \
--name gitlab \
-v ~/gitlab/config:/etc/gitlab \
-v ~/gitlab/logs:/var/log/gitlab \
-v ~/gitlab/data:/var/opt/gitlab \
gitlab:13.3.4-ce.0

此处hostname需要注意

  1. 影响范围
    1. 项目界面中http和ssh协议的下载地址
    2. ssh连接时的host名
    3. docker内部网络中的host名
  2. 如果什么都不设置,在克隆项目时会发现给出的是随机字符串
  3. 除了设置hostname,还可以通过其他方式配置这些host
    1. 在gitlab的Web页面中配置http(s)下的hostname
    2. 在gitlab的配置文件中配置ssh方式下的hostname

gitlab初始配置

浏览器访问80端口就能看到首页.
设置完管理员密码后就进入控制面板.
然后就是正常的操作了.

runner注册

使用runner中的命令开始注册

1
docker exec -it gitlab-runner-docker gitlab-runner register

然后会问几个问题

  1. gitlab服务主页位置
    官方: https://gitlab.com/,
    自建: 比如 http://pilab/ 由于存在容器间互相访问的网络,因此在gitlab-runner中写pilab能够找到gitlab-ce所在
  2. runner的token
    <gitlab-domain>/admin/runners 路径下可以拷贝这个token
  3. 描述
    随便写
  4. tags
    之后CI过程中,配置文件会根据这个tags找到对应的runner,
    可以写多个,逗号分隔
  5. executor类型
    有多种选择,目前是用docker搭建而不是一台真正的机器,故填写docker
  6. 如果executor填了docker,需要再次指定一个默认docker镜像
    (runner执行任务时,必须指定一个在runner内部使用的docker,
    当runner是真正的机器时没有太大技术问题,
    但当runner本身是由docker构建时,则涉及docker in docker的问题,
    官方给出了具有arm平台的docker:latest镜像)
    当然在CI配置文件中手动指定也完全可以

确认结果

  1. =docker ps -a
  2. 之前选好的路径下出现 config/config.toml 文件,里面含有刚才注册时使用的信息

参考

  1. runner注册参考
  2. docker-compose安装不成功问题
  3. 比较成熟的方案