如何在Jenkins生成的APK名称中加入Jira故事编号或修改构建号?
当然可以实现!结合你用到的Android Studio、Jenkins、Jira这套技术栈,不管是把Jira故事编号直接塞进APK名称里,还是用它来定制Jenkins的构建号,都有可行的方案,我给你详细拆解下:
这个方案的核心是先从Jira/代码提交信息里拿到故事编号,再传递给Android的构建脚本,动态生成带编号的APK文件名。
步骤1:在Jenkins中提取Jira故事编号
两种常用的提取方式:- 从Git提交信息中自动提取(前提是团队遵循提交规范,比如提交信息带
PROJ-123这类Jira编号):
在Jenkins的构建步骤里加一段shell脚本,提取编号并设置为环境变量:# 匹配格式为PROJ-XXX的Jira编号(可根据你的Jira项目前缀修改) JIRA_TICKET=$(git log --pretty=format:"%s" -n 1 | grep -oE 'PROJ-[0-9]+') # 把变量写入环境文件,供后续步骤使用 echo "JIRA_TICKET=$JIRA_TICKET" >> $WORKSPACE/jira.env - 通过Jenkins的Jira插件关联获取:
先在Jenkins里配置好Jira的连接(需要API token和权限),然后在构建任务中启用Jira关联,直接从绑定的Jira故事里拉取编号,这种方式更可靠,适合严格关联构建和Jira需求的场景。
- 从Git提交信息中自动提取(前提是团队遵循提交规范,比如提交信息带
步骤2:修改Android的build.gradle动态命名APK
打开app模块的build.gradle,在android块下的buildTypes里添加动态命名逻辑:android { // 保留你原本的其他配置 buildTypes { release { // 保留你原本的release配置 applicationVariants.all { variant -> variant.outputs.each { output -> // 获取Jenkins传递的JIRA_TICKET变量,没拿到就用UNKNOWN兜底 def jiraTicket = System.getenv("JIRA_TICKET") ?: "UNKNOWN" // 同时可以带上Jenkins原生的构建号 def jenkinsBuildNum = System.getenv("BUILD_NUMBER") ?: "0" // 自定义APK名称,格式可以按需调整 def apkName = "MyApp-${jiraTicket}-build-${jenkinsBuildNum}-${variant.buildType.name}.apk" output.outputFileName = apkName } } } // debug版本同理,可按需配置 debug { applicationVariants.all { variant -> variant.outputs.each { output -> def jiraTicket = System.getenv("JIRA_TICKET") ?: "UNKNOWN" def jenkinsBuildNum = System.getenv("BUILD_NUMBER") ?: "0" def apkName = "MyApp-${jiraTicket}-build-${jenkinsBuildNum}-${variant.buildType.name}.apk" output.outputFileName = apkName } } } } }步骤3:Jenkins构建时传递变量
在Jenkins的Gradle构建步骤里,确保环境变量能被Gradle读取到,比如执行:source $WORKSPACE/jira.env && ./gradlew assembleRelease或者也可以用Gradle参数传递,比如
./gradlew assembleRelease -PJIRA_TICKET=$JIRA_TICKET,对应的build.gradle里用project.property("JIRA_TICKET") ?: "UNKNOWN"来获取。
如果你希望Jenkins的构建号本身就包含Jira故事编号(比如PROJ-123-45),那APK名称用这个构建号自然就带上了Jira编号,步骤如下:
步骤1:安装并配置Build Name Setter插件
先在Jenkins插件市场安装Build Name Setter Plugin,然后在构建任务的“构建环境”里勾选“Set Build Name”。步骤2:自定义构建号格式
两种方式设置构建号:- 用之前提取的JIRA_TICKET变量,直接设置构建名称为
${JIRA_TICKET}-${BUILD_NUMBER},这样构建号就变成PROJ-123-45这种格式。 - 用shell脚本生成构建号:
然后在Build Name Setter插件里选择“Read build name from file”,指定JIRA_TICKET=$(git log --pretty=format:"%s" -n 1 | grep -oE 'PROJ-[0-9]+') # 拼接Jira编号和原生构建号 CUSTOM_BUILD_NAME="${JIRA_TICKET}-${BUILD_NUMBER}" # 写入文件供插件读取 echo $CUSTOM_BUILD_NAME > $WORKSPACE/build_name.txtbuild_name.txt的路径即可。
- 用之前提取的JIRA_TICKET变量,直接设置构建名称为
步骤3:修改build.gradle使用自定义构建号
此时Jenkins的BUILD_NUMBER环境变量已经是带Jira编号的自定义值,所以build.gradle里的命名可以简化:android { buildTypes { release { applicationVariants.all { variant -> variant.outputs.each { output -> def customBuildNum = System.getenv("BUILD_NUMBER") ?: "UNKNOWN" def apkName = "MyApp-${customBuildNum}-${variant.buildType.name}.apk" output.outputFileName = apkName } } } } }
- 提交规范约束:如果用提交信息提取Jira号,一定要要求团队成员每次提交代码都带上对应Jira故事的编号,否则会提取不到,此时可以设置构建失败或者用
UNKNOWN兜底。 - 插件权限配置:用Jira插件关联的话,要确保Jenkins服务器有访问Jira的权限,并且配置了正确的API token。
- 兼容性:Android Gradle插件的版本不同,
output.outputFileName的写法可能有细微差异,如果遇到问题,可以调整为output.outputFile = file("${project.buildDir}/outputs/apk/${variant.buildType.name}/${apkName}")。
内容的提问来源于stack exchange,提问作者solfinder

