面倒なリリース作業を楽にするSlack Botを1年以上運用している話
はじめに
アジャイル開発では毎日のようにリリースが行われますが、その作業には多くのコミュニケーションが発生し、手間がかかります。今回は、SlackBotを使ってどのようにこれを解決したかをご紹介します。
前提
弊社の開発では以下を採用しています:
- Github flowで開発
- Github Actionsはタグ発行のみで、実際のデプロイはCircleCI担当
- blue/greenデプロイを採用
開発フロー
GitHub flowを採用しているためシンプルなフローです。
- mainブランチからfeatureブランチをチェックアウト
- 適宜mainブランチを取り込みながらfeatureブランチで作業
- レビュー依頼(時折featureブランチ単位でステージング環境で動作確認も行う)
- 承認されたら「mergeable」タグが付与される
- Slackの指定のチャンネルでリリース宣言を行い、「mergeable」タグが付いているPR一覧を書き込んでリリース確認を取る
- リリースするPRをmainブランチに全てマージ
- mainブランチをステージング環境にデプロイし動作確認
- 問題なかったらプレ環境(本番DBと接続)にデプロイ
- プレ環境でも動作確認し、問題なかったら本番環境にトラフィックを切り替える
これまでのリリース作業の流れ
しかし、この作業には以下の課題がありました:
- リリースするPRのリンクをGitHubからコピペして貼り付けるのが面倒
- SlackとGitHubを行き来するのが面倒
- 実際にリリースされる内容が分かりづらい。mainブランチに意図しないコミットが含まれている可能性がある
- リリースにはGitHub Actionsを手動で実行する必要があるため学習コストがかかる
リリースSlack Botの導入
これらの問題を解決するために、リリースできそうなPRの一覧の取得と各環境のデプロイ実行ができるツールを開発しました。
スラッシュコマンドを実行するとリリース可能なPRが一覧で表示され、「Deploy Staging」を押すとモーダルが起動します。
リリース情報が表示され、どのPRがリリースされるかがひと目で分かるようになっています。
※前回のリリースとの差分が表示されるので、認識外のPRがマージされていても気づくことができる。
ステージングデプロイが開始されると、リリースノートが作成され、本番リリースのためのボタンも表示されます。ステージングで問題がなければ、そのままProductionデプロイを実行します。
仕組み
ServerlessFrameworkと@slack/bolt、GitHub Actionsを使って実現しています。
-
マージできるPR一覧取得
スラッシュコマンドを実行すると、GitHub APIの/issuesを実行し、LabelがMergeableのPRを取得します。 -
ステージングリリース
ボタンを押すとタグを発行するGitHub Actionsとドラフトでリリースノートが作成されます。タグの
発行をトリガーにCircleCIのステージングデプロイが開始される仕組みです。 -
本番リリース
ボタンを押すと、リリースノートがpublishに変更され、タグが発行されます。それを検知して、CircleCIのProductionデプロイが開始されます。
最後に
このSlack Botを導入して1年以上経ち、スラッシュコマンド一つでSlack上でリリース作業を完結できるようになりました。その結果、手間を減らすことができ、新しいメンバーにとってもリリースのハードルを下げることができました。
現在、機能改善した新しいSlackBotを制作中です。リリースサイクルをさらに高速化できるように改善を加えていく予定です。
ここまで読んでいただき、ありがとうございました!
Discussion