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

如何通过Jenkins获取CFBundleShortVersionString并同步至Jira版本字段

解决Jenkins读取iOS Plist版本号并同步至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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:29:21