在上一篇我們學到如何使用fail-fast、continue-on-error
這篇我們會來會來了解一下什麼是並發性,以及如何幫workflow設並發性以提升執行效率
並發性是指同一時間處理多個任務的能力,但並不代表一定要同時進行,而是允許多個任務交替執行,以充分利用系統資源、提升系統的效率
Github Actions預設也允許一次執行多個workflow,但你也可以選擇一次只執行一個,這也是並發性
在workflow中設定並發性有以下好處
避免同時
運行的workflow、job佔用太多資源
,進而提高執行速度,並減低因為同時佔用過多而資源導致workflow
不穩定或失敗
減少花費
concurrency是一個控制workflow、job的並發性的屬性,我們可以透過在concurrency來幫workflow或job分組,一組中一次只有一個workflow或job被執行
當有設定concurrency的workflow被排入queue等待執行時,如果repo中有另一個屬於同個concurrency group的workflow或job又被排進去,則已排入queue狀態會變成pending,而pending的則被取消
同一個分支上的所有workflow,一次只執行一個
concurrency:
group: ${{ github.ref }}
cancel-in-progress: true
同一個分支上的同一個workflow,一次只執行一個
可用於跑unit test的workflow,因為多次連續推到遠端的情況,只要對最後一次執行workflow即可
on:
push:
branches:
- main
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
同一個名稱以release/開頭的分支上的同一個workflow,一次只執行一個
非mono repo的情況下,可防止多個版本同時進行部署,以減少資源浪費、提高執行效率
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ contains(github.ref, 'release/')}}
設定needs代表該job依賴於別的job,所以如果依賴的job還沒跑完前就不會執行,如果依賴的job失敗了也不會執行
jobs:
build:
deploy:
needs: [build]
send message to Slack channel:
needs: [deploy]
當某名稱的workflow,達到某個執行階段時才執行
不過這個方法不能超過3層
,如果硬要這麼做的話第4層開始就不會觸發 (A → B → C → D可以,超過D後就不行)
name: Send Slack notification
# 當名為Deploy的workflow完成時執行
on:
workflow_run:
workflows: [Deploy]
types: [completed]
限制matrix job的最大平行執行數為1,如果為true則一個step失敗後,直接取消後面的所有job
不過沒有辦法控制哪個job先執行
,所以這個方法適用於只要確保所有job成功執行,且job之間沒依賴性
jobs:
prepare-for-dessert:
fail-fast: true
strategy:
max-parallel: 1
matrix:
fruit: [mango, strawberry]
dessert: [cake, 'ice cream']