使用Gitlab CI/DI 自動生成docker鏡像

因?yàn)轫?xiàng)目中有多個project,所以搭建了一個gitlab server. gitlab除了git的功能之外,還額外提供了CI和DI的功能柬祠。因?yàn)轫?xiàng)目目前沒有做集成測試和靜態(tài)檢查庶溶,所以CI基本用不到坤候。但是可以用DI來將項(xiàng)目文件打包成docker和vm image. 便于后續(xù)部署吨拗。

添加 gitlab runner

runner其實(shí)就是一個工作機(jī)器箕慧,gitlab的任務(wù)不是在gitlab server上完成的检柬,而是在一些runner上面來執(zhí)行的献联。所以第一步要添加runner.

install runner

官網(wǎng)有詳細(xì)的安裝步驟,鏈接如下:

https://docs.gitlab.com/runner/install/linux-repository.html

需要執(zhí)行如下命令厕吉,以ubuntu為例子:

# For Debian/Ubuntu/Mint
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash

sudo apt-get install gitlab-runner

configure runner

根據(jù)gitlab的定義酱固,runner分為special和shared. 定義如下:

Shared Runners are useful for jobs that have similar requirements,
between multiple projects. Rather than having multiple Runners idling for
many projects, you can have a single or a small number of Runners that handle
multiple projects. This makes it easier to maintain and update Runners.

Specific Runners are useful for jobs that have special requirements or for
projects with a specific demand. If a job has certain requirements, you can set
up the specific Runner with this in mind, while not having to do this for all
Runners. For example, if you want to deploy a certain project, you can setup
a specific Runner to have the right credentials for this.

這里創(chuàng)建一個shared runner.

  1. 通過root賬號登錄gitlab,然后找到admin/runners頁面头朱。
  2. 找到這個頁面的一個token
  3. 在runner machine上執(zhí)行如下命令:
root@worker:/home/zhbo# gitlab-ci-multi-runner register
Running in system-mode.                            

Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://172.30.42.156
Please enter the gitlab-ci token for this runner:
a8hH15vcz_ssa4FX8t-r
Please enter the gitlab-ci description for this runner:
[worker]:   
Please enter the gitlab-ci tags for this runner (comma separated):
package
Whether to run untagged builds [true/false]:
[false]:     
Whether to lock the Runner to current project [true/false]:
[true]: false
Registering runner... succeeded                     runner=a8hH15vc
Please enter the executor: ssh, docker+machine, docker, docker-ssh, parallels, shell, virtualbox, docker-ssh+machine, kubernetes:
ssh, docker+machine, docker, docker-ssh, parallels, shell, virtualbox, docker-ssh+machine, kubernetes
ERROR: Invalid executor specified                  
Please enter the executor: ssh, docker+machine, docker, docker-ssh, parallels, shell, virtualbox, docker-ssh+machine, kubernetes:
[ssh, docker+machine, docker, docker-ssh, parallels, shell, virtualbox, docker-ssh+machine, kubernetes]:
ERROR: Invalid executor specified                  
Please enter the executor: docker, docker-ssh, parallels, shell, virtualbox, docker-ssh+machine, kubernetes, ssh, docker+machine:
[ssh, docker+machine, docker, docker-ssh, parallels, shell, virtualbox, docker-ssh+machine, kubernetes]: shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

執(zhí)行完之后运悲,刷新admin/runners就可以看到新建的runner了。

配置job

上面已經(jīng)安裝好一個可用的runner项钮,接下來是配置在runner上執(zhí)行的job.

編寫.gitlab-ci.yml

gitlab提供了一個很方便的配置工具班眯,就是.gitlab-ci.yml, 將該文件放入到project的根目錄下即可烁巫。gitlab server上有詳細(xì)的文檔說明署隘,位置如下:
http://gitlab-server-ip/help/ci/yaml/README.md

以fcsslib項(xiàng)目為例,要配置一個生成docker鏡像的job亚隙, 每次對project打tag的時(shí)候就會觸發(fā)job執(zhí)行磁餐,生成一個fcsslib的鏡像,鏡像的version是tag的name. .gitlab-ci.yml的內(nèi)容如下:

after_script:
  - docker rmi $( docker images -q -f dangling=true)
stages:
  - build

package:
  stage: build
  script:
    - mkdir docker/src
    - cp -a app config.py manage.py docker/src/
    - cd docker
    - docker build -t fcss/taskmgr:$CI_COMMIT_REF_NAME .
  only:
    - tags
    - triggers
  tags:
    - package

其中Dockerfile的文件組織關(guān)系可以根據(jù)實(shí)際情況進(jìn)行調(diào)整。only 規(guī)定了只有g(shù)it tags操作和triggers才能觸發(fā)任務(wù)诊霹,triggers可以在gitlab的project->settings->CI/DI Pipelines下添加羞延,添加之后會生成一個token,使用這個token就可以隨時(shí)觸發(fā)一次job了脾还,在測試的時(shí)候非常有用伴箩。 tags 用來篩選符合條件的runners。

默認(rèn)的script運(yùn)行的位置是project的根目錄鄙漏,runner會先將整個project取下來嗤谚,然后在project根目錄下運(yùn)行job.

更多.gitlab-ci.yml文件的用法可以參考上面說的配置文檔。

配置權(quán)限

在runner上運(yùn)行任務(wù)的時(shí)候使用的是gitlab-runner賬戶怔蚌,該賬戶沒有root權(quán)限巩步,如果想使用更高的權(quán)限可以對gitlab-runner賬戶進(jìn)行提權(quán)。

這里因?yàn)橹挥衐ocker命令需要更高的權(quán)限桦踊,可以使用創(chuàng)建docker用戶組的方式解決渗钉。在runner上使用root賬戶執(zhí)行如下命令:

usermod -aG docker gitlab-runner

然后就可以執(zhí)行docker命令打包了。

docker文件的編寫

可以參考docker官方網(wǎng)站的實(shí)現(xiàn)钞钙。生成的docker鏡像也可以根據(jù)需要上傳到本地倉庫便于后續(xù)部署。這些操作都可以在job中執(zhí)行声离,此處不再做過多說明芒炼。

job的觸發(fā)

按照上面的.gitlab-ci.yml文件中指定的規(guī)則,有兩種方法可以觸發(fā)job的執(zhí)行术徊。

triggers

可以執(zhí)行如下命令:

http://:gitlab-server/api/v4/projects/:project_id/ref/REF_NAME/trigger/pipeline?token=TOKEN

git tags

可以對當(dāng)前項(xiàng)目打標(biāo)簽來觸發(fā)job的執(zhí)行本刽。git tag的常見命令如下:

列出標(biāo)簽
$ git tag # 在控制臺打印出當(dāng)前倉庫的所有標(biāo)簽
$ git tag -l 'v0.1.\*'
打標(biāo)簽

git標(biāo)簽分為兩種類型:輕量標(biāo)簽和附注標(biāo)簽。輕量標(biāo)簽是指向提交對象的引用赠涮,附注標(biāo)簽則是倉庫中的一個獨(dú)立對象子寓。建議使用附注標(biāo)簽。

創(chuàng)建輕量標(biāo)簽
$ git tag v0.1.2-light
創(chuàng)建附注標(biāo)簽
$ git tag -a v0.1.2 -m “0.1.2版本”

創(chuàng)建輕量標(biāo)簽不需要傳遞參數(shù)笋除,直接指定標(biāo)簽名稱即可斜友。
創(chuàng)建附注標(biāo)簽時(shí),參數(shù)a即annotated的縮寫垃它,指定標(biāo)簽類型鲜屏,后附標(biāo)簽名。參數(shù)m指定標(biāo)簽說明国拇,說明信息會保存在標(biāo)簽對象中洛史。

切換到標(biāo)簽

與切換分支命令相同,用git checkout [tagname]
查看標(biāo)簽信息
用git show命令可以查看標(biāo)簽的版本信息:

$ git show v0.1.2
刪除標(biāo)簽

誤打或需要修改標(biāo)簽時(shí)酱吝,需要先將標(biāo)簽刪除也殖,再打新標(biāo)簽。

$ git tag -d v0.1.2 # 刪除標(biāo)簽

參數(shù)d即delete的縮寫务热,意為刪除其后指定的標(biāo)簽忆嗜。

給指定的commit打標(biāo)簽
打標(biāo)簽不必要在head之上己儒,也可在之前的版本上打,這需要你知道某個提交對象的校驗(yàn)和(通過git log獲撒帧)址愿。

補(bǔ)打標(biāo)簽
$ git tag -a v0.1.1 9fbc3d0
標(biāo)簽發(fā)布

通常的git push不會將標(biāo)簽對象提交到git服務(wù)器,我們需要進(jìn)行顯式的操作:

$ git push origin v0.1.2 # 將v0.1.2標(biāo)簽提交到git服務(wù)器
$ git push origin –tags # 將本地所有標(biāo)簽一次性提交到git服務(wù)器

注意:如果想看之前某個標(biāo)簽狀態(tài)下的文件冻璃,可以這樣操作

  1. git tag 查看當(dāng)前分支下的標(biāo)簽
  2. git checkout v0.21 此時(shí)會指向打v0.21標(biāo)簽時(shí)的代碼狀態(tài)响谓,(但現(xiàn)在處于一個空的分支上)
  3. cat test.txt 查看某個文件
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市省艳,隨后出現(xiàn)的幾起案子娘纷,更是在濱河造成了極大的恐慌,老刑警劉巖跋炕,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赖晶,死亡現(xiàn)場離奇詭異,居然都是意外死亡辐烂,警方通過查閱死者的電腦和手機(jī)遏插,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纠修,“玉大人胳嘲,你說我怎么就攤上這事】鄄荩” “怎么了了牛?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辰妙。 經(jīng)常有香客問我鹰祸,道長,這世上最難降的妖魔是什么密浑? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任蛙婴,我火速辦了婚禮,結(jié)果婚禮上尔破,老公的妹妹穿的比我還像新娘敬锐。我一直安慰自己,他們只是感情好呆瞻,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布台夺。 她就那樣靜靜地躺著,像睡著了一般痴脾。 火紅的嫁衣襯著肌膚如雪颤介。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機(jī)與錄音滚朵,去河邊找鬼冤灾。 笑死,一個胖子當(dāng)著我的面吹牛辕近,可吹牛的內(nèi)容都是我干的韵吨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼移宅,長吁一口氣:“原來是場噩夢啊……” “哼归粉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起漏峰,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤糠悼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后浅乔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體倔喂,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年靖苇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了席噩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡贤壁,死狀恐怖班挖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情芯砸,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布给梅,位于F島的核電站假丧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏动羽。R本人自食惡果不足惜包帚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望运吓。 院中可真熱鬧渴邦,春花似錦、人聲如沸拘哨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽倦青。三九已至瓮床,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背隘庄。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工踢步, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人丑掺。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓获印,卻偏偏與公主長得像,于是被迫代替她去往敵國和親街州。 傳聞我的和親對象是個殘疾皇子兼丰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容