📌

【Azure Pipelines】Mavenでのビルド時のTips

2022/09/12に公開

Azure PipelinesでMavenのビルドの際にいろいろ小技が必要だったので、Tipsとしてまとめておきます。

環境

  • Java8
  • Maven マルチプロジェクト

基本形

公式にあるのはこんな感じ

steps:
- task: Maven@3
  inputs:
    mavenPomFile: 'pom.xml'
    mavenOptions: '-Xmx3072m'
    javaHomeOption: 'JDKVersion'
    jdkVersionOption: '1.8'
    jdkArchitectureOption: 'x64'
    publishJUnitResults: true
    testResultsFiles: '**/TEST-*.xml'
    goals: 'package'

Artifacts にあるjarをビルドに含める

Install Maven Artifacts

対応方法

Connect to Feed でRepositoryタグとか書かれているのをpom.xmlに入れるだけ。
ローカルでも使いたい場合は、$HOME/<ユーザ名>/.m2/settings.xml に Connect to Feed に記載されている内容で新規作成 or 追記するだけ。

Artifacts に Maven成果物を登録する

Maven クイックスタート

微妙に公式が書き方まとめてくれないので、うまいことまとめてくれないのだろうか・・・

対応方法

  1. Artifacts の Create Feed で新規Feedを作成する

    公開/非公開とか諸々の設定は割愛

  2. 作ったFeedのPermission を変更する。Feed Settings から Build Service とかを Contributor Roleを与えないと、成果物登録時に403エラーになる

  3. Connect to feed の Maven で記載されている Project Setup の

Add the repo to both your pom.xml's <repositories> and <distributionManagement> sections

と書いてあるタグをpom.xmlに埋め込む。
この成果物登録には<distributionManagement>のタグが必要。逆に登録しない場合は、通常のrepositoryesだけでOK

  1. pipelines.yml の maven タスク の goal をdeploy にする
  - task: Maven@3
    displayName: Deploy Articats
    inputs:
      mavenPomFile: "pom.xml"
      goals: "deploy"

【応用編】マルチプロジェクトの場合に、Azure Artifacts にあるjarをビルドに含める

シングルプロジェクトの場合は、上記でうまいことやってくれるが、マルチプロジェクトの場合はうまくやってくれなかった。というか1つ目のプロジェクトはビルドしているのに、2個目のプロジェクトは401 Access Denide になる謎。。逆になんで1つ目は通るんじゃ。。

対応方法

pielines.yml で MavenAuthenticate タスクを使用します。

  - task: MavenAuthenticate@0
    inputs:
      artifactsFeeds: "使用するFeed1, 使用するFeed2, 成果物用Feed"
  - task: Maven@3
    displayName: Deploy Articats
    inputs:
      mavenPomFile: "pom.xml"
      goals: "deploy"
      mavenOptions: "-Xmx3072m"
      javaHomeOption: "JDKVersion"
      jdkVersionOption: "1.8"
      jdkArchitectureOption: "x64"
      publishJUnitResults: true
      testResultsFiles: "**/surefire-reports/TEST-*.xml"
      mavenAuthenticateFeed: true

Mavenタスクの前に配置して、Maven タスク の mavenAuthenticateFeed をtrueに設定するだけ。

Maven のバージョンを変える

2022/09/12時点だと、Maven のバージョンは3.8.6でした。

/usr/bin/mvn -version
Apache Maven 3.8.6 (84538c9988a25aec085021c365c560670ad80f63)
Maven home: /usr/share/apache-maven-3.8.6
Java version: 1.8.0_332, vendor: Temurin, runtime: /usr/lib/jvm/temurin-8-jdk-amd64/jre
Default locale: en, platform encoding: UTF-8
OS name: "linux", version: "5.15.0-1014-azure", arch: "amd64", family: "unix"

ちなみに、3.8.1 から http なrepositoryにはアクセスできなくなったので、settings.xml を追加して読ませるといいよ、とかいろいろあったんですが、MavenAuthenticate タスクを使用している影響でこの方法が取れず、mavenのバージョンを下げることにしました。
古いプロジェクトだとあるよね。。

How to disable maven blocking external HTTP repositories?

対応方法

How to use newer versions of Maven for builds in Azure Pipelines for CI/CD

新しいバージョンの場合はこの方法で。
今回はバージョンを下げたいので、こんな記述にしました。
mavenVersionOption を Path にするのがミソっぽい。

steps:
  - script: "wget https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.zip"

  - task: ExtractFiles@1
    inputs:
      archiveFilePatterns: "apache-maven-3.6.3-bin.zip"
      destinationFolder: "$(build.sourcesdirectory)/maven"
  - task: Maven@3
    displayName: Deploy Articats
    inputs:
      mavenPomFile: "pom.xml"
      goals: "deploy"
      mavenOptions: "-Xmx3072m"
      javaHomeOption: "JDKVersion"
      jdkVersionOption: "1.8"
      jdkArchitectureOption: "x64"
      publishJUnitResults: true
      testResultsFiles: "**/surefire-reports/TEST-*.xml"
      mavenVersionOption: "Path"
      mavenDirectory: "$(build.sourcesdirectory)/maven/apache-maven-3.6.3"
      mavenSetM2Home: true
      mavenAuthenticateFeed: true

Maven のローカルリポジトリにjarをインストールする

mvn install:install-file でインストールするパターンね。
shellのファイルでも良いけど、inlineでも記述できる。
複数ある場合は改行コードに気をつけましょう(shellでハマった)

対応方法

  1. インストールしたいjarファイルを適当なディレクトリに配置する。
    project-root/lib あたりが一般的らしい。

  2. pipelines.yml の Maven タスク前に Bash タスクを追記する

  - task: Bash@3
    inputs:
      targetType: 'inline'
      script: |
        mvn install:install-file -Dfile="serializer/r3410/serializer.jar" -DgroupId=<グループID> -DartifactId=<id> -Dversion=<version> -Dpackaging=jar
      workingDirectory: '$(build.sourcesdirectory)/lib'

この書き方はポータル画面でやったほうが楽でした。

雑感

昔のプロジェクトを移植するのは大変。。Jenkinsがよしなにしすぎてたんだな。。

Discussion