如何通过Jenkins获取CFBundleShortVersionString并同步至Jira版本字段
首先,你的Plist路径设置是错误的——cd命令是用来切换工作目录的,不是获取文件路径的,这直接导致后续defaults read找不到正确的文件。我来帮你逐个解决问题:
一、正确的Plist路径设置与版本号读取
假设你的Jenkins项目工作空间就是iOS项目的根目录(大部分情况都是这样),你可以直接用相对路径指定Plist文件,或者先确认工作目录再拼接路径。
正确的Shell命令写法:
# 方式1:直接使用相对路径(推荐,如果Jenkins工作空间是项目根目录) INFO_PLIST="./Sources/Supporting/Info.plist" # 读取版本号 VERSION=$(defaults read "$INFO_PLIST" CFBundleShortVersionString) # 可选:打印验证是否正确读取 echo "读取到的App版本号:$VERSION" # 方式2:如果不确定工作目录,先切换到项目根目录再读取 cd "${WORKSPACE}" || exit 1 # WORKSPACE是Jenkins内置的工作空间环境变量 INFO_PLIST="./Sources/Supporting/Info.plist" VERSION=$(defaults read "$INFO_PLIST" CFBundleShortVersionString)
注意:如果你的Jenkins agent是macOS系统(因为
defaults命令是macOS专属的),确保agent已经配置好Xcode环境,避免权限或路径找不到的问题。
二、是否需要将变量存入属性文件?
不是必须的,但非常推荐这么做——因为Jenkins的Jira插件(比如官方的Jira Plugin)通常更容易读取Jenkins的环境变量或者属性文件中的值,直接传递Shell变量可能会有上下文丢失的问题。
实现方式:
在读取到VERSION变量后,将其写入一个属性文件(比如app_version.properties):
# 写入属性文件 echo "APP_VERSION=$VERSION" > "${WORKSPACE}/app_version.properties"
然后在Jenkins中,你可以通过EnvInject Plugin(环境变量注入插件)来加载这个属性文件,让VERSION变成Jenkins全局环境变量,方便后续Jira插件调用。
三、完整的Jenkins集成Jira步骤
这里分两种常见的Jenkins项目类型来讲解:
1. 自由风格软件项目
步骤1:安装必要插件
确保Jenkins已经安装:- Jira Plugin(官方Jira集成插件)
- EnvInject Plugin(可选,用来加载属性文件)
- Xcode Plugin(如果需要处理iOS项目构建,可选)
步骤2:配置项目构建步骤
添加一个「执行Shell」步骤,填入之前修复的版本号读取与属性文件写入命令。步骤3:加载属性文件(可选)
如果用了属性文件,添加「Inject environment variables」步骤,指定属性文件路径为${WORKSPACE}/app_version.properties。步骤4:配置Jira更新步骤
添加「Jira: Update issue」步骤:- 填写Jira服务器配置(提前在Jenkins全局配置中添加Jira服务器)
- 指定要更新的Jira Issue Key(可以通过参数化构建传入,或者固定值)
- 在「Fields to set」中,选择「Custom field」或者直接更新「Fix Version/s」字段,将值设置为
${APP_VERSION}(如果用了EnvInject)或者直接用${VERSION}(如果Shell变量能传递到上下文)。
2. Jenkins流水线项目(Pipeline)
如果用的是Jenkinsfile,完整的流水线示例如下:
pipeline { agent { label 'macos' } # 确保用macOS agent,支持defaults命令 stages { stage('读取App版本号') { steps { script { // 读取Plist版本号 def infoPlistPath = "${WORKSPACE}/Sources/Supporting/Info.plist" def version = sh(script: "defaults read '${infoPlistPath}' CFBundleShortVersionString", returnStdout: true).trim() // 存入环境变量,方便后续步骤使用 env.APP_VERSION = version echo "当前App版本号:${env.APP_VERSION}" // 可选:写入属性文件 sh "echo 'APP_VERSION=${version}' > ${WORKSPACE}/app_version.properties" } } } stage('同步版本号至Jira') { steps { script { // 使用Jira插件更新Issue的Fix Version jiraUpdateIssue( issueKey: 'PROJECT-123', // 替换成你的Jira Issue Key fields: [ fixVersions: [[name: env.APP_VERSION]] // 将版本号设置为Fix Version ] ) } } } } }
注意:流水线中使用
jiraUpdateIssue需要提前在Jenkins全局配置中添加Jira服务器,并确保流水线有足够权限访问Jira API。
内容的提问来源于stack exchange,提问作者Semih Ural

