1. CI/CD
1.1. エクメルンでのCI/CD
1.1.1. はじめに
エクメルンでCI/CDを構築するにあたり、以下の目標を掲げました。
- 自動テスト及び静的コード解析による問題の早期発見と質のよいコードの維持
- 自動化導入による、サービス開発、価値提供へのフォーカス
- 素早いリリース(価値提供)を続けていくことによるサービス成長速度の向上
- 最適かつ最速と思える手段で上記目標を達成する(地味に大切)
最後の目標については時間の制限がある中で最大の成果を出すために重要だと考えています。
1.1.2. 構築方法
クラウドサービスのCircleCI, AWS CodeDeployを使って構築。
- 自動テスト、デプロイをするために特殊なカスタマイズが必要なほど複雑ではなかったためクラウドオンリーで実現
- 独自にJenkinsサーバを用意した場合の運用コストを考慮
- CircleCIはcircle.yml、CodeDeployはappspec.ymlという設定ファイルで基本的な動作を制御できるため、お手軽かつ素早く構築できた
1.1.3. CI結果通知
- CI結果はSlackで専用チャンネルに通知、自然と目につくようすることでCIに対する意識を向上
1.1.4. リリース用コードのバックアップ
- 自動テストをクリアしたバージョンのコードをS3にバックアップ
- リリース時にGitHubが不安定になるなどの事態に対処 (Code DeployはデプロイするコードをGitHub, S3のどちらか選んで取得できる)
1.1.5. ハマったこと
- AWS CodeDeployは少々癖が強い。。→ ApplicationStopイベントはデプロイ前のコードで実行されるなど、仕組みを理解していないとハマるポイントが多かった。
- 連携用のユーザを別途用意しておくべし→ GitHubの自分ユーザでサービス間の連携をしてしまうと通知メールが自分にしか届かず、重要な情報を見逃しかけることもあった。。
1.2. CI/CDを導入するにあたって気をつけたこと
1.2.1. テスティングフレームワーク、静的解析ツールの選定
自動テストできる環境があっても、テストコードを書く習慣やコーディング規約を守る文化が根づいてなければ無意味になってしまうため早い段階で選定しておくのがよいと思います。
参考情報: テスティングフレームワーク
参考情報: 静的コード解析ツール
1.2.2. 環境構築、保守にコストをかけすぎない
エクメルンでは当初からクラウドサービスを使うことも視野に入れました。
CI/CDの本来の目的(自動化によるサービス開発へのフォーカス、コスト削減)を見失しなわないように考えるのが重要だと思います。
参考情報: CI/CD環境構築に役立つツール、サービス
1.2.3. 暗黙知化しない
CI/CDの特性上、複数のサーバや環境にまたがって全体が構成されることが多いため、ドキュメントや図に残して誰でも全体を把握できるようにしておいたほうがよいです。(CI/CD職人が生まれないように、、!)
1.2.4. ボトルネック化しない
「CIサーバが落ちているからデプロイできない!」といった問題が発生しないように、手動デプロイの方法も用意するのがいいです。(こういう問題は緊急時とかに発生しやすいんですよね。。)