Выполнение команды powershell непосредственно в трубе дженкинсов

Можно ли вызвать команду PowerShell непосредственно в конвейерах groovy script? При использовании пользовательских заданий в Jenkins я могу вызвать команду с помощью плагина PowerShell. Но нет никакого фрагмента, чтобы использовать его в groovy script.

Я также пробовал sh(), но кажется, что эта команда не допускает нескольких строк и комментариев внутри команды.

Ответ 1

Чтобы вызвать скрипт PowerShell из Groovy-Script:

  • Вы должны использовать команду bat.
  • После этого вы должны быть уверены, что переменная Error Code (errorlevel) будет возвращена правильно (EXIT 1 должен привести к ошибке FAILED).
  • Наконец, чтобы быть совместимым с PowerShell-Plugin, вы должны быть уверены, что $LastExitCode будет учитываться.
  • Я заметил, что "powershell" теперь доступен в конвейере, но, поскольку у него есть несколько проблем, я предпочитаю этот вариант. Все еще жду, работает стабильно. У меня действительно есть проблема с поведением dontKillMe.

Для этой части я написал небольшой метод, который можно интегрировать в любой конвейер-скрипт:

def PowerShell(psCmd) {
    psCmd=psCmd.replaceAll("%", "%%")
    bat "powershell.exe -NonInteractive -ExecutionPolicy Bypass -Command \"\$ErrorActionPreference='Stop';[Console]::OutputEncoding=[System.Text.Encoding]::UTF8;$psCmd;EXIT \$global:LastExitCode\""
}

[EDIT] Я добавил UTF8 OutputEncoding: прекрасно работает с Server 2016 и Win10. [/EDIT] [EDIT] Я добавил маску '%' [/EDIT]

Затем в своем конвейерном скрипте вы можете вызвать свой скрипт так:

stage ('Call Powershell Script')
{
    node ('MyWindowsSlave') {
        PowerShell(". '.\\disk-usage.ps1'") 
    }
}

Лучшее, что есть в этом методе, это то, что вы можете вызывать CmdLet без необходимости делать это в CmdLet, что является наилучшей практикой.

Вызовите ps1 для определения CmdLet, а затем вызовите CmdLet

PowerShell(". '.\\disk-usage.ps1'; du -Verbose")
  • Не забудьте использовать withEnv() и тогда вы лучше, чем полностью совместимы с плагином Powershell.
  • отложить ваш сценарий с . чтобы убедиться, что ваш шаг не удался, когда скрипт возвращает код ошибки (должен быть предпочтительным), используйте & если вам это не важно.

Ответ 2

Вызов сценариев PowerShell теперь поддерживается с помощью шага powershell как было объявлено в блоге Jenkins.

В документации упоминается, что он поддерживает многострочные скрипты.

Ответ 3

Вы можете использовать команду sh следующим образом:

sh """
    echo 'foo'
    # bar
    echo 'hello'
"""

Здесь можно найти комментарии.