2016-03-03 55 views
1

我正在使用Jenkins進行部署。我想運行一個複製一些文件的PowerShell腳本。我爲jenkins安裝了「Windows PowerShell」插件,它將執行PowerShell腳本。我的Powershell腳本如下所示jenkins無法在程序文件下執行powershell

param (
    [string] $targetEnvironment, 
    [switch] $WhatIf, 
    [switch] $Compare) 

    try 
    { 
     #do smething here 
    } 
    catch 
    { 
    } 

當我手動執行它時,此腳本工作正常。使用下面的命令插件的輸入窗口中運行該腳本但是當我得到錯誤

enter image description here

需要注意的是,如果我複製了「deploymentscript」文件夾「C:\ deploymentscript」然後更改插件的路徑窗口,那麼作業運行良好。 它不工作時,其下的程序文件執行

錯誤即時得到是

First time build. Skipping changelog. 
[workspace] $ powershell.exe -NonInteractive -ExecutionPolicy ByPass "& 'C:\Users\CODESC~1\AppData\Local\Temp\hudson2119904511537985474.ps1'" 
At C:\Users\username\AppData\Local\Temp\hudson2119904511537985474.ps1:1 char:119 
+ ... etaTaskar.ps1' -targetEnvironment demo 
+     ~~~~~~~~~~~~~~~~~~ 
Unexpected token '-targetEnvironment' in expression or statement. 
At C:\Users\username\AppData\Local\Temp\hudson2119904511537985474.ps1:1 char:138 
+ ... getEnvironment demo 
+     ~~~~ 
Unexpected token 'demo' in expression or statement. 
+ CategoryInfo   : ParserError: (:) [], ParseException 
+ FullyQualifiedErrorId : UnexpectedToken 

Build step 'Windows PowerShell' marked build as failure 
Finished: FAILURE 

EDIT1
@petrik你是對的,在「程序文件(x86)」文件夾中的空間造成問題。解決方案是使用以下格式:

&("C:\Program Files (x86)\Jenkins\jobs\MyJob\workspace\crconfig\deploymentscript\Deploy.ps1") -targetEnvironment demo 

並且工作正常。

現在基於文章here如果powershell scrit失敗我想讓Jenkin的工作也失敗, 所以我告訴Hudson調用PowerShell腳本窗體的窗口批處理任務。

powershell "& {&('C:\Program Files (x86)\Jenkins\jobs\MyJob\workspace\crconfig\deploymentscript\Deploy.ps1') -targetEnvironment $Env:EnvironmentParam; exit $lastexitcode }" 

我不確定我是否真的需要這個在我的情況?

+1

嘗試雙引號? – Engineer

+0

我的猜測是,它不是它從'Program Files'運行的事實,而是它從一個有空格的目錄路徑運行的事實。如果你手動執行那個命令(整個命令就像詹金斯那樣)會發生什麼? – Petrik

+1

另一種方法是執行如下操作:$ script ='c:\ Program Files(x86)\ Jenkins \ jobs \ MyJob \ workspace \ crconfig \ deploymentscript \ deploy.ps1';&$ script -targetEnvironment demo。 – Petrik

回答

1

所以在這種情況下,問題是由'程序文件'路徑中有空格造成的。將腳本路徑放入一個變量,然後可以使用call operator執行該變量。

爲了確保Jenkins在構建失敗時如果Powershell腳本失敗,需要採取幾個步驟。

  1. 使用Jenkins powershell插件。它會將powershell退出代碼傳遞給Jenkins
  2. 儘可能早地將$ErrorActionPreference設置爲「停止」。這會強制Powershell在拋出異常時暫停。默認行爲是報告錯誤,然後繼續。

在詹金斯的配置腳本可能看起來像這樣:

$ErrorActionPreference = 'Stop' 
$scriptPath = 'c:\Program Files (x86)\Jenkins\jobs\MyJob\workspace\crconfig\deploymentscript\deploy.ps1' 
& $script -targetEnvironment 'demo' 

這應該使詹金斯正常運行腳本並報告錯誤,如果腳本失敗停止生成。

0

我做了兩件事情來解決問題:

1)追加路徑的PowerScript 「C:\ USERS \\的文檔\ WindowsPowerShell \ profile.ps1」 系統屬性的路徑變量。
2)打開具有管理權限的Powershell並執行:「Set-ExecutionPolicy Unrestricted」

然後重新啓動windows計算機。當我將它重新連接到jenkins時,我的powershell工作正常。