scala-stewardを独自に作ったGitHub App(bot)で動かす方法

というわけで、デフォルトの GITHUB_TOKEN 使う方法以外を模索している最中のメモ。

多少参考にしたblog

sue445.hatenablog.com

GitHub Appの使い方として、なにか色々変な気がする(リポジトリ毎にprivate key設定する必要があるとか)が、とりあえず

  • 人間のUSER TOKENを使う必要がなく、Botからpull reqが出せる
  • なおかつ、出したpull reqが、デフォルトの GITHUB_TOKEN と違って、別のGitHub Actionsを実行可能

という目的を達成出来たのでメモ。

個人のTOKEN使うのと比較して、セキュリティ的に(万が一TokenやPrivate Keyが流出した場合)安全性が増しているのか?は、だいぶ謎なので改善方法考える (Private Keyそれぞれ登録は面倒だし微妙な)

TODO: Private Key流出したら結局全部変える必要あるだろうから、AppのTOKENを登録しても同じというか(出来るのかよくわかってない)、(リポジトリ毎にTOKEN変更可能なら?)むしろそのほうがいいのか・・・? あるいは、Private Keyの方をリポジトリごとやorganization毎に、複数生成・・・?

GitHub App作る

  • https://github.com/settings/apps ここで New GitHub App
  • 必要な権限は以下
  • その他必要なものないはず?なので、オプショナルな項目はとりあえず必要なし、必須なURLとかは適当にGitHubの自分かorganizationのアカウントでよい?
  • Private?Internal?(自分専用)でもどっちでも、とりあえず動く・・・?複数のOrganizationで共有したいならPrivateではないほうがいいが、この方式のままだとセキュリティ的に微妙なので、それぞれApp作るほうがいいか、あるいは・・・

必要な権限

  • Pull requests Read & Write
  • Contents Read & Write
  • TODO: どこか(どこ?)に、forkしてpull reqするようにすれば必要ない権限があるので改善方法考える
  • ここ https://github.com/settings/apps/アプリのID/permissions から後から変更も可能
    • 権限を変更したら、既にリポジトリにインストール?済の場合、Appの再認証?再登録?が必要だが
    • organizationに属するappの場合は https://github.com/organizations/orgのid/settings/apps/appのid/permissions

Private Key生成

  • ここ https://github.com/settings/apps/アプリのIDGenerate a private key
  • botのid.日付.private-key.pem というファイルが勝手にダウンロードされる

Secret登録

登録するのは 適当なKEY名生成したPrivate Key

登録場所

organization用のappの場合、organizationに権限をtransfer

  • 必須ではないが、organization用に作るなら、やっておいたほうが良さそう
  • おそらくorgの管理者権限がないと、acceptが出来ないが
  • そもそもorg用につくるなら、最初からこっち https://github.com/organizations/orgの名前/settings/apps から作ればいいかも

アプリをインストール

.scala-steward.conf を置く

.github/workflows/scala-steward.conf を置く

  • あくまで設定例
  • TODO: リポジトリごとに、それぞれこのconfを置く前提で説明書いたが、リポジトリごとに置くのではなくて repos.md 作って、複数リポジトリを管理する方式ならば、面倒さやセキュリティの問題はだいぶ軽減されそう?ただし、tokenのスコープの関係上おそらく手順変えないと動かないかも
  • だた、個人のリポジトリは(コラボレーターいなければ)ある程度はそれでもいいが .github/workflows/scala-steward.conf の編集権限と、登録されてるリポジトリの権限を出来るだけ同一にしたいので、リポジトリ毎に置きたい、という気持ちがある
name: scala-steward
on:
  push: # pushは無くてもいい。あるいはcronなしで逆にpushだけという方法もなくもないが普通はcron
  schedule:
  - cron: '0 0 * * *' # 好きなタイミングを設定。UTC。これだと毎日1回
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
    - name: Generate token
      id: generate_token
      if: ${{ !github.event.repository.fork }}
      uses: tibdex/github-app-token@v1
      with:
        app_id: 作ったアプリのID
        private_key: ${{ secrets.登録したSECRETのKEY }}
    - uses: scala-steward-org/scala-steward-action@v2
      if: ${{ !github.event.repository.fork }}
      with:
        github-token: ${{ steps.generate_token.outputs.token }}
        author-email: "APIから取得したID+ボットの名前[bot]@users.noreply.github.com"
        author-name: "ボットの名前[bot]"

botのemailの取得方法

追記

公式でGitHub Appsのkey指定に直接対応したので、token生成用のGitHub Actionsは組み合わせる必要がなくなって、scala-stewardのGitHub Actionsのみで実行可能になりました

scalikejdbc

argonaut