在jenkins管道内使用bash从package.json中提取版本

ux6nzvsh  于 2022-11-21  发布在  Jenkins
关注(0)|答案(8)|浏览(253)

包.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

因此,我能够提取版本,但在运行脚本时仍无法传递

enxuqcxy

enxuqcxy1#

在使用readJSON进行编辑后,现在得到的字符串插值是错误的。在Groovy中,单引号内的变量 * 不 * 被替换,只有双引号内的变量才被替换。

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

必须是

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

5anewei62#

默认情况下,sh步骤不返回任何内容,因此packageVersion应为null
要返回已执行命令的输出,请按如下方式使用它:

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

sh的这个变体返回输出,而不是打印输出。
实际上,我想知道,为什么echo $packageVersion没有失败并出现错误,因为这个变量没有定义,但应该是echo packageVersion

ct3nt3jp

ct3nt3jp3#

对于我的这一点:

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

fdbelqdn4#

这对我很有效:

完整版本号:

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
k10s72fa

k10s72fa5#

stage('Read JSON') {
    steps {
        script {
            def packageJson = readJSON file: 'package.json'
            def packageVersion = packageJSON.version
            echo "${packageJSONVersion}"
         }
     }
}
zbdgwd5y

zbdgwd5y6#

下面的代码片段对我很有效:感谢@Ferenc Takacs
版本= sh(返回标准输出:真,脚本:“grep '版本'软件包. json|剪切-d“"' -f4| tr '\n' '\0'")

s6fujrry

s6fujrry7#

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

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

wwwo4jvm8#

要访问run-script作用域之外的npm环境变量,请使用bash解析该变量:

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

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

相关问题