用 Github CLI - `gh` 來查找 action,並且 rerun



前言

  • 公司這邊採用一個專職的 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

  1. per_page 測試下來最高就是 100,所以這邊直接寫死方便理解。

  2. 一次最高就是 100,所以超過的話就要用 --paginate 來處理;但這樣速度會慢上不少,所以加上第二個參數來控制是否要啟用。

  3. 顯示欄位可以依照需求調整。我選擇只顯示 .name .run_number .id .conclusion 這幾個欄位,因為

    • .name:是 workflow 的名稱,也是驗證關鍵字查詢的結果是否跟預期一樣
    • .run_number:是 workflow 的編號,在頁面上查找比較快
    • .id:是 workflow 的 id,用來 rerun,或 call 其他 API 時比較方便
    • .conclusion:是 workflow 的結果,可以快速看到是否有失敗的 workflow
  4. 控制欄位顯示的語法是 \(.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

  1. https://cli.github.com/manual/gh_api
  2. https://blog.jdriven.com/2023/10/jq-joy-using-string-interpolation/
Licensed under CC BY-NC-SA 4.0
最後更新 2024-09-12 06:19

主題 StackJimmy 設計