Contents
概要
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すると、パイプラインが自動で動いてくれるようになっています。
以上