docker中gitlab-runner 配置以及迁移
上一篇:docker中部署gitlab
1.docker中配置gitlab-runner
1.1 dockerhub中拉最新的镜像docker pull gitlab/gitlab-runner
1.2 开启容器
执行命令:docker run -d --name gitlab-runner --restart always -v /srv/gitlab-runner/config:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock gitlab/gitlab-runner:latest
参数解释:
-d:后台执行。--name gisla-runner:容器名字为gitlab-runner--restart always:总是重启容器-v:第一个是docker容器配置,挂载位置:宿主机位置:容器位置,第二个是让容器能够访问宿主机的docker情况- 最后是镜像名
1.3配置gitlab-runner
查看gitlab的项目->settings->CI/CD->Runners如下图所示:
执行命令注册runner:gitlab-runner regitster,会出现如下设置:
root@1a37f8f872ac:/# gitlab-runner register
Runtime platform arch=amd64 os=linux pid=223 revision=943fc252 version=13.7.0
Running in system-mode.
Enter the GitLab instance URL (for example, https://gitlab.com/):
***#输入上图第一个红色框的内容
Enter the registration token:
***#输入上图第二个红色框的内容
Enter a description for the runner:
[1a37f8f872ac]: test for docker runner # 添加的对于这个runner的描述,可以随意写
Enter tags for the runner (comma-separated):
doc-builder#这个是tags,与.gitlab-ci.yml的中设置相关,自己设置,但是需要在后面的tags中设置相同,后面会提到。
Registering runner... succeeded runner=XNyhPXYC
Enter an executor: docker-ssh, shell, virtualbox, kubernetes, docker, parallels, ssh, docker+machine, docker-ssh+machine, custom:
docker#使用什么方式执行,可选项在提示中,这里选的是docker
Enter the default Docker image (for example, ruby:2.6):
docker:latest#上一个选项是docker时候会提示使用的镜像名
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
参数说明:
Enter the GitLab instance URL (for example, https://gitlab.com/):设置为项目->settings->CI/CD->Runners中的2.Specify the following URL during the Runner setup:具体内容,即上图中的第一个红框。Enter the registration token:设置为项目->settings->CI/CD->Runners中的3.Use the following registration token during setup:具体内容,即上图中的第二个红框。[1a37f8f872ac]: test for docker runner:设置随意,是对这个注册的runner的说明。Enter tags for the runner (comma-separated):设置为doc-builder,这个可以自己设置,但是注意需要和与.gitlab-ci.yml的中设置tags一致,否则在CI时候会一直:
Enter an executor: docker-ssh, shell, virtualbox, kubernetes, docker, parallels, ssh, docker+machine, docker-ssh+machine, custom::使用什么方式进行执行runner,我只跑通了docker方式。Enter the default Docker image (for example, ruby:2.6):设置为docker:latest,一个docker镜像,作为后面runner debug deploy项目环境。
到此,完成了gitlab-runner的注册。项目->settings->CI/CD->Runners会显示:
表示,runner已经与gitlab相连接。点击图中的锁头图标后面的设置
按钮
勾选下图红框选项(为了测试所有commit都能CI测试):
在项目的根目录中添加.gitlab-ci.yml文件内容为:
- build
- test
- deploy
job_build:
stage: build
script:
- echo "I am in build"
only:
- master
tags:
- doc-builder
job_test:
stage: test
script:
- echo "I am in test"
tags:
- doc-builder
job_deploy:
stage: deploy
script:
- echo "I am in deploy"
tags:
- doc-builder
注意,tags与之前设置的一致问题。然后,add , commit , push到远程。
接下来在CI/CD->Jobs中看到部署测试成功情况:
如果此时没有对项目进行构建,而是显示:
则先检查tags是否一致,若一直,2个选择1.需要重新按照步骤再注册一个新的gitlab-runner register,注意tags需要更换名称,并且停掉当前项目->settings->CI/CD->Runners点击按钮Pause;2.简单的测试gitlab-runner项目的话,删除当前的Runner,项目->settings->CI/CD->Runners点击按钮Remove Runner,然后在gitlab-runner容器中执行gitlab-runner verify --delete,按照上面步骤重新注册一次。到此根据网上的流程跑通。
2.启用gitlab-runner中dicker镜像用自己配置的dockerhub。
2.1需要将之前一个gitlab-runner换一台机器,但是之前没用docker。
2.2按照上面部署,出现问题Could not resolve host: 'http gitlab-ci runner
这是docker容器内不能访问外部端口,再gitlab-runner容器/etc/gitlab-runner/config.toml文件末尾(其实是[runners.docker]下面)添加一个选项network_mode = "host",将gitlab-runner的端口与宿主机设置一致,等同于注册时直接添加此选项,其他方法没有尝试成功。然后继续执行重启gitlab-runner restart。再次取查看gitlab中项目构建情况。
2.3出现问题bad substitution,这个是docker环境问题。
这个问题卡了很长时间,报错的脚本位置是一行注释的内容。原因是容器中后启动docker不适合项目的环境需求,需要修改docker镜像,也就是说需要自己配置一个用于build,depoly项目的镜像,保存到dockerhub(自己设置的本地daockerhub)。出现这个问题后考虑过gitlab-runner镜像中直接用shell执行,在gitlab-runner容器中直接配置环境,但是换为shell后会有2.2中的错误,而且目前还没有解决,不知道原因,所以还是用docker。开启新docker容器,配置环境并保存为镜像自行百度。然后,如果将docker镜像推到远程dockerhub,按照之前的方式,修改一下gitlab-runner register时候的到docker即可。
2.4采用局域网内的docker镜像作为gitlab-runner环境镜像
2.4.1 直接按照2.3方式执行,会报错http: server gave HTTP response to HTTPS client,此时需要创建或修改宿主机器 /etc/docker/daemon.json,添加{ "insecure-registries":["myregistry.example.com:5000"] },注意如果之前文件中有数据,则是将添加,"insecure-registries":["myregistry.example.com:5000"] ,然后,重启dockersudo service docker restart,其中myregistry.example.com为dockerhub内网地址。
2.4.2 报错如下:
ERROR: Preparation failed: Error response from daemon: Get http://***/v2/:
dial tcp: lookup dockerhub.bmi on ****: read udp ****: read: connection refused
(docker.go:143:0s)
修改宿主机DNS,修改文件/etc/resolvconf/resolv.conf.d/base,添加nameserver *.*.*.*,其中*.*.*.*为具体的DNS设置。然后宿主机执行命令:
sudo /etc/init.d/resolvconf restart