在 GitLab 上構(gòu)建 CI 流水線
本文介紹如何在 GitLab 上配置 CI 流水線。我在前面的文章中介紹了 基于 CMake 和 VSCodium 的構(gòu)建系統(tǒng) 和 基于 GoogleTest 和 CTest 的單元測(cè)試。本文將在此基礎(chǔ)上進(jìn)一步配置 CI 流水線。我會(huì)先演示如何布設(shè)和運(yùn)行 CI 流水線,然后再介紹如何配置它。
CI 是指提交到代碼倉庫的代碼變更會(huì)被自動(dòng)構(gòu)建和測(cè)試。在開源領(lǐng)域,GitLab 是一個(gè)流行的 CI 流水線平臺(tái)。除了作為中心 Git 倉庫外,GitLab 還提供 CI/CD 流水線、問題跟蹤issue tracking 和 容器注冊(cè)表container registry功能。
相關(guān)術(shù)語
在進(jìn)入正題之前,我先介紹在本文和 GitLab 文檔 中會(huì)遇到的常見術(shù)語。
- 持續(xù)交付continuous delivery(CD):自動(dòng)化供應(yīng)軟件,以供隨時(shí)交付
- 持續(xù)部署continuous deployment(CD):自動(dòng)化軟件發(fā)布
- 流水線pipeline: CI/CD 的直接構(gòu)件,它由階段和作業(yè)構(gòu)成
- 階段stage:一組作業(yè)
- 作業(yè)job:某項(xiàng)需要執(zhí)行的具體任務(wù),比如編譯、單元測(cè)試等
- 執(zhí)行器runner:實(shí)際執(zhí)行作業(yè)的服務(wù)
布設(shè) CI 流水線
在下面的章節(jié)中,我將復(fù)用以前的 示例工程。點(diǎn)擊 GitLab 倉庫頁面右上角的 復(fù)刻Fork
Fork the project
設(shè)置執(zhí)行器
為了讓你對(duì)整個(gè)流程有所了解,我們先從在本地安裝執(zhí)行器講起。
參照?qǐng)?zhí)行器服務(wù) 安裝指南 安裝好服務(wù),然后注冊(cè)執(zhí)行器。
1、選擇 GitLab 項(xiàng)目頁面左側(cè)的 設(shè)置Settings,再選擇 CI/CD。
Select CI/CD in Settings
2、展開 執(zhí)行器Runners 區(qū)域,關(guān)閉 共享的執(zhí)行器Shared runners
Configure runner
3、在終端中運(yùn)行 gitlab-runner register
,根據(jù)提示輸入以下注冊(cè)信息:
- GitLab 實(shí)例: https://gitlab.com/ (如上圖)
- 注冊(cè)令牌:從執(zhí)行器區(qū)域中獲取 (如上圖)
- 描述:按需自由填寫
- 標(biāo)簽:可以不填
- 執(zhí)行環(huán)境:選 Shell
如果有需要,你可以在 ~/.gitlab-runner/config.toml
中修改這些配置。
4、用命令 gitlab-runner run
啟動(dòng)執(zhí)行器。你可以在 GitLab 的項(xiàng)目設(shè)置界面執(zhí)行器區(qū)域看到執(zhí)行器的狀態(tài):
Available specific runners
運(yùn)行流水線
前面已經(jīng)提過,流水線就是一組由執(zhí)行器執(zhí)行的作業(yè)。每個(gè)推送到 GitLab 的提交都會(huì)生成一個(gè)附加到該提交的流水線。如果多個(gè)提交被一起推送,那么只會(huì)為最后一個(gè)提交生成流水線。為了演示,我直接在 GitLab 在線編輯器中提交和推送修改。
打開 README.md
文件,添加一行數(shù)據(jù):
Web editor
現(xiàn)在提交修改。
這里注意默認(rèn)的行為是為提交新建一個(gè)分支,為了簡便起見,我們擇提交到主分支。
Commit changes
提交后一會(huì)兒后,你就應(yīng)該改能看到 GitLab 執(zhí)行器執(zhí)行的控制臺(tái)中有輸出消息:
Checking for jobs... received job=1975932998 repo_url=<https://gitlab.com/hANSIc99/cpp\_testing\_sample.git> runner=Z7MyQsA6
Job succeeded duration_s=3.866619798 job=1975932998 project=32818130 runner=Z7MyQsA6
在 GitLab 項(xiàng)目概覽界面左側(cè)選擇 CI/CD --> 管道Pipelines,查看最近執(zhí)行的流水線:
Pipeline overview
選中流水線可以在詳情界面看到哪些作業(yè)失敗了,并能查看各個(gè)作業(yè)的輸出。
當(dāng)遇到非零返回值是就認(rèn)為作業(yè)執(zhí)行失敗了。在下面的例子中我通過調(diào)用 exit 1
強(qiáng)制讓作業(yè)執(zhí)行失?。?/p>
Job overview
CI 配置
階段、流水線和作業(yè)的配置都在倉庫根目錄的 .gitlab-ci.yml 文件中。我建議使用 GitLab 內(nèi)置的流水線編輯器,它會(huì)自動(dòng)對(duì)配置進(jìn)行檢查。
stages:
- build
- test
build:
stage: build
script:
- cmake -B build -S .
- cmake --build build --target Producer
artifacts:
paths:
- build/Producer
RunGTest:
stage: test
script:
- cmake -B build -S .
- cmake --build build --target GeneratorTest
- build/Generator/GeneratorTest
RunCTest:
stage: test
script:
- cmake -B build -S .
- cd build
- ctest --output-on-failure -j6
文件中定義了兩個(gè)階段:build
和 test
,以及三個(gè)作業(yè):build
、RunGTest
和 RunCTest
。其中作業(yè) build
屬于一個(gè)同名的階段,另外兩個(gè)作業(yè)屬于階段 test
。
script
小節(jié)下的命令就是一般的 Shell 命令。你可以認(rèn)為是將它們逐行輸入到 Shell 中。
我要特別提及 產(chǎn)物artifact 這個(gè)特性。在示例中我定義了二進(jìn)制的 Producer
為作業(yè) build
的產(chǎn)物。產(chǎn)物會(huì)被上傳到 GitLab 服務(wù)器,并且可以從服務(wù)器的這個(gè)頁面上被下載:
Pipeline artifacts
默認(rèn)情況下,后續(xù)階段的作業(yè)會(huì)自動(dòng)下載先前階段作業(yè)生成的所有產(chǎn)物。
你可以在 docs.gitlab.com 上查看 gitlab-ci.yml
參考指南。
總結(jié)
上面只是一個(gè)最基本的例子,讓你對(duì)持續(xù)集成的一般原則有一個(gè)了解。再演示中我禁用了共享執(zhí)行器,然而這才是 GitLab 的優(yōu)勢(shì)所在。你可以在一個(gè)干凈的容器化的環(huán)境中構(gòu)架、測(cè)試和部署程序。除了使用 GitLab 提供的免費(fèi)執(zhí)行器,你也可以用自己的容器作為執(zhí)行器。當(dāng)然還有更高階的用法:用 Kubernetes 來協(xié)調(diào)調(diào)度執(zhí)行者容器,讓流水線適應(yīng)大規(guī)模使用的使用場(chǎng)景。如需進(jìn)一步了解,可以查看 about.gitlab.com。
如果你使用的是 Fedora,需要注意的一點(diǎn)是目前 GitLab 執(zhí)行者還不支持用 Podman 作為容器引擎。(LCTT 譯注:Podman 是 Fedora 自帶的容器引擎。)根據(jù) 議題issue #27119,對(duì) Podman 支持已將列上日程。(LCTT 譯注:Podman 4.2 及以上版本增加了對(duì)于 GitLab 執(zhí)行器的支持。)
把重復(fù)性的操作描述成作業(yè),并將作業(yè)合并成流水線和階段,可以讓你跟蹤它們的質(zhì)量而不增加額外工作。。特別是在大型社區(qū)項(xiàng)目中,適當(dāng)配置的 CI 可以告訴你提交的代碼是否對(duì)項(xiàng)目有改善,為你接受或拒絕合并請(qǐng)求提供依據(jù)。