【Github】Github Actions ~ クロスレポジトリアクセス ~

◾️はじめに

https://dk521123.hatenablog.com/entry/2025/02/02/161957

で、別レポジトリ(クロスレポジトリ)のアクセスについて考えたが
以下の本で「第17章 GitHub Appsトークンによるクロスリポジトリアクセス」
が書かれていたので、実際にやってみた内容などをまとめておく

目次

【1】Github Actionsで推奨されるクレデンシャル
 1)GITHUB_TOKEN
 2)デプロイキー (Deploy Key)
 3)GitHub Apps トークン
【2】Github Actionsで非推奨されるクレデンシャル
 1)Fine-grained personal access tokens
 2)個人アカウントから作成したSSHキー
 3)パーソナルアクセストークン (clasic)
【3】GitHub Appsの設定手順
 1)GitHub Appsの作成
 2)App ID取得およびトークン生成用の秘密鍵生成
 3)GitHub Appsをインストール
 4)Secrets にApp IDと秘密鍵を保存
 5)実装する
【4】GitHub Apps トークンの運用
 1)秘密鍵のキーローテーション

【1】Github Actionsで推奨されるクレデンシャル

* 以下の通り。(★がお勧めで、今回のテーマの一つ)

1)GITHUB_TOKEN
2)デプロイキー (Deploy Key)
3)GitHub Apps トークン ★

1)GITHUB_TOKEN

* 詳細は、以下の関連記事を参照のこと

Github Actions ~ GITHUB_TOKEN / permissions ~
https://dk521123.hatenablog.com/entry/2024/04/22/221027

デメリット

* トークンの権限は、ワークフローを含むリポジトリに限定されるため

2)デプロイキー (Deploy Key)

* 特定リポジトリ専用のSSHキー

デメリット

* Git によるコードの読み書きしかできないため
 GitHub APIの実行ができない
* アクセス可能なリポジトリは1つのみ

3)GitHub Apps トーク

* 利用時に都度発行される

メリット

* 有効期限が短いため、セキュア

構造

+-------- GitHub Apps ----------+  生成   +--------------------------+
|   秘密鍵(長命。事前に準備が必要)]  | -----> | GitHub Apps Token(短命) |
+-------------------------------+         +--------------------------+

【2】Github Actionsで非推奨されるクレデンシャル

以下1)〜3)いずれも
その個人がプロジェクトから離脱した時のことを考えると
本番運用には適していない

1)Fine-grained personal access tokens

cf. Fine-grained(ファイングレイン) = きめの細かい, 微粒子の

理由

* 有効期限が存在し、長期運用には不向き

2)個人アカウントから作成したSSHキー

理由

* リポジトリ単位のアクセス制御ができない(Organization関係なく全てにアクセスできる)

3)パーソナルアクセストークン (clasic)

理由

* アクセス制御が大雑把にしかできない

【3】GitHub Appsの設定手順

* 以下のサイトを参考にするのが良さそう

https://zenn.dev/suzutan/articles/how-to-use-github-apps-token-in-github-actions

1)GitHub Appsの作成

[1] GitHub Apps 作成ページに移動

* 以下のサイトに移動

https://github.com/settings/apps/new

[2] GitHub Apps 作成ページに移動

* 以下を入力し、「Create GitHub App」ボタン押下

* GitHub App name:任意の文字列(e.g. HelloWorldGoGo)
* Write: 任意の文字列(e.g. Hello world)
* Homepage URL: (e.g. https://dk521123.hatenablog.com)
---
* Webhook
 + Active : チェック外す
---
* Repository permissions(リポジトリレベルのパーミッション)
 + Contents: Read-only ... 別リポジトリのソースコードが取得可能になる
---
* Account permissions(個人アカウントレベルのパーミッション)
* Organization permissions(Organizationレベルのパーミッション)
 => 今回特に何も触らない
---
* Where can this GitHub App be installed?
 + Only on this account にチェック

2)App ID取得およびトークン生成用の秘密鍵生成

* 「1)GitHub Appsの作成」の続きとして、、、

[1] App IDをコピーしておく

* App ID: 1XXXXXX

[2] トークン生成用の秘密鍵生成

* 下スクロールして、「Private keys」欄の「Generate a private key」ボタン押下
 => 秘密鍵のファイル(<AppName>.YYYY-MM-DD.private-key.pem)がダウンロードされる  

3)GitHub Appsをインストール

[1] GitHub Apps設定の左メニュー[Install App]を選択
[2] 「Install」ボタン押下し、インストールする
[3] [Only select repositories]を選択
[4] 「Select repositories」プルダウンを選択し、
  使いたいリポジトリを選択(複数選択可能)
[5] 「Install」ボタン押下

4)Secrets にApp IDと秘密鍵を保存

Case1:Web UIから設定する場合
Case2:ghコマンドから設定する場合

GitHub CLI ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2024/02/17/233836

Case1:Web UIから設定する場合

[1] 使用したいリポジトリに移動
[2] [Settings]-[Secrets and variables]を選択
[3] 「Secrets」タブを選択し「Merge environment secrets」ボタン押下
[4] 「New environment」ボタン押下
[5] 「Name」欄に任意の文字列(e.g. Sample)を入力し「Configure environment」ボタン押下
[6] 下スクロールで「Environment secrets」欄までいき、「Add secrets environment」ボタン押下

あとは必要なシークレットを登録する

APP_ID:1XXXXXX
PRIVATE_KEY:<秘密鍵ファイルの内容>

Case2:ghコマンドから設定する場合

# gh secret set 【シークレット名】 --body "【内容】"
gh secret set APP_ID --body "1XXXXXX"

# gh secret set 【シークレット名】<< "【ファイルパス】"
gh secret set PRIVATE_KEY << "【ファイルパス】"

5)実装する

on: push

jobs:
  hello-world:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/create-github-app-token@v1
         id: app-token
         with:
           app-id: ${{ secrets.APP_ID }}
           private-key: ${{ secrets.PRIVATE_KEY }}
           owner: another-owner
      - uses: actions/checkout@v4
         id: clone-private-repo
         with:
           repository: your-org/yout-private-repo
           token: ${{ steps.app-token.outputs.token }} # ★出力結果★
           path: your-tools

【4】GitHub Apps トークンの運用

1)秘密鍵のキーローテーション

* 目安は1年
* 複数登録可能なので、問題なければ、切り替える運用でOKそう
* 公式ドキュメントの以下の記述も参考

https://docs.github.com/ja/apps/creating-github-apps/authenticating-with-a-github-app/managing-private-keys-for-github-apps
https://docs.github.com/ja/apps/creating-github-apps/about-creating-github-apps/best-practices-for-creating-a-github-app#private-keys

関連記事

Github ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2019/07/18/234652
Github Actions ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2021/11/04/142835
Github Actions ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2022/06/16/151443
Github Actions ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2023/12/22/195715
Github Actions ~ GITHUB_TOKEN / permissions ~
https://dk521123.hatenablog.com/entry/2024/04/22/221027
Github Actions ~ Self-hosted runners / 入門編 ~
https://dk521123.hatenablog.com/entry/2023/12/18/204119
Github Actions ~ Self-hosted runners / あれこれ編 ~
https://dk521123.hatenablog.com/entry/2024/02/07/002736
Github Actions ~ セキュリティ/Third-Party Github Action ~
https://dk521123.hatenablog.com/entry/2024/04/05/000136
Github Actions ~ セキュリティ/インジェクション攻撃 ~
https://dk521123.hatenablog.com/entry/2024/04/16/222419
Github Actions ~ deprecationによるエラー防止を考える ~
https://dk521123.hatenablog.com/entry/2025/02/01/214020
Github Actions ~ 別レポジトリをcloneすることを考える ~
https://dk521123.hatenablog.com/entry/2025/02/02/161957
Self-hosted runner下の Github actions が突然エラー
https://dk521123.hatenablog.com/entry/2024/07/05/000212
GitHub Apps ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2024/07/06/230610
GitHub CLI ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2024/02/17/233836
状態を戻す際には ~ reset / revert etc ~
https://dk521123.hatenablog.com/entry/2020/07/12/103726
Gitで状態を戻す方法を考える
https://dk521123.hatenablog.com/entry/2020/07/11/182959