APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

【GitHub Actions】PATなしで別のリポジトリからコードをチェックアウトしたい!

はじめに

こんにちは、ACS事業部の小原です。
本記事は弊社のアドベントカレンダーの15日目としての投稿になります!
他の記事も是非チェックしてみてください↓

qiita.com

さて、今回はGitHub Actions で最近使った機能について簡単に紹介しようと思います。

こんなケースに遭遇したことはありませんか?

  • 共通のライブラリコードを別のプライベートリポジトリで管理している
  • CIパイプラインでそのライブラリを使ってテストやビルドをしたい
  • 今後の管理を考えて Personal Access Token(PAT)は使いたくない...

「Personal Access Tokenを使えば簡単!」と思われるかもしれませんが、以下のような懸念がありました。

  • ①セキュリティリスク
    • PATは権限が広い
    • 個人のトークンに依存したくない
  • ②メンテナンス性
    • トークンの期限管理が必要
    • 担当者が変わったときの引継ぎが面倒

そこで、GitHub Appを使ってこの課題を解決しました。

GitHub Appを使うメリット

GitHub Appを使うメリットを以下の通りまとめてみました。

  • 必要最小限の権限設定が可能
    • リポジトリ単位でアクセス権を設定
    • 読み取り専用の権限も◎
  • Organization管理が容易
    • 個人に依存しない
    • アプリケーション単位での権限管理
  • より柔軟な有効期限
    • インストールトークンは1時間
    • でも、自動更新が可能

GitHub Appの秘密鍵は無期限で有効ですが、そこから生成される GitHub App トークンは最大で1時間有効というところがいいですね。

実装手順

ざっくりとした流れは、こんな感じです。

  1. GitHub Appの作成
  2. APP IDと秘密鍵の取得・作成
  3. GitHub Appのインストール
  4. SecretsにAPP IDと秘密鍵を登録
  5. ワークフローファイル内で呼び出し

ひとつずつ見ていきましょう。

1. GitHub Appの作成

GitHubの Settings > Developer settings > GitHub Apps > New GitHub App から新規作成します。

今回は不要なのでHomepage URLは適当に、Webhookはチェックマークを外しています。

続いてリポジトリの設定です。
今回は別のリポジトリのコードが読めればいいのでContentsの欄をRead-onlyに設定します。

他のリポジトリに対して、「ファイルを編集してプルリクエストを作成したい」という時はContentsPull requestsRead and writeを設定することで実現できます。

MetadataContentsに依存するので自動的にRead-onlyに設定されます。

最後に GitHub Appのインストール先がOnly on this accountになっていることを確認して作成します。

2. APP IDと秘密鍵の取得・作成

GitHub Appが作成できたらGeneralからGitHub App ID をしっかりメモしてください。

また、画面下部の [Generate a private key]をクリックして秘密鍵(GitHub App Private Key)をダウンロードします。

3. GitHub Appのインストール

次にInstall AppからGitHub Appをインストールしましょう。

すると以下の画面に遷移しますが、ここでどのリポジトリに先ほど設定した権限を持たせるか決めます。
複数のリポジトリに対して設定することも可能です。

4. SecretsにAPP IDと秘密鍵を登録

ここまで来たら設定はあと少しです。
作成したGitHub AppのAPP IDと秘密鍵をSecretsに登録していきます。

IDと秘密鍵を登録したら検証準備完了です。

5. ワークフローファイル内で呼び出し

では GitHub Actions で別のプライベートリポジトリからコードをチェックアウトしてみましょう。

github_actionsというリポジトリから、my-test-projectというリポジトリをチェックアウトしてみます。

ワークフローは以下のようになります。

name: Checkout Private Repo

on: 
  workflow_dispatch:

jobs:
  checkout:
    runs-on: ubuntu-latest
    steps:
      # App認証トークンの取得
      - name: Generate GitHub App token
        id: generate-token
        uses: actions/create-github-app-token@v1
        with:
          app-id: ${{ secrets.APP_ID }}
          private-key: ${{ secrets.PRIVATE_KEY }}
          owner: <your-org>
          repositories: my-test-project
      
      # メインリポジトリのチェックアウト
      - uses: actions/checkout@v4
          
      # my-test-projectリポジトリのチェックアウト
      - name: Checkout my-test-project repo
        uses: actions/checkout@v4
        with:
          repository: <your-org>/my-test-project
          path: my-test-project
          token: ${{ steps.generate-token.outputs.token }}

      # README.mdの表示
      - name: Display README.md
        run: cat my-test-project/README.md

ここで重要なのは、以下の二点です。
1. Generate GitHub App tokenidを設定し、その後のチェックアウトで利用する。
2. チェックアウト時に必ずtoken: ${{ steps.<設定したid>.outputs.token }}と指定する。

検証結果

別のプライベートリポジトリをチェックアウトして、README.mdを表示させました。
実行結果はこちらです。

少しめんどくさい設定手順に思えた方もいらっしゃるかと思いますが、慣れると簡単です。

終わりに

この機能が役立つ場面は挙げるとキリがないくらい多いと思います!
皆さんもぜひ活用してみてください!


私達ACS事業部はAzure・AKSなどのクラウドネイティブ技術を活用した内製化のご支援をしております。ご相談等ありましたらぜひご連絡ください。

www.ap-com.co.jp

また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。

www.ap-com.co.jp

本記事の投稿者: 小原陽希