最近需要在研究GitLab的CI,所以自己基于Docker搭建了一个GitLab环境, 在此做下记录...
搭建过程十分简单, 我是在自己电脑的虚拟中搭建的gitlab, 切记配置不能太低, gitlab比较耗资源, ,官方要求至少4G内存。
一、GitLab 的搭建
1.获取镜像
# gitlab-ce为稳定版本,后面不填写版本则默认pull最新latest版本
$ docker pull gitlab/gitlab-ce
我使用的是汉化版的镜像,docker pull twang2218/gitlab-ce-zh:latest
2.运行gitlab镜像
$ docker run -d -p 443:443 -p 80:80 -p 222:22 --name gitlab --restart always -v /home/gitlab/config:/etc/gitlab -v /home/gitlab/logs:/var/log/gitlab -v /home/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce
# -d:后台运行
# -p:将容器内部端口向外映射
# --name:命名容器名称
# -v:将容器内数据文件夹或者日志、配置等文件夹挂载到宿主机指定目录
3.配置
按上面的方式,gitlab容器运行没问题,但在gitlab上创建项目的时候,生成项目的URL访问地址是按容器的hostname来生成的,也就是容器的id。作为gitlab服务器,我们需要一个固定的URL访问地址,于是需要配置gitlab.rb(宿主机路径:/home/gitlab/config/gitlab.rb)。
# gitlab.rb文件内容默认全是注释
$ vim /home/gitlab/config/gitlab.rb
# 配置http协议所使用的访问地址,不加端口号默认为80
external_url 'http://宿主机IP'
# 配置ssh协议所使用的访问地址和端口
gitlab_rails['gitlab_ssh_host'] = '宿主机IP'
gitlab_rails['gitlab_shell_ssh_port'] = 222 # 此端口是run时22端口映射的222端口
:wq #保存配置文件并退出
# 重启gitlab容器
$ docker restart gitlab
此时就可以通过浏览器,使用IP+端口的方式访问GitLab了
4.其他配置
由于GitLab十分消耗资源,所以这里贴出来一些降低资源消耗的配置,仅供参考,因为我的目的仅仅是启动GitLab做实验,所有资源配置都很低。需要修改的是宿主机 /home/gitlab/config/gitlab.rb文件(注:路径需根据自己自定的数据卷位置修改)
# 配置http协议所使用的访问地址,不加端口号默认为80
external_url 'http://10.106.127.128:8088'
# 配置ssh协议所使用的访问地址和端口
gitlab_rails['gitlab_ssh_host'] = '10.106.127.128:8088'
gitlab_rails['gitlab_shell_ssh_port'] = 222 # 此端口是run时22端口映射的222端口
unicorn['worker_memory_limit_min'] = "100 * 1 << 20"
unicorn['worker_memory_limit_max'] = "150 * 1 << 20" #减小内存
sidekiq['concurrency'] = 5 # 减小sidekiq的并发数
postgresql['shared_buffers'] = "64MB" #数据库缓存
postgresql['max_worker_processes'] = 2 #数据库并发数
unicorn['worker_timout'] = 60
unicorn['worker_processes'] = 2
二、GitLab runner 搭建
1. 拉取镜像
docker pull gitlab/gitlab-runner:latest
2.运行镜像
docker run -d --name gitlab-runner --restart always \
-v /docker/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
注意:这里docker.sock文件路径要确定, 之前就指定错路径导致后面使用容器exectuor的时候报错。
3.注册runner
这里使用的是specific Runner方式。在gitlab中 设置 --> CI/CD --> Runner(展开) 找到对应的配置信息。如图:
运行命令:
docker run --rm -t -i -v /docker/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register
#输入GitLab URL
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
https:// ***.***.com/
#输入你的注册token
Please enter the gitlab-ci token for this runner
***
#输入对这个Runner的描述
Please enter the gitlab-ci description for this runner
my-runner
#输入Runner的[tag]
Please enter the gitlab-ci tags for this runner (comma separated):
test
#输入Runner的[executor] ,这里使用容器
Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:
docker
#如果你选择Docker作为Runner的executor,你还要选择默认的docker image来运行job
Please enter the Docker image (eg. ruby:2.1):
alpine:latest
至此GitLab runner已经搭建启动。
4、其他配置
- 使用本地镜像
# 修改配置文件 :/docker/gitlab-runner/config/config.toml
# 在对应runner下增加如下配置, 防止重复拉取镜像
pull_policy = "if-not-present"
- maven本地仓库缓存
# 修改配置文件 :/docker/gitlab-runner/config/config.toml
# 在对应runner下挂载数据卷
volumes = ["/cache","/root/.m2/:/root/.m2/"]
三、Hello Word
在项目的根路径添加配置文件 .gitlab-ci.yml
这里我们选择了一个maven的镜像作为executor的执行环境。执行了单元测试的任务。
image: hub.c.163.com/library/maven:latest
test:
stage: test
script:
- mvn test
还有一种比较常见的场景,我们需要对代码在CI阶段进行代码扫描。
比如使用GolangCI-Lint进行扫描,扫描后我们将扫描结果进行上传。
比如进行单元测试,当运行失败将结果上传。
image: hub.c.163.com/library/maven:latest
test:
stage: test
script:
- mvn test
artifacts:
name: test.json #为上传的文件起名
when: on_failure #当失败的时候进行
paths:
- test.json #上传文件路径
四、踩过的坑
- 期初在注册的时候不清楚tags的含义,随便输入了个名字,在执行pipline时一直等待找不到可执行的runner。 遇到此问题,在.gitlab-ci.yml中配置指定 tags 即可。
- 使用 shell 作为executor 执行用户是gitlab-runner如遇到权限问, 可以从此出发及决问题。