皆さん、こんにちは。キャスレーコンサルティング AWSエンジニアのH.Kです。
開発したコードをサーバーにデプロイするのって大変ですよね。
決して短くない時間を拘束されてしまい、その時間を開発に充てることが
出来ればもっと開発効率を上げることが出来るのに・・・
と感じている人が多くいるかと思います。

昨今、顧客からの要求・要望の頻度が増えてきており、
巷でよく言われている『ビジネスを加速させる』働き方が求められている状況を
身をもって実感しています。
今回はシステム開発において顧客からの要求・要望へ迅速に応え、
『ビジネスを加速させる』ための手法である『CI/CD』についてご紹介します。

CI/CDとは?

  • 継続的インテグレーション、継続的デリバリー(デプロイ)の略称で
    アプリ開発におけるビルド~リリースを自動化する手法(方法論)。
  • 昨今話題のアジャイル開発やDevOpsの土台となる手法。
CI/CD flow

上記画像はRedHat公式サイトから引用。
解説記事も分かりやすいのでCI/CDについて詳しく知りたい方は読んでみてください。
https://www.redhat.com/ja/topics/devops/what-is-ci-cd

CI/CDがあるとどうなる?

  • 開発に充てられる時間を直接的に増やすことが出来る。
  • 自動テストによってバグ等を発見しやすくなる。
    ※テスト内容は自作する必要あり
  • <超重要>テストやデプロイを自動化することで人的要因によるミスを排除することができ、
    アプリ開発スピードの向上・品質の担保の両方を実現することができる。
img_awsgeek-ci-cd_05

AWS builders.flashより抜粋

  • 方法論の説明だけだとイメージがしにくいので実際に作ってみようと思います。

使用ツール&環境

  • Docker(Rails&PostgreSQ)
  • GitHubDesktop
  • AWS(EC2,CodePipeline,CodeBuild,CodeDeploy)
<構成図>
※詳しい設定は言語や環境によって変わるため割愛します。
※ローカル・ステージング環境はDocker公式ドキュメントを参考に構築
https://docs.docker.com/samples/rails/
  • ローカル・ステージング環境はdocker-composeで構築。
    Dockerについて詳しく知りたい方は過去記事で解説しているのでご覧ください
  • GitHubにあるリモートリポジトリの更新をトリガーに
    CodePipelineがCodeBuild、CodeDeployを動かす。
  • Code系サービスの各役割について軽く解説。
    ・CodePipeline:
     AWSのCode系サービスを取りまとめるためのサービス。
     GitHubなどで管理しているソースコードの更新を監視してくれる。
    ・CodeBuild:
     コードをビルド、テストするためのサービス。
     テスト等でNGが出ると後続のCodeDeployは動かない。
     ※今回、テストコードは省略。
    ・CodeDeploy:
     CodeBuildから渡された成果物を指定したサーバーのにデプロイしていく。
     ※カナリアリリースやBlue-Greenデプロイにも対応
  • 今回省略していますが、ステージング環境へのデプロイについては
    「人による承認プロセス」を以ってデプロイを実行するか決めることが出来ます。
リリースプロセス(現実案)

DevelopersI0の技術ブログより抜粋

https://dev.classmethod.jp/articles/codepipeline-approval/

<大まかな構築の流れ>

  1. Rails&PostgresSQL環境を作成。(Dockerfile,docker-compose.yml)
    ※設定ファイルの詳細は先述のDocker公式ドキュメント参照
  2. 適当なWebアプリケーションを作成。(今回はscaffoldで作成)
  3. EC2を作成して(SSH(22)とRails(3000)のポートを開けておくこと)
    IAMロール「AWSCodeDeployRole」をアタッチ。
  4. EC2にDocker,docker-compose,CodeDeployAgentをインストール。
  5. AWSコンソールでCodeBuild,CodeDeploy,CodePipelineを作成。
    リモートリポジトリにcommit&pushするとCodePipelineが動き出す。
  6. Source,Build,Deployが完了後、EC2側で項目6で作成したrailsアプリが
    デプロイされていることを確認。

    CI/CDを構築することでGitHubにコードをcommit&pushするだけで
    コードのビルド、コードのテスト(本記事では省略)、サーバーへのデプロイを
    自動化することが出来るようになります。
    切り戻しについてもcommitをrevertするだけで完了します。(素晴らしい)

最後に・・・

今回はサーバーへのデプロイに関する作業を自動化する手法であるCI/CDを紹介しました。
CI/CDを導入することによって頻繁に行われていたステージング&本番環境への
デプロイ作業に取られていた時間を自動化することで開発効率が上げることができました。
(コード品質を担保するためのテストに対する理解等の課題はまだまだありますが・・・)
ゼロからのCI/CD導入は時間と労力がかかるのでまずはCIの部分から
「小さく始めてみる」のもアリだと思います。

これから更に加速するであろうビジネスに追随するための一つのアプローチとして
CI/CD導入を検討してみてはいかがでしょうか。

拙文ではありますがこれで今回の解説は以上にしたいと思います。
次回(あれば)は本番環境も含めてCI/CDを導入する際の注意点を解説出来たらと思います。

それでは。

HK
SD部 HK
AWS周りや情シスを担当しています。趣味はゲームです。