LoginSignup
15
0

More than 1 year has passed since last update.

GitHub Apps + Dangerをやってみる

Posted at

はじめに

この記事はand factory.inc Advent Calendar 2022 2日目の記事です。
昨日は @y-okudera さんの SnapshotTestingでURLで取得するリモートの画像の代替品としてAsset Catalogの画像を使用する でした。

目的

Dangerの公式ガイドでは、GitHubのユーザーのPersonal Access Tokenを用いることを推奨していますが、個別にユーザーを作る必要があり、以下の観点でよくないです。

  • Parsonal access token はその性質上権限が強すぎるので、流出した時のセキュリティ的なリスクが高い。
  • BOTとはいえ、ユーザー扱いであることに変わりはないので、Organizationのシート(人数)を1枠使ってしまう。

そこでGitHub Appsを経由して用いれば、ユーザー作成なしかつ、Botとして扱えるとのことなので、やってみました。

概要

Personal Access Tokenでは対象ユーザーのAccess TokenをGitHub上で作成した後はCIなどの環境変数として取り回すだけですが、GitHub AppsはAppの作成&連携やAccess Token生成を自前でコネコネやる必要があります。
弊社ではCircleCIを用いてますので、CircleCIで行っていきます。

Personal Access Token使用 GitHub Apps使用
%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2022-11-24_23.15.52.png %E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2022-11-24_23.16.45.png

GitHub Apps(Danger ボット)作成手順

では、Dangerで走るところまでやっていきましょう。

GitHub上での設定

まずはGitHubからです。

GitHubの設定より、「Settings」→「Developer settings」を開く。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2022-11-14_13.10.23.png

「New GitHub Apps」より新規作成

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2022-11-14_13.11.56.png

それぞれ項目を埋める

  • 基本情報

    • 以下は必須ですが、適当につける
      • GitHub App name
      • 説明
    • Homepage URLはGitHub上にページが作られる
    • Expire user authorization tokens のチェックを入れることで「refresh_token」を使用できる
    参考画像

    %E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2022-11-14_13.13.26.png

  • Permissions

    • MetadataRead-only
    • Issues,PullRequests,Commit statusesをRead and write
    参考画像

    %E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2022-11-14_13.13.42.png
    %E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2022-11-14_13.13.58.png
    %E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2022-11-14_13.14.13.png
    %E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2022-11-14_13.14.22.png

  • Subscribe Eventsは特にいじらず

    参考画像

    %E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2022-11-14_13.16.02.png

  • GitHubを他のorganizationに連携できるように

    参考画像

    %E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2022-11-14_13.16.08.png

Appsページで「AppID」「Installation ID」を確認、「Private Key」を作成

  • AppID

    %E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2022-11-14_13.19.38.png

  • Private Key

    • 以下のボタンPrivate Keyが生成され、.pemファイルがダウンロードされます。

    %E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2022-11-14_13.19.32.png

  • Installation ID

    • サイドメニューの「Install App」より、連携先のorganaizationを選択

      参考画像

      %E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2022-11-21_13.24.15.png

    • 連携リポジトリを選択後、「Install & Request」

      参考画像

      %E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2022-11-21_13.24.36.png

    • 出てくるURLの末尾が「Installation ID」です

      参考画像

      %E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2022-11-14_13.20.44.png

Circle CIの設定

「Project Settings」→「Environment Variables」より設定

  • 先程控えた値を投入
    • PEMのみBase64でエンコード/デコードしている ※スクリプト側で改行がうまく取れないため

      $ base64 test-danger2.2022-11-13.private-key.pem | cat
      

      %E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2022-11-14_13.25.32.png

「Project Settings」→「Advanced」で「Only build pull requests」をOnにする

  • OnにしないとPR作成した後に流れなくなるため

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2022-11-14_13.22.48.png

ソースコード側の修正

スクリプトを作成

  • 要はGitHub Appsのaccess tokenを取得している
    • JWT作成→access token取得→環境変数に入れる
#!/usr/bin/env bash

echo -e "\n>>> generate a JWT\n"
JWT=$(ruby << EOF
    require 'openssl'
    require 'jwt'  # https://rubygems.org/gems/jwt
    require 'base64'

    # Private key contents
    pem = Base64.decode64(ENV['GITHUB_APP_PEM_BASE64'])
    private_key = OpenSSL::PKey::RSA.new(pem)

    # Generate the JWT
    payload = {
      # issued at time, 60 seconds in the past to allow for clock drift
      iat: Time.now.to_i - 60,
      # JWT expiration time (10 minute maximum)
      exp: Time.now.to_i + (10 * 60),
      # GitHub App's identifier
      iss: ENV['GITHUB_APP_ID']
    }

    jwt = JWT.encode(payload, private_key, "RS256")
    puts jwt
EOF
)
echo -e "\n>>> create an installation access token\n"
echo $JWT
TOKEN=$(curl -s -D /dev/stderr -X POST \
    -H "Authorization: Bearer ${JWT}" \
    -H "Accept: application/vnd.github.v3+json" \
    https://api.github.com/app/installations/${GITHUB_APP_INSTALLATION_ID}/access_tokens \
| jq -r .token)
echo export DANGER_GITHUB_API_TOKEN="${TOKEN}" >> $BASH_ENV

.circleci/config.ymlにdangerのコマンド用意

  • 方法は色々あるけど、今回はfastlaneを利用します
  • 先程のスクリプトでAccessToken生成後、それを用いてDanger走らせる
    lane :run_danger do
        danger(
            danger_id: "test",
            dangerfile: "./DangerFile",
            github_api_token: ENV["DANGER_GITHUB_API_TOKEN"],
            verbose: true
        )
    end
# circle ci
danger:
    description: "Run danger"
    steps:
      - run: 
          name: Refresh token
          command: sh scripts/refresh_github_apps_token.sh # 先程のアクセストークン取得
      - run: 
          name: Echo check token
          command: echo $DANGER_GITHUB_API_TOKEN # テスト
      - run: 
          name: Run danger
          command: bundle exec fastlane run_danger

実行してみる!

  • できた!

    • ちゃんとBotだ!

    %E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2022-11-21_13.43.21.png

まとめ

  • GitHub Apps1つでOrgnization連携を複数行い、スクリプト共有すれば簡単に導入できそう!
  • 今回はDanger BotをGitHub Appsで作成してみるでしたが、GitHub Appsは他にも色々できる!

参考

15
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
0