個人サービスで1週間に一度gem updateをするようにした

今週の金曜日にケバブを食べながら開発体験などなどを話すランチをした
これは良い場なので今後もやっていきたい!

このランチの中の話の一つにgemのupdateをどれくらいの周期でやっているかの話が出た

  • 気づいたタイミング
  • 1週間に一回

後は手動でやってるとかCIでやってるとか
この時そういえば個人サービスのgem全然updateしてないなと思った

個人サービスは毎日開発するものでもないし複数個あるので、気づいた時にやろうはやらないやつなので良い感じの方法を探した
CIはCircleCIを使っているのでschedule使えば良い感じに出来そうじゃんと思ったらgemがあったのでそれを導入した

github.com

導入も簡単でGithubのpersonal access tokenを発行してCircleCIのProjectに設定して後は.circleci/config.ymlを良い感じに設定するだけ

↓に実際に作ったyamlを置いています

version: 2
jobs:
  build:
    docker:
      - image: ruby:2.5.1-alpine
        environment:
          RAILS_ENV: test
          DB_HOST: '127.0.0.1'
          DB_USERNAME: root
          DB_PASSWORD: ''
      - image: circleci/mysql:5.7
    working_directory: ~/repo
    steps:
      - run: &setup_requirements
          name: Install dependencies
          command: |
            apk add --update --no-cache \
              git \
              openssh-client \
              tar \
              gzip \
              ca-certificates \
              tzdata \
              yarn \
              gcc \
              build-base \
              libxml2-dev \
              libxslt-dev \
              mysql-dev
      - run: &set_timezone
          name: Set timezone to Asia/Tokyo
          command: cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
      - checkout
      - restore_cache: &restore_gems_cache
          name: Restore bundler cache
          keys:
            - gems-{{ .Environment.COMMON_CACHE_KEY }}-{{ checksum "Gemfile.lock" }}
            - gems-{{ .Environment.COMMON_CACHE_KEY }}-
      - run:
          name: Install Ruby Dependencies
          command: |
            bundle check || bundle install --jobs=4 --retry=3
            bundle clean
      - save_cache: &save_gems_cache
          name: Save bundler cache
          key: gems-{{ .Environment.COMMON_CACHE_KEY }}-{{ checksum "Gemfile.lock" }}
          paths:
            - /usr/local/bundle
      - restore_cache:
          name: Restore Yarn Package Cache
          keys:
            - yarn-packages-{{ checksum "yarn.lock" }}
      - run:
          name: Install Dependencies
          command: yarn install
      - save_cache:
          name: Save Yarn Package Cache
          key: yarn-packages-{{ checksum "yarn.lock" }}
          paths:
            - ~/.cache/yarn
      - run:
          name: Run rubocop
          command: bundle exec rubocop
      - run:
          name: Check Prettier
          command: yarn run fmt-check
      - run:
          name: Setup DB
          command: bundle exec rails db:create db:migrate
      - run:
          name: Run Rspec
          command: bundle exec rspec spec
  continuous_bundle_update:
    docker:
      - image: ruby:2.5.1-alpine
    working_directory: ~/repo
    steps:
      - run: *setup_requirements
      - run: *set_timezone
      - checkout
      - restore_cache: *restore_gems_cache
      - 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 hatappi hatappi@hatappi.me $CIRCLE_BRANCH

workflows:
  version: 2
  build:
    jobs:
      - build
  nightly:
    triggers:
      - schedule:
          cron: "00 10 * * 5"
          filters:
            branches:
              only: master
    jobs:
      - continuous_bundle_update

build jobはpushしたりした時に実行する方で今回良い感じにgem updateのPRを作ってくれるのは continuous_bundle_update job
これを nightly のscheduleで設定しているcronの時間に従って起動している
※ cronはUTCで設定される

ちなみにこの設定だとmasterブランチのみで日本時間で金曜日の19時にしか実行されないので動作テストをしておきたい
CircleCIはAPIを提供してくれているので、これを使ってテストしました

circleci.com

$ curl -u 11111111111111111111: \
     -d build_parameters[CIRCLE_JOB]=continuous_bundle_update \
     https://circleci.com/api/v1.1/project/github/hatappi/hoge/tree/circleci-bundle-update-pr

f:id:hatappi1225:20180922221955p:plain