はじめに
CI/CDの定番ツールと言えば個人的にCircleCIとGitHubだと思うんですが、Azureサービスで楽々にCI/CD環境を構築したのでまとめてみました。ソースコードとか詳細な手順は掲載していないの悪しからず。
目次
- 構成図
- AKSクラスターとプライベートレジストリの構築
- AzureDevOpsでプロジェクト作成
- azure-pipeline.ymlにビルド・テストコマンドを記述
- Deployの設定
- git push で動作確認
- おわりに
構成図
AKSクラスターとプライベートレジストリの構築
AKSクラスタとContainer Registryを作成しAKSからregistryにアクセスできるようにします。これは以下の公式ドキュメントを参考にしました。
AKSクラスタの作成
ACRの作成
AKSとACRの連携
AzureDevOpsでプロジェクト作成
ポータルからAzure DevOpsを検索し、プロジェクトを作成しました。Azure DevOpsをはじめて利用する場合は組織を作成する必要があります。ちなみにWEB UIはこんな感じです。
この画面からパイプラインの作成やら、開発メンバーの追加が行えます。開発から本番環境まで全てAzureのサービスを使うといった場合、Azure DevOpsはおすすめです。
azure-pipeline.ymlにビルド・テストコマンドを記述
Azure Reposから新しいリポジトリを作成し、サンプルのソースコードをpushしました。Azure Pipilines > Buildで新しいビルドバイプラインを作成します。GitプロバイダーはAzure Repos以外にもGitHub、Bitbucket等を選択できます。ビルドのテンプレートは豊富な言語・プラットフォームから選択できます。ここではJavaのSpring Bootを使用したのでmavenを選択します。バイプラインを作成すると、ソースコードリポジトリのルートにazure-pipelines.ymlという名前のファイルが作成されます。今回はこんな感じで記述しました。
# Maven
# Build your Java project and run tests with Apache Maven.
# Add steps that analyze code, save build artifacts, deploy, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/java
trigger:
- master
pool:
vmImage: 'ubuntu-latest'
variables:
dockerId: matsucon
backendImageName: springapp
steps:
- script: |
echo Starting Build
mvn install -DskipTests=true
displayName: 'ビルドを実行しています'
- script: |
echo Starting UnitTest
mvn test
displayName: 'テストを実行しています'
- script: |
docker build -t $(dockerId).azurecr.io/$(backendImageName) --no-cache .
docker login -u $(dockerId) -p $(dockerLoginPassword) $(dockerId).azurecr.io
docker push $(dockerId).azurecr.io/$(backendImageName)
displayName: 'イメージをビルドしてレジストリにpushしています'
CircleCIなどのCIツール利用したことのある方はおなじみの記法だと思います。コンテナレジストリのパスワードなどの機密情報は環境変数としてWEB UIから設定できます。公式リファレンスを参考にしています。
Deployの設定
次にデプロイの定義をしていきます。azure-pipelines.ymlにCI定義まで記述したんだからデプロイの定義も同じファイルに書かせてくれよと思ったのですが、そこは目をつむって先に進みます。
Pipelines > Releasesからデプロイの詳細を設定していきます。デプロイ設定はドキュメントがあまりなく、WEB UIをあちこちいじりながら設定していきました。うまくいくとこんな感じになります。
ビルドの終了をトリガーにして、kubectl apply deploy
でアプリのデプロイ、kubectl apply service
でアプリを外部に公開しています。
git push で動作確認
SpringBootで書かれたpush前のコードは以下のようになっています。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@EnableAutoConfiguration
public class Example {
@RequestMapping("/")
String home() {
return "<h1>hello World</h1> \n <h2>sample app</h2>";
}
static int calc(int a, int b) {
return a + b;
}
public static void main(String[] args) {
SpringApplication.run(Example.class, args);
}
}
h1タグのhello Worldをこんにちは世界に変えてpushしてみます。
Azure Pipelinesを見てみるとビルドが走っていることが確認出来ます。
kubectl get svc
で公開されているサービスのIPを調べてブラウザで表示してみます。
AKSへのデプロイもうまくいってるみたいです。
おわりに
CI/CDパイプラインを誰でも簡単に(?)構築できてしまうAzureDevOpsですが、デプロイのところでは直感的に扱うのが難しいなというのが第一印象でした。ただ、Azureユーザーなら使いなれたサービスでCI/CDパイプラインを構築できてお手軽なので気になる方はぜひ試してみてください。