Почему конвейер Jenkins возвращает -@tmp/durable-56090643/script.sh 4: FSUM7728 bad $ {} модификатор для команды оболочки? - PullRequest
1 голос
/ 07 апреля 2020

У меня есть этот этап в моем конвейере Jenkins, который запускает команду и сохраняет выходные данные в переменной. Я пытаюсь получить номер идентификатора из сохраненной строки, но получаю ошибку bad ${} modifier. Должен был напечатан 00062100. Он правильно работает в консоли.

  stage('test') {
   agent {node 'test'}
    steps{
        sh "string=$(onetstat -a -P 1111)"
        sh "echo ${string:6:8}"
    }
  }

вывод команды («BUILD 00062100 Listen»)

**Update:**    
stage('server2') {
   agent {node 'test'}
    steps{
            sh '''
                var="$(onetstat -a -P 1111)"
                echo ${var:6:8}
            '''
    }
  }

 **log of the run**
  [Pipeline] sh
    + + onetstat -a -P 1111 
    + 1<TMP> /tmp/shGgcEdAGgA 
 var=
 BUILDER8 00069B50 Listen  
 Local Socket:   127.0.0.1..1111                                     
 Foreign Socket: 0.0.0.0..0                                           
 /Build@tmp/durable-a93a2921/script.sh 3: FSUM7728 bad ${} modifier

Ответы [ 2 ]

2 голосов
/ 07 апреля 2020

В вашем примере есть два недоразумения. Когда вы используете двойные кавычки в Jenkinsfile, вы создаете Groovy String , который заменяет переменные (определенные с помощью знака $) соответствующими значениями (или выражениями.)

Другое недоразумение создание переменной bash за один шаг sh и доступ к ней на другом шаге sh. Это не сработает. Каждый sh шаг выполняется в своем собственном процессе оболочки, и любая локальная переменная, созданная в одной оболочке, не может быть доступна в другой.

Вы можете решить обе проблемы. Во-первых, вам нужно заменить двойные кавычки одинарными в шаге sh. Во-вторых, вам нужно определить скрипт оболочки за один sh шаг. Для этого можно использовать Groovy многострочную строку (тройные кавычки). Рассмотрим следующий пример:

pipeline {
    agent any

    stages {
        stage("Test") {
            steps {
                // Below code prints nothing
                sh 'something="BUILD 00062100 Listen"'
                sh 'echo ${something:6:8}'

                // Below code prints 00062100
                sh '''
                    something="BUILD 00062100 Listen"
                    echo ${something:6:8}
                '''
            }
        }
    }
}

Вывод:

[Pipeline] {
[Pipeline] stage
[Pipeline] { (Test)
[Pipeline] sh
+ something='BUILD 00062100 Listen'
[Pipeline] sh
+ echo

[Pipeline] sh
+ something='BUILD 00062100 Listen'
+ echo 00062100
00062100
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
0 голосов
/ 07 апреля 2020

Использовал это решение для получения идентификатора из вывода команды

 var=$(onetstat -a -P 1111) 
 var=$(echo $var | cut -b 6-10) 
...