You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gradle Release插件配置问题:无法用正式版部署至Jfrog Artifactory

问题解决:Gradle Release插件部署Artifactory始终用快照版的问题

问题背景

需基于gradle.properties管理版本,通过Gradle Release插件完成Jfrog Artifactory正式版发布,流程要求:

  • 移除版本号的-SNAPSHOT后缀并提交到Git仓库
  • 为该提交创建Git标签
  • 使用正式版部署至Artifactory
  • 升级版本号并重新添加-SNAPSHOT后缀

使用主流Gradle Release插件时,部署阶段始终使用快照版版本,无法切换到正式版。

现有配置代码

build.gradle

publishing {
    publications {
        mavenJava(MavenPublication) {
            groupId 'in.org'
            artifactId 'some-service'
            version "${version}"
            from components.java
        }
    }
}

artifactory {
    contextUrl = "${artifactory_contextUrl}"
    publish {
        repository {
            repoKey = version.endsWith('SNAP') ? "${snapshot_repository}" : "${release_repository}"
            username = "${artifactory_user}"
            password = "${artifactory_password}"
            maven = true
        }
        defaults {
            publications("mavenJava")
            publishArtifacts = true
            publishPom = true
        }
    }
    resolve {
        repository {
            repoKey = "${release_repository}"
            username = "${artifactory_user}"
            password = "${artifactory_password}"
            maven = true
        }
    }
}

release {
    versionPropertyFile = 'gradle.properties'
    failOnCommitNeeded = false
    failOnPublishNeeded = false
    git {
        requireBranch.set('release')
    }
}

artifactoryDeploy.shouldRunAfter preTagCommit, checkCommitNeeded

updateVersion.doLast {
    def buildGradle = file('gradle.properties')
    buildGradle.text = buildGradle.text.replaceFirst(~/version = (\d++\.\d++\.\d++)/, 'version = \'$1\'')
}

gradle.properties

artifactory_user=*****
artifactory_password=*****
artifactory_contextUrl=https://jfrog.in/artifactory
version=1.0.1-SNAPSHOT
snapshot_repository=gradle-dev-local
release_repository=gradle-release-local

问题根源

  1. 版本判断逻辑错误:Artifactory配置中判断快照版的条件是version.endsWith('SNAP'),但实际版本后缀是-SNAPSHOT,导致正式版判断失效,始终走快照仓库。
  2. 任务执行顺序错误:artifactoryDeploy.shouldRunAfter的配置未将部署任务正确关联到Release插件的流程中,导致部署时版本仍为快照版。
  3. updateVersion任务格式错误:修改后的版本号被添加了单引号(version = '1.0.1'),不符合gradle.properties的无引号键值对格式,会导致后续版本读取异常。

修复方案

1. 修正版本判断逻辑

修改Artifactory发布仓库的判断条件,匹配完整的-SNAPSHOT后缀:

repoKey = version.endsWith('-SNAPSHOT') ? "${snapshot_repository}" : "${release_repository}"

2. 调整任务执行顺序,关联Release流程

Release插件默认执行顺序为:checkCommitNeeded → preTagCommit(移除SNAPSHOT并提交) → tag(打标签) → publish → updateVersion(升级版本加SNAPSHOT) → commitNewVersion → push。

需让artifactoryDeploy在preTagCommit之后、tag之前执行,确保用正式版部署:

// 确保部署任务在版本切换为正式版后执行
artifactoryDeploy.mustRunAfter preTagCommit
// 将部署任务加入Release流程
release {
    versionPropertyFile = 'gradle.properties'
    failOnCommitNeeded = false
    failOnPublishNeeded = false
    git {
        requireBranch.set('release')
    }
    tasks = ['artifactoryDeploy'] // 指定Release流程中执行的任务
}

3. 修复updateVersion任务的版本格式问题

移除不必要的单引号,保持gradle.properties的正确格式:

updateVersion.doLast {
    def propsFile = file('gradle.properties')
    propsFile.text = propsFile.text.replaceFirst(~/version = (\d+\.\d+\.\d+)/, 'version = $1-SNAPSHOT')
}

4. 确保Publication版本动态读取

确认MavenPublication直接引用项目版本属性,保证版本动态更新:

mavenJava(MavenPublication) {
    groupId 'in.org'
    artifactId 'some-service'
    version project.version // 直接引用项目版本
    from components.java
}

最终验证

执行gradle release命令后,检查:

  • Git提交记录中是否存在移除-SNAPSHOT的版本提交
  • 是否生成对应正式版的Git标签
  • Artifactory正式版仓库中是否存在对应构件
  • gradle.properties中的版本是否已升级并重新添加-SNAPSHOT后缀

内容的提问来源于stack exchange,提问作者Anuj Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 05:53:26