結局、デフォルトのGITHUB_TOKENで別のGitHub Actions起動できない問題があるから使いづらい(実質、他のCI併用する場合じゃないと有用じゃない?)けど、これhttps://t.co/uo7COyP2xo
— Kenji Yoshida (@xuwei_k) 2020年11月20日
本体に取り込まれてリリースされてた
というわけで、デフォルトの GITHUB_TOKEN
使う方法以外を模索している最中のメモ。
自動化したpull reqと手動のやつ分けたいが、GitHubは別アカウント作ったらなぜかすぐにspam扱いするし、デフォルトで提供されるGITHUB_TOKEN使ったGitHub Actionsは他を起動不可能な制約があるし、結局自動のやつも自分のTOKEN使うことになり、区別ができなくなるというか草が無駄に水増しされる状態
— Kenji Yoshida (@xuwei_k) 2020年11月17日
多少参考にしたblog
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毎に、複数生成・・・?
これとscala-stewardのGitHub Actionsを組み合わせたら動いた(デフォルトGITHUB_TOKENと違ってCI実行される)が、手順が面倒・・・https://t.co/viWJ12uqWl pic.twitter.com/G2PAYeoJzN
— Kenji Yoshida (@xuwei_k) 2020年11月20日
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/アプリのID
でGenerate a private key
botのid.日付.private-key.pem
というファイルが勝手にダウンロードされる
Secret登録
登録するのは 適当なKEY名
と 生成したPrivate Key
登録場所
- organizationで、複数リポジトリで使用予定ならば、こっちが便利? https://github.blog/changelog/2020-05-14-organization-secrets/
- organizationではない個人リポジトリは、リポジトリごとに(面倒)
https://github.com/ユーザー/なまえ/settings/secrets/actions
organization用のappの場合、organizationに権限をtransfer
- 必須ではないが、organization用に作るなら、やっておいたほうが良さそう
- おそらくorgの管理者権限がないと、acceptが出来ないが
- そもそもorg用につくるなら、最初からこっち
https://github.com/organizations/orgの名前/settings/apps
から作ればいいかも
アプリをインストール
- https://github.com/settings/installations ここから?作ったアプリ選ぶ
All repositories
かOnly select repositories
の、好きな方選ぶ
.scala-steward.conf
を置く
- デフォルトの設定でいいなら必要なし
- 必要なら
.github/workflows/scala-steward.conf
を置くより前に! - https://github.com/scala-steward-org/scala-steward/blob/a466aae6799dfbe77f6f281b7356be94298bc263/docs/repo-specific-configuration.md
- pull reqが多くなりそうな場合は
updates.limit
を適当な小さい有限にしておくのがオススメ
.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の取得方法
- ここからid取得
https://api.github.com/users/ボットの名前%5Bbot%5D
- github-actions botの場合 https://api.github.com/users/github-actions%5Bbot%5D
- github-actions botに限らず、任意のGitHub Appで作ったbotアカウントで、この方法が使えるっぽい?
- https://github.community/t/github-actions-bot-email-address/17204/6
追記
Thanks to @laughedelic and @xuwei_k work now scala-steward-action can be used as a backend for your own Scala Steward GitHub App! Check it out: https://t.co/9OsolsiMnn
— Alejandro Hernández (@alejandrohdezma) 2021年3月13日
公式でGitHub Appsのkey指定に直接対応したので、token生成用のGitHub Actionsは組み合わせる必要がなくなって、scala-stewardのGitHub Actionsのみで実行可能になりました
例
scalikejdbc
- https://github.com/scalikejdbc/csvquery/commit/cb3a2438b244b8985c9f55a105555d776b56d340
- https://github.com/apps/scalikejdbc-bot