前言
- 公司這邊採用一個專職的 Repo 來處理所有「部署」相關的 workflow,不時會需要查找各個前後端 Repo 發來的 deploy request,所以用
gh
CLI 來快速查找資料。
- 偶而部署 job 會失敗,需要
rerun
;這邊也紀錄了一個 function 來做批次請求。
說明
依據關鍵字查找 action
用 Github CLI 可以快速地查找與控制 action 的狀態 [1]。
方便起見,把 api 跟解析結果包成一個函數,用起來比較簡便:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# 要改成自己的 org name 跟 repo name
ORG_NAME="my-org"
REPO_NAME="my-deploy-repo"
list_actions_name () {
local keyword per_page
keyword=$1
search_type=${2:-fast}
per_page=100
case $search_type in
fast)
paginate=""
;;
full)
paginate="--paginate"
;;
esac
gh api '/repos/'"${ORG_NAME}"'/'"${REPO_NAME}"'/actions/runs?per_page='"${per_page}" ${paginate} --jq '.workflow_runs[] | select(.name | contains("'"${keyword}"'"))' | jq -r '"\(.name) | #\(.run_number), \(.id), \(.conclusion)"'
}
|
Note
-
per_page
測試下來最高就是 100
,所以這邊直接寫死方便理解。
-
一次最高就是 100
,所以超過的話就要用 --paginate
來處理;但這樣速度會慢上不少,所以加上第二個參數來控制是否要啟用。
-
顯示欄位可以依照需求調整。我選擇只顯示 .name
.run_number
.id
.conclusion
這幾個欄位,因為
.name
:是 workflow 的名稱,也是驗證關鍵字查詢的結果是否跟預期一樣
.run_number
:是 workflow 的編號,在頁面上查找比較快
.id
:是 workflow 的 id,用來 rerun,或 call 其他 API 時比較方便
.conclusion
:是 workflow 的結果,可以快速看到是否有失敗的 workflow
-
控制欄位顯示的語法是 \(.field_name)
– 只有前面的括號跳脫。這是 jq
的 string interpolation 的語法 [2],可以見下方補充。
範例結果
1
2
3
4
|
list_actions_name "my demo"
# my demo workflow name | #123, 1234567890, success
# my demo workflow name | #122, 1234567891, success
|
可以再依據需求做額外的處理,像是只找出最新的 workflow
1
|
list_actions_name "my demo workflow name" | head -1
|
依據 run id 來 rerun
只要有 run id 就很簡單,不過這個要用 POST
:
1
2
3
4
5
6
7
8
9
10
11
12
|
# 如果已經宣告可以省略
ORG_NAME="my-org"
REPO_NAME="my-deploy-repo"
rerun_action () {
local run_id
run_id=$1
gh api -X POST "/repos/${ORG_NAME}/${REPO_NAME}/actions/runs/${run_id}/rerun"
}
# rerun_action 1234567890
|
範例組合技
- 找出所有失敗的 workflow,然後 rerun:
1
|
list_actions_name "my demo" | grep failure | awk -F, '{print $2}' | xargs rerun_action
|
補充:jq
string interpolation
除了單純顯示欄位,還可以做一些資料的操作
sample JSON data:
1
2
3
4
5
|
{
"prefix": "Hi",
"name": "ktlast",
"counts": 13
}
|
例如轉成大寫 (注意雙引號 "
)
1
2
3
|
echo ${MY_JSON_DATA} | jq -r '"\(.prefix) \(.name | ascii_upcase)"'
# Hi KTLAST
|
簡單運算 (同樣注意雙引號 "
)
1
2
3
|
echo ${MY_JSON_DATA} | jq -r '"Counts = \(.counts + 1)"'
# Counts = 14
|
REF
- https://cli.github.com/manual/gh_api
- https://blog.jdriven.com/2023/10/jq-joy-using-string-interpolation/