Docker搭建自己的Gitlab CI Runner
目錄:
- Gitlab CI介紹
- 環境、軟體準備
- 安裝、註冊並啟動Gitlab Runner
- 定義專案構建流程
- FAQ
1、Gitlab CI介紹
CI:持續整合,我們通常使用CI來做一些自動化工作,比如程式的打包,單元測試,部署等,這種構建方式避免了打包環境差異引起的錯誤,提高了工作效率。Gitlab-CI是Gitlab官方提供的持續整合服務,我們可以在倉庫的根目錄下新建.gitlab-ci.yml檔案,自己定義持續整合流程模板,並且在Gitlab中配置runner,在之後的每次提交合並中將會觸發構建,並且可以通過Gitlab的hook, 在程式碼提交的各個環節自動地完成一系列的構建工作,總之對於一些非複雜性的整合需求,都是可以滿足的。
2、環境、軟體準備
本次演示環境,我是在本機mac上操作,以下是我本地軟體及版本:
- Git:git version 2.10.1 (Apple Git-78)
- Docker: Version 17.03.0-ce-mac1 (15583)
- Gitlab: GitLab Community Edition 8.17.4
- Gitlab Runner: Version 1.11.2
注意:本次我們使用選擇docker作為runner的executor,也或者可以使用docker安裝Gitlab Runner,所以我們需要提前安裝docker環境。Git是開源的分散式版本控制系統,Gitlab、Runner都需要依賴它,所以我們也需要提前安裝好git環境。這裡我就忽略git、docker、gitlab的安裝過程,著重說下Gitlab CI Runner安裝以及如何跑專案構建流程。
3、安裝、註冊並啟動Gitlab Runner
Gitlab Runner安裝方式有兩種,一種是直接二進位制檔案安裝,一種是基於docker映象安裝。
方式一:二進位制檔案安裝
1)下載對應作業系統的二進位制包,我這裡使用的是mac版本
sudo curl --output /usr/local/bin/gitlab-runner https://gitlab-ci-multi-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-ci-multi-runner-darwin-amd64
2)給gitlab-runner賦可執行許可權
sudo chmod +x /usr/local/bin/gitlab-runner
3)註冊runner
# gitlab-runner register
Please enter the gitlab-ci coordinator URL:
# 示例:http://gitlab.alibaba-inc.com/ci
Please enter the gitlab-ci token for this runner:
# xxxxxx
Please enter the gitlab-ci description for this runner:
# 示例:qd_api_runner
Please enter the gitlab-ci tags for this runner (comma separated):
# 示例:hwy
Whether to run untagged builds [true/false]:
# true
Please enter the executor: docker, parallels, shell, kubernetes, docker-ssh, ssh, virtualbox, docker+machine, docker-ssh+machine:
# docker
Please enter the default Docker image (e.g. ruby:2.1):
# maven:3-jdk-8
說明:
1、gitlab ci的地址以及token,從你要配置該runner到哪個專案,就去gitlab下該專案首頁右側設定—》CI/CD Pipelines—》Specific Runners下可以找到。
2、gitlab-ci tags這個很重要,在專案構建流程yaml檔案裡面指定tag,就是匹配使用哪個tag的runner,這裡我定義了hwy,回頭再配置檔案裡面就指定這個tag。
3、executor:執行者可以有很多種,這裡我們使用docker,方便構建執行。
4、Docker image:構建Docker image時填寫的image名稱,根據專案程式碼語言不同,指定不同的映象。我這裡專案是java語言的,所以我使用官方maven:3-jdk-8映象。
4)安裝並啟動gitlab-runner
cd ~
gitlab-runner install
gitlab-runner start
方式二:docker映象安裝
1)拉取gitlab-runner映象
sudo docker pull gitlab/gitlab-runner:latest
2)新增gitlab-runner container
sudo 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
3)註冊runner
sudo docker exec -it gitlab-runner gitlab-ci-multi-runner register
註冊過程略,方式同方式一步驟3.
方式一和方式二,若是runner註冊成功,此時到我們專案首頁右側設定—》CI/CD Pipelines—》Runners activated for this project就可以看到我們剛註冊的qd_api_runner了。如圖:
4、定義專案構建流程
專案的構建流程是由專案根目錄的.gitlab-ci.yml檔案控制的,關於gitlab-ci詳細的配置文件可以檢視 這裡 , 以下是一個簡單的Java Maven專案的例子.gitlab-ci.yml:
image: maven:3-jdk-8
test:
stage: test
script:
- mvn test
tags:
- hwy
我們提交該檔案到gitlab對應專案上去。
git add .gitlab-ci.yml
git commit -m "Add .gitlab-ci.yml"
git push origin develop
這個時候,我們從該專案的Pipelines選項卡下可以看到,有正在執行的剛新建的hwy的這個runner的pipelines了。點選進去可以看到控制檯實時輸出日誌。如圖:
上面是一個簡單的demo例項,一個pipeline只有一個job的型別,一般我們CI都是有好幾步組成,比如java專案,我們先build打包一下,如果成功了在執行一下test,最後我們deploy到機器上。像多步操作的流程,我們可以配置yml檔案,分解為多個job,來依次執行。例如下邊這個.gitlab-ci.yml檔案:
image: maven:3-jdk-8
stages:
- build
- test
- deploy
job_build:
stage: build
script:
- mvn clean install
only:
- develop
tags:
- hwy
job_test:
stage: test
script:
- mvn test
tags:
- hwy
job_deploy:
stage: deploy
script:
- echo "deploy over..."
tags:
- hwy
說明:這個yml檔案就是有3個job組成,依次為build、test、deploy。在執行這個CI流程時候,會分解成3個job依次執行。這裡tags: hwy就是指定使用哪個runner來執行這個job,我們也可以執行其他已註冊可用的runner。詳細gitlab pipline流程截圖如下:
FAQ
- 註冊gitlab-runner時,提示報錯:
GitLab Runner >= 9.0 can be used ONLY with GitLab CE/EE >= 9.0
這個因為預設gitlab runner安裝時最新版的,與我們正在使用的gitlab版本不匹配,那麼我們找到匹配的gitlab-runner版本安裝即可,從這裡我們可以找到 Runner和GitLab CE / EE相容性列表
- 有時runner會連線不上,或者在專案倉庫->設定->runner裡呈灰色,這有可能是runner機器上沒有啟動gitlab-runner引起的,可以執行ps -ef | grep gitlab看看是否存在gitlab-runner的程序,如果沒有則執行gitlab-runner start 命令啟動runner服務。
- 若已經配置好了gitlab-runner了,執行commit,pipeline狀態一直是pending,並且提示:
This build is stuck, because the project doesn't have any runners online assigned to it. Go to Runners page
這個是因為未找到對應的runner導致的,原因一是有可能gitlab-runner註冊失敗,原因二有可能是.gitlab-ci.yml配置檔案裡面tags沒有匹配到已註冊可用的runner。 每次maven:3-jdk-8去執行build和test都會重新拉取映象,下載依賴的jar包,比較耗時耗資源。這是因為docker image每次構建都是在獨立的container裡, maven的 .m2檔案並不會被多次構建公用,這裡我們可以通過修改gitlab-runner的配置,將maven .m2目錄加到volumes中,並增加映象拉取規則(預設是從遠端拉取映象,這裡修改為優先獲取本地映象,不存在時才去遠端拉取映象)。
# gitlab-runner list Listing configured runners ConfigFile=/Users/wanyang3/.gitlab-runner/config.toml qd_api_runner Executor=docker Token=xxxxxx URL=http://gitlab.alibaba-inc.com/ci # vim /Users/wanyang3/.gitlab-runner/config.toml [[runners]] ... [runners.docker] ... volumes = ["/cache","/Users/wanyang3/.m2:/root/.m2"] pull_policy = "if-not-present" ... # gitlab-runner restart
修改配置完成後,記得要重啟gitlab-runner。
參考資料: