Money Forward Developers Blog

株式会社マネーフォワード公式開発者向けブログです。技術や開発手法、イベント登壇などを発信します。サービスに関するご質問は、各サービス窓口までご連絡ください。

20230215130734

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

こんにちは! 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』