デプロイの半自動化をして楽で安全にリリースできるようにした話

f:id:yamotuki:20200108120317j:plain

こんにちは。エンジニアの鈴木智也です。 今回はデプロイの効率化を通してDX: Developer Experience (開発体験)を向上させ、デプロイの安全性を高めた話です。

ボタン一つで開発環境へデプロイ、さらにボタン一つで本番環境へデプロイできるようになりました。 背景と技術概要について記述します。

背景

弊社ではWebサーバとしてAWS ElasticBeanstalk(以下EBと呼びます)を採用しています。 EBにおいては、eb deployコマンドやAWS Console のGUIから簡単にコードをデプロイすることができます。 弊社では以下のステップでデプロイを行なっていました

  1. eb deploy <EB開発環境名> で開発環境にデプロイ
  2. 開発環境サーバにSSHログインして手動で migration とキャッシュクリア
  3. 機能が正しく動いていることを確認
  4. AWS Console から本番環境にデプロイ
  5. 本番環境サーバにSSHログインして同様のコマンド

問題点として以下のものがありました

  • 手元から eb deploy コマンドを打つときに環境名を指定しなければいけないが、誤って本番環境を指定しまって意図しない本番デプロイが発生する可能性があり得る。危険!
  • 開発・本番ともにSSHログインしてmigrate, cache clearコマンド打つのがめんどくさい
  • 本番デプロイにおいては特にコードが入った時点でタイミングを見計らって migrationとcache clearを行わなければいけない。
    • DBのレコードからLaravel Eloquent経由でドメインオブジェクトにマッピングを行なっている
    • そのためドメインオブジェクトを作るコードを変更した場合には、コードがサーバに入った時点でレコードも追従している必要がある
    • しかし migration ファイルはコードとともにサーバに配置されるので、migration ファイルが置かれた = コードが入ったタイミング を見計らって migrate しなければいけない
    • これが遅れるとmigrateを実行するまでの間サーバエラーになる

これらの問題があったことにより、デプロイは心理的負荷の高い作業になってしまっていました。

改善方法

EBのCLIコマンドとCircleCI Workflow を組み合わせることで、自動テストからの流れでボタンクリックだけでデプロイをできるようにしました。 これにより環境の取り違えは起こり得ないようになりました。もう安全!

具体的には以下のようなCircleCIの画面で待ちになっている状態のところをクリックすれば次のステップに進むようになります。

f:id:yamotuki:20200108105645p:plain
デプロイフローの図

本番デプロイができる条件は、2020-10-01 などの形式のリリースタグに対応するCircleCI Workflow でなければいけないように制限をしました。具体的なCircleCIの設定ファイルの書き方については以下の記事を参照してください。 qiita.com

migration の問題についても改善しました。 ebextensions で設定することにより、EBデプロイのソースコードが抽出されたタイミングで自動実行されるようになりました。これでもうリリースにつきっきりでタイミングを計るだけの開発者はいなくなりました。具体的な ebextension の設定ファイルの書き方については以下の記事を参考にしてください。

qiita.com

改善した結果

これでもう環境の取り違えも、コマンドの打ち忘れも起こりません。 心理的負荷も下がったので、リリースやると疲れて他のことをやる気力が失われる、という状況もかなり緩和されました。

DX上がった!

最後に

我々は、一緒にDX向上してくれるエンジニアを随時募集中です。 www.wantedly.com

www.wantedly.com