【问题标题】:Running bash script from pipeline always hangs从管道运行 bash 脚本总是挂起
【发布时间】:2020-02-28 19:34:22
【问题描述】:

我创建了一个尝试运行脚本的简单管道,然后我将对输出执行其他操作,但是根据 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

这是控制台中脚本的输出

latest
2020-01-18T00:42:35.531397Z
centos8.1.1911
2020-01-18T00:42:33.410905Z
centos8
2020-01-18T00:42:29.783497Z
8.1.1911
2020-01-18T00:42:19.111164Z
8
2020-01-18T00:42:16.802842Z
centos7.7.1908
2019-11-12T00:42:46.131268Z
centos7
2019-11-12T00:42:41.619579Z
7.7.1908
2019-11-12T00:42:34.744446Z
7
2019-11-12T00:42:24.00689Z
centos7.6.1810
2019-07-02T14:42:37.943412Z

【问题讨论】:

  • 仅基于我之前的管道,您是否尝试将“echo CheckTagsDates”替换为 echo "${CheckTagsDates}"。老实说,是唯一看起来很奇怪的事情
  • 已更新。根据詹金斯,.sh 脚本仍然永远运行并且永远不会退出。
  • 您是否在 Jeknins 控制台上获得任何输出?意思是,脚本是否卡在了数据的获取上?或者在它回显了所有信息之后

标签: bash jenkins jenkins-pipeline


【解决方案1】:

我如何在评论中告诉你,我认为这是错误地使用 echo 指令进行字符串插值。

Jenkins Pipeline 使用与 Groovy 相同的规则进行字符串插值。 Groovy 的字符串插值支持可能会让该语言的许多新手感到困惑。虽然 Groovy 支持使用单引号或双引号声明字符串,例如:

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 的一些更高级功能至关重要。

来源:https://jenkins.io/doc/book/pipeline/jenkinsfile/#string-interpolation

【讨论】:

  • 谢谢你,我真的很感激。虽然这将满足 ECHO 命令的错误,但我报告的问题仍然存在,根据 Jenkins,.sh 脚本永远不会退出。
  • 每次运行作业,jenkins 都会创建一个带有作业数量的临时目录。文件脚本真的存在吗?
【解决方案2】:

作为这种情况的解决方法,我建议您在 Groovy 中而不是 shell 中解析 json 内容,并将脚本限制为仅检索 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}")
                    }
                }
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 2019-06-06
    • 2022-12-01
    • 2020-10-20
    • 1970-01-01
    相关资源
    最近更新 更多