【Azure Pipelines】Azure Artifactsに登録したwarファイルを使って、Dockerイメージをビルド&プッシュする
はじめに
javaプロジェクトでビルドした成果物(war)がAzure Artifactsに公開されるので、そのwarファイルを使って、Dockerイメージを作成し、Azure Container Repositoryにイメージをpushします。
(参考)Dockerfile
あんまり本筋ではないので軽く。というかこのDockerfileも正しい書き方なのかは謎。
war は jetty にデプロイします。
hoge/engine/*.war にどうAzure Pipelinesで指定するか、というところですね。
FROM jetty:11.0-jdk17-eclipse-temurin
COPY *.war /var/lib/jetty/webapps/ROOT.war
ENV JAVA_OPTIONS='-Xms512M -Xmx512M -XX:MaxMetaspaceSize=128m 他にオプションがあれば追記'
Pipeline
pipeline の yml だけ見たいはこちらをもとにどうぞ。
trigger: none
pool:
vmImage: 'ubuntu-latest'
variables:
dockerRegistryServiceConnection: 'docker_registory_service_connection'
dockerfilePath: '$(Build.SourcesDirectory)/Dockerfile'
imageTag: 'v1.0-beta'
containerRegistoryName : 'backend-apps'
steps:
- task: DownloadPackage@1 # ①
inputs:
packageType: 'maven'
feed: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxx399904/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxx2c6d43'
view:
definition: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxx35034c'
version: 'latest'
files: '**.war'
downloadPath: '$(Build.SourcesDirectory)'
- task: Docker@2 # ②
inputs:
containerRegistry: $(dockerRegistryServiceConnection)
repository: $(containerRegistoryName)
command: 'buildAndPush'
Dockerfile: $(dockerfilePath)
tags: $(imageTag)
補足
① DownloadPackage タスク
Azure Artifacts に 公開した成果物をPipelineで使用する場合に使います。
- Azure DevOps の Pipeline の Edit画面 からの指定の仕方
Tasks で 『Download package』を選択します。
Azure Artifactsに公開したプロジェクト、パッケージ、バージョンがプルダウンに出てくるので指定していきます。
ここではJavaのプロジェクトなので、Package Type は Maven、Files に war を取得するように指定します。
画面から指定しない場合は、APIを叩いてフィードのIDとプロジェクトIDを取得するか、プロジェクト名またはフィード名でできるそうです。
成果物をダウンロードするフィード (またはプロジェクト) の ID を見操作方法
フィードの取得 API を使用して、フィードのフィードとプロジェクト ID を取得できます。 API については、 こちらを参照してください。
ID の代わりにプロジェクト名またはフィード名を使用できますか
はい。定義でプロジェクト名またはフィード名を使用できます。 ただし、将来プロジェクトまたはフィードの名前が変更された場合は、タスクも更新する必要があるか、失敗する可能性があります。
definition は com.hoge:backend みたいな書き方でもOKです。
ここでは自動生成されたもののままにします。
version は latest を指定すると最新のバージョンをダウンロードしてくれます。
downloadPath は規定値は $(System.ArtifactsDirectory) ですが、今回は面倒なので $(Build.SourcesDirectory) にダウンロードされるようにしました。いいんかな。
② Docker タスク
今回はbuildとContainer Registryへpushするので command は buildAndPush です。
containerRegistry は 事前にserviceConnectionとして、Azure Container Registry を登録しておきます。そのサービス名を記述します。
あとは Dockerfile に Dockerfile の場所を、registory にコンテナのリポジトリ名、tagsなどを指定していきます。
変数にしてますが、変数じゃなくても大丈夫です。
これでPipelineでContainerRegistryにイメージが登録されるようにできました。
次はContainer Instance にデプロイできるようにするかな。
それでは。
Discussion