如何在build.gradle.kts中编写任务供Jenkins获取项目版本
解决Gradle版本号统一维护与Jenkins动态获取的问题
问题背景
我基于Java 17 + Groovy格式的build.gradle开发项目,通过Jenkins流水线实现自动部署,其中一个核心阶段是构建带版本号的Docker镜像并上传至Nexus用于内部管控。目前创建新分支时,需要同时修改build.gradle和Jenkinsfile中的版本号,重复操作效率低下,希望仅在build.gradle中维护版本号,通过Gradle任务将版本号提供给Jenkinsfile调用。之前尝试了一个Kotlin风格的任务,但实际项目使用的是Groovy格式的build.gradle,需要调整适配。
解决方案
1. 适配Groovy DSL的版本输出任务
将之前的Kotlin任务修改为Groovy版本,建议直接输出纯版本号(避免多余字符干扰Jenkins解析):
tasks.register("printVersion") { doLast { println version } }
如果需要输出version=xxx的键值对格式也可以,但后续Jenkins解析需对应处理,纯版本号的形式更简洁直接。
2. 修改Jenkinsfile动态拉取版本号
移除硬编码的VERSION变量,改为执行Gradle任务捕获版本号:
pipeline { environment { VERSION = sh(script: './gradlew printVersion -q', returnStdout: true).trim() } stage('Build Docker image') { when { expression { env.BRANCH_NAME.contains("release/") } } steps { script { echo "构建Docker镜像,版本号:${VERSION}" docker.withRegistry('http://localhost:8083', 'nexus-credentials') { def customImage = docker.build("project-name:${VERSION}") customImage.push() } } } } }
关键细节说明:
-q参数:启用Gradle静默模式,仅输出任务的打印内容,过滤Gradle自带的冗余日志,确保获取到纯净的版本号.trim():去除输出内容的换行符,避免版本号带空格或换行导致Docker镜像标签异常- 替换
find为contains:更准确地判断分支是否属于release分支
3. 验证流程
- 本地执行
./gradlew printVersion -q,确认输出与build.gradle中设置的版本号一致 - 将Gradle任务的修改提交至代码仓库
- 触发Jenkins流水线,检查日志中是否正确打印版本号,且Docker镜像标签与build.gradle中的版本保持一致
内容的提问来源于stack exchange,提问作者Acacio Afonso
相关产品推荐
相关产品推荐

