文森說技術

iOS, Web Development Notes
- , ,

GitHub Actions - 利用 GitHub API 與 Workflow Dispatch 達成跨 Repo 觸發

在 GitLab 有 multi-project pipelines 可以做到跨專案 (repo) 觸發對方 pipeline 的事情。

不過看來在 GitHub Actions 沒有辦法做到,目前還是只能先靠透過 API 觸發另外一個 repo 的 workflow 。

組成

流程

被觸發方的修改

helloworld.yml
1
2
3
4
5
6
7
8
9
10
11
name: hello-world

# on 的地方改成 `workflow_dispatch`
on: workflow_dispatch

jobs:
hello-world-job:
runs-on: ubuntu-latest
steps:
- run: |
echo hello world

API

Accept

官方建議用 application/vnd.github.v3+json 就用它吧!

curl

1
-H "Accept: application/vnd.github.everest-preview+json"

認證

使用 HTTP Basic Auth 認證

  • username: 能夠取用目標 repo 的 GitHub id
  • password: Personal access token

curl

1
-u "<username>:<password>"

Endpoint

Method Endpoint
POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches
  • owner - 目標 repo 的擁有者
  • repo - 目標 repo 的 id
  • workflow_id - workflow 的檔案名稱

Body

ref 是必要資訊,可以指定 branch, tag 或是 commit SHA ,這邊就先指定為 main 吧!

1
-d '{"ref": "main"}'

組合

組合完之後就長這樣:

1
2
3
4
5
curl -XPOST \
-u "<username>:<personal access token>" \
-H "Accept: application/vnd.github.everest-preview+json" \
-d '{"ref": "main"}' \
https://api.github.com/repos/<owner>/<repo>/actions/workflows/<workflow file name>.yml/dispatches

執行後沒錯誤的話應該會得到 204 No Content

可以透過加上 -v 取得詳細資訊

1
< HTTP/1.1 204 No Content

被觸發方的 Actions

可以看出來是被 workflow_dispatch 觸發的:

這樣子就算成功了

結語

雖然觸發的方式有點原始,不過至少確定能夠透過這個方法讓兩個 repo 之間能夠連通了。

打 API 沒問題了,接下就可以來試試 repo 互打。

以上,這篇就到這邊囉。

參考文章

如果覺得這篇對你有幫助,歡迎幫忙分享給其他人 😀