本文描述了在Linux环境中搭建Gitlab+Gitlab-Runner实验环境的过程,可以在服务器端,也可以在自己的笔记本上搭建这个环境用来使用Gitlab的CI/CD流程。所有的软件运行在一台电脑上,我自己是在华为的笔记本上运行,配置为16G内存+512G固态硬盘,安装的Linux发行版是Deepin V20.8,供参考。

1. 拉取镜像

# 拉取Gitlab和Gitlab-runner镜像
docker pull registry.gitlab.cn/omnibus/gitlab-jh
docker pull gitlab/gitlab-runner

2. 创建Gitlab的挂载目录并启动Gitlab容器

Gitlab容器需要挂载三个路径:etclogopt,用来保存持久化数据,我们在当前用户的根目录中新建这三个路径,假定当前用户名为gitlab。然后通过挂载这三个路径的方式启动gitlab。

# 创建挂载目录
cd ~
mkdir gitlab-ce
mkdir gitlab-ce/etc
mkdir gitlab-ce/log
mkdir gitlab-ce/opt
# 启动容器
docker run -itd -p 80:80 -p 9922:22 -v /home/gitlab/gitlab-ce/etc:/etc/gitlab -v /home/gitlab/gitlab-ce/log:/var/log/gitlab -v /home/gitlab/gitlab-ce/opt:/var/opt/gitlab --restart always  --privileged=true --name gitlab registry.gitlab.cn/omnibus/gitlab-jh

参数

描述

-i

以交互模式运行容器

-t

为容器重新分配一个伪输入终端,通常与 -i 同时使用

-d

后台运行容器

-p 80:80

将容器内80端口映射至宿主机80端口,这是访问gitlab的端口

-p 9922:22

将容器内22端口映射至宿主机9922端口,这是访问ssh的端口

-v /home/gitlab/gitlab-ce/etc:/etc/gitlab

将容器/etc/gitlab目录挂载到宿主机/home/gitlab/gitlab-ce/etc目录下,这里是gitlab的配置文件,挂载后可以直接在宿主机访问并修改

-v /home/gitlab/gitlab-ce/log:/var/log/gitlab

将容器/var/log/gitlab目录挂载到宿主机/home/gitlab/gitlab-ce/log目录下,这里是gitlab的日志文件,挂载后可以直接在宿主机查看

-v /home/gitlab/gitlab-ce/opt:/var/opt/gitlab

将容器的/var/opt/gitlab目录挂载到宿主机/home/gitlab/gitlab-ce/opt目录下,这里是XXX

–restart always

容器自启动

–privileged=true

让容器获取宿主机root权限

–name gitlab

设置容器名称为gitlab

gitlab/gitlab-ce

镜像的名称

3. 修改容器参数

之后需要在容器内进行修改参数。

# 首先看一下本机的IP地址,并且记录下来,这里假定是192.168.xxx.xxx
ifconfig

# 进入容器内部
docker exec -it gitlab bash
 
# 修改gitlab.rb
vi /etc/gitlab/gitlab.rb
 
# 修改下面的配置
# gitlab访问地址,可以写域名。如果端口不写的话默认为80端口
external_url 'http://192.168.xxx.xxx'
# ssh主机ip
gitlab_rails['gitlab_ssh_host'] = '192.168.xxx.xxx'
# ssh连接端口
gitlab_rails['gitlab_shell_ssh_port'] = 9922

# 让配置生效
gitlab-ctl reconfigure

重新配置后会/etc/gitlab/gitlab.rb文件会更新gitlab.yml这个文件,如果gitlab访问地址不是80端口,要修改下面文件

# 修改http和ssh配置
vi /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml
 
  gitlab:
    host: 192.168.xxx.xxx
    port: 80 # 如果使用非80端口,在这里修改
    https: false

然后重启gitlab使配置生效

# 重启gitlab 
gitlab-ctl restart
# 退出容器 
exit

4. 在宿主机使用浏览器访问 gitlab

使用浏览器访问:http://192.168.xxx.xxx/
正常情况下会出现下面的登录界面

docker gitlab host不是ip gitlab runner docker in docker_linux

【注意】如果出现502错误,可能是电脑内存不足,可以等一下,一般会恢复正常

docker gitlab host不是ip gitlab runner docker in docker_gitlab_02

5. 登录并修改密码

gitlab-ce安装以后,把root用户的初始密码放在了一个临时文件中了

/etc/gitlab/initial_root_password

打开这个文件,就可以看到Password:后面的一长串字符就是root用户的初始密码。建议登录后尽快修改密码。【注意】这个文件将在首次执行reconfigure后24小时自动删除。

6. 拷贝runner的token

使用root用户登录后,进入Admin界面

docker gitlab host不是ip gitlab runner docker in docker_docker_03


选择CI/CD-Runners菜单

docker gitlab host不是ip gitlab runner docker in docker_docker_04


拷贝Registration Token,在下面注册runner的时候需要使用

docker gitlab host不是ip gitlab runner docker in docker_docker_05

7. 安装Gitlab-runner

Gitlab-runner容器需要挂载一个路径:config,用来保存配置数据。同时我们需要指定宿主机运行docker的sock文件,这样runner在启动docker容器的时候会调用宿主机的docker-daemon,不需要再Gitlab-runner中再安装docker-daemon

# 创建挂载目录
cd ~
mkdir gitlab-runner
mkdir gitlab-runner/config
# 启动容器
docker run -d --name gitlab-runner --restart always -v /home/gitlab/gitlab-runner/config:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock gitlab/gitlab-runner

8. 向Gitlab注册runner

进入Runner容器内

docker exec -it gitlab-runner bash

运行register命令开始注册

gitlab-runner register

输入Gitlab的地址,与上面第3节的external_url相同

Runtime platform   arch=amd64 os=linux pid=41 revision=d540b510 version=15.9.1
Running in system-mode.                            
                                                   
Enter the GitLab instance URL (for example, https://gitlab.com/):
http://192.168.xxx.xxx

输入Registration Token,参见第6节。

Enter the registration token:
xxxxxxxxxxxxxxxx

输入Runner的描述

Enter a description for the runner:
[hostname]: my-runner

输入与Runner关联的标签,标签对应于.gitlab-ci.yml脚本中的tags,可以选择一个或者多个Runner来执行,这里我们设置他的标签为test和prod,你们可以设置其他的

Enter tags for the runner (comma-separated):
test,prod

输入runner的描述文字,可选

Enter optional maintenance note for the runner:
my-runner

输入Runner的执行器
由于我们都是基于Docker,所以这里选择执行器为Docker

Enter an executor: custom, docker, parallels, shell, kubernetes, docker-ssh, ssh, virtualbox, docker+machine, docker-ssh+machine, instance:
docker

设置执行器的默认docker镜像,由于我们使用Docker作为执行器,因此在这里需要指定使用Docker:20.10.16镜像作为默认镜像。

Enter the default Docker image (for example, ruby:2.7):
docker:20.10.16

退出容器

exit

9. Gitlab-runner的附加配置

由于我们使用Docker启动了Gitlab-runner,又配置了在runner中使用docker作为基础镜像运行jobs,也就是我们使用了“Docker中的Docker”因此我们需要做对Gitlab-runner做一下附加配置。
进入gitlab-runner下/etc/gitlab-runner/,修改config.toml。
由于gitlab-runner的容器内没有预装vi,所以我们可以直接在宿主机修改这个文件/home/gitlab/gitlab-runner/config/config.toml

privileged = true

然后重启gitlab runner

docker restart gitlab-runner

9. 检查

再按照第6节的方法看一下runners,会出现一个已经注册的runner。