見出し画像

CI/CD構築奮闘記

こんにちは、株式会社キャリタスのシステム1部1課です!本ブログは、システム1部1課が構築中のCI/CDに関する情報を共有させていただきます。

筆者は中途で株式会社キャリタスに入社し、今年3年目ですが、企業管理チームのスクラムマスターを担当しています。
入社前、10年以上の開発経験がありますが、AWSのサービスを活用したCI/CDの構築や実務経験はないので、手探りで進めています。同じくCI/CDを構築している方のご参考になっていただければ幸いです。


内製化プロジェクトの概要


背景

2024年6月から自社でのサービス開発(内製化)をスタートしました。開発プロセスの効率を向上させるため、CI/CD(継続的インテグレーションとデリバリー)の構築が必要となりました。

内製化の詳細については、こちらの記事をご覧ください。

CI/CDとは

Continuous IntegrationとContinuous Deliveveryという略語で、ソフトウェアのビルド、テスト、リリース、デプロイまでのプロセスを効率化し、迅速に行うための手法です。

キャリタス就活のインフラ基盤はAWSで構築されていますので、親和性の高いAWSサービス(CodePipeline、CodeBuild、CodeDeploy、CodeCommit)を活用することで、柔軟かつスムーズにCI/CDを構築することができます。

CodePipelineと設計

CodePipelineは、ソースコードの変更がトリガーとなってビルドからデプロイまで、自動で
進めるためのサービスです。これで手動操作によるミスを防ぎ、リリース時間を短縮することができます。

キャリタス就活では5つのサブシステムに分けられています。

  1. 企業側

  2. 管理ツール

  3. 企業側バッチ

  4. 学生側

  5. 学生側バッチ

WebアプリケーションはEC2で、バッチはAWS BatchとLambdaで構成されているため、それぞれに対応するCodePipelineを設計し、Webアプリケーション用とバッチ系のパイプラインに分けて構築をしていこうと考えてみました。

WEBアプリケーション


バッチ

理想形ではありますが、現状実現できていません。内製化の開発を優先するので、運用上必要なところだけ実現していて、継続して構築を進めています。

CodeCommitとブランチ戦略

CodeCommitは、AWSが提供するGitベースのソースコード管理サービスです。GitHubやGitLabと同様に、開発チームが共同で作業を行うために利用できますが、CodeCommitはAWSのインフラストラクチャに統合されているため、他のAWSサービスとの連携が容易です。

ここから少しブランチ戦略の話です。ブランチ戦略の選択によって、CodePipelineの設計に直結すると思っています。
基本的にGitFlowを使用しますが、キャリタス就活の運用状況に沿って、少しカスタマイズしています。全サブシステムでdevelop→release→masterの段階的にリリースをしています。急ぎであっても、必ずこの流れに沿ってリリースするので、我々はhotfixは使用していません。

コード修正の一例紹介

CodeBuildとビルドプロセス

CodeBuildは、ソースコードのビルドやテストを自動的に実行し、成果物を生成するためのAWSサービスです。ビルド環境やbuildspecファイルの設定により、効率的なビルドプロセスを実現しています。

ビルド環境について、スピードは重視していないのと、費用面も考慮しないといけないので、一番低いスペックに設定してます。

Buildspecは以下のようなものを使用してビルドを行っています。

CodeDeployによるデプロイ

CodeDeployは、EC2インスタンス(エージェントが必要)などへの自動デプロイを行うサービスです。CodeDeployを使うことで、デプロイの手順を標準化し、ヒューマンエラーを減らすことができます。

想定外の制約

CodeDeployという名前なので、当然何でもデプロイできると勝手に想像しましたが、実際には制限があり、EC2インスタンスへのデプロイはできますが、AWS Lambda、ECRへのデプロイには適用できないことが分かりました。

  • ECRへ直接的にデプロイ(docker push)することはサポートされていません。

  • AWS Lambdaへのデプロイはバージョンとエイリアスを指定することで可能ですが、現状この設定を使用せずに運用しているため、100本以上Lambdaを設定しないといけません。バージョンの切り替えも考慮する必要はあるので、工数が大きいと感じていて、CodeDeployでデプロイしない方法にしました。

このため、CodeBuildでAWSコマンドを使ってデプロイするなどの工夫を行っています。

※冒頭の設計はこれに気付いた後の設計です。

振り返りと今後の課題

内製化開発を進める中で、CI/CDの完全自動化はまだ達成できていませんが、手動でCodeBuildを起動し、WEBモジュールをビルドすることで、手動でのデプロイ作業であっても、デプロイ作業が効率化されました。今後は引き続きCI/CDの構築を進め、さらなるオペレーションの効率化を目指していきます。

今後も進捗がありましたら、ブログで再度共有していきます。次回もお楽しみに!


最後まで読んで頂きありがとうございます!
我々は新卒、中途採用を実施しています。ご興味のある方は下記リンクよりご応募お願いします!


いいなと思ったら応援しよう!