簡體   English   中英

如何將 GitHub Actions 工作流程驗證為 GitHub 應用程序,以便它可以觸發其他工作流程?

[英]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 應用程序權限的任何其他操作?

  1. 在您的用戶或組織帳戶中創建 GitHub 應用程序 記下顯示在應用設置頁面上的應用的應用 ID ,稍后您將需要它。

  2. 授予您的應用必要的權限 要發送拉取請求,應用程序可能需要:

    1. 內容權限的讀寫訪問
    2. 拉取請求權限的讀寫訪問權限
    3. 如果您打算發送更改工作流文件的拉取請求,則對工作流權限進行讀寫訪問
  3. 為您的應用生成私鑰

  4. 將私鑰的副本存儲在名為MY_GITHUB_APP_PRIVATE_KEYGitHub Actions 機密中。 這可以是將包含您要編寫的工作流的存儲庫中的存儲庫級機密,也可以是用戶級或組織級機密,在這種情況下,將需要訪問包含工作流的存儲庫到秘密。

  5. 在您的存儲庫或用戶或組織帳戶中安裝您的 GitHub 應用程序 記下安裝 ID 這是在安裝應用程序的存儲庫、用戶或組織的設置中安裝頁面 URL 末尾的 8 位數字。 稍后您將需要它。

想要在您的應用程序運行時進行身份驗證的工作流運行需要在每次運行時獲取臨時安裝訪問令牌,並使用該令牌對自身進行身份驗證。 這在 GitHub 的文檔中稱為身份驗證安裝,他們在 Ruby 中提供了一個代碼示例。 步驟是:

  1. 生成一個JSON Web 令牌(JWT),其iat (“發布時間”)為過去 60 秒, exp (過期時間)為未來 10m,您的App IDiss (發行者),並使用您的私鑰和 RS256 算法。
  2. https://api.github.com/app/installations/:installation_id/access_tokens發出 HTTP POST 請求(將:installation_id替換為您的安裝 ID ),並在Authorization: Bearer <SIGNED_JWT>標頭中使用已簽名的 JWT。
  3. 臨時安裝訪問令牌將在 GitHub API 的 JSON 響應中。

這是一個使用PyJWTrequests實現此令牌交換的 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 調用進行身份驗證。 下面的工作流程將:

  1. 安裝 Python 3.10 和gha-token
  2. 使用您之前創建的App IDInstallation IDMY_GITHUB_APP_PRIVATE_KEY GitHub secret 調用gha-token獲取安裝訪問令牌
  3. 使用安裝訪問令牌對 GitHub CLI 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM