Gitlab-CI持續集成之Runner配置和CI腳本
一、簡介
1. 為實現持續集成,需為該項目准備以下兩樣東西:
1)軟件集成腳本.(gitlab-ci.yml)
2)一台Runner服務器
當然,考慮到集成環境的配置,還需要docker鏡像作為載體。
2. 基本流程如下:
1)安裝Runner服務器,注冊和項目對應的Runner Service(后續再說Shared Runner),編寫集成腳本;
2) 每當push代碼, 自動觸發腳本,Gitlab將變動告知Gitlab-CI,CI連接Runner服務器,找到關聯的Runner Service,Runner負責更新代碼到本地,並執行集成腳本。
二、安裝Runner
1. Centos7使用yum安裝
1)添加yum源
a.官方源
1 curl –L https://package.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash
b.國內源
cat << EOF >> /etc/yum.repos.d/gitlab-ci-multirunner.repo [gitlab-ci-multi-runner] name=gitlab-ci-multi-runner baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ci-multi-runner/yum/el7 repo_gpgcheck=0 gpgcheck=0 enabled=1 gpgkey=https://packages.gitlab.com/gpg.key EOF
sudo yum makecache
2)安裝1.11.2版本
sudo yum install gitlab-ci-multi-runner-1.11.2-1
由於公司Gitlab版本目前是8.X,官方Gitlab最新是9.0,Runner最新版不支持9.0以下版本的Gitlab,因此只能安裝該版本。視Gitlab服務器的版本而定。
3)Runner用戶權限
Runner默認會在服務器上創建gitlab-runner用戶, 所有的Runner Service則默認通過該用戶執行集成腳本,因此該用戶需要較高的權限。尤其是使用Docker鏡像時,必須加入docker組。
sudo usermod -aG docker gitlab-runner
2.Ubuntu使用apt-get安裝
1)添加apt源
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.deb.sh | sudo bash
2)安裝1.11.2版本
sudo yum install gitlab-ci-multi-runner-1.11.2-1
3)Runner用戶權限(同上)
3.安裝包安裝
下載二進制文件或相應系統的安裝包安裝即可,gitlab-ci-multi-runner-1.11.2安裝包。
三、注冊Runner
1.進入自己的Project—>設置Runners
2.查看Specific Runners里面的url和token
3.在Runner服務器執行注冊命令
gitlab-runner register --non-interactive \ --url http://gitlab.xxxxx.com/ci \ --registration-token GWGGXZNxbxabcdMaXZhj9 \ --name Crowd_Job_CI \ --tag-list 172.17.3.126 \ --run-untagged=true \ --executor shell \ --builds-dir /home/gitlab-runner \ --config "/etc/gitlab-runner/config.toml"
--url 項目CI地址*
-- registration-token 項目里剛才看到的token,互相關聯的標志*
--name 該Special Runner服務名,便於后台管理(查看、刪除、調用)*
--tag-list 該Special Runner標簽,集成腳本中可以通過指定tag關聯
--run-untagged 是否運行無標簽的集成腳本,必須用等號
--excutor 規定集成腳本執行的環境,還可以是docker等*
-- builds-dir 默認該文件夾,可以自定義項目集成初始化的位置
--config 默認配置文件,存儲注冊信息,可以自定義不同的配置文件
刷新頁面看到已經注冊成功,可以使用了。
四、運行Runner
假設集成腳本已就緒,那么就需要運行Runner
1.使用Specific Runner
1)run-single
gitlab-ci-multi-runner run-single \ --url http://gitlab.sensenets.com/ci --token 37fe0fa59e3475e20e24b6e6afc7c3 --executor shell
當然這里也可以指定注冊時的大部分參數,不過無論如何url、token(Runner的token,而非注冊時項目的token)、executor這三個參數是必須的。
run-single命令很簡單的把我們剛才注冊的Runner運行起來了,如果這個Runner對應的項目有更新,這個運行的服務就會去執行腳本內容。
即便我們不運行run-single命令,默認會有一個已經運行狀態的Runner Service,名稱就是gitlab-runner,會自動執行所有注冊過的Runner,但同時只能執行一個任務。
2)run 、install、start
上圖說明了Runner的原理:
安裝gitlab-ci-multi-runner服務器,相當於一個勞務公司的創辦,它管理Runner工人,外包各種項目Project。
注冊的目的是把項目和Runner連接起來,因為部分項目的Runner可能需要定制。Runner好比是一個工人,在勞務中心(gitlab-ci-multi-runner)登記合同,供職於我們的Project(但是當他比較閑的時候,也可以去其他公司兼職)。
但是對應的RunnerService相當於Runner工人的管理層,一個管理層可以管理一個甚至多個工人。勞務公司默認有一個公用的管理層,服務名就是上面所說的gitlab-runner,如果我們不指定管理層,那么勞務公司所有工人都被gitlab-runner管理運行。這個管理人員比較弱,一次只能管理一個項目,其他項目會等待。
run、run-sigle相當於一次性的外包項目,非常具有針對性。
install則是把一個或者幾個runner包裝好,然后start,就是一個有着管理服務的工人體系,隨時待命。
當Project更新,觸發Runner服務器上的Runner Service(某管理隊伍),Runner Service根據自己的配置信息,和項目的需求(tag指定某個工人),派遣Runner工人去執行Project給予的任務(Job)。
配置信息相當於花名冊,不注冊僅僅寫一個花名冊是不行的,working_dir相當於辦公地點。
下面安裝兩個服務並啟動:
gitlab-runner install \ -n "jiukun_self_runner" \ -d "/home/jiukunz" \ -c "/etc/gitlab-runner/config_jiukun_test.toml" \ -u gitlab-runner
gitlab-runner install \ -n "jiukun_self2_runner" \ -d "/home/jiukunz" \ -c "/etc/gitlab-runner/config_jiukun_test.toml" \ -u gitlab-runner
1 gitlab-runner start -n jiukun_self_runner 2 gitlab-runner start -n jiukun_self2_runner
其中,-n為安裝的服務名稱,-d為工作路徑,-c為配置文件,-u為執行用戶(服務名稱和執行用戶必須指定,配置文件和工作路徑可以使用默認路徑)
其實,當我們執行上述安裝命令時,gitlab-ci-multi-runner后台實際是將run命令寫入/etc/systemd/system/jiukun_self_runner.service文件,使之成為一個單獨的服務:
2.使用Shared Runner
使用share runner需要管理員權限,聯系公司gitlab管理員,獲取token。然后使用和Special Runner一樣的方法注冊成功。
進入任意項目的Runner頁面,將看到以下內容:
這里我重復注冊了兩次,可以看到Runner無論是名字還是tag都可以重復,但是Runner的token卻不相同,實際上區分不同的Runner工人只需要兩樣東西就是url和token。當然並不建議進行相同命名,不便於管理。
公司所有的項目默認都可以使用Shared Runner,而不需要重復配置。
1)好處:對於大多數Runner的配置其實是完全相同的(同樣的executor,同樣的配置文件和工作路徑,同樣的依賴環境),如果每個項目都去一個個注冊不僅麻煩,而且不方便遷移,這時可以使用shared runner。
2)不足:如果一個項目的編譯所需的exector等其他配置(配置文件有更多可選配置),並且和其他項目需要單獨管理,這時最好使用Special Runner,並鎖定該Runner為項目本身使用,單獨管理。
五、管理Runner
1.注冊的runner列表
gitlab-runner list \ --config "/etc/gitlab-runner/config_jiukun_test.toml"
2.查看runner連接狀態
gitlab-runner verify \ --config "/etc/gitlab-runner/config_jiukun_test.toml"
3.取消注冊(移除)
gitlab-runner unregistry \ --url http://gitlab.xxxxxx.com/ci \ --token 9c1bb50065661ba766023016f6ebf2
不能直接在project的web端進行remove操作,否則這里會執行失敗
4管理gitlab-runner服務
gitlab-runner status \ -n jiukun_self_runner.service 不指定服務名,則默認為gitlab-runner服務 gitlab-runner stop \ -n jiukun_self_runner.service gitlab-runner restart \ -n jiukun_self_runner.service gitlab-runner uninstall \ -n jiukun_self_runner.service
執行uninstall會卸載該服務,與之對應的runner將無法通過該服務運行,請確保對應的CI任務已停止。
六、集成腳本
將集成腳本命名為.gitlab-ci.yml或者.gitlab-ci.yaml,放置在對應項目倉庫分支的根目錄下。
1. yaml語法
大小寫敏感、使用縮進代表層級、不允許使用Tab縮進,只能使用空格,縮進並無統一限制,但同級關系內要保持對齊即可。#代表注釋。
語言格式里存在減號和冒號這些特殊字符,因此要注意千萬別寫成中文的字符格式。
減號對應的是數組,冒號對應的是鍵值對(對象)。
2. 關鍵詞
1)image
如果使用docker作為Runner的executor,並且沒有設置默認的鏡像,此處需要設置鏡像;不使用可以省略
2)sevices
如果使用docker集群服務,可以直接調用服務;不使用可以省略
3)stages
定義各個階段名稱,如果省略,CI默認為三個階段
每個job都必須定義其所屬的階段,如果不定義,默認均屬於build階段;同階段任務並行對待,上一階段所有任務執行成功,才會繼續執行下一階段;語句依次執行,如果某一語句執行失敗,將返回錯誤碼,並宣告CI失敗。
如果定義stages,則job中的stage必須與之相對應。
4)before_script
定義在所有腳本運行之前執行的語句
5)after_script
定義在所有腳本運行之后執行的語句
6)variables
定義環境變量
7)cache
定義下個job會使用到的文件或內容
3. Jobs
.gitlab-ci.yml腳本內容的主體為一個個job,沒有數量限制,每個Job名稱可以相同也可以不同(最好不要相同),可以大小寫;每個Job內部至少有一個關鍵詞。常用關鍵詞如下
1)stage
和腳本全局stages對應(如果全局未定義,可使用默認)
2)image、services、variables
同全局關鍵詞
3)only
規定該腳本響應分支(項目其他分支不會觸發該腳本;如果不定義,會檢測所有分支;與之相反的關鍵詞是except)
4)before_script、after_script
同全局關鍵詞(注意,如果同時存在,會覆蓋全局關鍵詞對應列表內容)
5)script
腳本主體,使用方法和在shell內一樣,將在對應executor內運行一個shell環境,執行腳本內容。每個Job的shell環境不同(Job結束,該環境自動關閉)。
6)tags
指定Runner的標簽(通常一個項目有很多Runner,依靠tag區分)
7)artifacts
指定Job的產出文件路徑,如果該關鍵詞設定,可以直接在pipeline頁面下載該文件
8)when
默認一個job只有在上一階段所有job成功才會執行,通過when可以改,通常用來清理環境使用,以免失敗后無法清理,有四種可選參數。
on_success(上一階段所有Job成功才執行)
on_failure(上一階段任意Job失敗就執行)
always(總是執行)
manual(此階段由UI界面交互執行)
備注:以上純屬原創,學習來源為gitlab-runner官方中文文檔、gitlab-runner英文文檔、gitlab-ci英文文檔。如需轉載請注明出處,后續繼續完善。