Использование шага sh в Windows

TL;DR Я хочу использовать шаг sh, хотя Jenkins работает в Windows. Я не хочу использовать шаг bat, если только вы не покажете мне, как легко воспроизвести то, что мне нужно сделать, используя bat

Я преобразовывал некоторые старые задания Jenkins в скрипт 2.x Pipeline. Одна из моих работ использует «Плагин публикации через SSH» для:

  • Отправка артефактов на удаленный сервер
  • Выполнить набор команд на удаленном сервере

Например:

Публиковать через плагин SSH

Я хотел воспроизвести это в Pipeline Script, поэтому сделал следующее:

   stage('Deploy') {
    withCredentials([[$class: 'FileBinding', credentialsId: 'bitbucket-key-file', variable: 'SSHKEY']]) {
        sh '''
            scp -i "$SSHKEY" dsub.tar.gz [email protected]:dsubdeploy
            scp -i "$SSHKEY" deployDsubUi.sh [email protected]:dsubdeploy
            ssh -i "$SSHKEY" -o StrictHostKeyChecking=no 192.168.220.57 <<- EOF
                DEPLOY_DIR=/home/tprmbbuild/dsubdeploy
                echo '*** dos2unix using sed'
                sed -e 's/\r$//' $DEPLOY_DIR/deployDsubUi.sh > $DEPLOY_DIR/deployDsubUi-new.sh
                mv $DEPLOY_DIR/deployDsubUi-new.sh $DEPLOY_DIR/deployDsubUi.sh
                chmod 755 $DEPLOY_DIR/deployDsubUi.sh
                echo '*** Deploying Dsub UI'
                $DEPLOY_DIR/deployDsubUi.sh $DEPLOY_DIR/dsub.tar.gz
            EOF'''
    }
   }

Проблема в том, что я получаю эту трассировку стека при выполнении моей сборки:

[Pipeline] sh
[E:\Jenkins\jenkins_home\workspace\tpr-ereg-ui-deploy@2] Running shell script
      1 [main] sh 3588 E:\Jenkins\tools\Git_2.10.1\usr\bin\sh.exe: *** fatal error - add_item ("\??\E:\Jenkins\tools\Git_2.10.1", "/", ...) failed, errno 1
Stack trace:
Frame        Function    Args
000FFFF9BB0  0018005C24E (0018023F612, 0018021CC39, 000FFFF9BB0, 000FFFF8B30)
000FFFF9BB0  001800464B9 (000FFFFABEE, 000FFFF9BB0, 1D2345683BEC046, 00000000000)
000FFFF9BB0  001800464F2 (000FFFF9BB0, 00000000001, 000FFFF9BB0, 4A5C3A455C3F3F5C)
000FFFF9BB0  001800CAA8B (00000000000, 000FFFFCE00, 001800BA558, 1D234568CAFA549)
000FFFFCC00  00180118745 (00000000000, 00000000000, 001800B2C5E, 00000000000)
000FFFFCCC0  00180046AE5 (00000000000, 00000000000, 00000000000, 00000000000)
00000000000  00180045753 (00000000000, 00000000000, 00000000000, 00000000000)
000FFFFFFF0  00180045804 (00000000000, 00000000000, 00000000000, 00000000000)
End of stack trace

person ThaDon    schedule 01.11.2016    source источник
comment
Это актуально для вас? tikalk.com/devops/shell-jenkins-windows-slave   -  person Nate Gardner    schedule 05.11.2016
comment
Вывод не показывает "*** dos2unix using sed". Возможно, произошел сбой в scp или при запуске оболочки. Если бы вы могли добавить команду echo после каждого scp, это могло бы дать вам подсказку. Также вы можете попробовать запустить пустой сценарий оболочки (только с echo), чтобы сузить проблему.   -  person blackpen    schedule 06.11.2016
comment
@blackpen на самом деле, я считаю, что он не может создать оболочку, поэтому ни одна из команд не может быть запущена   -  person ThaDon    schedule 10.11.2016
comment
@NateGardner уже настроил это, но безрезультатно :(   -  person ThaDon    schedule 10.11.2016


Ответы (3)


Вы должны иметь возможность запускать scp.exe из установки git непосредственно в пакетном сценарии. Насколько я знаю, для партии нет «здесь» документа, но вы можете просто поместить сценарий для запуска на сервере в отдельный файл.

(Не проверено)

stage('Deploy') {
withCredentials([[$class: 'FileBinding', credentialsId: 'bitbucket-key-file', variable: 'SSHKEY']]) {
    bat '''
        E:\\Jenkins\\tools\\Git_2.10.1\\usr\\bin\\scp.exe -i "${SSHKEY}" dsub.tar.gz [email protected]:dsubdeploy
        E:\\Jenkins\\tools\\Git_2.10.1\\usr\\bin\\scp.exe -i "${SSHKEY}" deployDsubUi.sh [email protected]:dsubdeploy
        E:\\Jenkins\\tools\\Git_2.10.1\\usr\\bin\\scp.exe -i "${SSHKEY}" -o StrictHostKeyChecking=no 192.168.220.57 < server_script.sh
}

}

person haphi    schedule 10.11.2016
comment
Я разочарован тем, что то, что я мог довольно легко сделать с плагинами v1.6, настолько сложно или даже невозможно сделать с конвейерным сценарием 2.x. - person ThaDon; 10.11.2016

Согласен с «я считаю, что он не может создать оболочку». Он пытается запустить «E:\Jenkins\tools\Git_2.10.1\usr\bin\sh.exe» (используя синтаксис обратной косой черты Windows). Если у нас нет настроенного исполняемого файла оболочки (sh.exe) в указанном каталоге, он завершится ошибкой.

Powershell (или Cmd Shell):
если вы хотите использовать пакетные файлы, вам потребуется установить/настроить 3 двоичных файла (ssh, scp, ssh). Все остальное становится на свои места (я вижу, что вы отправляете команды на удаленную машину с помощью ssh. Я предполагаю, что удаленный сервер основан на Linux/Unix).

Альтернативы:
вы можете использовать cygwin или запускать linux на виртуальном боксе (или любое программное обеспечение, эмулирующее linux на windows). Но запуск всего 3 команд может не стоить проблем (это определенно будет полезно, если вы планируете преобразовать/написать больше сценариев оболочки в будущем).

person blackpen    schedule 09.11.2016
comment
@ThaDon, спасибо за награду. Если вам нужны разъяснения, я буду рад вам помочь. - person blackpen; 12.11.2016
comment
Так вы говорите, что я должен установить %PATH%? Кстати, в ваших трех двоичных файлах вы дважды упомянули ssh. - person xjcl; 18.02.2021

Вы можете использовать «bat» вместо «sh» в окнах. Также используйте 2 обратных слэша, чтобы правильно экранировать строку пути. См. пример ниже

  node {
      currentBuild.result = "SUCCESS"
      try {

       stage('Checkout'){

          checkout scm
       }

       stage('Convert to Binary RPD'){
         bat "D:\\oracle\\Middleware\\user_projects\\domains\\bi\\bitools\\bin\\biserverxmlexec -D .\\RPD -P Gl081Reporting -O .\\GLOBI.rpd"
       }


       stage('Notify'){

         echo 'sending email'

         // send to email
           emailext ( 
               subject: "SUCCESS: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]'", 
               body: """$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS:
                    Check console output at $BUILD_URL to view the results.""",
               to:"[email protected] [email protected]"
            )
       }

    }
    catch (err) {

        currentBuild.result = "FAILURE"

        throw err
    }

}
person codemonkey    schedule 28.04.2017