patorashのブログ

方向性はまだない

CircleCIのworkflowを使ってbundle updateのPRを自動化する

以前にHerokuとCircleCIを使ってbundle updateのPRの生成を自動化していました。

qiita.com

しかし、最近はCircleCIのworkflowを使えばHerokuを使わずともCircleCIのみで完結しそう!ということだったので調査してみました。

方法が公開されていた

circleci-bundle-update-prのREADMEで、CircleCIのワークフローを使ってPRを生成する方法が公開されていました。ありがたい!

github.com

.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で接続して、必要になりそうなものをインストールしていきます。

参考にしたのは、以下のページ。

dora.bk.tsukuba.ac.jp

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 を設定しなければなりません。 GitHubPersonal 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自体も、テストが通ったら自動デプロイができたり、テストが通ったら通知を送って、手動で承認をするとデプロイが動くなど、細かい運用フローにも対応できそうで、よさそうです。とりあえず個人プロジェクトではテストが通ったら自動デプロイするところまでやってみようと思います。