Запуск bash скрипта из конвейера всегда зависает - PullRequest
1 голос
/ 28 февраля 2020

Я создал простой конвейер, который пытается запустить сценарий, а затем я сделаю что-то еще с выводом, однако сценарий (CheckTagsDates. sh) никогда не завершается согласно Дженкинсу. Если IS SH в подчиненном узле Jenkins, например, пользователь 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 file

#!/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

Ответы [ 2 ]

1 голос
/ 02 марта 2020

В качестве обходного пути для этого случая я бы предложил вам выполнить синтаксический анализ содержимого json в Groovy вместо оболочки и ограничить сценарий только получением json.

* 1002. *
1 голос
/ 29 февраля 2020

Как я уже говорил в комментарии, я думаю, что это неправильное использование команды 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...