ローカルで作っている Web アプリケーションを公開しようかなーと思ったとき、ふと以下のことを思いついて試してみたときのメモです。
- 使い慣れてるので Bitbucket でソースコードを管理したい
- ビルドやデプロイ環境を楽につくりたい
そういうわけで試しに AWS CodeStar と連携してみました。AWS CodeStar って何ぞやという説明は割愛します。以降、AWS Code* 系のサービスは 「AWS」を略して記載します(省略後:CodeStar、CodeCommit、CodeBuild、CodeDeploy、および CodePipeline)。
環境
言語: Java 8(Spring Boot 2.0.2)
ビルドツール: Gradle
結論
うまくいった部分もうまくいかなかった部分もありました。
- CodeStar により開発からデプロイ環境が一斉に整うのはとても楽
- とても楽だが、CodeStar で生成されたものと既存プロジェクトでの差分は吸収する必要がある
- CodeBuild 上でテストしようとするとエラーで失敗した(未解決。ただ、ローカルでは通る)
- (テストをスキップすれば)Bitbucket の master ブランチを更新するだけでビルドされデプロイされる
そもそも CodeStar は「新規プロジェクトにどうぞ」というスタンスであり、上記の使い方は AWS 側の想定していないものです。私が今までやってきたような Bitbucket 中心のソースコード管理や CI を前提に考えると、現実的には、Bitbucket + CI + CodeDeploy のような構成がよいかなと思ってます。単にまだ使いこなせてないだけかも、多分その可能性が濃厚。
手順
- CodeStar で新規プロジェクトを作成する
- CodeCommit に作成された新規リポジトリと Bitbucket 上の既存リポジトリのソースコードをマージする
- 上記 2. でマージしたソースコードを CodeCommit と Bitbucket に push して両者の状況を揃える
- Bitbucket の Pipelines を設定(Bitbucket から CodeCommit への push のため)
- 動作確認。Bitbucket の master ブランチを更新した後、デプロイまで成功することを CodeStar のダッシュボードで確認
- 何かしらのエラーがあるか、エラーが無くてもデプロイされていない場合は設定などを確認
1. CodeStar で新規プロジェクトを作成する
こちらについては特に説明することはありません。公式のガイドにしたがってプロジェクトを作成します。
2. CodeCommit に作成された新規リポジトリと Bitbucket 上の既存リポジトリのソースコードをマージする
CodeCommit と接続する方法は AWS のガイドにあるのでそちらを参照してください。
冒頭に述べた環境においては、CodeCommit に作成されたファイルのうち、以下のファイルがマージ対象です。
- appspec.yml
- CodeDeploy で使用されます
- buildspec.yml
- CodeBuild で使用されます
- template.yml
- CloudFormation で使用されます
- scripts/*
- CodeDeploy で使用されます
3. 上記 2. でマージしたソースコードを CodeCommit と Bitbucket に push して両者の状況を揃える
特筆することはありません。
4. Bitbucket の Pipelines を設定(Bitbucket から CodeCommit への push のため)
以下のサイトを参考を元に設定しました。
https://medium.com/@jay_proulx/aws-codecommit-from-atlassian-bitbucket-and-bitbucket-pipelines-for-ci-offloading-4f1131695802
AWS 上に Bitbucket 用のユーザを用意してあげて、後は、自分が CodeCommit と連携するときの要領で諸々を設定してあげるという感じです。
5. 動作確認。Bitbucket の master ブランチを更新した後、デプロイまで成功することを CodeStar のダッシュボードで確認
タイトルの通りですが、デプロイ完了までには結構かかります。CodeStar プロジェクトによって生成された初期コードでも 6 か 7 分ほどなので、気長に待ちます。CodePipeline のフェーズすべてに成功しており、アプリケーションエンドポイントにアクセスして想定どおりのページを確認できればOK。
6. 何かしらのエラーがあるか、エラーが無くてもデプロイされていない場合は設定などを確認
ここまでの手順により、Bitbucket のブランチが更新されると、自動的に CodeCommit に同期され、CodeBuild が走り、CodeDeploy されるようになるかと思います。とはいえ、開発やデプロイのために万事整ったかというと、そうではないかもしれません。恐らく、既存プロジェクトとの差分を吸収せざるを得ないでしょう。私が遭遇した課題は例えば以下です。
- 既存プロジェクトは Gradle でビルドしているが、CodeStar の初期プロジェクトは Maven でビルドしている
- 既存プロジェクトは jar ファイルを生成しているが、CodeStar の初期プロジェクトは war ファイルを生成している
- 先述した通りだが、CodeBuild で ./gradlew test に失敗する(ローカルでは成功する)
- などなど……
次に述べるものは既存プロジェクトとの差分ではありませんが、DB との繋ぎ込みや、Web サイトの SSL 化や、ステージングにデプロイするように CodePipeline を編集したり、場合によって本番デプロイ前に承認フェーズを挟むよう CodePipeline を編集するなど、要件に応じて他に対応する必要がありそうな要素はいろいろ考えつきます。
感想
古式ゆかしきサーバ構築はおろか、パブリッククラウドにも全然詳しくないのですが、何とか目的は達成できましたし、勉強にもなりました。でも CodeBuild でテスト通せないのは致命的なので、もう少し調べてみようかなという感じです。