
DependabotのPRにフックして追いcommitする
こんにちは、びしょ〜じょです。
寒すぎる。俺達の春を返せよ…。
1. はじめに
本ブログはJekyllで運用されており、GitHubでホストされ、Dependabotで依存ライブラリのアップデートを最近自動化した。
ところで、このシステムでは開発にNixを使っており、ruby-nixによってRubyの依存ライブラリをNix化している。 bundixでGemfile.lockからgemset.nixを生成し、ruby-nixでNix化されたgemsのパスが通っているshellが動いており、そこで開発をおこなう。
でもよぉDependabotのPRではgemset更新してくれないやんけ、ということで↓をやりたい。
- DependabotがGemfile{,.lock}更新のPRが出たら
- PRにhookして
- gemset.nixを更新して
- PR branchにpushする
2. hook やりかた
DependabotのPRがどういう挙動をするかを確認する。 例えばこのPR:
-
dependabot[bot]
というユーザがPRを作り1 -
dependencies
ruby
というラベルをつける
ふむ。 PRにラベルがついたときにGitHub Actionsを発火させられるので、それをやるとよい。
on:
pull_request:
types: [labeled]
ちょっと丁寧に、dependabot
というユーザがdependencies
ruby
ラベルをつけたときに絞る。
jobs:
hook:
if: |
github.event.label.name == 'dependencies' &&
github.event.label.name == 'ruby' &&
github.actor == 'dependabot[bot]'
runs-on: ubuntu-latest
steps:
- ...
ruby
以外にもhookしたい環境がある場合便利ですな。
3. やるだけ
あとはやるだけ。 bundixでgemsetを更新し、PR branchにcommit & pushする。
- run: nix run '.#patched-bundix' # gmsetを更新
- run: |
git config --global user.name 'github-actions[bot]'
git config --global user.email 'github-actions[bot]@users.noreply.github.com'
git commit --all -m "Update gemset.nix via bundix" || echo "No changes to commit"
git fetch origin
git rebase origin/${{ github.event.pull_request.head.ref }} || git merge origin/${{ github.event.pull_request.head.ref }}
git push "https://${GITHUB_ACTOR}:${{ secrets.GITHUB_TOKEN }}@github.com/${GITHUB_REPOSITORY}.git" ${{ github.event.pull_request.head.ref }}:refs/heads/${{ github.event.pull_request.head.ref }}
ユーザ名とemailは適当で良いが、無いとcommitできないので設定しておく。
${GITHUB_ACTOR}
は自動で設定されており、PRのauthorに同じ dependabot[bot]
。
${{ secrets.GITHUB_TOKEN }}
もGithub Actionsで自動で発行されるトークンで、リポジトリに閉じた権限で使える。
こういう賢いactionsを使ってもいいかもしれない。
PRに書き込むために、permissionを設定する必要があるので、やる
permissions:
contents: write
actions: write
pull-requests: write
なんか多くね? まあ一旦ええか、一旦…。
これでPRにhookして自動でgemsetが更新される。
ええな。
4. おわりに
Dependabotがhookサポートしてくれねえかな…。
この記事は業務時間中に書かれた。 株式会社eiiconではCIとNixのノウハウが豊富な人材を募集しています。
本記事で使われたテクニックはプロダクトの開発でも利用されている。
-
commitを見るとユーザ名がわかる。彼の本名は
dependabot[bot]
↩