くりにっき

フルスタックキュアエンジニアです

circleci-bundle-update-prをGitHub Actionsで動かせるようにした

投げたPRはこちら

github.com

動機

とある事情でCI用途のパーソナルアクセストークンを撲滅したかった件の一環です。

解説

GitHub Actionsはジョブ実行時に自動でアクセストークンをセットしてくれて便利なんですが、API実行の許可は付与されていても git push に対する許可が与えられていませんでした。

具体的には下記がGitHub Actionsだとエラーになります。

https://github.com/masutaka/circleci-bundle-update-pr/blob/v1.16.1/lib/circleci/bundle/update/pr.rb#L104-L111

そこでシステムの gitgit commitgit push してる部分をAPIで置き換えた感じです。

circleci-bundle-update-prをGitHub Actionsで動かす方法

https://github.com/masutaka/circleci-bundle-update-pr#run-on-github-actions にも書いたようにGitHub Actionsの変数をCircleCIの変数でexportしなおしてあげるだけでGitHub Actionsで動くようになります。

実際にGitHub Actionsで動かした図がこちら

f:id:sue445:20190928003300p:plain

補足

執筆時点では

steps:
  - name: Set up Ruby
    uses: actions/setup-ruby@v1
    with:
      ruby-version: v2.6.4

のように書いてもRuby 2.6.4をインストールできないため *1Gemfileruby "2.6.4" を書いているとかでどうしてもRuby 2.6.4を使いたい場合には

container:
  image: ruby:2.6.4

のようにDockerイメージを使うのがいいと思います。

circleci-bundle-update-prをGitHub Actionsで動かすメリット

  • パーソナルアクセストークンの発行が不要になる
  • CircleCIがorg単位での並列数に対してGitHub Actionsがリポジトリ単位での並列数なので、複数リポジトリで同時にジョブが実行されても詰まらない

circleci-bundle-update-prをGitHub Actionsで動かすデメリット

  • GitHub Actionsにはキャッシュがないため、毎回フルでbundle installが実行されて遅い
    • schedulerで定期的に動かすジョブなので少々遅いのは個人的には許容できる
    • Betaなのでキャッシュがないと割り切っています(楽観)

余談1

gitlabci-bundle-update-mr で同じ方針でやったので余裕かと思ってたら、GitLabだとAPI 1回で済んだことがGitHubだとAPI 7回もかかって意外に手ごわかった、、、

余談2

dependabotでええやんっていうのもごもっともなんですが、dependabotだと1 bundle update 1 PRになっている関係でPRが大量にきた時にCIが詰まるという問題があるので個人的には circleci-bundle-update-pr くらいの粒度が好きです。

あと、circleci-bundle-update-prだと下記のようにすることで週替りでbundle update当番を割り当てることができるんですが、dependabotだと同じことができない(assigneesが固定値しか渡せない)ためcircleci-bundle-update-prを使い続けてるというのもあります。

circleci-bundle-update-pr --assignees $(ruby -rtime -e 'a=%w[foo bar baz]; print a[Time.now.to_date.cweek% a.size]')