こんにちは! 2019年7月に中途入社した @ktmouk と申します。
HRプロダクト領域の開発を担当しています。
アプリを開発するのが好きで、 プライベートでも『Hackaru』という時間を管理できるアプリを開発しています。
今回は初めてブログを書かせていただきます。 本稿では、依存パッケージの更新業務のフローを改善した話を紹介します!
依存パッケージの更新とは
HRプロダクト開発チームでは、毎週火曜日〜金曜日に依存パッケージの更新をしています。 Gemfileやpackage.jsonのような、プロダクトで使用しているパッケージをバージョンアップする作業です。 中には脆弱性を修正するような重要な更新も含まれているので、定期的にアップデートするのは大切な作業になります。
Dependabotを使用しています。
依存パッケージのバージョンアップには、「Dependabot」を使用しています。 「Dependabot」を使えば、依存しているパッケージの新しいバージョンを検知して自動でプルリクエストを作成してくれます!とても便利。
設定画面から検知する間隔も設定できます。 HR開発チームでは、毎週月曜日にプルリクエストを作成するように設定しています。
現状のフローはこんな感じです。月曜日に自動作成されたプルリクエストを担当者がチェック。 問題なければリリースするという流れです。
現状のフロー
- 毎週、持ち回りで担当者を1人割り当てる。
- 1人の担当者がDependabotが作成したPRを全部レビュー。問題なければmasterにマージ。
- すべて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
■ビジネス向けバックオフィス向け業務効率化ソリューション 『マネーフォワード クラウド』
■だれでも貯まって増える お金の体質改善サービス 『マネーフォワード おかねせんせい』