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
问题根源
- 版本判断逻辑错误:Artifactory配置中判断快照版的条件是
version.endsWith('SNAP'),但实际版本后缀是-SNAPSHOT,导致正式版判断失效,始终走快照仓库。 - 任务执行顺序错误:
artifactoryDeploy.shouldRunAfter的配置未将部署任务正确关联到Release插件的流程中,导致部署时版本仍为快照版。 - 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
相关产品推荐
相关产品推荐

