前言
GitLab Runner是一個(gè)開源的項(xiàng)目,是用來執(zhí)行GitLab中的項(xiàng)目的根目錄下創(chuàng)建的.gitlab-ci.yml 腳本的工具徒恋。GitLab-CI可以比喻成管理工人的工廠讼油,Runner是工廠里的工人占调,每個(gè)工人需要在工廠進(jìn)行注冊(cè)邦泄,所負(fù)責(zé)的項(xiàng)目不同会涎,所做的工作也不同种樱。當(dāng)工廠某一個(gè)項(xiàng)目發(fā)生變動(dòng)時(shí)萧求,需要通知對(duì)應(yīng)的工人去做對(duì)應(yīng)的工作托享。
具體部署流程圖
GitLab Runner簡介
1. Runner類型
- Shared Runner:所有工程都能夠用的骚烧,且只有系統(tǒng)管理員能夠創(chuàng)建
- Specific Runner:只有特定的項(xiàng)目可以使用。
2. GitLab Runner中相關(guān)概念介紹
管道(pipeline)
每個(gè)推送到 Gitlab 的提交都會(huì)產(chǎn)生一個(gè)與該提交關(guān)聯(lián)的管道(pipeline)闰围,若一次推送包含了多個(gè)提交赃绊,則管道與最后那個(gè)提交相關(guān)聯(lián),管道(pipeline)就是一個(gè)分成不同階段(stage)的作業(yè)(job)的集合羡榴。-
階段(Stage)
階段是對(duì)批量的作業(yè)的一個(gè)邏輯上的劃分碧查,每個(gè) GitLab CI/CD 都必須包含至少一個(gè) Stage。多個(gè) Stage 是按照順序執(zhí)行的校仑,如果其中任何一個(gè) Stage 失敗忠售,則后續(xù)的 Stage 不會(huì)被執(zhí)行者冤,整個(gè) CI 過程被認(rèn)為失敗
image.png
以圖中所示為例,整個(gè) CI 環(huán)節(jié)包含三個(gè) Stage:build档痪、test 和deploy涉枫。
build 被首先執(zhí)行。如果發(fā)生錯(cuò)誤腐螟,本次 CI 立刻失斣柑;
test 在 build 成功執(zhí)行完畢后執(zhí)行乐纸。如果發(fā)生錯(cuò)誤衬廷,本次 CI 立刻失敗汽绢;
deploy 在 test 成功執(zhí)行完畢后執(zhí)行吗跋。如果發(fā)生錯(cuò)誤,本次 CI 失敗宁昭。
下圖是Gitlab對(duì)階段和階段狀態(tài)的展示:
- 作業(yè)(Job)
作業(yè)就是運(yùn)行器(Runner)要執(zhí)行的指令集合跌宛,Job 可以被關(guān)聯(lián)到一個(gè) Stage。當(dāng)一個(gè) Stage 執(zhí)行的時(shí)候积仗,與其關(guān)聯(lián)的所有 Job 都會(huì)被執(zhí)行疆拘。在有足夠運(yùn)行器的前提下,同一階段的所有作業(yè)會(huì)并發(fā)執(zhí)行。作業(yè)狀態(tài)與階段狀態(tài)是一樣的寂曹,實(shí)際上哎迄,階段的狀態(tài)就是繼承自作業(yè)的。
關(guān)于job中詳細(xì)的參數(shù)介紹隆圆,請(qǐng)移步https://docs.gitlab.com/runner/
準(zhǔn)備工作
- 準(zhǔn)備gitlab 測(cè)試服務(wù)器漱挚,用于gitlab上的代碼存儲(chǔ)、CI等的配置
- 準(zhǔn)備一臺(tái)部署服務(wù)器渺氧,用于安裝gitlab-ruuner并部署代碼
開始Go!
1. 準(zhǔn)備gitlab服務(wù)器旨涝,并創(chuàng)建一個(gè)項(xiàng)目
2. 準(zhǔn)備一臺(tái)部署服務(wù)器,用于安裝gitlab-ruuner并部署代碼
1. 在部署服務(wù)器上安裝gitlab-runner
# 安裝gitlab-runner
yum install gitlab-runner
2. 向GitLab-CI注冊(cè)gitlab-runner
-
找到你的gitlab上存放的項(xiàng)目阶女,找到settings-->CI/CD-->Runner
runner-setting.png
runner-setting2.png - 部署服務(wù)器上進(jìn)行runner注冊(cè)
gitlab-runner register
- url:gitlab所在的測(cè)試服務(wù)器地址
- token:項(xiàng)目的token颊糜,用于關(guān)聯(lián)runner和項(xiàng)目
- name:runner的名字,用于區(qū)分runner
- tags:用于匹配任務(wù)(jobs)和執(zhí)行任務(wù)的設(shè)備(runners)秃踩,此處不填直接回車時(shí)衬鱼,默認(rèn)Can run untagged jobs值為true
- executor:執(zhí)行環(huán)境
-
注冊(cè)成功之后,我們就可以在gitlab的CI配置中看到剛才注冊(cè)的runner了
runner.png - 點(diǎn)開注冊(cè)好的runner,可以看到具體配置內(nèi)容
runner-confige.png
注意:如果你設(shè)置了Can run untagged jobs為No,那你需要在你gitlab-ci.yml文件中指定你要使用runner的tag,才能運(yùn)行對(duì)應(yīng)的runner憔杨,否則你任務(wù)可能一直在pending狀態(tài)鸟赫,找不到runner執(zhí)行。
3. 啟動(dòng)gitlab-runner
- 前臺(tái)啟動(dòng)
gitlab-runner run
- 后臺(tái)啟動(dòng)(gitlab-runner service)
gitlab-runner install
gitlab-runner start
4. 配置ssh免登錄,用于將gitlab-runner服務(wù)器上獲取到的文件拷貝到服務(wù)器
- 首先登陸服務(wù)器抛蚤,進(jìn)入gitlab-runner用戶下生成一對(duì)公鑰台谢,私鑰對(duì)。生成過程需要兩次輸密碼岁经,直接回車即可朋沮。
ssh-keygen -t rsa -C 'your email@domain.com'
-
密鑰默認(rèn)保存位置在 ~/.ssh 目錄下,打開后會(huì)看到私鑰文件 id_rsa 和公鑰文件 id_rsa.pub
ssh.png - 復(fù)制公鑰到你的部署服務(wù)器上
scp ~/.ssh/id_rsa.pub <用戶名>@<Linux的ip地址>:/root/.ssh/id_rsa.pub
- 把公鑰追加到服務(wù)器ssh認(rèn)證文件中
cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
5.此后缀壤,從本地上傳文件到服務(wù)器就不需要輸用戶名樊拓,密碼了。
5. 在gitlab中配置變量塘慕,用于.gitlab-ci.yml文件
- 項(xiàng)目的根目錄下編寫.gitlab-ci.yml文件
##緩存 node_modules/目錄 下次構(gòu)建不會(huì)刪除
cache:
paths:
- node_modules/
stages: # Stages 表示構(gòu)建階段筋夏,這里有兩個(gè)階段 install, deploy
- build
- deploy
fetch: # Jobs 表示構(gòu)建工作,表示某個(gè) Stage 里面執(zhí)行的工作图呢。
stage: build
script:
- echo "=====start build======"
- npm i
- npm run build
- echo "=====end build======"
only:
- master
artifacts:
expire_in: 2 week
paths:
- dist/
deploy-static:
stage: deploy
script:
- echo "=====start deploy======"
- scp -r ./dist root@$DEPLOY_SERVER_DEV:$WEB_DIR
- echo "=====end deploy======"
6. 把.gitlab-ci.yml文件推送到gitlab倉儲(chǔ)条篷,觸發(fā)流水線
-
點(diǎn)擊每次構(gòu)建狀態(tài),可以查看構(gòu)建詳情蛤织,如果有錯(cuò)誤的話可以點(diǎn)開構(gòu)建階段赴叹,查看錯(cuò)誤詳情。
deploy-error.png
7. 到此瞳筏,我們已經(jīng)完成了一套完整對(duì)自動(dòng)化部署稚瘾,之后只有g(shù)itlab倉庫有代碼更新,就可以觸發(fā)流水線了