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

Hui*_*ang 2 groovy jenkins 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"}
Run Code Online (Sandbox Code Playgroud)

我想从 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 = ''
}
Run Code Online (Sandbox Code Playgroud)

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

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

在 groovy Jenkins 文件中包含 sh bash 时出错

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

Mat*_*ard 5

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

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

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

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

build_map = readJSON(text: build_json)
Run Code Online (Sandbox Code Playgroud)

请参阅文档以获取更多信息。

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

latest_version = build_map['version']
Run Code Online (Sandbox Code Playgroud)

或这个:

latest_version = build_map.version
Run Code Online (Sandbox Code Playgroud)

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