【Azure Pipelines】Mavenでのビルド時のTips
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をビルドに含める
対応方法
Connect to Feed でRepositoryタグとか書かれているのをpom.xmlに入れるだけ。
ローカルでも使いたい場合は、$HOME/<ユーザ名>/.m2/settings.xml に Connect to Feed に記載されている内容で新規作成 or 追記するだけ。
Artifacts に Maven成果物を登録する
微妙に公式が書き方まとめてくれないので、うまいことまとめてくれないのだろうか・・・
対応方法
-
Artifacts の Create Feed で新規Feedを作成する
公開/非公開とか諸々の設定は割愛 -
作ったFeedのPermission を変更する。Feed Settings から Build Service とかを Contributor Roleを与えないと、成果物登録時に403エラーになる
-
Connect to feed の Maven で記載されている Project Setup の
Add the repo to both your pom.xml's <repositories> and <distributionManagement> sections
と書いてあるタグをpom.xmlに埋め込む。
この成果物登録には<distributionManagement>のタグが必要。逆に登録しない場合は、通常のrepositoryesだけでOK
- 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でハマった)
対応方法
-
インストールしたいjarファイルを適当なディレクトリに配置する。
project-root/lib あたりが一般的らしい。 -
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