[英]How to authenticate a GitHub Actions workflow as a GitHub App so it can trigger other workflows?
默認情況下(使用默認secrets.GITHUB_TOKEN
時)GitHub Actions 工作流無法觸發其他工作流。 因此,例如,如果工作流向具有通常對拉取請求運行測試的 CI 工作流的存儲庫發送拉取請求,則 CI 工作流將不會為另一個工作流發送的拉取請求運行。
可能還有許多其他 GitHub API 操作是使用默認密碼進行身份驗證的工作流secrets.GITHUB_TOKEN
也不能接受。
我如何驗證我的工作流作為 GitHub 應用程序運行,以便它們可以觸發其他工作流並執行我授予 GitHub 應用程序權限的任何其他操作?
在您的用戶或組織帳戶中創建 GitHub 應用程序。 記下顯示在應用設置頁面上的應用的應用 ID ,稍后您將需要它。
授予您的應用必要的權限。 要發送拉取請求,應用程序可能需要:
為您的應用生成私鑰。
將私鑰的副本存儲在名為MY_GITHUB_APP_PRIVATE_KEY
的GitHub Actions 機密中。 這可以是將包含您要編寫的工作流的存儲庫中的存儲庫級機密,也可以是用戶級或組織級機密,在這種情況下,將需要訪問包含工作流的存儲庫到秘密。
在您的存儲庫或用戶或組織帳戶中安裝您的 GitHub 應用程序。 記下安裝 ID 。 這是在安裝應用程序的存儲庫、用戶或組織的設置中安裝頁面 URL 末尾的 8 位數字。 稍后您將需要它。
想要在您的應用程序運行時進行身份驗證的工作流運行需要在每次運行時獲取臨時安裝訪問令牌,並使用該令牌對自身進行身份驗證。 這在 GitHub 的文檔中稱為身份驗證安裝,他們在 Ruby 中提供了一個代碼示例。 步驟是:
iat
(“發布時間”)為過去 60 秒, exp
(過期時間)為未來 10m,您的App ID為iss
(發行者),並使用您的私鑰和 RS256 算法。https://api.github.com/app/installations/:installation_id/access_tokens
發出 HTTP POST 請求(將:installation_id
替換為您的安裝 ID ),並在Authorization: Bearer <SIGNED_JWT>
標頭中使用已簽名的 JWT。這是一個使用PyJWT和requests實現此令牌交換的 Python 腳本:
from argparse import ArgumentParser
from datetime import datetime, timedelta, timezone
import jwt
import requests
def get_token(app_id, private_key, installation_id):
payload = {
"iat": datetime.now(tz=timezone.utc) - timedelta(seconds=60),
"exp": datetime.now(tz=timezone.utc) + timedelta(minutes=10),
"iss": app_id,
}
encoded_jwt = jwt.encode(payload, private_key, algorithm="RS256")
response = requests.post(
f"https://api.github.com/app/installations/{installation_id}/access_tokens",
headers={
"Accept": "application/vnd.github+json",
"Authorization": f"Bearer {encoded_jwt}",
},
timeout=60,
)
return response.json()["token"]
def cli():
parser = ArgumentParser()
parser.add_argument("--app-id", required=True)
parser.add_argument("--private-key", required=True)
parser.add_argument("--installation-id", required=True)
args = parser.parse_args()
token = get_token(args.app_id, args.private_key, args.installation_id)
print(token)
if __name__ == "__main__":
cli()
https://github.com/hypothesis/gha-token是上述代碼的一個版本,作為可安裝的 Python 包。 要使用pipx安裝它並獲取令牌:
$ pipx install git+https://github.com/hypothesis/gha-token.git
$ gha-token --app-id $APP_ID --installation-id $INSTALLATION_ID --private-key $PRIVATE_KEY
ghs_xyz***
您可以編寫一個使用 gha-token 獲取令牌的工作流,並對工作流發出的任何 API 請求或 GitHub CLI 調用進行身份驗證。 下面的工作流程將:
gha-token
MY_GITHUB_APP_PRIVATE_KEY
GitHub secret 調用gha-token
獲取安裝訪問令牌gh auth status
命令進行身份驗證在下面的工作流程中,您應該將<APP_ID>
替換為您的App ID ,並將<INSTALLATION_ID>
替換為您的安裝 ID :
name: My Workflow
on:
workflow_dispatch:
jobs:
my_job:
name: My Job
runs-on: ubuntu-latest
steps:
- name: Install Python 3.10
uses: actions/setup-python@v4
with:
python-version: "3.10"
- run: python3.10 -m pip install pipx
- run: python3.10 -m pipx install "git+https://github.com/hypothesis/gha-token.git"
- name: Get GitHub token
id: github_token
run: echo GITHUB_TOKEN=$(gha-token --app-id <APP_ID> --installation-id <INSTALLATION_ID> --private-key "$PRIVATE_KEY") >> $GITHUB_OUTPUT
env:
PRIVATE_KEY: ${{ secrets.MY_GITHUB_APP_PRIVATE_KEY }}
- run: gh auth status
env:
GITHUB_TOKEN: ${{ steps.github_token.outputs.GITHUB_TOKEN }}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.