スポンサーリンク

Build-Deploy-Pipeline デプロイ(CD/CI)

CodePipelineでSpringBoot on BeanstalkのCD/CIパイプラインを構築する

投稿日:2022年3月5日 更新日:

概要

CDパイプライン周りの図はこのようになります。

  • GitからCodeBuildにソースを取得する
  • CodeBuildで.jarを生成し、S3に格納する
  • S3の.jarをBeanstalkにデプロイする

このようなパイプラインを作成します。
CodeDeployはBenastalkに非対応ですし、CodePipelineでは.jarさえあれば直接Beanstalkにデプロイできるので、CodeDeployは不要です。

手順はこうなります。

  • 事前準備 Githubにソースをコミットしておく
  • 事前準備 S3にバケットを作成しておく
  • Elastic Beanstalkでアプリを作成する
  • CodeBuildでビルドプロジェクトを作成する
  • CodePipelineで自動化する

事前準備

Githubにソースをコミットしておく

SpringBootプロジェクトをGithubにコミットしておきます。
buildspec.ymlは後述します。

application.propertiesのserver.port=5000を追記しておきます。
BeanstalkはELBが5000番に転送してくるからです。
この記述がないと、動作確認時にnginxエラー 502 BadGatewayとなります。

S3にバケットを作成しておく

S3に任意の名前のバケットを作成しておきます。

S3に必要な設定

バケットのバージョニング有効にする

S3バケットが作成できたことを確認してください。

Elastic Beanstalkでアプリを作成する

デプロイ先となるBeanstalkのアプリを作成します。
新しい環境の作成から、次の設定で作成します。

環境枠の選択ウェブサーバー環境
アプリケーション名任意
ex) xxx-app
環境名任意
ex) xxx-app-prod
プラットフォームJava
プラットフォームのブランチCorretto 11 running on 64bit Amazon Linux 2
プラットフォームのバージョン3.2.12 (Recommended)
アプリケーションコードサンプルアプリケーション

beanstalkの環境が作成されたことを確認してください。

CodeBuildでビルドプロジェクトを作成する

次の設定のビルドプロジェクトを作成します。

プロジェクト名任意
ソースプロバイダGithub
リポジトリGithubアカウントのリポジトリ
GitHub リポジトリSpringBootプロジェクトのあるリポジトリを選択
ソースバージョンビルドしたいブランチ名
ex) main や master など
環境イメージマネージド型イメージ
オペレーティングシステムAmazon Linux 2
ランタイムStandard
イメージaws/codebuild/amazonlinux2-aarch64-standard: 1.0
イメージのバージョンこのランタイムバージョンには常に最新のイメージを使用してください
サービスロール新しいサービスロール
ビルド仕様buildspec ファイルを使用する
アーティファクト>タイプAmazon S3
バケット名事前準備で作成したバケット名
アーティファクトのパッケージ化なし
CloudWatch Logs - オプショナルチェックを外す

ビルドプロジェクトが作成されていることを確認してください。

次のbuildspec.ymlをSpringBootプロジェクトのルート直下に配置します。

version: 0.2

phases:
  install:
    runtime-versions:
      java: corretto11
  build:
    commands:
      - echo Build started on `date`
      - ./gradlew bootJar
artifacts:
  files:
    - build/libs/okozukai-system-0.0.1-SNAPSHOT.jar
  discard-paths: yes

buildspec.ymlのポイントは2つです。

build: commands: ./gradlew bootJar...gradlewではなく、./gradlwとします。
ビルド時に自動テストも実行したい場合は、./gradlew bootJarではなく./gradlew build を実行すると、テスト成功後に.jarを作成できます。

artifacts:discard-paths: yes...これを付与しないと、CodeDeployがartifactを見つけることができずに失敗してしまいます。

SpringBoot-elastic beanstalkにCodePipeでデプロイに失敗する

buildspec.ymlのartifacts:discard-paths: yesについて補足します。

このオプションをつけると、S3にアップされる成果物に違いがでます。

artifacts:discard-pathsをつけた場合でも、つけなかった場合でも、適当な名前のついたzipが作成されることには変わりありません。

しかし、解凍した中身を見ると、階層のあるなしに違いがあります。

artifacts:discard-paths:yes の場合、上記のようにzip直下に.jarが入っています。

一方、artifacts:discard-paths:no または指定しない場合、上記のようにzipの中には階層が再現されています。
この階層は、buildspec.ymlのartifacts:filesで指定した階層となっています。

CodePipelineでCodeBuildからCodeDeployにS3経由で成果物を渡す場合、zip直下に.jarがないとDeployできません。

CodeDeployにはzipの中のどの階層のファイルかを指定する入力欄もないことからもわかると思います。

CodePipelineで自動化する

Step 1 パイプラインの設定を選択する

パイプライン名任意
サービスロール新しいサービスロール

Step 2 ソースステージを追加する

ソースプロバイダーGitHub(バージョン2)
接続自分のGitアカウントで接続を作成する
リポジトリ名ソースのあるリポジトリ名
ブランチ名デプロイしたいブランチ名
出力アーティファクト形式CodePipelineのデフォルト

Step 3 ビルドステージを追加する

プロバイダーを構築するAWS CodeBuild
プロジェクト名CodeBuildで作成したビルドプロジェクト

Step 4 デプロイステージを追加する

デプロイプロバイダーAWS Elastic Beanstalk
アプリケーション名CodeBuildで作成したアプリケーション
環境名CodeBuildで作成した環境

Step 5 レビュー

設定内容に誤りがないか確認して、パイプラインを作成するを押します。

パイプラインの一覧から、作成したパイプラインを選択すると、
パイプラインが開始されています。

無事デプロイまで進むことを確認してください。
エラーが発生している場合は、解決する必要があります。
CodeBuild/CodeDeploy/CodePipelineのエラーはこちらです。

デプロイが完了したら、BeanstalkのURLへアクセスして、
動作確認を行ないます。
期待通りアプリが動作すればOKです。

GithubにPushされたらCodePipelineが開始するようにする

この時点では残念ながら未だ、CodePipelineはGithubのPushを検知して、自動でパイプラインを開始してくれません。

開始するには、パイプラインの「変更をリリースする」を押して手動でやる必要があります。

最後に、CodePipelineがGithubのPushを検知して、自動でパイプラインを開始できるよう、Github側でAWSと紐付けを行います。

Githubを開き、Settingsを押します。

左サイドバーのApplicationsを押すと、
Installed GitHub Appsタブに「AWS Connector for Github」があるので、
Configureボタンを押します。

Repository access でPipelineで登録したリポジトリを選択して、Saveボタンを押します。

これで、Github側の設定はOKです。

この後、GIthubにPushすると、パイプラインが自動で動いてくれるようになっています。

 

以上

Udemyのハンズオン動画講座でSpringBootのスキルを磨く!

スポンサーリンク

-Build-Deploy-Pipeline, デプロイ(CD/CI)

Copyright© 【Spring Hack】 , 2022 All Rights Reserved Powered by AFFINGER5.