2017-02-24 140 views
7

是否有可能直接在管道groovy腳本中調用PowerShell命令?在Jenkins中使用自定義作業時,我可以使用PowerShell插件調用該命令。但是在groovy腳本中沒有使用這個片段。直接在jenkins管道中執行powershell命令

我也試過sh(),但看起來這個命令不允許在命令裏面有多行和註釋。

回答

13

要從Groovy的腳本調用的PowerScript:

  • ,你必須使用bat命令。
  • 之後,您必須確保錯誤代碼(errorlevel)變量將被正確返回(EXIT 1應導致FAILED作業)。
  • 最後,爲了與PowerShell-Plugin兼容,您必須確保$LastExitCode將被考慮。
  • 我已經注意到'powershell'現在可用於流水線,但由於它有幾個問題,我更喜歡這個變種。仍在等待它運作穩定。

對於porpuse我寫這可以在任何管道,腳本集成一個小常規方法:

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\"" 
} 

[編輯]我已經添加了UTF8 OutputEncoding:與服務器2016的偉大工程Win10 [/編輯] [編輯]我已經添加了 '%' 面具[/編輯]

在您的管道腳本,那麼你可以打電話給你的腳本是這樣的:。

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

與方法的最好的事情是,你可以撥打CmdLet而不必爲此在腳本,這是最好的實踐。

呼叫PS1定義CmdLet中,然後調用CmdLet

PowerShell(". '.\\disk-usage.ps1'; du -Verbose") 
  • 不要忘記使用withEnv()的,那麼你是不是與PowerShell的插件完全兼容更好。
  • .延遲您的腳本,以確保您的腳本在腳本返回錯誤代碼(應該是首選)時失敗,如果您不關心它,請使用&
-2

可以使用sh命令是這樣的:

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

評論在這裏的支持。

+0

在我的一個窗口節點上工作,但不在另一個窗口節點上。有什麼你需要做的操作系統來啓用它? –

+0

sh命令將啓動一個bash會話,也可以使用不屬於PowerShell環境的windows slave。 您可以嘗試'sh',其中ps.exe''或'sh'在您的管道中回顯$ SHELL''。 請參閱:[鏈接](https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#code-sh-code-shell-script) 請注意'ps.exe'必須安裝在windows slave上。 – elou

6

調用PowerShell腳本現在支持powershell步驟,如Jenkins blog所公佈的那樣。

documentation提到它支持多行腳本。

+0

嗨,不知道如果我在這個問題上遲了一點,我注意到默認情況下powershell支持使用-NoProfile插件,你知道有沒有辦法解決這個問題?我似乎無法運行我的管道,因爲我需要訪問PowerShell配置文件。 – jacmurphy50