从管道运行bash脚本总是挂起
我已经创建了一个简单的管道,它试图运行一个脚本,然后我将对输出执行其他操作,但是Jenkins认为脚本(CheckTagsDates.sh)永远不会完成。如果我SSH到Jenkins从节点,su作为Jenkins用户,导航到正确的工作区文件夹,我可以成功地执行命令从管道运行bash脚本总是挂起,bash,jenkins,jenkins-pipeline,Bash,Jenkins,Jenkins Pipeline,我已经创建了一个简单的管道,它试图运行一个脚本,然后我将对输出执行其他操作,但是Jenkins认为脚本(CheckTagsDates.sh)永远不会完成。如果我SSH到Jenkins从节点,su作为Jenkins用户,导航到正确的工作区文件夹,我可以成功地执行命令 pipeline { agent {label 'agent'} stages { stage('Check for releases in past 24hr') { step
pipeline {
agent {label 'agent'}
stages {
stage('Check for releases in past 24hr') {
steps{
sh 'chmod +x CheckTagsDates.sh'
script {
def CheckTagsDates = sh(script: './CheckTagsDates.sh', returnStdout: true)
echo "${CheckTagsDates}"
}
}
}
}
}
以下是CheckTagsDates.sh文件的内容
#!/bin/bash
while read line
do
array[ $i ]="$line"
(( i++ ))
done < <( curl -L -s 'https://registry.hub.docker.com/v2/repositories/library/centos/tags'|jq -r '."results"[] | "\(.name)&\(.last_updated)"')
for i in "${array[@]}"
do
echo $i | cut -d '&' -f 1
echo $i | cut -d '&' -f 2
done
我是如何在评论中告诉你们的,我认为在字符串插值中使用echo指令是错误的 Jenkins管道使用与Groovy相同的规则进行字符串插值。Groovy的字符串插值支持可能会让许多语言新手感到困惑。Groovy支持使用单引号或双引号声明字符串,例如:
def singlyQuoted = 'Hello'
def doublyQuoted = "World"
def username = 'Jenkins'
echo 'Hello Mr. ${username}'
echo "I said, Hello Mr. ${username}"
只有后一个字符串支持基于美元符号($)的字符串插值,例如:
def singlyQuoted = 'Hello'
def doublyQuoted = "World"
def username = 'Jenkins'
echo 'Hello Mr. ${username}'
echo "I said, Hello Mr. ${username}"
将导致:
Hello Mr. ${username}
I said, Hello Mr. Jenkins
了解如何使用字符串插值对于使用Pipeline的一些更高级功能至关重要
来源:作为本例的解决方法,我建议您在Groovy中解析json内容,而不是在shell中,并将脚本限制为仅检索json
pipeline {
agent {label 'agent'}
stages {
stage('Check for releases in past 24hr') {
steps{
script {
def TagsDates = sh(script: "curl -L -s 'https://registry.hub.docker.com/v2/repositories/library/centos/tags'", returnStdout: true).trim()
TagsDates = readJSON(text: TagsDates)
TagsDates.result.each {
echo("${it.name}")
echo("${it.last_updated}")
}
}
}
}
}
}
仅基于我以前的管道,您尝试过用echo“${CheckTagsDates}”替换“echo CheckTagsDates”。老实说,这是唯一看起来奇怪的事情。根据jenkins的说法,.sh脚本仍然会永远运行,并且永远不会退出。您在Jeknins控制台上有任何输出吗?也就是说,脚本是否在获取数据时陷入了困境?或者在它回应了所有的信息之后谢谢你,我真的很感激。虽然这将满足ECHO命令的错误,但我报告的问题仍然存在,根据Jenkins的说法,.sh脚本永远不会退出。每次运行作业时,Jenkins都会创建一个临时目录,其中包含作业的编号。文件脚本真的存在吗?