Баш не найден в декларативном трубопроводе Дженкинса - PullRequest
0 голосов
/ 19 декабря 2018

У меня проблема с тем, что Дженкинс не может распознать bash.

Я запускаю stage с докером agent, используя изображение golang.При попытке запустить файл sh я получаю эту ошибку:

+ ./build/docker/docker.sh / home / jenkins / workspace / 003-CGI-App-setup-ACS-build-4ZEA3UO3JRWIGZRIGIBD7BRQJV7JJ4LAKTS4XDXT6N3GDVU7Z4WA@tmp/durable-46264c73/script.sh: строка 1: ./build/docker/docker.sh: не найдена

* 1012 1011: 1011 - 1013: 1011*
stage('Build & publish') {
        agent {
            docker {
                image 'golang:1.10-alpine3.7'
            }
        }
        steps {
            checkout scm
            unstash 'war'
            sh 'export PATH=/bin/bash:$PATH'
            sh 'cp XXX/XXX/target/*.war build/docker/ROOT.war'
            sh 'chmod 777 ./build/docker/docker.sh'
            sh 'go build -o XXX'
            sh './XXX build'
            sh './build/docker/docker.sh'
        }
    }

Мой файл docker.sh также начинается с #!/bin/bash.

Кто-нибудь знает, связан ли он с образом докера?Если да, правильно ли я добавляю bash?

Спасибо.

1 Ответ

0 голосов
/ 19 декабря 2018

Многие легковесные образы Docker, особенно созданные на основе Alpine Linux, не содержат GNU Bash.

Лучшее решение здесь - переписать сценарий, чтобы он не требовал специально использовать bash.Измените его строку shebang на #!/bin/sh и ограничьте его синтаксис тем, что разрешено в спецификации POSIX .Этого более чем достаточно для большинства простых сценариев в стиле «do A, B, C, а затем D»;если вам нужны такие специфичные для bash функции, как массивы, рассмотрите более мощный язык сценариев, такой как Python.

В частности, в одной строке

sh 'export PATH=/bin/bash:$PATH'
  • Каждая команда shвыполняется в собственной среде выполнения с чистой средой, поэтому настройки переменных среды из более раннего оператора sh не влияют на более поздний;этот оператор недопустим.
  • Элементы $PATH являются каталогами, а не отдельными файлами.
  • /bin требуется только для включения в $PATH и во всехстандартные среды исполнения.(Если существует /bin/bash, то его найдут явные команды bash -c '...' и строки #!/bin/bash shebang.)

(Другая частая причина таких проблем - смешанные среды Windows / Linux, гдефактическая строка shebang заканчивается двухсимвольной новой строкой CR / LF в стиле DOS, и среда не может запускаться /bin/bash\r.)

...