一、模塊內容預覽
1、預准備環境
2、Gitlab DockerCompose搭建
3、Gitlab Runner DockerCompose搭建
4、Gitlab項目和GitlabRunner關聯
5、.gitlab-ci.yml模板
6、Gitlab Runner之shell Excutor (.gitlab-ci.yml) 案例演示
7、Gitlab Runner之docker Excutor (.gitlab-ci.yml) 案例演示
8、.gitlab-ci.yml文件中的cache用法
9、runners配置
二、模塊具體講解
1、預准備環境
在開始后面的演示大家需要准備一台服務器或者多台服務器。其實在實際CICD的環境中應該是多台,因為GitlabRunner會和Gitlab服務器不在同一台上面。具體為什么大家往下看就清楚了,這里不做過多的解釋,不啰嗦直接開搞。這里為了演示就拿一台服務器出來演示,多機是同樣的道理學習還是得要有舉一反三的能力,尤其是做技術的。沒有一成不變的教程,就算教程是對的但是也不一定適合你所處的環境還是得要折騰一下才會有結果,在技術的道路上不要想着有100%對的答案,只有100%對的思想。
| ip | 基礎環境 | 描述 | 操作系統 |
| 192.16.10.33 | Docker、DockerCompose以及其他環境。 | 宿主機 | Ubuntu |
重復說一下,你找的這台服務器一定要先安裝Docker,DockerCompose沒有安裝的先安裝docker不要着急看下面的。因為下面的所有的內容都是需要依賴Docker的環境。
不知道怎么安裝Docker,DockerCompose可以參考我的另一篇文章:https://www.cnblogs.com/dszazhy/p/14718416.html
好像上面我忘記記錄DockerCompose怎么搭建了,這里不浪費時間了大家自己抽時間百度一下吧很簡單的,對自己要有信心哦,加油歐力給!
2、Gitlab DockerCompose搭建
gitlab部署文件docker-compose.yml文件,自己隨便創建一個目錄放入這個文件。
version: '3.1' services: gitlab:
#image: gitlab/gitlab-ce:latest
image: registry.cn-hangzhou.aliyuncs.com/dsz-docker/gitlab-for-chinise:11.1.4 container_name: gitlab restart: always privileged: true hostname: 'gitlab' environment: TZ: 'Asia/Shanghai' GITLAB_OMNIBUS_CONFIG: | external_url 'http://192.168.10.33:8686' #記住這里一定要帶上端口否則gitlab項目clone地址也會沒有端口導致gitlab-runner拉取不到項目,這里特意提示下。其他的就都跟着我的具體大家看情況配置就好了。 gitlab_rails['time_zone'] = 'Asia/Shanghai' gitlab_rails['smtp_enable'] = true gitlab_rails['gitlab_ssh_host'] = '192.168.10.33' gitlab_rails['gitlab_shell_ssh_port'] = 33 ports: - '8686:8686' - '443:443' - '33:22' volumes: - /home/docker_gitlab/config:/etc/gitlab - /home/docker_gitlab/data:/var/opt/gitlab - /home/docker_gitlab/logs:/var/log/gitlab
以上文件創建好以后執行docker-compose up -d這時候gitlab就會起來了。記住這個命令要在這個文件所在的目錄執行,不要跑錯了地方。這些都是docker-compose基本用法不是本文的重點,后續這種問題都將一筆帶過。你若是想在別的任意目錄下執行可以加上-f。好了點到為止,我們繼續今天吧。
訪問:192.168.10.33:8686就可以登錄了,首次登陸會提示大家修改root用的密碼,大家修改一下再次登錄就好了。登錄好以后大家記得創建一個SpringBoot可以測試的項目哦。
以下是上面的文件中external_url不帶端口的話下面的地址就也沒有端口,導致gitlab-runner會已這個沒有端口的地址拉取項目,從而導致失敗。

3、Gitlab Runner DockerCompose搭建
gitlab-runner部署文件docker-compose.yml文件
version: '3.1'
services:
runner-guanfang:
image: gitlab/gitlab-runner:latest
container_name: gitlab-runner
restart: always
privileged: true
volumes:
#務必保證 /home/runner/config有寫的權限否則容器啟動會失敗
- /home/runner/config:/etc/gitlab-runner #容器與宿主機runner配置文件掛載,防止容器重啟或者recreate數據丟失,這個很重要。
- /var/run/docker.sock:/var/run/docker.sock #用於runner容器共享宿主機的docker,不然在runner容器里起容器端口掛載就會有問題了。解決Docker in Docker的問題。
同樣在這個文件的目下執行:docker-compose -d這樣gitlab-runner就起好了。上面gitlab也起好了,這樣基本所有的服務我們基本上都已經完成了。

以上表示啟動成功過,容器名可能跟我當前文檔演示的不一樣不用糾結都是自定的,大家想怎么改就怎么改吧。
3、Gitlab項目和GitlabRunner關聯
第1步:Gitlab中創建一個SpringBooot項目,下面紅色的幾個目錄或者文件是我們重點要操作的內容。
本文演示的項目DEMO地址可以分享給大家:https://github.com/ShouZhiDuan/gitlab-runner

第二步:點擊項目中的設置->CI/CD->Runner(這個就是跟我們部署的GitlabRunner有關系的地方)

第三步:點擊Runner展開詳情

黃色部分是等會用來關聯GitlabRunner的兩個重要參數。
藍色部分是已關聯的GitlabRunner列表,也就是跟當前項目關聯成的GitlabRunner都會顯示在這里。
紅色部分是配置環境變量的地方,一般都用於GitlabRunner中job構建的參數。雖然.gitlab-ci.yml也可以配置環境變量,但是這里如果涉及到密碼,例如docker倉庫的密碼等配置在這里相對會比較安全。
第四步:執行Gitlab項目與GitlabRunner關聯操作。
#執行以下命令,第一個gitlab-runner是你的容器名稱(根據實際你的容器名稱為准),第二個gitlab-runner是容器中的默認授權用戶,一般你啟動沒有特殊處理就默認輸入這個。 docker exec -it gitlab-runner gitlab-runner register
>>>>>> #復制上面黃色部分的兩個參數,第一個是項目倉庫地址,第二個是token相當於倉庫中項目的唯一標識以及免密獲取項目信息,這樣runner就可以通過這兩個參數拉取需要構建的項目數據。 Runtime platform arch=amd64 os=linux pid=24 revision=c1edb478 version=14.0.1 Running in system-mode. Enter the GitLab instance URL (for example, https://gitlab.com/): http://192.168.10.33:8686/ #輸入上面截圖的黃色區域第一個參數 Enter the registration token: nZyc2xXijBorc1mTQgfT #輸入上面截圖的黃色區域第二個參數 Enter a description for the runner: 持續集成部署測試 #這個是當前綁定runner的一個自定義描述,相當於別名自己以后看到這個名字就知道這個runner可以干什么。 Enter tags for the runner (comma-separated): run-springboot #這是這個runner的tag很重要,自定義。但是需要記住,因為再后續.gitlab-ci.yml中的job會用到。指定哪個tag決定你用哪個runner來執行任務。 Registering runner... succeeded runner=nZyc2xXi Enter an executor: kubernetes, docker-ssh, parallels, ssh, docker-ssh+machine, docker+machine, custom, docker, shell, virtualbox: doker #excutor模式選擇 #這里大家根據上面這一行提示的列表:kubernetes, docker-ssh, parallels, ssh, docker-ssh+machine, docker+machine, custom, docker, shell, virtualbox。 #選一個符合或者自己需要的方式,本文會給大家演示shell、docker兩種方式。具體兩者在用起來還是有很大的區別的。 #shell方式是基於我們啟動的runner容器環境構建任務比如maven,jdk,docker等, #具體需要什么樣的環境就看大家具體.gitlab-ci.yml文件job中執行的shell需要依賴什么環境了,所以大家在搭建前先想好自己項目在構建中需要什么環境。 #但是經過自己實操一把shell感覺還是存在一些問題,本文碰到的問題就是在構建過程中gitlab-runner用戶權限的問題,導致構建過程shell腳本執行失敗。但是也是可以解決,具體等會下面具體部署給大家說一下具體的場景具體的解決方式。 #docker方式感覺比shell方式友好很多,也不用在乎執行過程用戶權限等其他的問題構建很順暢甚至感覺性能比shell方式快好多,大大減少構建的周期,所以推薦大家用docker方式。具體的等會下面也會給大家演示一下部署。 Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
<<<<<<
操作完以上步驟出現Runner registered successfully表示關聯成功了。這樣就可以看到上面截圖藍色部分會出現自己剛才綁定runner進本信息。
5、.gitlab-ci.yml模板
excotor docker模式
before_script:
#befor_script表示一下每個任務執行開始前都要執行的一些內容,比如設置一些環節變量等。
#- export name=value #這樣你就可以在下面任意一個環節通過${name}去使用
image:
#這里是excutor(docker)模式全局job構建環境,這里把java項目常用的構建環境全部集成了一下鏡像。例如:jdk、maven、docker、docker-compose等。
#Dockerfile文件在項目/docker/Dockerfie,大家可以拉取代碼參考根據自己的實際情況做修改升級調整等。
#這樣以下每個stage構建需要的環境都有了。
name: registry.cn-hangzhou.aliyuncs.com/dsz-docker/runner-for-java:20210715-1
entrypoint: [""]
# 定義CI執行的階段的JOB,這里可以自己根據情況定義多少個階段
stages:
- whoami
- whoami2
- show_env
- build_image
- compile
- build
- run
#全局變量,在構建生命周期中大家都可以用到。
#以下參數大家可以根據自己測試時候的參數做調整,比如說docker倉庫信息等。大家都是有經驗的開發者,我就不多說了。
variables:
MAVEN_REPO: /.m2 #maven倉庫,注意這里是容器里面的倉庫地址,后面會把這個目錄掛載到宿主機里面去,方式每次構建拉取jar影響構建性能。
PROJECT: demo
IMAGE_FULL_NAME: registry.cn-hangzhou.aliyuncs.com/dsz-docker/demo:20210716-2
gitla_runner_image: registry.cn-hangzhou.aliyuncs.com/dsz-docker/dsz-gitlab-runner:20210715-1
dsz_docker_hub: registry.cn-hangzhou.aliyuncs.com
docker_user: duanshouzhi516518
docker_pwd: xxxxxx #這個密碼大家就可以配置到gitlab中我上面截圖紅色部分了使用方法一樣任然可以${password}去使用,就可以防止敏感數據暴露問題。
#任務1
whoami:
#image: docker:latest
stage: whoami
tags:
#這里寫大家在綁定Gitlab項目和GitlabRunner時候輸入的tag,這樣當前的job就會使用這個runner來跑任務。
#docker的模式會是每個任務都會分配一個docker容器環境來操作。
- gw-new-docker
script:
#測試shell,檢查docker的版本。這個很好用,類似於給大家debug調試一些東西。
- whoami
- docker -v
#任務2
whoami2:
#這里的image不要要配了,因為上面配置了全局的,所以下面所有的job都不需要配置。推薦大家這樣去做,不然每個job都要維護自己的image。
#這里也是excotor docker模式與shell模式比較大的區別。shell模式所有的環境都是基於runner容器的環境去操作的不需要特殊指定。
#但是這里配置image有點問題好像只能配置一個,如果大家在當前任務既要用到docker又要用到docker-compose這樣的方式就會有問題,所以推薦大家跟我一樣自己做一個全局的image然后讓這個image集成全局所有的CICD環境這樣就OK了。
#image: docker/compose:latest
stage: whoami2
tags:
- gw-new-docker
script:
- docker-compose -v
#任務3 注意這個任務前面有個.表示當前任務被注釋不會被執行。
.show_env_1:
stage: show_env
tags:
- gw-new-docker
script:
- echo "測試變量配置值"
#$test_name可以在gitlab頁面上設置,此處獲取
- echo $test_name
#任務4 大家仔細觀察發現上面的show_env_1和這個show_env_2所定義的stage都是show_env。意思是show_env這個stage會有兩個子任務show_env_1和show_env_2會並行執行,待會截圖大家就可以看的出來。
show_env_2:
stage: show_env
tags:
- gw-new-docker
script:
- echo "======當前環境變量======"
- env
#任務5
.build_image:
#image: docker:latest
stage: build_image
tags:
- gw-new-docker
script:
- cd docker
- docker login --username=$docker_user --password=$docker_pwd $dsz_docker_hub
# 這里的變量就是我們全局配置定義的了
- docker build -t $gitla_runner_image .
- docker push $gitla_runner_image
- rm -rf target
- docker rmi $gitla_runner_image
#任務6 構建springboot鏡像
compile:
# image: maven:latest
# image: registry.cn-hangzhou.aliyuncs.com/dsz-docker/maven:latest
stage: compile
allow_failure: false
# 指定構建的分支
only:
- master
tags:
- gw-new-docker
# 運行腳本
script:
- env
- mvn -Dmaven.repo.local=$MAVEN_REPO clean package -Dmaven.test.skip=true
artifacts:
name: $PROJECT
expire_in: 1 days #設置maven打包的jar定時移除時間節省磁盤空間,這個很重要如果構建體量大了你會發現磁盤會暴增。
paths: #指定移除文件目錄
- target/*.jar
# 任務7 構建SpringBoot鏡像
#按理說這個任務我們都知道構建打包發布docker鏡像SpringBoot標配會用到git、maven、docker環境,git在部署的runner里面會自帶大家不用管。如果這里用image來配置環境的話就會滿足不了。當然如果大家想這樣做,可以換個思維吧當前的任務拆成多個子任務,這樣每個子任務配置自己的環境應該也可以。 #我這里沒有試過,大家可以試一下。但是我覺得在定義構建任務的時候還是盡量少點,因為畢竟每個任務都會啟動一個docker容器來執行比較占用資源,從而影響構建時長。
build:
#image: docker:latest
stage: build
script:
# 這里的變量會自動獲取你當前推送代碼的gitlab用戶和密碼以及倉庫地址
#- docker login --username $CI_REGISTRY_USER --password $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker login --username=$docker_user --password=$docker_pwd $dsz_docker_hub
# 這里的變量就是我們全局配置定義的了
- docker build -t $IMAGE_FULL_NAME .
- docker push $IMAGE_FULL_NAME
- rm -rf target
- docker rmi $IMAGE_FULL_NAME
only:
- master
tags:
- gw-new-docker
#任務8 啟動SpringBoot容器
.run:
#image: docker:latest
#image: docker/compose:latest
stage: run
script:
#- docker stop $PROJECT || true
#- docker rm $PROJECT || true
- docker-compose down
- docker-compose up -d
only:
- master
tags:
- gw-new-docker
以上就是excutor docker的.gitlab-ci.yml文件,這個需要放在咋們自己項目的更目錄下,這樣gitlab-cicd會自動識別這個文件出發構建。
完成以上過程大家只要把代碼push到gitlab上就會自動觸發構建打包部署。下面貼幾個圖大家就清楚了,實際在部署的過程大家多點點就清楚了。
構建歷史列表

構建任務詳情


查看
查看job日志


查看構建結果

構建成功所有任務都是綠色的勾勾。
6、Gitlab Runner之shell Excutor (.gitlab-ci.yml) 案例演示(待續,休息中。。。。。。)
9、runners配置config.toml
更多可參考:https://www.cnblogs.com/wsl222000/p/12876464.html
concurrent = 1
check_interval = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "192.168.10.34.runner"
url = "https://nvxg.nvxclouds.com:9443/"
token = "b97HrVA9KKn3TAxmgLdY"
executor = "docker"
clone_url = "https://nvxg.nvxclouds.com:9443"
[runners.custom_build_dir]
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.docker]
tls_verify = false
image = "maven:latest"
privileged = true
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache", "/home/.m2/:/.m2/"]
pull_policy = "if-not-present"
shm_size = 300000
[[runners]]
name = "1034-vte-admin"
url = "https://nvxg.nvxclouds.com:9443/"
token = "P6SPrHgUReafesaLntHF"
executor = "docker"
clone_url = "https://nvxg.nvxclouds.com:9443"
[runners.custom_build_dir]
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.docker]
tls_verify = false
image = "maven:latest"
privileged = true
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache", "/home/.m2/:/.m2/"]
pull_policy = "if-not-present"
shm_size = 300000
[[runners]]
name = "1034.vet.front"
url = "https://nvxg.nvxclouds.com:9443/"
token = "-53ktRjb5AtJwHFFNoZd"
executor = "docker"
clone_url = "https://nvxg.nvxclouds.com:9443"
[runners.custom_build_dir]
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.docker]
tls_verify = false
image = "node:12.22.1"
privileged = true
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]
pull_policy = "if-not-present"
shm_size = 300000
[[runners]]
name = "1034.vte.admin"
url = "https://nvxg.nvxclouds.com:9443/"
token = "U-N3zbaD8zZaHHD17fjx"
executor = "docker"
clone_url = "https://nvxg.nvxclouds.com:9443"
[runners.custom_build_dir]
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.docker]
tls_verify = false
image = "node:12.22.1"
privileged = true
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]
pull_policy = "if-not-present"
shm_size = 300000
