自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

我用 GitHub Action 搭建了一套 CI/CD 系統(tǒng)

新聞 前端
本文是 Nebula Graph 工程師利用 GitHub Action 搭建 CI/CD 系統(tǒng)的實(shí)踐,希望能夠?qū)ψx者有所幫助,同時(shí)也歡迎讀者留言與作者進(jìn)行交流。

 [[325829]]

本文是 Nebula Graph 工程師利用 GitHub Action 搭建 CI/CD 系統(tǒng)的實(shí)踐,希望能夠?qū)ψx者有所幫助,同時(shí)也歡迎讀者留言與作者進(jìn)行交流。

1. 緣起

Nebula Graph 最早的自動(dòng)化測試是使用搭建在 Azure 上的 Jenkins,配合著 GitHub 的 Webhook 實(shí)現(xiàn)的,在用戶提交 Pull Request 時(shí),加個(gè) ready-for-testing 的 label 再評論一句 Jenkins go 就可以自動(dòng)的運(yùn)行相應(yīng)的 UT 測試,效果如下:

我用 GitHub Action 搭建了一套 CI/CD 系统

因?yàn)槭亲庥玫?Azure 的云主機(jī),加上 nebula 的編譯要求的機(jī)器配置較高,而且任務(wù)的觸發(fā)主要集中在白天。所以上述的方案性價(jià)比較低,從去年團(tuán)隊(duì)就在考慮尋找替代的方案,準(zhǔn)備下線 Azure 上的測試機(jī),并且還要能提供多環(huán)境的測試方案。

調(diào)研了一圈現(xiàn)有的產(chǎn)品主要有:

  1. TravisCI
  2. CircleCI
  3. Azure Pipeline
  4. Jenkins on k8s(自建)

雖然上面的產(chǎn)品對開源項(xiàng)目有些限制,但整體都還算比較友好。

鑒于之前 GitLab CI 的使用經(jīng)驗(yàn),體會到如果能跟 GitHub 深度集成那當(dāng)然是首選。所謂“深度”表示可以共享 GitHub 的整個(gè)開源的生態(tài)以及完美的 API 調(diào)用(后話)。恰巧 2019,GitHub Action 2.0 橫空出世,Nebula Graph 便勇敢的入了坑。

這里簡單概述一下我們在使用 GitHub Action 時(shí)體會到的優(yōu)點(diǎn):

  1. 免費(fèi)。開源項(xiàng)目可以免費(fèi)使用 Action 的所有功能,而且機(jī)器配置較高。
  2. 開源生態(tài)好。在整個(gè) CI 的流程里,可以直接使用 GitHub 上的所有開源的 Action,哪怕就是沒有滿足需求的 Action,自己上手寫也不是很麻煩,而且還支持 docker 定制,用 bash 就可以完成一個(gè)專屬的 Action。
  3. 支持多種系統(tǒng)。Windows、macOS 和 Linux 都可以一鍵使用,跨平臺簡單方便。
  4. 可跟 GitHub 的 API 互動(dòng)。通過 GITHUB_TOKEN 可以直接訪問 GitHub API V3,想上傳文件,檢查 PR 狀態(tài),使用 curl 命令即可完成。
  5. 自托管。只要提供 workflow 的描述文件,將其放置到 .github/workflows/ 目錄下,每次提交便會自動(dòng)觸發(fā)執(zhí)行新的 action run。
  6. Workflow 描述文件改為 YAML 格式。目前的描述方式要比 Action 1.0 中的 workflow 文件更加簡潔易讀。

下面在講實(shí)踐之前還是要先講講 Nebula Graph 的需求:首要目標(biāo)比較明確就是自動(dòng)化測試。

作為數(shù)據(jù)庫產(chǎn)品,測試怎么強(qiáng)調(diào)也不為過。Nebula Graph 的測試主要分單元測試和集成測試。用 GitHub Action 其實(shí)主要瞄準(zhǔn)的是單元測試,然后再給集成測試做些準(zhǔn)備,比如 docker 鏡像構(gòu)建和安裝程序打包。順帶再解決一下 PM 小姐姐的發(fā)布需求,就整個(gè)構(gòu)建起來了第一版的 CI/CD 流程。

2. PR 測試

Nebula Graph 作為托管在 GitHub 上的開源項(xiàng)目,首先要解決的測試問題就是當(dāng)貢獻(xiàn)者提交了 PR 請求后,如何才能快速地進(jìn)行變更驗(yàn)證?主要有以下幾個(gè)方面。

  • 符不符合編碼規(guī)范;
  • 能不能在不同系統(tǒng)上都編譯通過;
  • 單測有沒有失??;
  • 代碼覆蓋率有沒有下降等。

只有上述的要求全部滿足并且有至少兩位 reviewer 的同意,變更才能進(jìn)入主干分支。

借助于 cpplint 或者 clang-format 等開源工具可以比較簡單地實(shí)現(xiàn)要求 1,如果此要求未通過驗(yàn)證,后面的步驟就自動(dòng)跳過,不再繼續(xù)執(zhí)行。

對于要求 2,我們希望能同時(shí)在目前支持的幾個(gè)系統(tǒng)上運(yùn)行 Nebula 源碼的編譯驗(yàn)證。那么像之前在物理機(jī)上直接構(gòu)建的方式就不再可取,畢竟一臺物理機(jī)的價(jià)格已經(jīng)高昂,何況一臺還不足夠。為了保證編譯環(huán)境的一致性,還要盡可能的減少機(jī)器的性能損失,最終采用了 docker 的容器化構(gòu)建方式。再借助 Action 的 matrix 運(yùn)行策略 和對 docker 的支持,還算順利地將整個(gè)流程走通。

我用 GitHub Action 搭建了一套 CI/CD 系统

運(yùn)行的大概流程如上圖所示,在 vesoft-inc/nebula-dev-docker 項(xiàng)目中維護(hù) nebula 編譯環(huán)境的 docker 鏡像,當(dāng)編譯器或者 thirdparty 依賴升級變更時(shí),自動(dòng)觸發(fā) docker hub 的 Build 任務(wù)(見下圖)。當(dāng)新的 Pull Request 提交以后,Action 便會被觸發(fā)開始拉取最新的編譯環(huán)境鏡像,執(zhí)行編譯。

我用 GitHub Action 搭建了一套 CI/CD 系统

針對 PR 的 workflow 完整描述見文件 pull_request.yaml。同時(shí),考慮到并不是每個(gè)人提交的 PR 都需要立即運(yùn)行 CI 測試,且自建的機(jī)器資源有限,對 CI 的觸發(fā)做了如下限制:

  1. 只有 lint 校驗(yàn)通過的 PR 才會將后續(xù)的 job 下發(fā)到自建的 runner,lint 的任務(wù)比較輕量,可以使用 GitHub Action 托管的機(jī)器來執(zhí)行,無需占用線下的資源。
  2. 只有添加了 ready-for-testing  label 的 PR 才會觸發(fā) action 的執(zhí)行,而 label 的添加有權(quán)限的控制。進(jìn)一步優(yōu)化 runner 被隨意觸發(fā)的情況。對 label 的限制如下所示:
  1. jobs: 
  2.   lint: 
  3.     name: cpplint 
  4.     if: contains(join(toJson(github.event.pull_request.labels.*.name)), 'ready-for-testing'

在 PR 中執(zhí)行完成后的效果如下所示:

我用 GitHub Action 搭建了一套 CI/CD 系统

Code Coverage 的說明見博文:圖數(shù)據(jù)庫 Nebula Graph 的代碼變更測試覆蓋率實(shí)踐。

https://nebula-graph.io/cn/posts/integrate-codecov-test-coverage-with-nebula-graph/

3. Nightly 構(gòu)建

在 Nebula Graph 的集成測試框架中,希望能夠在每天晚上對 codebase 中的代碼全量跑一遍所有的測試用例。同時(shí)有些新的特性,有時(shí)也希望能快速地打包交給用戶體驗(yàn)使用。這就需要 CI 系統(tǒng)能在每天給出當(dāng)日代碼的 docker 鏡像和 rpm/deb 安裝包。

GitHub Action 被觸發(fā)的事件類型除了 pull_request,還可以執(zhí)行 schedule 類型。schedule 類型的事件可以像 crontab 一樣,讓用戶指定任何重復(fù)任務(wù)的觸發(fā)時(shí)間,比如每天凌晨兩點(diǎn)執(zhí)行任務(wù)如下所示:

  1. on: 
  2.   schedule: 
  3.     - cron: '0 18 * * *' 

因?yàn)?GitHub 采用的是 UTC 時(shí)間,所以東八區(qū)的凌晨 2 點(diǎn),就對應(yīng)到 UTC 的前日 18 時(shí)。

docker

每日構(gòu)建的 docker 鏡像需要 push 到 docker hub 上,并打上 nightly 的標(biāo)簽,集成測試的 k8s 集群,將 image 的拉取策略設(shè)置為 Always,每日觸發(fā)便能滾動(dòng)升級到當(dāng)日最新進(jìn)行測試。因?yàn)楫?dāng)日的問題目前都會盡量當(dāng)日解決,便沒有再給 nightly 的鏡像再額外打一個(gè)日期的 tag。對應(yīng)的 action 部分如下所示:

  1. - name: Build image 
  2.        env: 
  3.          IMAGE_NAME: ${{ secrets.DOCKER_USERNAME }}/nebula-${{ matrix.service }}:nightly 
  4.        run: | 
  5.          docker build -t ${IMAGE_NAME} -f docker/Dockerfile.${{ matrix.service }} . 
  6.          docker push ${IMAGE_NAME} 
  7.        shell: bash 

package

GitHub Action 提供了 artifacts 的功能,可以讓用戶持久化 workflow 運(yùn)行過程中的數(shù)據(jù),這些數(shù)據(jù)可以保留 90 天。對于 nightly 版本安裝包的存儲而言,已經(jīng)綽綽有余。利用官方提供的 actions/upload-artifact@v1  action,可以方便的將指定目錄下的文件上傳到 artifacts。最后 nightly 版本的 nebula 的安裝包如下圖所示。

我用 GitHub Action 搭建了一套 CI/CD 系统

上述完整的 workflow 文件見 package.yaml

https://github.com/vesoft-inc/nebula/blob/master/.github/workflows/package.yaml

4. 分支發(fā)布

為了更好地維護(hù)每個(gè)發(fā)布的版本和進(jìn)行 bugfix,Nebula Graph 采用分支發(fā)布的方式。即每次發(fā)布之前進(jìn)行 code freeze,并創(chuàng)建新的 release 分支,在 release 分支上只接受 bugfix,而不進(jìn)行 feature 的開發(fā)。bugfix 還是會在開發(fā)分支上提交,最后 cherrypick 到 release 分支。

在每次 release 時(shí),除了 source 外,我們希望能把安裝包也追加到 assets 中方便用戶直接下載。如果每次都手工上傳,既容易出錯(cuò),也非常耗時(shí)。這就比較適合 Action 來自動(dòng)化這塊的工作,而且,打包和上傳都走 GitHub 內(nèi)部網(wǎng)絡(luò),速度更快。

在安裝包編譯好后,通過 curl 命令直接調(diào)用 GitHub 的 API,就能上傳到 assets 中,具體腳本 內(nèi)容如下所示:

  1. curl --silent \ 
  2.      --request POST \ 
  3.      --url "$upload_url?name=$filename" \ 
  4.      --header "authorization: Bearer $github_token" \ 
  5.      --header "content-type: $content_type" \ 
  6.      --data-binary @"$filepath" 

同時(shí),為了安全起見,在每次的安裝包發(fā)布時(shí),希望可以計(jì)算安裝包的 checksum 值,并將其一同上傳到 assets 中,以便用戶下載后進(jìn)行完整性校驗(yàn)。具體步驟如下所示:

  1. jobs: 
  2.   package
  3.     name: package and upload release assets 
  4.     runs-on: ubuntu-latest 
  5.     strategy: 
  6.       matrix: 
  7.         os: 
  8.           - ubuntu1604 
  9.           - ubuntu1804 
  10.           - centos6 
  11.           - centos7 
  12.     container: 
  13.       image: vesoft/nebula-dev:${{ matrix.os }} 
  14.     steps: 
  15.       - uses: actions/checkout@v1 
  16.       - name: package 
  17.         run: ./package/package.sh 
  18.       - name: vars 
  19.         id: vars 
  20.         env: 
  21.           CPACK_OUTPUT_DIR: build/cpack_output 
  22.           SHA_EXT: sha256sum.txt 
  23.         run: | 
  24.           tag=$(echo ${{ github.ref }} | rev | cut -d/ -f1 | rev) 
  25.           cd $CPACK_OUTPUT_DIR 
  26.           filename=$(find . -type f \( -iname \*.deb -o -iname \*.rpm \) -exec basename {} \;) 
  27.           sha256sum $filename > $filename.$SHA_EXT 
  28.           echo "::set-output name=tag::$tag" 
  29.           echo "::set-output name=filepath::$CPACK_OUTPUT_DIR/$filename" 
  30.           echo "::set-output name=shafilepath::$CPACK_OUTPUT_DIR/$filename.$SHA_EXT" 
  31.         shell: bash 
  32.       - name: upload release asset 
  33.         run: | 
  34.           ./ci/scripts/upload-github-release-asset.sh github_token=${{ secrets.GITHUB_TOKEN }} repo=${{ github.repository }} tag=${{ steps.vars.outputs.tag }} filepath=${{ steps.vars.outputs.filepath }} 
  35.           ./ci/scripts/upload-github-release-asset.sh github_token=${{ secrets.GITHUB_TOKEN }} repo=${{ github.repository }} tag=${{ steps.vars.outputs.tag }} filepath=${{ steps.vars.outputs.shafilepath }} 

上述完整的 workflow 文件見 release.yaml。

https://github.com/vesoft-inc/nebula/blob/master/.github/workflows/release.yaml

5. 命令

GitHub Action 為 workflow 提供了一些 命令 方便在 shell 中進(jìn)行調(diào)用,來更精細(xì)地控制和調(diào)試每個(gè)步驟的執(zhí)行。常用的命令如下:

set-output

有時(shí)在 job 的 steps 之間需要傳遞一些結(jié)果,這時(shí)就可以通過 echo "::set-output name=output_name::output_value" 的命令形式將想要輸出的 output_value 值設(shè)置到 output_name 變量中。

在接下來的 step 中,可以通過 $ {{steps.step_id.outputs.output_name}} 的方式引用上述的輸出值。

上節(jié)中上傳 asset 的 job 中就使用了上述的方式來傳遞文件名稱。一個(gè)步驟可以通過多次執(zhí)行上述命令來設(shè)置多個(gè)輸出。

set-env

同 set-output 一樣,可以為后續(xù)的步驟設(shè)置環(huán)境變量。語法:echo "::set-env name={name}::{value}" 。

add-path

將某路徑加入到 PATH 變量中,為后續(xù)步驟使用。語法:echo "::add-path::{path}" 。

6. Self-Hosted Runner

除了 GitHub 官方托管的 runner 之外,Action 還允許使用線下自己的機(jī)器作為 Runner 來跑 Action 的 job。在機(jī)器上安裝好 Action Runner 之后,按照 教程,將其注冊到項(xiàng)目后,在 workflow 文件中通過配置 runs-on: self-hosted 即可使用。

self-hosted 的機(jī)器可以打上不同的 label,這樣便可以通過 不同的標(biāo)簽 來將任務(wù)分發(fā)到特定的機(jī)器上。比如線下的機(jī)器安裝有不同的操作系統(tǒng),那么 job 就可以根據(jù) runs-on 的 label 在特定的機(jī)器 上運(yùn)行。self-hosted 也是一個(gè)特定的標(biāo)簽。

我用 GitHub Action 搭建了一套 CI/CD 系统

安全

GitHub 官方是不推薦開源項(xiàng)目使用 Self-Hosted 的 runner 的,原因是任何人都可以通過提交 PR 的方式,讓 runner 的機(jī)器運(yùn)行危險(xiǎn)的代碼對其所在的環(huán)境進(jìn)行攻擊。

但是 Nebula Graph 的編譯需要的存儲空間較大,且 GitHub 只能提供 2 核的環(huán)境來編譯,不得已還是選擇了自建 Runner??紤]到安全的因素,進(jìn)行了如下方面的安全加固:

虛擬機(jī)部署

所有注冊到 GitHub Action 的 runner 都是采用虛擬機(jī)部署,跟宿主機(jī)做好第一層的隔離,也更方便對每個(gè)虛擬機(jī)做資源分配。一臺高配置的宿主機(jī)可以分配多個(gè)虛擬機(jī)讓 runner 來并行地跑所有收到的任務(wù)。

如果虛擬機(jī)出了問題,可以方便地進(jìn)行環(huán)境復(fù)原的操作。

網(wǎng)絡(luò)隔離

將所有 runner 所在的虛擬機(jī)隔離在辦公網(wǎng)絡(luò)之外,使其無法直接訪問公司內(nèi)部資源。即便有人通過 PR 提交了惡意代碼,也讓其無法訪問公司內(nèi)部網(wǎng)絡(luò),造成進(jìn)一步的攻擊。

Action 選擇

盡量選擇大廠和官方發(fā)布的 action,如果是使用個(gè)人開發(fā)者的作品,最好能檢視一下其具體實(shí)現(xiàn)代碼,免得出現(xiàn)網(wǎng)上爆出來的 泄漏隱私密鑰 等事情發(fā)生。

比如 GitHub 官方維護(hù)的 action 列表:

https://github.com/actions

私鑰校驗(yàn)

GitHub Action 會自動(dòng)校驗(yàn) PR 中是否使用了一些私鑰,除卻 GITHUB_TOKEN 之外的其他私鑰(通過 $ {{secrets.MY_TOKENS}} 形式引用)均是不可以在 PR 事件觸發(fā)的相關(guān)任務(wù)中使用,以防用戶通過 PR 的方式私自打印輸出竊取密鑰。

環(huán)境搭建與清理

對于自建的 runner,在不同任務(wù)(job)之間做文件共享是方便的,但是最后不要忘記每次在整個(gè) action 執(zhí)行結(jié)束后,清理產(chǎn)生的中間文件,不然這些文件有可能會影響接下來的任務(wù)執(zhí)行和不斷地占用磁盤空間。

  1. - name: Cleanup 
  2.        if: always() 
  3.        run: rm -rf build 

將 step 的運(yùn)行條件設(shè)置為 always() 確保每次任務(wù)都要執(zhí)行該步驟,即便中途出錯(cuò)。

基于 Docker 的 Matrix 并行構(gòu)建

因?yàn)?Nebula Graph 需要在不同的系統(tǒng)上做編譯驗(yàn)證,在構(gòu)建方式上采用了容器的方案,原因是構(gòu)建時(shí)不同環(huán)境的隔離簡單方便,GitHub Action 可以原生支持基于 docker 的任務(wù)。

Action 支持 matrix 策略運(yùn)行任務(wù)的方式,類似于 TravisCI 的 build matrix。通過配置不同系統(tǒng)和編譯器的組合,我們可以方便地設(shè)置在每個(gè)系統(tǒng)下使用 gcc 和 clang 來同時(shí)編譯 nebula 的源碼,如下所示:

  1. jobs: 
  2.   build: 
  3.     name: build 
  4.     runs-on: ubuntu-latest 
  5.     strategy: 
  6.       fail-fast: false 
  7.       matrix: 
  8.         os: 
  9.           - centos6 
  10.           - centos7 
  11.           - ubuntu1604 
  12.           - ubuntu1804 
  13.         compiler: 
  14.           - gcc-9.2 
  15.           - clang-9 
  16.         exclude: 
  17.           - os: centos7 
  18.             compiler: clang-9 

上述的 strategy 會生成 8 個(gè)并行的任務(wù)(4 os x 2 compiler),每個(gè)任務(wù)都是(os, compiler)的一個(gè)組合。這種類似矩陣的表達(dá)方式,可以極大的減少不同緯度上的任務(wù)組合的定義。

如果想排除 matrix 中的某個(gè)組合,只要將組合的值配置到 exclude 選項(xiàng)下面即可。如果想在任務(wù)中訪問 matrix 中的值,也只要通過類似 $ {{matrix.os}} 獲取上下文變量值的方式拿到。這些方式讓你定制自己的任務(wù)時(shí)都變得十分方便。

運(yùn)行時(shí)容器

我們可以為每個(gè)任務(wù)指定運(yùn)行時(shí)的一個(gè)容器環(huán)境,這樣該任務(wù)下的所有步驟(steps)都會在容器的內(nèi)部環(huán)境中執(zhí)行。相較于在每個(gè)步驟中都套用 docker 命令要簡潔明了。

  1. container: 
  2.      image: vesoft/nebula-dev:${{ matrix.os }} 
  3.      env: 
  4.        CCACHE_DIR: /tmp/ccache/${{ matrix.os }}-${{ matrix.compiler }} 

對容器的配置,像在 docker compose 中配置 service 一樣,可以指定 image/env/ports/volumes/options 等等 參數(shù)。在 self-hosted 的 runner 中,可以方便地將宿主機(jī)上的目錄掛載到容器中做文件的共享。

正是基于 Action 上面的容器特性,才方便的在 docker 內(nèi)做后續(xù)編譯的緩存加速。

7. 編譯加速

Nebula Graph 的源碼采用 C++ 編寫,整個(gè)構(gòu)建過程時(shí)間較長,如果每次 CI 都完全地重新開始,會浪費(fèi)許多計(jì)算資源。因?yàn)槊颗_ runner 跑的(容器)任務(wù)不定,需要對每個(gè)源文件及對應(yīng)的編譯過程進(jìn)行精準(zhǔn)判別才能確認(rèn)該源文件是否真的被修改。目前使用最新版本的 ccache 來完成緩存的任務(wù)。

雖然 GitHub Action 本身提供 cache 的功能,由于 Nebula Graph 目前單元測試的用例采用靜態(tài)鏈接,編譯后體積較大,超出其可用的配額,遂使用本地緩存的策略。

ccache

ccache 是個(gè)編譯器的緩存工具,可以有效地加速編譯的過程,同時(shí)支持 gcc/clang 等編譯器。Nebula Graph 使用 C++ 14 標(biāo)準(zhǔn),低版本的 ccache 在兼容性上有問題,所以在所有的 vesoft/nebula-dev 鏡像 中都采用手動(dòng)編譯的方式安裝。

Nebula Graph 在 cmake 的配置中自動(dòng)識別是否安裝了 ccache,并決定是否對其打開啟用。所以只要在容器環(huán)境中對 ccache 做些配置即可,比如在  ccache.conf  中配置其最大緩存容量為 1 G,超出后自動(dòng)替換較舊緩存。

  1. max_size = 1.0G 

ccache.conf 配置文件最好放置在緩存目錄下,這樣 ccache 可方便讀取其中內(nèi)容。

tmpfs

tmpfs 是位于內(nèi)存或者 swap 分區(qū)的臨時(shí)文件系統(tǒng),可以有效地緩解磁盤 IO 帶來的延遲,因?yàn)?self-hosted 的主機(jī)內(nèi)存足夠,所以將 ccache 的目錄掛載類型改為 tmpfs,來減少 ccache 讀寫時(shí)間。在 docker 中使用 tmpfs 的掛載類型可以參考 相應(yīng)文檔。相應(yīng)的配置參數(shù)如下:

  1. env: 
  2.      CCACHE_DIR: /tmp/ccache/${{ matrix.os }}-${{ matrix.compiler }} 
  3.    options: --mount type=tmpfs,destination=/tmp/ccache,tmpfs-size=1073741824 -v /tmp/ccache/${{ matrix.os }}-${{ matrix.compiler }}:/tmp/ccache/${{ matrix.os }}-${{ matrix.compiler }} 

將所有 ccache 產(chǎn)生的緩存文件,放置到掛載為 tmpfs 類型的目錄下。

并行編譯

make 本身即支持多個(gè)源文件的并行編譯,在編譯時(shí)配置 -j $(nproc) 便可同時(shí)啟動(dòng)與核數(shù)相同的任務(wù)數(shù)。在 action 的 steps 中配置如下:

  1. - name: Make 
  2.       run: cmake --build build/ -j $(nproc) 

8. 坑

說了那么多的優(yōu)點(diǎn),那有沒有不足呢?使用下來主要體會到如下幾點(diǎn):

只支持較新版本的系統(tǒng)。很多 Action 是基于較新的 Nodejs 版本開發(fā),沒法方便地在類似 CentOS 6 等老版本 docker 容器中直接使用。否則會報(bào) Nodejs 依賴的庫文件找不到,從而無法正常啟動(dòng) action 的執(zhí)行。因?yàn)?Nebula Graph 希望可以支持 CentOS 6,所以在該系統(tǒng)下的任務(wù)不得不需要特殊處理。

不能方便地進(jìn)行本地驗(yàn)證。雖然社區(qū)有個(gè)開源項(xiàng)目 act,但使用下來還是有諸多限制,有時(shí)不得不通過在自己倉庫中反復(fù)提交驗(yàn)證才能確保 action 的修改正確。

目前還缺少比較好的指導(dǎo)規(guī)范,當(dāng)定制的任務(wù)較多時(shí),總有種在 YAML 配置中寫程序的感受。目前的做法主要有以下三種:

  1. 根據(jù)任務(wù)拆分配置文件。
  2. 定制專屬 action,通過 GitHub 的 SDK 來實(shí)現(xiàn)想要的功能。
  3. 編寫大的 shell 腳本來完成任務(wù)內(nèi)容,在任務(wù)中調(diào)用該腳本。

目前針對盡量多使用小任務(wù)的組合還是使用大任務(wù)的方式,社區(qū)也沒有定論。不過小任務(wù)組合的方式可以方便地定位任務(wù)失敗位置以及確定每步的執(zhí)行時(shí)間。

我用 GitHub Action 搭建了一套 CI/CD 系统

Action 的一些歷史記錄目前無法清理,如果中途更改了 workflows 的名字,那么老的 check runs 記錄還是會一直保留在 Action 頁面,影響使用體驗(yàn)。

目前還缺少像 GitLab CI 中手動(dòng)觸發(fā) job/task 運(yùn)行的功能。無法運(yùn)行中間進(jìn)行人工干預(yù)。

action 的開發(fā)也在不停的迭代中,有時(shí)需要維護(hù)一下新版的升級,比如:checkout@v2

不過總體來說,GitHub Action 是一個(gè)相對優(yōu)秀的 CI/CD 系統(tǒng),畢竟站在 GitLab CI/Travis CI 等前人肩膀上的產(chǎn)品,還是有很多經(jīng)驗(yàn)可以借鑒使用。

9. 后續(xù)

定制 Action

前段時(shí)間 docker 發(fā)布了自己的第一款 Action,簡化用戶與 docker 相關(guān)的任務(wù)。后續(xù),針對 Nebula Graph 的一些 CI/CD 的復(fù)雜需求,我們亦會定制一些專屬的 action 來給 nebula 的所有 repo 使用。通用的就會創(chuàng)建獨(dú)立的 repo,發(fā)布到 action 市場里,比如追加 assets 到 release 功能。專屬的就可以放置 repo 的 .github/actions 目錄下。

這樣就可以簡化 workflows 中的 YAML 配置,只要 use 某個(gè)定制 action 即可。靈活性和拓展性都更優(yōu)。

跟釘釘 /slack 等 IM 集成

通過 GitHub 的 SDK 可以開發(fā)復(fù)雜的 action 應(yīng)用,再結(jié)合 釘釘/slack 等 bot 的定制,可以實(shí)現(xiàn)許多自動(dòng)化的有意思的小應(yīng)用。比如,當(dāng)一個(gè) PR 被 2 個(gè)以上的 reviewer approve 并且所有的 check runs 都通過,那么就可以向釘釘群里發(fā)消息并 @ 一些人讓其去 merge 該 PR。免去了每次都去 PR list 里面 check 每個(gè) PR 狀態(tài)的辛苦。

當(dāng)然圍繞 GitHub 的周邊通過一些 bot 還可以迸發(fā)許多有意思的玩法。

 

 

責(zé)任編輯:張燕妮 來源: 架構(gòu)頭條
相關(guān)推薦

2021-01-18 09:35:17

Travis-CGithub ActiLinux

2021-05-06 11:06:52

人工智能語音識別聲聞檢索

2021-05-27 07:12:19

單點(diǎn)登錄系統(tǒng)

2022-09-05 15:12:34

數(shù)據(jù)庫GitHub開發(fā)

2020-10-21 14:10:28

工具測試開發(fā)

2025-03-28 09:52:08

CIGo項(xiàng)目

2022-04-29 09:04:35

日志平臺開發(fā)

2022-11-12 17:50:02

Web服務(wù)器微服務(wù)

2023-07-14 12:02:29

2023-01-08 21:05:45

數(shù)據(jù)預(yù)警模型

2019-07-25 10:31:55

AWSDevOps架構(gòu)

2022-08-04 00:05:11

系統(tǒng)分布式流量

2024-11-19 16:31:23

2025-02-21 08:17:13

2024-11-12 08:13:09

2024-09-23 04:00:00

java架構(gòu)分布式系統(tǒng)

2022-02-22 09:00:00

軟件開發(fā)CI/CD 管道工具

2021-02-10 07:31:12

VuejsElementUI

2019-08-12 13:47:41

GitHub代碼開發(fā)者

2019-11-07 09:00:39

Jenkins流水線開源
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號