Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从管道运行bash脚本总是挂起_Bash_Jenkins_Jenkins Pipeline - Fatal编程技术网

从管道运行bash脚本总是挂起

从管道运行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

我已经创建了一个简单的管道,它试图运行一个脚本,然后我将对输出执行其他操作,但是Jenkins认为脚本(CheckTagsDates.sh)永远不会完成。如果我SSH到Jenkins从节点,su作为Jenkins用户,导航到正确的工作区文件夹,我可以成功地执行命令

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都会创建一个临时目录,其中包含作业的编号。文件脚本真的存在吗?