Jenkins Pipeline执行shell命令报错:command not found求助
解决Jenkins Pipeline中计算WAR文件md5sum的报错问题
错误原因分析
第一个Pipeline代码的问题
- 多sh步骤变量不共享:每个
sh步骤是独立的shell进程,在第一个sh里定义的SUM变量,无法在第二个sh步骤中访问。 - 赋值语法错误:
SUM=echo $(md5sum ${WORKSPACE}/ABC/XYZ/dist/ABC.war)写法错误,多了冗余的echo,且shell会将md5sum的输出当作命令执行,导致command not found报错。
第二个尝试代码的问题
MDSUM= "$(echo $SUM | head -n1 | awk '{print $1;}')" 中等号后有空格,shell会把MDSUM识别为命令,后面的字符串作为参数,从而触发报错。
解决方案
方案1:在单个shell步骤中完成md5计算与输出
将所有相关shell命令合并到一个sh块中,确保变量在同一个进程内可用,同时修正语法错误:
stage('Build') { steps { withAnt(installation: 'ANT_1.9.9', jdk: 'Java_1.8.0_361') { sh 'ant -f ABC/XYZ/build.xml build' } sh ''' #!/bin/bash # 直接将md5sum结果赋值给SUM,去掉冗余echo SUM=$(md5sum "${WORKSPACE}/ABC/XYZ/dist/ABC.war") echo "完整md5信息:$SUM" # 提取纯md5值,注意等号前后无空格 MDSUM=$(echo "$SUM" | awk '{print $1}') echo "仅md5值:$MDSUM" ''' } post { success { echo "build success" } } }
方案2:将md5值保存为Jenkins Pipeline变量(供后续步骤使用)
如果需要把md5值传递给Pipeline的其他步骤,使用sh returnStdout: true捕获命令输出:
stage('Build') { steps { withAnt(installation: 'ANT_1.9.9', jdk: 'Java_1.8.0_361') { sh 'ant -f ABC/XYZ/build.xml build' } script { // 捕获md5值并去除多余空格换行 def warMd5 = sh( script: 'md5sum "${WORKSPACE}/ABC/XYZ/dist/ABC.war" | awk \'{print $1}\'', returnStdout: true ).trim() echo "WAR文件md5值:${warMd5}" // 后续可使用warMd5变量执行归档、验证等操作 } } post { success { echo "build success" } } }
内容的提问来源于stack exchange,提问作者sai rohith naredla
相关产品推荐
相关产品推荐

