【问题标题】:extract version from package.json with bash inside jenkins pipeline在 jenkins 管道中使用 bash 从 package.json 中提取版本
【发布时间】:2018-08-04 08:40:45
【问题描述】:

package.json 中的脚本:

"scripts": {
    "version": "echo $npm_package_version"
  },

Jenkins 流水线中的一个阶段:

stage('Build'){
    sh 'npm install'
    def packageVersion = sh 'npm run version'
    echo $packageVersion
    sh 'VERSION=${packageVersion} npm run build'
}

我从 npm 脚本输出中获得了版本,但遵循以下行

echo $packageVersion

返回空值

是否未正确分配 packageVersion 值?

编辑: 当使用带有以下代码的管道实用程序步骤时

stage('Build'){
    def packageJSON = readJSON file: 'package.json'
    def packageJSONVersion = packageJSON.version
    echo packageJSONVersion
    sh 'VERSION=${packageJSONVersion}_${BUILD_NUMBER}_${BRANCH_NAME} npm run build'
        }

我明白了

[Pipeline] echo
1.1.0
[Pipeline] sh
[...] Running shell script + VERSION=_16_SOME_BRANCH npm run build

所以我可以提取版本,但运行脚本时仍然无法通过它

【问题讨论】:

  • 我没有使用node.js的经验,但如果package.json包含版本,您也可以通过readJSON阅读。
  • 感谢提示,我已经使用 readJSON 编辑了我的帖子
  • 我将--silent 选项添加到npm run script 以避免捕获添加的输出

标签: jenkins jenkins-pipeline


【解决方案1】:

在使用readJSON 进行编辑后,您现在得到了错误的字符串插值。单引号内的变量在 Groovy 中被替换,仅在双引号内。

sh 'VERSION=${packageJSONVersion}_${BUILD_NUMBER}_${BRANCH_NAME} npm run build'

必须

sh "VERSION=${packageJSONVersion}_${BUILD_NUMBER}_${BRANCH_NAME} npm run build"

【讨论】:

    【解决方案2】:

    默认情况下sh 步骤不返回任何内容,因此packageVersion 应该是null

    要返回执行命令的输出,可以这样使用:

    sh(script: 'npm run version', returnStdout: true')
    

    实际上,我想知道,为什么echo $packageVersion 不会因错误而失败,因为这个变量没有定义,但应该是echo packageVersion

    【讨论】:

    • 以下给了我空字符串: def packageVersion = sh(script: 'npm run version', returnStdout: true) echo "version:${packageVersion}"
    【解决方案3】:

    对于我来说:

    sh(script: "grep \"version\" package.json | cut -d '\"' -f4 | tr -d '[[:space:]]'", returnStdout: true)
    

    【讨论】:

    • 请解释您的代码。在 Stack Overflow 上不鼓励仅作为答案提交代码,并且可能会被删除。
    • 这是唯一对我有用的,谢谢。
    【解决方案4】:

    这对我有用:

    完整版号:

    PACKAGE_VERSION = sh returnStdout: true, script: '''grep 'version' package.json | cut -d '"' -f4 | tr '\n' '\0''''
    echo "Current package version: $PACKAGE_VERSION"
    $ > 1.2.3
    

    仅限主要版本:

    PACKAGE_VERSION = sh returnStdout: true, script: '''grep 'version' package.json | cut -d '"' -f4 | cut -d '.' -f1 | tr '\n' '\0''''
    echo "Current package Major version: $PACKAGE_VERSION"
    $ > 1
    

    【讨论】:

    • 这对我有用:version = sh(returnStdout: true, script: "grep 'version' package.json | cut -d '\"' -f4 | tr '\\n' '\ \0'")
    • @RakeshYembaram 评论应该是替代答案。
    【解决方案5】:

    下面的 sn-p 对我有用:感谢 @Ferenc Takacs

    version = sh(returnStdout: true, script: "grep 'version' package.json | cut -d '"' -f4 | tr '\n' '\0'")

    【讨论】:

      【解决方案6】:

      此命令将在package.json 中获取确切的属性version: ...,并且可以在Mac 和Linux 上运行。如果您的package.json 中有> 1 个version 关键字,则使用grep 的其他解决方案不会给您正确的答案(它会返回所有这些关键字,而不仅仅是您想要的那个)

      awk -F'"' '/"version": ".+"/{ print $4; exit; }' package.json
      

      【讨论】:

      • 请解释您的代码。在 Stack Overflow 上不鼓励仅提交代码作为答案,并且可能会被删除。
      【解决方案7】:

      要访问运行脚本范围之外的 npm 环境变量,请使用 bash 解析该变量:

      $ npm run env | grep npm_package_version | cut -d '=' -f 2
      

      作者:https://remarkablemark.org/blog/2018/08/14/package-json-version/

      【讨论】:

        猜你喜欢
        • 2016-10-02
        • 2021-02-06
        • 1970-01-01
        • 1970-01-01
        • 2017-12-03
        • 2018-05-07
        • 2018-06-24
        • 2017-09-24
        • 1970-01-01
        相关资源
        最近更新 更多