在上一篇我們學到如何使用表達式跟function在workflow中設立條件、處理資料
在這篇我們會來了解一下自動、手動觸發workflow的事件
就像是JS的事件一樣,我們必須自行把事件監聽綁在元素上,或者自行呼叫function,function才會被觸發
常見的workflow觸發事件大致
上能分為自動、手動和排程
幾種
透過on屬性可以定義觸發事件,且一個workflow可
以有多個
觸發事件
首先不論是要自動、手動或排程,都用on:
定義觸發事件
name: Foo
on:
# 發PR到main、名稱含有release/的分支時觸發
pull_request:
branches:
- main
- release/**
# ignore叫release/bar的分支
branches-ignore:
- release/bar
# 手動觸發、無輸入欄位
workflow_dispatch:
# 排程,GMT+8每週一早上9點執行
schedule:
- cron: '0 1 * * 1'
不過如果
你的workflow沒被推到default branch上過
(通常是main或master),而你想要在發PR前試看看這個workflow,
那麼頗不幸的即便有定義workflow_dispatch,仍然無法在Github Actions的頁手動觸發他、使用Github Cli也沒辦法
,因為這兩個方法都不會列出不在default branch的workflow
# 列出default branch上可用的workflow,預設會把disable的藏起來
gh workflow list
# 列出default branch上所有workflow
gh workflow list -a
# workflow的name是name: 的值,不是檔名喔
# 以上面的例子來說就是Foo
gh workflow run <workflow的name> --ref <分支名>
如果硬要用指令觸發他,只會噴錯"could not find any workflows named <workflow的name>"
不過仍然可以使用偷吃步定義push: 解決
name: Foo
on:
pull_request:
branches:
- main
# 略
push:
branches:
- 當下開發用的分支名
之後只要push到遠端就會被觸發了,也可以在Github Actions的頁、使用Github Cli的指令看到它
使用filter用法跟正規表達式差不多,可以設置條件過濾分支、tag、commit之類的東西,除了常見的**和!,還有*、+、?之類的filter可以用,需要跳脫時字串時用\
在下面的例子中會示範使用當中幾種
另外需要注意的是,GitHub Actions
中,diff 只會處理 前300個
變更檔案。如果你使用的filter没有在在前300個找到符合條件的更改,workflow就不會被觸發
name: Foo
on:
# 發PR到所有不叫release/bar的所有分支時觸發
pull_request:
branches:
- !release/bar
on:
push:
# 只在push的更動的檔案中有json檔時觸發
paths:
- '**.json'
# 但是不檢查以下這些json
paths-ignore:
- .stylelintrc.json
- .eslintrc.json
- package.json
on:
# 有新的issue時
issues:
types:
- opened
jobs:
inform owner of repo:
# 如果標題包含critical
if: contains(github.event.issue.title, , 'critical')
issue_comment
陷阱
,你可能會以為只有在issue有留言時才會觸發,但其實PR有留言也會,而discussion的話則用discussion_commenton: issue_comment
jobs:
inform developer of PR:
# 判斷是否為PR有新留言
if: ${{ github.event.issue.pull_request }}
# 使用Github網頁發布新版本時(上圖黃圈處會多一個新版本)
on:
release:
types: [published]
在前面的段落我們已經知道定義了workflow_dispatch
可以手動觸發
,但事實上不只手動觸發,甚至還可以設置input傳
一些資料給workflow
但需要注意的是input上限是10個、65535字元,且最好設置options:避免
使用者輸入一些奇怪的內容造成安全上的風險
on:
workflow_dispatch:
inputs:
workspaceName:
required: true
default: 'foo'
options:
- foo
- bar
environment:
description: 'Environment to run tests against'
default: 'dev'
options:
- dev
- alpha
- beta
- prod
使用workflow_run,並定義types可以控制workflow間執行的順序
,分為requested(開跑)、completed(完成)、in_progress(正在跑)
不過這個方法不能超過3層
,如果硬要這麼做的話第4層開始就不會觸發 (A → B → C → D可以,超過D後就不行)
另外如果做的事情之間夠獨立
的話,透過這種方式拆分workflow
也能達到間接複用
的效果,至於其他複用方式在之後的篇章會提到
name: (Runtime) Commit Artifacts for Meta WWW and fbsource V2
on:
# 當名為(Runtime) Build and Test的workflow在main分支上跑完,且成功跑完後
workflow_run:
workflows: ["(Runtime) Build and Test"]
types: [completed]
branches:
- main
conclusion: success
repository_dispatch是一個很特別的事件,types完全是自訂的,不過types的名稱最多只能有100字元
它是透過Github API來觸發
的,通常用於觸發點發生在Github之外時
,至於如何建立repo dispatch event在之後的篇章會提到