🕌

【Azure Pipelines】Azure Artifactsに登録したwarファイルを使って、Dockerイメージをビルド&プッシュする

2023/10/02に公開

はじめに

javaプロジェクトでビルドした成果物(war)がAzure Artifactsに公開されるので、そのwarファイルを使って、Dockerイメージを作成し、Azure Container Repositoryにイメージをpushします。

(参考)Dockerfile

あんまり本筋ではないので軽く。というかこのDockerfileも正しい書き方なのかは謎。
war は jetty にデプロイします。
hoge/engine/*.war にどうAzure Pipelinesで指定するか、というところですね。

Dockerfile
FROM jetty:11.0-jdk17-eclipse-temurin
COPY --chown=jetty:jetty *.war /var/lib/jetty/webapps/ROOT.war

ENV JAVA_OPTIONS='-Xms512M -Xmx512M -XX:MaxMetaspaceSize=128m 他にオプションがあれば追記'

Pipeline

pipeline の yml だけ見たいはこちらをもとにどうぞ。

azure-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で使用する場合に使います。
https://learn.microsoft.com/ja-jp/azure/devops/pipelines/tasks/reference/download-package-v1?view=azure-pipelines

  • 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 タスク

https://learn.microsoft.com/ja-jp/azure/devops/pipelines/tasks/reference/docker-v2?view=azure-pipelines&tabs=yaml

今回はbuildとContainer Registryへpushするので command は buildAndPush です。

containerRegistry は 事前にserviceConnectionとして、Azure Container Registry を登録しておきます。そのサービス名を記述します。
https://learn.microsoft.com/ja-jp/azure/devops/pipelines/library/service-endpoints?view=azure-devops&tabs=yaml#create-a-service-connection

あとは Dockerfile に Dockerfile の場所を、registory にコンテナのリポジトリ名、tagsなどを指定していきます。
変数にしてますが、変数じゃなくても大丈夫です。


これでPipelineでContainerRegistryにイメージが登録されるようにできました。
次はContainer Instance にデプロイできるようにするかな。
それでは。

Discussion