如何在Jenkinsfile中自动提取package.json版本号重命名dist文件夹
解决方案
方法1:使用jq解析版本号(推荐,轻量高效)
绝大多数Linux构建环境默认预装jq(轻量JSON解析工具),如果环境未安装可提前执行apt install jq/yum install jq完成安装。
修改后的Jenkinsfile步骤如下:
steps { withEnv(["TOKEN=${NPM_REGISTRY_TOKEN}"]) { sh 'echo "//registry.npmjs.org/:_authToken=${TOKEN}" >> ~/.npmrc' sh 'npm publish' sh ''' # 提取package.json中的version字段 VERSION=$(jq -r '.version' package.json) # 重命名dist文件夹 mv /var/lib/jenkins/workspace/sdk-js_master/dist /var/lib/jenkins/workspace/sdk-js_master/${VERSION} ''' } }
说明:jq -r '.version'命令会直接读取package.json的version字段,-r参数会输出原始字符串,自动去掉JSON字段自带的双引号。
方法2:使用Node.js自带能力提取版本号(无额外依赖,兼容性更强)
因为你的构建流程需要执行npm publish,必然已经安装Node.js环境,该方法不需要安装任何额外工具,稳定性更高:
修改后的Jenkinsfile步骤如下:
steps { withEnv(["TOKEN=${NPM_REGISTRY_TOKEN}"]) { sh 'echo "//registry.npmjs.org/:_authToken=${TOKEN}" >> ~/.npmrc' sh 'npm publish' sh ''' # 调用Node.js执行JS代码直接读取version字段 VERSION=$(node -p "require('./package.json').version") # 重命名dist文件夹 mv /var/lib/jenkins/workspace/sdk-js_master/dist /var/lib/jenkins/workspace/sdk-js_master/${VERSION} ''' } }
说明:node -p 参数会执行后面的JS代码并打印输出结果,直接通过模块加载逻辑读取package.json的version字段,完全不需要处理复杂的正则匹配,不受package.json格式缩进、换行变化的影响。
优化建议
- 可以把mv命令的全路径简化为相对路径,Jenkins执行步骤的默认工作目录就是任务的根目录,修改后命令更精简,就算工作区路径变更也不需要调整:
mv dist ./${VERSION} - 如果你的package.json不在sh执行的当前目录,把命令中
package.json的路径替换为对应文件的绝对/相对路径即可。
内容的提问来源于stack exchange,提问作者rumon
相关产品推荐
相关产品推荐

