jenkins - 使用 groovy 解析 Jenkin 的 shell 脚本中的 JSON 对象

标签 jenkins groovy jenkins-pipeline

假设我有一个如下的 JSON:

{"id":"1.0.0-6",
"version":"1.0.0",
"build":6,
"tag":"android-v1.0.0-6",
"commitHash":"5a78c4665xxxxxxxxxxe1b62c682f84",
"dateCreated":"2020-03-02T08:11:29.912Z"}

我想从 Jenkins Groovy 文件中取出版本 ID,并将版本 ID 传递给名为 XRAY 的 JIRA 插件,以便它将在 JIRA 中创建一个构建版本作为标签。

stage('Get App version') {
      steps {
          container('devicefarm') {
               steps {
                   sh "LATEST_VERSION=$(curl ${APP_ARTIFACTORY_URL}/${XRAY_PLATFORM}/builds/latest.json | sed \"s/.*$VERSION_KEY\":\"\\([^\"]*\\).*/'\\1'/\")"
               }
           }
      }
}
environment {
        AWS_DEFAULT_REGION = 'uk-xxx'
        XRAY_ENVIRONMENT = 'e2e'
        VERSION_KEY = 'id'
        XRAY_PLATFORM = 'Android'
        APP_ARTIFACTORY_URL = 'https://artifactory.example.com/mobile'
        LATEST_VERSION = ''
}

我有两个问题,curl 命令的结果是否会按预期分配给名为“LATEST_VERSION”的同一 Jenkins 文件中定义的变量?

我可能可以通过在 Jenkins 上运行管道来测试它,但我遇到了另一个问题,阻止我这样做,它提示“需要标识符或代码块”。

error while include sh bash in groovy Jenkins file

在 sh 文件中运行相同的内容时,没有此问题,版本 ID 已按预期从 JSON 中检索。

最佳答案

有几个步骤可以实现这一目标。首先,我们需要修复 shell 方法的执行。我们将其转换为有效的 shell 执行,该执行返回执行的标准并将其分配给变量:

build_json = sh(label: 'Retrieve Build Info', script: "curl ${APP_ARTIFACTORY_URL}/${XRAY_PLATFORM}/builds/latest.json", returnStdout: true)

这是一个有效的 shell 方法执行,它还将返回标准输出并将其分配给一个变量。请参阅documentation了解更多信息。

接下来,我们需要解析生成的 JSON,并将该返回值分配给变量:

build_map = readJSON(text: build_json)

请参阅documentation了解更多信息。

最后,我们现在有了一个 Map,我们可以在其中访问 latest_version 键的值并将其分配给变量。我们可以使用以下语法访问:

latest_version = build_map['version']

或者这个:

latest_version = build_map.version

请注意,虽然这确实回答了您的问题,但您无法在管道执行期间将动态值传递给 environment block (您的问题意味着您希望稍后执行)。因此,您将需要尝试不同的路线,并且可能需要询问有关它的后续问题。

关于jenkins - 使用 groovy 解析 Jenkin 的 shell 脚本中的 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61654487/

相关文章:

jenkins - 对声明性管道阶段使用轻量级执行器(代理无)

jenkins - 如何在声明性 Jenkins 管道中的阶段之间传递变量?

java - Jenkins 在 Linux 中无法识别我的 Java

groovy - 在 Groovy 中抑制警告 “Access to field exceeds its access rights”

git - 无法使用 Groovy Jenkinsfile 读取 Git 环境变量 Jenkins

javascript - 我怎样才能使grails remoteFunction正常工作?

grails - 在Groovy单元测试中重写JdbcTemplate方法

jenkins - 关闭 Allure 报告的存档

maven - 如何在Sonar Server中设置多个源位置?

python-3.x - 为什么我的 jenkins 服务器上不同用户的 sqlite 版本不同?