目錄
背景
本節是繼DevOps實例演示
的第三篇文章, 在上一篇文章中, 我們已經成功安裝部署了GitLab
可以方便的對我們的Git倉庫進行管理了,但是要實現我們的需求,僅僅安裝GitLab
還不行, 還需要安裝一個插件Git-Runner
,來進行我們真正的pipeline
工作
聲明: 在本文以及本系列文中, 不會涉及公司內部相關內容,旨在能幫助到和我一樣摸着光亮前進的人。
備註: 在閱讀本章節前, 若您掌握有一定的git命令
以及Linux
知識那將更容易理解。
介紹
在上篇文章, 我們說了GitLab
對於Cicd
有着天然的優勢, 那麼他體現在哪呢, 看下面的一張圖.
這張圖裏面都幹了什麼:
- 首先我們本地的代碼開發完成之後, 我們要將本地的
Local
分支Merge到Develop分支(有的也可能叫Master分支)
- 第二步, 我們將合併之後的代碼
Push
提交到我們的Git版本庫 - 第三步, 因爲我們的git倉庫通過
GitLab
管理, 在GitLab
管理控制檯裏面有一個選項叫CiCd Configration
當你點擊這一項的配置的時候, 便會在你的當前git項目的根目錄下生成一個 .gitlab-ci.yml
的配置文件(具體怎麼編寫這個配置文件, 後續有介紹),在這個配置文件裏面我們可以指定我們的pipeline(流水線, 這個名詞其實指的是, 當你的代碼提交上來之後, 要觸發哪些工作)
, 當我們編寫好了配置文件.那現在ta
就好比一個菜譜, 規定了怎麼做一道菜, 那麼問題來了, 具體誰來照着菜譜做這道菜呢? 就是我們第四步中的Git-Runner(顧名思義, 就是運行Git任務的組件)
- 第四步, 我們在配置文件指定了, 需要讓哪臺
Runner
來執行我們的任務, 那麼ta
就會按照菜譜去炒菜
。
安裝
系統
CentOS Linux release 7.5.1804 (Core)
下載
gitlab-runner rpm包
[root@gitlab-runner-64 ~]# curl -s https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash
Detected operating system as centos/7.
Checking for curl...
Detected curl...
Downloading repository file: https://packages.gitlab.com/install/repositories/runner/gitlab-runner/config_file.repo?os=centos&dist=7&source=script
done.
Installing pygpgme to verify GPG signatures...
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.nwsuaf.edu.cn
* extras: mirrors.nwsuaf.edu.cn
* updates: mirrors.nwsuaf.edu.cn
runner_gitlab-runner-source/signature | 836 B 00:00:00
Retrieving key from https://packages.gitlab.com/runner/gitlab-runner/gpgkey
Importing GPG key 0xE15E78F4:
Userid : "GitLab B.V. (package repository signing key) <[email protected]>"
Fingerprint: 1a4c 919d b987 d435 9396 38b9 1421 9a96 e15e 78f4
From : https://packages.gitlab.com/runner/gitlab-runner/gpgkey
runner_gitlab-runner-source/signature | 951 B 00:00:00 !!!
runner_gitlab-runner-source/primary | 175 B 00:00:02
Package pygpgme-0.3-9.el7.x86_64 already installed and latest version
Nothing to do
Installing yum-utils...
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.nwsuaf.edu.cn
* extras: mirrors.nwsuaf.edu.cn
* updates: mirrors.nwsuaf.edu.cn
Package yum-utils-1.1.31-46.el7_5.noarch already installed and latest version
Nothing to do
Generating yum cache for runner_gitlab-runner...
Importing GPG key 0xE15E78F4:
Userid : "GitLab B.V. (package repository signing key) <[email protected]>"
Fingerprint: 1a4c 919d b987 d435 9396 38b9 1421 9a96 e15e 78f4
From : https://packages.gitlab.com/runner/gitlab-runner/gpgkey
The repository is setup! You can now install packages.
安裝
gitlab-runner
root@gitlab-runner-64 ~]# yum install gitlab-runner -y
啓動
gitlab-runner
[root@gitlab-runner-64 ~]# systemctl start gitlab-runner
[root@gitlab-runner-64 ~]# systemctl status gitlab-runner
● gitlab-runner.service - GitLab Runner
Loaded: loaded (/etc/systemd/system/gitlab-runner.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2018-11-20 15:33:55 CST; 1min 15s ago
Main PID: 27906 (gitlab-runner)
Memory: 4.9M
CGroup: /system.slice/gitlab-runner.service
└─27906 /usr/lib/gitlab-runner/gitlab-runner run --working-directory /home/gitlab-runner --config /etc/gitlab-runner/config.toml --service gitla...
Nov 20 15:33:55 gitlab-runner-64 gitlab-runner[27906]: Running in system-mode.
Nov 20 15:33:55 gitlab-runner-64 gitlab-runner[27906]: Running in system-mode.
Nov 20 15:33:55 gitlab-runner-64 gitlab-runner[27906]:
Nov 20 15:33:55 gitlab-runner-64 gitlab-runner[27906]:
Nov 20 15:33:55 gitlab-runner-64 gitlab-runner[27906]: Configuration loaded builds=0
Nov 20 15:33:55 gitlab-runner-64 gitlab-runner[27906]: Configuration loaded builds=0
Nov 20 15:33:55 gitlab-runner-64 gitlab-runner[27906]: Listen address not defined, metrics server disabled builds=0
Nov 20 15:33:55 gitlab-runner-64 gitlab-runner[27906]: Listen address not defined, metrics server disabled builds=0
Nov 20 15:33:55 gitlab-runner-64 gitlab-runner[27906]: Listen address not defined, session server disabled builds=0
Nov 20 15:33:55 gitlab-runner-64 gitlab-runner[27906]: Listen address not defined, session server disabled builds=0
註冊
gitlab
這一步很關鍵
[root@gitlab-runner-64 ~]# gitlab-runner register
Runtime platform arch=amd64 os=linux pid=28891 revision=cf91d5e1 version=11.4.2
Running in system-mode.
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
# ------------------------------------------------------------這一步填寫項目的地址
http://xxxxxxxxxx
Please enter the gitlab-ci token for this runner:
# ------------------------------------------------------------這一步項目的Token
xxxxxxxxxxxxxxxxx
Please enter the gitlab-ci description for this runner:
# ------------------------------------------------------------這一步添加runner的描述. 例如runner java
[gitlab-runner-64]: gitlab-runner-test
Please enter the gitlab-ci tags for this runner (comma separated):
# -----------------------------------------這一步添加runner的別名, 在gitlab-ci.yml通過這個選擇運行的runner
my-tag,another-tag
Registering runner... succeeded runner=xiwkMztd
Please enter the executor: docker+machine, kubernetes, docker, parallels, shell, ssh, virtualbox, docker-ssh+machine, docker-ssh:
# ------------------------------------------------------------這一步選擇runner運行的方式
# ------------------------------------------------------------筆者這裏選擇的shell(意味直接在部署runner本機進行運行)
# -----------------------------------------------若選用docker(意味, runner將在容器中運行,並且需要提前安裝docker環境)
# --------------------------------常用的就這兩種, 您也可自己學習一下其他, 關於shell,以及docker區別, 下一篇會做對比介紹
shell
Please enter the default Docker image (e.g. ruby:2.1):
maven:3-jdk-8 (針對於java環境)
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
#註冊完成之後,gitlab-runner的配置文件會改變
[root@gitlab-runner-64 ~]# cat /etc/gitlab-runner/config.toml
concurrent = 1
check_interval = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "gitlab-runner-test"
url = "http://10.39.47.63"
token = "477e1b6bba858703fd609e7ff991e4"
executor = "docker"
[runners.docker]
tls_verify = false
image = "golang:latest"
privileged = false
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/cache"]
shm_size = 0
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
通過上面的操作, 我們便部署好了Git-runner
, 上一步操作我們叫註冊, 這個是什麼意思呢, 舉個例子好比滴滴平臺
和滴滴車主
的關係, 車主需要自己主動向平臺註冊
, 那麼平臺有任務了, 會給分配給車主去執行
.
在這裏, 也一樣, 在gitlab中一個項目好比一個平臺
, 當runner
主動註冊之後, 在執行pipeline的時候, 纔會指定runner去執行
.
那麼我們看一下註冊完成之後的
gitlab界面, 可以看到在Runners
菜單中多了一個runner
簡單使用
我們在git倉庫的根目錄下, 編輯.gitlab-ci.yml
文件輸入下面的內容,並保存
# 這個配置文件編寫的格式, 是`yml`格式, 靠縮進來區分,還算比較友好
stages:
- test-job #調度test-job任務
# test-job
test-job:
stage: test-job #(一個stage便是一個任務,可以起一個別名, 在最外層統一調度任務)
script:
- echo "========== hello gitlab-runner"
模擬測試
我們模擬提交一次代碼, 之後查看執行結果, 可以看到當我們代碼提交之後, 成功觸發了,我們的任務
真實案例
下面看一下筆者真實項目中的gitlab-ci.yml
配置文件
stages:
- get_git_log
- git_clone_di
- build_java
- get_clone_doc
- ansible_deploy
# get_git_log(格式化獲取最近一次提交的記錄, 並記錄到文本中)
get_git_log:
stage: get_git_log
script:
- echo `git log --pretty=format:\"%an-%h-%s-%H\" -2` > /usr/local/ansible-playbook/email/gitLog.txt
# 克隆後端代碼(這一塊涉及內部鏈接, 用xxxxxxxxxxxxxxxxxxx代替)
git_clone_di:
stage: git_clone_di
script:
- cd /usr/dixDevops/dixDi
- rm -rf *
- git clone -b develop 'https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
# 編譯構建後端代碼(因爲我使用的runner是shell,所以需要提前在runner 的服務器安裝jdk 以及maven)
build_java:
stage: build_java
script:
- cd /usr/dixDevops/dixDi/DI
- mvn clean package -Dmaven.test.skip=true
# 克隆文檔(產品使用的操作文檔,涉密部分用xxxxx替代)
git_clone_doc:
stage: get_clone_doc
script:
- cd /usr/dixDevops/dixDoc
- rm -rf *
- git clone --depth 1 https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- python -c "import os;import json; print json.dumps(os.listdir('./docs'))" > ./docs/list.json
# ansible自動部署(觸發ansible的自動部署模塊, 這一塊後續會詳細闡述)
ansible_deploy:
stage: ansible_deploy
script:
- tower-cli job launch --job-template=7 -v
執行結果
可以看到, 根據我們的配置runner總共用時10分39秒
到這裏, 我們通過安裝
GitLab
以及安裝GitLab-Runner
以及一系列的配置, 已經完成了我們的第一步操作, 如下圖
問題總結
背景
#安裝按照好gitlab-runner之後,gitlab-ci的runner默認使用gitlab-runner用戶執行操作;這樣就導致了 有時候我們#想要執行一個命令或者一個腳本, 總有頻繁的權限限制問題.
#通過指令ps aux|grep gitlab-runner可以看到:
/usr/bin/gitlab-ci-multi-runner run --working-directory /home/gitlab-runner --config /etc/gitlab-runner/config.toml --service gitlab-runner --syslog --user gitlab-runner
其中:
- working-directory:設置工作目錄, 默認是/home/{執行user}
- config:設置配置文件目錄,默認是/etc/gitlab-runner/config.toml
- user:設置執行用戶名,默認是gitlab-runner
因此想要更改user
爲root
只需要重新設置–user屬性即可,
步驟如下
#刪除gitlab-runner
sudo gitlab-runner uninstall
# 安裝並設置--user(例如我想設置爲root)
gitlab-runner install --working-directory /home/gitlab-runner --user root
#重啓gitlab-runner
sudo service gitlab-runner restart
驗證
再次執行ps aux|grep gitlab-runner會發現–user的用戶名已經更換成root了
/usr/bin/gitlab-ci-multi-runner run --working-directory /home/gitlab-runner --config /etc/gitlab-runner/config.toml --service gitlab-runner --syslog --user root
至此gitlab-runner執行.gitlab-cli.yaml時候便是以root用戶去執行操作,再也沒有繁瑣的權限問題了
來自root的溫馨提示:能力越大責任越大!
關於另一種安裝方式docker
以及,兩者之間的不同點, 以及如何選擇, 請查看本系列下一篇文章
DevOps系列GitLab-CICD(三)之安裝git-runner-docker安裝方式