前言
GitLab Runner是一個開源的項目,是用來執(zhí)行GitLab中的項目的根目錄下創(chuàng)建的.gitlab-ci.yml 腳本的工具。GitLab-CI可以比喻成管理工人的工廠,Runner是工廠里的工人,每個工人需要在工廠進行注冊,所負責的項目不同,所做的工作也不同。當工廠某一個項目發(fā)生變動時,需要通知對應的工人去做對應的工作。
具體部署流程圖

GitLab Runner簡介
1. Runner類型
- Shared Runner:所有工程都能夠用的,且只有系統(tǒng)管理員能夠創(chuàng)建
- Specific Runner:只有特定的項目可以使用。
2. GitLab Runner中相關(guān)概念介紹
管道(pipeline)
每個推送到 Gitlab 的提交都會產(chǎn)生一個與該提交關(guān)聯(lián)的管道(pipeline),若一次推送包含了多個提交,則管道與最后那個提交相關(guān)聯(lián),管道(pipeline)就是一個分成不同階段(stage)的作業(yè)(job)的集合。-
階段(Stage)
階段是對批量的作業(yè)的一個邏輯上的劃分,每個 GitLab CI/CD 都必須包含至少一個 Stage。多個 Stage 是按照順序執(zhí)行的,如果其中任何一個 Stage 失敗,則后續(xù)的 Stage 不會被執(zhí)行,整個 CI 過程被認為失敗
image.png
以圖中所示為例,整個 CI 環(huán)節(jié)包含三個 Stage:build、test 和deploy。
build 被首先執(zhí)行。如果發(fā)生錯誤,本次 CI 立刻失??;
test 在 build 成功執(zhí)行完畢后執(zhí)行。如果發(fā)生錯誤,本次 CI 立刻失??;
deploy 在 test 成功執(zhí)行完畢后執(zhí)行。如果發(fā)生錯誤,本次 CI 失敗。
下圖是Gitlab對階段和階段狀態(tài)的展示:


- 作業(yè)(Job)
作業(yè)就是運行器(Runner)要執(zhí)行的指令集合,Job 可以被關(guān)聯(lián)到一個 Stage。當一個 Stage 執(zhí)行的時候,與其關(guān)聯(lián)的所有 Job 都會被執(zhí)行。在有足夠運行器的前提下,同一階段的所有作業(yè)會并發(fā)執(zhí)行。作業(yè)狀態(tài)與階段狀態(tài)是一樣的,實際上,階段的狀態(tài)就是繼承自作業(yè)的。
關(guān)于job中詳細的參數(shù)介紹,請移步https://docs.gitlab.com/runner/
準備工作
- 準備gitlab 測試服務器,用于gitlab上的代碼存儲、CI等的配置
- 準備一臺部署服務器,用于安裝gitlab-ruuner并部署代碼
開始Go!
1. 準備gitlab服務器,并創(chuàng)建一個項目

2. 準備一臺部署服務器,用于安裝gitlab-ruuner并部署代碼
1. 在部署服務器上安裝gitlab-runner
# 安裝gitlab-runner
yum install gitlab-runner
2. 向GitLab-CI注冊gitlab-runner
-
找到你的gitlab上存放的項目,找到settings-->CI/CD-->Runner
runner-setting.png
runner-setting2.png - 部署服務器上進行runner注冊
gitlab-runner register

- url:gitlab所在的測試服務器地址
- token:項目的token,用于關(guān)聯(lián)runner和項目
- name:runner的名字,用于區(qū)分runner
- tags:用于匹配任務(jobs)和執(zhí)行任務的設備(runners),此處不填直接回車時,默認Can run untagged jobs值為true
- executor:執(zhí)行環(huán)境
-
注冊成功之后,我們就可以在gitlab的CI配置中看到剛才注冊的runner了
runner.png - 點開注冊好的runner,可以看到具體配置內(nèi)容
runner-confige.png
注意:如果你設置了Can run untagged jobs為No,那你需要在你gitlab-ci.yml文件中指定你要使用runner的tag,才能運行對應的runner,否則你任務可能一直在pending狀態(tài),找不到runner執(zhí)行。
3. 啟動gitlab-runner
- 前臺啟動
gitlab-runner run
- 后臺啟動(gitlab-runner service)
gitlab-runner install
gitlab-runner start
4. 配置ssh免登錄,用于將gitlab-runner服務器上獲取到的文件拷貝到服務器
- 首先登陸服務器,進入gitlab-runner用戶下生成一對公鑰,私鑰對。生成過程需要兩次輸密碼,直接回車即可。
ssh-keygen -t rsa -C 'your email@domain.com'
-
密鑰默認保存位置在 ~/.ssh 目錄下,打開后會看到私鑰文件 id_rsa 和公鑰文件 id_rsa.pub
ssh.png - 復制公鑰到你的部署服務器上
scp ~/.ssh/id_rsa.pub <用戶名>@<Linux的ip地址>:/root/.ssh/id_rsa.pub
- 把公鑰追加到服務器ssh認證文件中
cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
5.此后,從本地上傳文件到服務器就不需要輸用戶名,密碼了。
5. 在gitlab中配置變量,用于.gitlab-ci.yml文件

- 項目的根目錄下編寫.gitlab-ci.yml文件
##緩存 node_modules/目錄 下次構(gòu)建不會刪除
cache:
paths:
- node_modules/
stages: # Stages 表示構(gòu)建階段,這里有兩個階段 install, deploy
- build
- deploy
fetch: # Jobs 表示構(gòu)建工作,表示某個 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倉儲,觸發(fā)流水線

-
點擊每次構(gòu)建狀態(tài),可以查看構(gòu)建詳情,如果有錯誤的話可以點開構(gòu)建階段,查看錯誤詳情。
deploy-error.png

7. 到此,我們已經(jīng)完成了一套完整對自動化部署,之后只有g(shù)itlab倉庫有代碼更新,就可以觸發(fā)流水線了






