🐄

Gradle で Azure Artifacts に成果物を発行する

2023/08/09に公開

Mavenだと公式のままでだいたいできるんですが、Gradle版はそのままやってもできなかったのでまとめます。あと、プラグインがだいぶ古いやつじゃないですかね?
https://learn.microsoft.com/en-us/azure/devops/artifacts/maven/publish-with-gradle?view=azure-devops

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 版

https://learn.microsoft.com/en-us/azure/devops/pipelines/artifacts/publish-maven-artifacts?view=azure-devops

参考

https://learn.microsoft.com/en-us/azure/devops/pipelines/artifacts/pull-package-gradle?view=azure-devops
https://stackoverflow.com/questions/25063113/publish-war-file-to-maven-repo-using-gradle
https://qiita.com/wf-kenji-ikeda/items/696bda335a8933abfcb3

Discussion