Agile育成ブログ
未来を変える喜びを
未分類

🤖 GitHub Actionsにおける GITHUB_TOKEN の役割

GITHUB_TOKEN は、GitHub Actionsのワークフローが実行されるたびに自動的に生成される一時的な認証トークンです。

これは、ワークフロー内で実行されるアクションやスクリプトが、GitHub Actions自身に代わってGitHub APIを通じて操作(Issueの作成、コメントの投稿、コードのチェックアウトなど)を行うために使用されます。

📌 基本的な特徴

  • 自動生成: ワークフローの開始時にGitHubによって自動で作成されます。
  • 有効期限: ジョブが完了するか、最大で実行時間が終了すると、自動的に期限切れとなり無効になります。
  • アクセス方法:
    • secrets コンテキストを通じて、${{ secrets.GITHUB_TOKEN }} という標準構文で参照できます。
    • アクションには、明示的に渡されなくても github.token コンテキスト経由でアクセス権があります(セキュリティ上の理由から、明示的に渡すか権限を制限することが推奨されます)。

🛠️ GITHUB_TOKEN の主な使用例

例 1: アクションやCLIへの入力として渡す

GitHub CLI (Command Line Interface) など、外部のツールや独自のアクションを使用する場合、認証トークンを明示的な入力パラメーターとして渡します。

  • 目的: スクリプトやCLIツールが、認証された状態でGitHubリソースを操作できるようにする。
jobs:
  open-issue:
    # ... その他の設定 ...
    steps:
      - run: |
          # gh issue create コマンドを実行
          gh issue --repo ${{ github.repository }} \
            create --title "Issue title" --body "Issue body"        
        env: # <--- 環境変数としてトークンを設定
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} # トークンをGH_TOKENとして渡す

例 2: GitHub REST APIを直接呼び出す

curl などのツールを使って、GitHub REST APIの特定のエンドポイントに直接リクエストを送信し、認証済みの操作(Issueの作成など)を行います。

  • 目的: GitHub Actionsに組み込まれていない、特定のAPI機能を利用する。
jobs:
  create_issue:
    # ... その他の設定 ...
    steps:
      - name: Create issue using REST API
        run: |
          curl --request POST \
          --url https://api.github.com/repos/${{ github.repository }}/issues \
          --header 'authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' # <--- Bearerトークンとして認証情報を渡す
          # ... APIリクエストのペイロード (タイトル、本文など) ...

🔒 セキュリティ強化:アクセス許可(Permissions)の設定

GITHUB_TOKEN は強力なため、セキュリティ上のベストプラクティスとして、ワークフローまたはジョブごとに必要最小限のアクセス権のみを付与することが強く推奨されます。

この設定には、ワークフローファイル内の permissions キーを使用します。

📌 permissions キーの役割

permissions キーを使用することで、GITHUB_TOKEN がどのリポジトリリソース(Issue、Contents、Pull Requestsなど)に対して「読み取り (read)」または「書き込み (write)」権限を持つかを指定できます。

ワークフロー例

例 1では、issues: writecontents: read の2つの権限のみをジョブに付与しています。

jobs:
  open-issue:
    runs-on: ubuntu-latest
    permissions: # <--- GITHUB_TOKENの権限をここで制限
      contents: read  # コードの読み取りのみ許可
      issues: write # Issueの作成・編集を許可
    steps:
      # ... Issueを作成するステップ ...