1. 程式人生 > >Docker搭建自己的Gitlab CI Runner

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上操作,以下是我本地軟體及版本:

  1. Git:git version 2.10.1 (Apple Git-78)
  2. Docker: Version 17.03.0-ce-mac1 (15583)
  3. Gitlab: GitLab Community Edition 8.17.4
  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

  1. 註冊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相容性列表
  2. 有時runner會連線不上,或者在專案倉庫->設定->runner裡呈灰色,這有可能是runner機器上沒有啟動gitlab-runner引起的,可以執行ps -ef | grep gitlab看看是否存在gitlab-runner的程序,如果沒有則執行gitlab-runner start 命令啟動runner服務。
  3. 若已經配置好了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。
  4. 每次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。

參考資料: