以前にHerokuとCircleCIを使ってbundle update
のPRの生成を自動化していました。
しかし、最近はCircleCIのworkflowを使えばHerokuを使わずともCircleCIのみで完結しそう!ということだったので調査してみました。
方法が公開されていた
circleci-bundle-update-pr
のREADMEで、CircleCIのワークフローを使ってPRを生成する方法が公開されていました。ありがたい!
.circleci/config.ymlに設定してみる
設定をほぼ丸々コピペしてみました。
- Rubyのバージョンの辺りを最新の2.5.1に変更
- restore_cacheのkeysを既存プロジェクトの設定に変更
とりあえず動くかどうか試すためにworkflowsのbuildブロックにbundle updateするjobを設定してpushしてみたところ、エラーで落ちました。
nokogiriが入らない
nokogiriは、C拡張のgemなので、素のruby: 2.5.1-alpine
のdocker imageだとコンパイルできずにエラーになりました。とりあえずCircleCIにsshで接続して、必要になりそうなものをインストールしていきます。
参考にしたのは、以下のページ。
alpine-sdkを入れればよさそう。
apk add --update --no-cache alpine-sdk
その後、bundle installしたらnokogiriが無事にインストールされました!しかしまだbundle installの途中でコケる…。
pgが入らない
pgもC拡張のgemなのですが、postgresql-clientがないとコンパイルできないようでした。こちらも入れていきます。
apk add --update --no-cache postgresql-dev
この後、bundle installしたらpgも無事にインストールされ、bundle installが完走しました。
修正後の設定
以下が、修正後の設定です。nokogiriやpostgresqlを使ってない場合は素のままでいいと思いますが、参考程度に。 deployブロックのusername, emailは自身のgithubアカウントに置き換えてください。
また、CircleCIのプロジェクトに環境変数 GITHUB_ACCESS_TOKEN
を設定しなければなりません。
GitHubのPersonal access tokensより、トークンを発行して、それをCircleCIのプロジェクトのBUILD SETTINGS » Environment Variablesから設定してください。
version: 2 jobs: build: # snip continuous_bundle_update: docker: - image: ruby:2.5.1-alpine environment: TZ: "/usr/share/zoneinfo/Asia/Tokyo" working_directory: /work steps: - run: name: Install System Dependencies command: | # See also https://circleci.com/docs/2.0/custom-images/#adding-required-and-custom-tools-or-files apk add --update --no-cache git openssh-client tar gzip ca-certificates tzdata alpine-sdk postgresql-dev gem install -N bundler - checkout - restore_cache: name: Restore bundler cache keys: - gems-{{ .Environment.COMMON_CACHE_KEY }}-{{ checksum "Gemfile.lock" }} - gems-{{ .Environment.COMMON_CACHE_KEY }}- - run: name: Setup requirements for continuous bundle update command: gem install -N circleci-bundle-update-pr - deploy: name: Continuous bundle update command: circleci-bundle-update-pr <username> <email> workflows: version: 2 build: jobs: - build: # snip nightly: triggers: - schedule: cron: "00 10 * * 5" filters: branches: only: master jobs: - continuous_bundle_update
まとめ
CircleCIだけで完結するようになったのはありがたいです。また、cronのようにスケジュール設定できるとのいうのも、色々使えそうな気がします。 また、workflow自体も、テストが通ったら自動デプロイができたり、テストが通ったら通知を送って、手動で承認をするとデプロイが動くなど、細かい運用フローにも対応できそうで、よさそうです。とりあえず個人プロジェクトではテストが通ったら自動デプロイするところまでやってみようと思います。