国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

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

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

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

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

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

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

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

這里簡(jiǎn)單概述一下我們?cè)谑褂?GitHub Action 時(shí)體會(huì)到的優(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 都可以一鍵使用,跨平臺(tái)簡(jiǎn)單方便。
  4. 可跟 GitHub 的 API 互動(dòng)。通過 GITHUB_TOKEN 可以直接訪問 GitHub API V3,想上傳文件,檢查 PR 狀態(tài),使用 curl 命令即可完成。
  5. 自托管。只要提供 workflow 的描述文件,將其放置到 .github/workflows/ 目錄下,每次提交便會(huì)自動(dòng)觸發(fā)執(zhí)行新的 action run。
  6. Workflow 描述文件改為 YAML 格式。目前的描述方式要比 Action 1.0 中的 workflow 文件更加簡(jiǎn)潔易讀。

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

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

2. PR 測(cè)試

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

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

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

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

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

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

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

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

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

  1. 只有 lint 校驗(yàn)通過的 PR 才會(huì)將后續(xù)的 job 下發(fā)到自建的 runner,lint 的任務(wù)比較輕量,可以使用 GitHub Action 托管的機(jī)器來執(zhí)行,無需占用線下的資源。
  2. 只有添加了 ready-for-testing  label 的 PR 才會(huì)觸發(fā) action 的執(zhí)行,而 label 的添加有權(quán)限的控制。進(jìn)一步優(yōu)化 runner 被隨意觸發(fā)的情況。對(duì) 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ù)庫(kù) Nebula Graph 的代碼變更測(cè)試覆蓋率實(shí)踐。

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

3. Nightly 構(gòu)建

在 Nebula Graph 的集成測(cè)試框架中,希望能夠在每天晚上對(duì) codebase 中的代碼全量跑一遍所有的測(cè)試用例。同時(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í)間,比如每天凌晨?jī)牲c(diǎn)執(zhí)行任務(wù)如下所示:

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

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

docker

每日構(gòu)建的 docker 鏡像需要 push 到 docker hub 上,并打上 nightly 的標(biāo)簽,集成測(cè)試的 k8s 集群,將 image 的拉取策略設(shè)置為 Always,每日觸發(fā)便能滾動(dòng)升級(jí)到當(dāng)日最新進(jìn)行測(cè)試。因?yàn)楫?dāng)日的問題目前都會(huì)盡量當(dāng)日解決,便沒有再給 nightly 的鏡像再額外打一個(gè)日期的 tag。對(duì)應(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 天。對(duì)于 nightly 版本安裝包的存儲(chǔ)而言,已經(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 還是會(huì)在開發(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 之后,按照 教程,將其注冊(cè)到項(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)的代碼對(duì)其所在的環(huán)境進(jìn)行攻擊。

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

虛擬機(jī)部署

所有注冊(cè)到 GitHub Action 的 runner 都是采用虛擬機(jī)部署,跟宿主機(jī)做好第一層的隔離,也更方便對(duì)每個(gè)虛擬機(jī)做資源分配。一臺(tái)高配置的宿主機(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 會(huì)自動(dòng)校驗(yàn) PR 中是否使用了一些私鑰,除卻 GITHUB_TOKEN 之外的其他私鑰(通過 $ {{secrets.MY_TOKENS}} 形式引用)均是不可以在 PR 事件觸發(fā)的相關(guān)任務(wù)中使用,以防用戶通過 PR 的方式私自打印輸出竊取密鑰。

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

對(duì)于自建的 runner,在不同任務(wù)(job)之間做文件共享是方便的,但是最后不要忘記每次在整個(gè) action 執(zhí)行結(jié)束后,清理產(chǎn)生的中間文件,不然這些文件有可能會(huì)影響接下來的任務(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)境的隔離簡(jiǎ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 會(huì)生成 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)都會(huì)在容器的內(nèi)部環(huán)境中執(zhí)行。相較于在每個(gè)步驟中都套用 docker 命令要簡(jiǎn)潔明了。

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

對(duì)容器的配置,像在 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í)間較長(zhǎng),如果每次 CI 都完全地重新開始,會(huì)浪費(fèi)許多計(jì)算資源。因?yàn)槊颗_(tái) runner 跑的(容器)任務(wù)不定,需要對(duì)每個(gè)源文件及對(duì)應(yīng)的編譯過程進(jìn)行精準(zhǔn)判別才能確認(rèn)該源文件是否真的被修改。目前使用最新版本的 ccache 來完成緩存的任務(wù)。

雖然 GitHub Action 本身提供 cache 的功能,由于 Nebula Graph 目前單元測(cè)試的用例采用靜態(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)識(shí)別是否安裝了 ccache,并決定是否對(duì)其打開啟用。所以只要在容器環(huán)境中對(duì) 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),那有沒有不足呢?使用下來主要體會(huì)到如下幾點(diǎn):

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

不能方便地進(jìn)行本地驗(yàn)證。雖然社區(qū)有個(gè)開源項(xiàng)目 act,但使用下來還是有諸多限制,有時(shí)不得不通過在自己倉(cāng)庫(kù)中反復(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)用該腳本。

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

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

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

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

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

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

9. 后續(xù)

定制 Action

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

這樣就可以簡(jiǎn)化 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

人工智能語音識(shí)別聲聞檢索

2021-05-27 07:12:19

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

2022-09-05 15:12:34

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

2020-10-21 14:10:28

工具測(cè)試開發(fā)

2025-03-28 09:52:08

CIGo項(xiàng)目

2022-04-29 09:04:35

日志平臺(tái)開發(fā)

2025-11-17 09:36:23

Harbor開源Docker

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ā)者
點(diǎn)贊
收藏

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

综合婷婷亚洲小说| 日韩美女视频在线观看| 色视频www在线播放国产| 韩国av一区二区三区| 国产一区自拍视频| 亚洲综合小说| 国产欧美在线观看| 清纯唯美亚洲经典中文字幕| 精品亚洲一区二区三区在线观看| 黄色免费在线网站| 51久久夜色精品国产麻豆| 男人的天堂av高清在线| 天天综合色天天| 四虎在线视频| 色一情一伦一子一伦一区| 奇米影视888狠狠狠777不卡| 亚洲二区在线视频| 在线播放的av| 在线免费观看不卡av| av电影在线网| 在线播放一区二区三区| 性xxxfreexxxx性欧美| 欧美一卡二卡三卡四卡| 久草在线视频福利| 精品偷拍各种wc美女嘘嘘| 刘亦菲一区二区三区免费看| 一区二区欧美久久| 日韩一区二区三区色| 久久久久久成人| 综合亚洲自拍| 亚洲va欧美va国产综合久久| 亚洲国产一区二区精品专区| 日韩视频在线播放| 国产乱妇无码大片在线观看| 国产美女主播在线播放| 国产亚洲美州欧州综合国| 国产一伦一伦一伦| 午夜亚洲国产au精品一区二区| 午夜黄色在线观看| 91精品国产入口在线| 成人影院av| 久久久久久久久久久久av| 免费欧美一区| 九九九九九九精品| 福利电影一区二区| 日本19禁啪啪吃奶大尺度| 欧洲av一区二区嗯嗯嗯啊| 国产黄大片在线观看| 欧美噜噜久久久xxx| 第一sis亚洲原创| 日本不卡一区二区三区视频| 国产精品18久久久久久久久久久久| 欧美两根一起进3p做受视频| 亚洲国产视频a| av免费在线免费| 欧美精品免费看| 91精品国产调教在线观看| 亚洲精品免费在线看| 国产欧美日韩不卡| 麻豆影视国产在线观看| 欧美精品一区二区免费| 美女亚洲一区| 亚洲一二区在线| 日韩一区在线免费观看| 日韩成人黄色| 日韩电视剧在线观看免费网站| 精品视频一区二区三区| www.久久草| 成人av在线资源网站| 欧美日韩影视| 亚洲人成亚洲人成在线观看| 九九热精品视频在线观看| 神马影院一区二区| 国产蜜臀97一区二区三区 | 国产精品99一区二区| 不卡中文字幕在线| 一区二区三区在线观看欧美| 毛片在线网址| 国产成人av网| 久久国产精品一区二区| 国产黄色高清在线| 日韩成人高清在线| 五月天激情综合网| 欧美精品自拍视频| 欧美亚洲一区二区在线| 麻豆国产一区| 色播亚洲婷婷| 亚洲国产综合色| 国产综合av| 国产女人水真多18毛片18精品| 久久综合九色综合97婷婷女人| 岛国最新视频免费在线观看| 欧美激情视频一区二区| 日本女优在线视频一区二区| 草草久视频在线观看电影资源| 国产视频精品xxxx| 国一区二区在线观看| 免费看a级黄色片| 欧美精品一区二区在线观看| 精品午夜久久| 国产av天堂无码一区二区三区| 在线一区二区观看| 麻豆一区二区| 男人插女人视频在线观看| 7777精品伊人久久久大香线蕉| 亚欧日韩另类中文欧美| 成人一区二区在线| 日韩毛片高清在线播放| 丁香婷婷久久| 亚洲第一精品区| 日韩亚洲欧美综合| 亚洲精品一区二区在线看| 男女无套免费视频网站动漫| 亚洲视频在线观看网站| 日韩电影网1区2区| 1769免费视频在线观看| 国产伦精品一区| 亚洲国产乱码最新视频| 东京久久高清| 九热视频在线观看| 中文在线资源观看视频网站免费不卡 | 国产精品jizz在线观看老狼| 欧美日本高清视频在线观看| 午夜国产一区二区| 一本色道久久加勒比88综合| 欧美成人中文字幕| 久久综合九色欧美综合狠狠| 久久国产三级| 尤物av无码色av无码| 亚洲视频在线免费看| 免费看精品久久片| 大桥未久在线视频| 一区二区三区四区五区视频| 日韩三级中文字幕| 日本欧美一区二区三区乱码| 都市激情久久综合| 欧美少妇一级片| 亚洲男人天堂2024| 激情综合网天天干| 18video性欧美19sex高清| 日本高清久久一区二区三区| 在线观看一区二区视频| 一本色道久久综合亚洲精品不卡 | 1769国内精品视频在线播放| 国产精品三级视频| 伊甸园亚洲一区| 一二三区高清| 91久久久精品| 欧美精品vⅰdeose4hd| 日韩中文字幕区一区有砖一区| 久久五月精品中文字幕| 99re8这里只有精品| 精品国偷自产在线视频| 亚洲国产精华液网站w| 国产探花一区二区| 一本一生久久a久久精品综合蜜| 亚洲精品国产品国语在线| 在线观看91av| 成人免费在线电影| 国产一区日韩一区| 视频国产一区| 免费无码av片在线观看| 国产伊人精品在线| 91av中文字幕| 粉嫩高清一区二区三区精品视频| 久久99精品久久久久久噜噜| 久久久久成人精品| 久久久久久久激情视频| 91精品国产一区二区三区| 在线日韩av片| 欧美四级电影网| 中文av一区| 欧美日韩18| 国产伦精一区二区三区| 国产精品视频一区二区三区不卡| 亚洲国产免费| 小嫩嫩精品导航| 蜜桃伊人久久| 经典一区二区三区| 精品久久久久久亚洲精品| 欧美日精品一区视频| 国产精品久久久久久福利一牛影视 | 91麻豆.com| 琪琪久久久久日韩精品| 久久这里精品| 成人小视频在线观看免费| 欧美大片网站在线观看| 五月综合激情婷婷六月色窝| 久久aⅴ国产紧身牛仔裤| 日韩国产激情| 国产天堂av| 亚洲高清视频一区二区| 久久免费视频网站| 日韩三级免费观看| 亚洲色图丝袜美腿| 亚洲人亚洲人色久| 不卡专区在线| 蜜桃tv在线播放| av免费观看大全| 99蜜桃在线观看免费视频网站|