時間がかかっていた依存パッケージの更新フローをカイゼンした話

こんにちは!
2019年7月に中途入社した @ktmouk と申します。

HRプロダクト領域の開発を担当しています。

アプリを開発するのが好きで、
プライベートでも『Hackaru』という時間を管理できるアプリを開発しています。

今回は初めてブログを書かせていただきます。
本稿では、依存パッケージの更新業務のフローを改善した話を紹介します!

 

依存パッケージの更新とは

HRプロダクト開発チームでは、毎週火曜日〜金曜日に依存パッケージの更新をしています。
Gemfileやpackage.jsonのような、プロダクトで使用しているパッケージをバージョンアップする作業です。
中には脆弱性を修正するような重要な更新も含まれているので、定期的にアップデートするのは大切な作業になります。

 

Dependabotを使用しています。

依存パッケージのバージョンアップには、「Dependabot」を使用しています。
「Dependabot」を使えば、依存しているパッケージの新しいバージョンを検知して自動でプルリクエストを作成してくれます!とても便利。

設定画面から検知する間隔も設定できます。
HR開発チームでは、毎週月曜日にプルリクエストを作成するように設定しています。

現状のフローはこんな感じです。月曜日に自動作成されたプルリクエストを担当者がチェック。
問題なければリリースするという流れです。

現状のフロー

  1. 毎週、持ち回りで担当者を1人割り当てる。
  2. 1人の担当者がDependabotが作成したPRを全部レビュー。問題なければmasterにマージ。
  3. すべてmasterにマージしたら、本番へリリース作業を行う。

シンプルですね!

 

で、何が問題なの?

フローはとても分かりやすいのですが、以下のような課題がありました。

課題

  • 週によってはPRの数にバラツキがある。 多いときだと30件以上。多すぎると担当者が大変。
  • 担当者によって得意分野の差があるので、1人ですべてのPRをレビューするのは限界がある。

少ないときはいいのですが、多いときは量がとても多い!
それを1人の担当者で全て見るというのも無理がありました。

 

そうだ、オートマージ機能を使おう。

Dependabotの機能一覧をざっくり見ているとオートマージ機能というものが。

automerged_updates

Specify which update pull requests should be merged automatically.
https://dependabot.com/docs/config-file/#automerged_updates

DependabotがPRをだしたうえでマージまで自動でしてくれます。素晴らしい。
これなら、レビューするプルリクエストの件数自体を減らせそうです。

さっそく .dependabot/config.yml の設定を変更します。
テストや開発環境でしか使用しないパッケージはオートマージするようにしました。

version: 1
update_configs:
  - package_manager: ruby:bundler
    directory: /
    update_schedule: weekly
    automerged_updates: # 自動マージの設定
      - match:
          dependency_type: development  # テスト用と開発環境用のパッケージを対象
          update_type: all

設定も簡単ですね。ちなみに設定ファイルの書式が正しいかどうか下記のページで検査できます。
本番に投下する前に、事前に検査しておくと安心です。
https://dependabot.com/docs/config-file/validator/

 

ついでにオートマージ先のブランチの作成も自動化しよう。

オートマージ機能を使用するには、 .dependabot/config.yml にマージ先にするブランチを指定する必要があります。

HR開発チームでは、マージ先にするブランチは、masterブランチではなく別のブランチにしています。

というのも、masterブランチにマージするには、事前にチームのレビューが必須の運用になっているからです。GitHubの設定でも1件以上のApproveが必須の設定になっていて、Dependabotのオートマージ先にmasterブランチを指定してもオートマージはできないようになっています。

そのため、オートマージ先にする一時的なブランチを作成することにしました。
ついでにブランチの作成も自動化しよう、ということで CircleCI を使ってブランチも自動で作成するようにしました。

sync_branch.sh というシェルを書いて、
ブランチがない場合は作成して、ある場合は git merge でmasterブランチの最新を取り込むようにしました。

#!/usr/bin/env bash

set -ex

USER_EMAIL="sync-branch@example.com"
USER_NAME="sync-branch[bot]"

BRANCH_FROM="$1"
BRANCH_TO="$2"

# リモートもブランチを存在するか確認する
function exists_branch() {
  git branch -a | grep "remotes/origin/$BRANCH_TO"
}

# リモートにブランチを作成
function create_branch() {
  git checkout "$BRANCH_FROM"
  git pull origin "$BRANCH_FROM"
  git checkout -b "$BRANCH_TO"
  git push origin "$BRANCH_TO"
}

# リモートのブランチを更新
function update_branch() {
  git checkout "$BRANCH_FROM"
  git pull origin "$BRANCH_FROM"
  git checkout "$BRANCH_TO"
  git merge "$BRANCH_FROM" -m "Merge branch '$BRANCH_FROM' into $BRANCH_TO by $USER_NAME"
  git push origin "$BRANCH_TO"
}

# gitのユーザアカウントを作成
function configure_user() {
  git config user.email $USER_EMAIL
  git config user.name $USER_NAME
}
configure_user

# リモートにブランチがあるか確認する
if [ $(exists_branch) ]; then
  update_branch # すでにある場合は、git mergeして最新を取り込む
  echo "$1 branch updated."
else
  create_branch # 存在しない場合はブランチを作成する
  echo "$1 branch created."
fi

このシェルスクリプトをCircleCIのスケジュール機能を使い毎週日曜日の 00:00に実行します。

jobs:
  sync_dependabot_branch:
    docker:
      - image: cibuilds/base
    steps:
      - checkout
      # masterブランチから milestone_dependabot ブランチを生やす
      - run: .circleci/sync_branch.sh "master" "milestone_dependabot"

workflows:
  version: 2
  sync_dependabot_branch:
    triggers:
      - schedule:
          # 毎週日曜日の 00:00
          # dependabotの実行が月曜日のため、日曜日には作成しておく。
          cron: "00 00 * * 0"
          filters:
            branches:
              only:
                - master

毎週日曜日になると、CircleCIが自動でmilestone_dependabotブランチを作成してくれます。

そして、月曜日にDependabotがプルリクエストを自動で作成。
日曜日に自動作成されたmilestone_dependabotブランチに自動でマージされます。

 

レビュー作業もチーム全員でやろう。

プルリクエストのレビューの方法も見直しました。毎週火曜日に bundle update会という会を開いて、
チーム全員でPRの確認作業をすることにしました。

今までは1人の担当者で確認作業をしていたのですが、担当者によって得意分野の違いがあるので、
1人ですべてのPRをレビューすると、時間がかかる課題がありました。

この会を開くことで、全員の知見を集結することができ、
20分〜30分ほどの時間で全てのプルリクエストをレビューすることができるようになっています。

 

おわりに

HR開発チームでは、こういった「改善しなくてもなんとかなるけど、改善しないと後々つらくなる課題」を積極的に改善していく雰囲気があり、1メンバーとして誇らしいなと感じてます!
こういう課題はついつい保留にしてしまいがちですが、保留にせず取り組むことが大切ですね。

マネーフォワードでは、エンジニアを募集しています。
ご応募お待ちしています。

【採用サイトのご案内】
マネーフォワード採用サイト
Wantedly

【プロダクトのご紹介】
お金の見える化サービス 『マネーフォワード ME』 iPhone,iPad Android

ビジネス向けバックオフィス向け業務効率化ソリューション 『マネーフォワード クラウド』

おつり貯金アプリ 『しらたま』

お金の悩みを無料で相談 『マネーフォワード お金の相談』

だれでも貯まって増える お金の体質改善サービス 『マネーフォワード おかねせんせい』

金融商品の比較・申し込みサイト 『Money Forward Mall』

くらしの経済メディア 『MONEY PLUS』

本業に集中できる新しいオンライン融資サービス 『Money Forward BizAccel』

Pocket