在上一篇我們了解了撰寫 workflow 前需要做的permission設定,以及GITHUB_TOKEN跟workflow permission的關係
這篇我們會來會認識另一個action,並用它來寫一個簡單的幫PR上label的workflow
開始之前來複習一下workflow的基本結構
寫workflow是為了叫 Github Actions提供的runner幫你在某些時候,自動做一些有固定流程、順序,而且你懶得每次都自己處理的事情
我們可以用英文的5W1H來記住workflow的基本結構
// 以下三項很明確,所以不需要在寫進yml檔裡
Where: Github Actions
Who: runner
Why: 你懶得每次都自己處理
// 以下是你要寫進yml檔裡的,這樣runner才會知道你要他在何時幫你做什麼
When: 某些時候,透過on定義
What: 固定流程、順序的事,透過jobs、steps定義
How: 事情的細節,透過run、use定義
不過如果記不起來或者是有其他更複雜的需求,也可以在直接使用官方跟社群提供的template
template裡面也有註解,不用擔心看不懂
大家應該在各大repo的Pull Request區看過label
幫PR上label的好處如下
1.方便管理PR
2.作為workflow內條件判斷的依據
actions/labeler@v5是一個可以根據你設定的條件幫PR自動上label的action
# 以main為base開出去的分支名稱以fix/開頭且後面只含英文、-、_時,使用fix label
bug:
- base-branch: ['main']
- head-branch: ['^fix/[a-zA-Z_-]+']
# 如果更動的檔案有.md檔,使用documentation標籤
documentation:
- changed-files:
- any-glob-to-any-file: ['*.md']
# 如果更動的檔案有src底下任一資料夾的檔案,且該檔案不在src下的docs資料夾內的話,使用source標籤
source:
- changed-files:
- any-glob-to-any-file: 'src/**/*'
# !代表排除之意
- all-globs-to-all-files: '!src/docs/*'
從上面的例子可以注意到changed filed的屬性不只一種
由any和all取任兩個排列組合組成,一共有四種屬性如下
any-glob-to-any-file
- any-glob-to-any-file: ['*.md', '*.txt', '*.csv']
# 更動的檔案為index.md、inddex.js時,因為有1個pattern match到1個檔案到故成立
any-glob-to-all-files
- any-glob-to-all-file: ['*.md', '*.txt', '*.csv']
# 更動的檔案為index.md、template.md時,因為有1個pattern match所有檔案到故成立
all-globs-to-any-file
- all-globs-to-any-file: ['*.md', 'doc/*.*']
# 更動的檔案為doc/index.md、main.js時,因為所有pattern match到1個檔案故成立
all-globs-to-all-files
- all-globs-to-all-files: ['*.md', '*.txt', '*.csv']
# 更動的檔案為index.md、index.txt、template.csv時,因為所有pattern都有match到檔案,且所有檔案都有被某個patternmatch到故成立
這一步可以使用官方給的範例,或者以範例為基礎進行修改
name: Add label to PR
on:
pull_request:
branches:
- main
jobs:
labeler:
permissions:
contents: read
# 一定要賦予workflow PR的wirte權限才能上label
# 如果你的repo是從別的repo form產生的,則預設只會有PR的read權限,此時就須要把on底下的事件改用pull_request_target
pull-requests: write
runs-on: ubuntu-latest
steps:
- uses: actions/labeler@v5
# with為optional屬性,透過它可以傳入各種input
with:
# 當更動的檔案改變時,且不再match時,移除label
sync-labels: true