🐄
Gradle で Azure Artifacts に成果物を発行する
Mavenだと公式のままでだいたいできるんですが、Gradle版はそのままやってもできなかったのでまとめます。あと、プラグインがだいぶ古いやつじゃないですかね?
build.gradle の記述
関係する部分のみ抜粋します。
ちなみに、古き良きwarを生成するタイプのシングルプロジェクトです。
build.gradle
plugins {
// 一部省略
id 'java'
id 'war'
id "maven-publish"
}
group = 'Azure Artifacts に作ったArtifacts名'
version = '1.0.0'
// バージョンにビルド番号を追加するために書いてます。
if (hasProperty('buildNumber')) {
version = version + '-' + buildNumber;
}
sourceCompatibility = '1.8'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
publishing {
publications {
myPublication(MavenPublication) {
groupId 'jp.hogehoge.group' // なんでもいいのでかっこいいやつがおすすめ
artifactId 'Azure Artifacts に作ったArtifacts名'
version version
artifact bootWar
// 通常のwarだと from components.web
// jar だと from components.java で良いはず
}
}
// Repositories to publish artifacts
repositories {
maven {
url 'Azure Artifacts のProject setup にあるurl'
name 'Azure Artifacts に作ったArtifacts名'
credentials {
username "Azure DevOps Services"
password System.getenv("SYSTEM_ACCESSTOKEN")
}
}
}
}
dependencies {
// 省略
}
test {
useJUnitPlatform()
}
bootWar {
archiveBaseName = 'Azure Artifacts に作ったArtifacts名'
destinationDirectory = file("$buildDir/libs")
}
artifact bootWar が結構ミソで、bootWarタスクでファイル名を設定している場合は、from components.web だとwarタスクがSKIPされます。なので、artifact bootWar を指定しましょう。
あと、本家では authentication が指定されてますが、credentials に変更が必要です。後述で出てくるPipeline側で設定でSYSTEM_ACCESSTOKENを渡すように設定するので、それを受け取ります。
※'Azure Artifacts に作ったArtifacts名' が重複しまくっててgroup変数そのままセットすればいい気もしますが、そこは何も言わないで下さい。
azure-pipelines.yml の記述
azure-pipelines.yml
trigger:
branches:
include:
- master
pool:
vmImage: ubuntu-latest
steps:
- task: Gradle@2
inputs:
workingDirectory: ""
gradleWrapperFile: "gradlew"
gradleOptions: '-Xmx3072m '
javaHomeOption: "JDKVersion"
jdkVersionOption: "1.8"
jdkArchitectureOption: "x64"
publishJUnitResults: true
testResultsFiles: "**/TEST-*.xml"
tasks: "publish"
options: "-PbuildNumber=$(Build.BuildNumber)"
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
"-PbuildNumber=$(Build.BuildNumber)" はwarファイル名に使うのでoptionsで渡していますが、やらないなら不要です。
あとは、envでSYSTEM_ACCESSTOKEN: $(System.AccessToken)を渡すようにすると良しなに認証してくれます。
ローカルからAzure Artifacts にアクセスする場合
ユーザディレクトリ直下にある.gradle ディレクトリ(Windowsだと C:\Users\ユーザ名.gradle、Ubuntuだと/home/ユーザ名/.gradle )の中にgradle.propertiesを作成して、AzureDevOpsのパーソナルアクセストークンを記述します。
gradle.properties
vstsMavenAccessToken=<PASTE_YOUR_PERSONAL_ACCESS_TOKEN_HERE>
(おまけ)Maven 版
参考
Discussion