2019年7月25日 星期四

在Azure Devops Server 2019 的 powershell task 執行外部執行檔

在Azure Devops Server 2019 的 powershell task 執行外部執行檔

原本的需求是在 Pipelines 部署時,判斷如果docker-compose 己經有把container 建起來了,就更新container,否則就用docker-compose建立新的container。

但是在Pipelines的部署工作裡,似乎要做到上面的需求有困難。所以才想要在powershell裡執行docker-compose

底下是我預備要執行的powershell,

Set-Location -Path C:\composefile

$proxy = 'iisproxy'
$site1 = 'site-blue'
$site2 = 'site-green'

$cID = $(docker ps -qf "name=$proxy")

if(-NOT $cID){
 Write-Host "create new container"
 docker pull myhub.local/iisproxy
 docker pull myhub.local/app
        docker-compose up -d 
    }
    else {
        Write-Host "update container"
 docker pull myhub.local/app
        docker-compose stop $site1 
        docker-compose up -d --force-recreate --no-deps $site1  
 Start-Sleep -s 5
        docker-compose stop $site2
        docker-compose up -d --force-recreate --no-deps $site2        
    }

但是卻發現只要是執行到 docker-compose 就會出現 NativeCommandError 的錯誤

2019-07-24T08:00:10.7991464Z ##[error]位於 C:\azagent\A1\_work\_temp\46980d80-fab6-4a21-8fd7-1a6e7130d9a8.ps1:20 字元:9

+ docker-compose stop $site1  

2019-07-24T08:00:10.8097416Z ##[error]+ ~~~~~~~~~~~~~~~~~~~~~~~~~~  

2019-07-24T08:00:10.8204529Z ##[error] + CategoryInfo : NotSpecified: (Stopping site-blue ... :String) [], RemoteException  

2019-07-24T08:00:10.8301628Z ##[error] + FullyQualifiedErrorId : NativeCommandError  

2019-07-24T08:00:10.8403452Z ##[error]  

2019-07-24T08:00:10.8516019Z ##[error]PowerShell 已結束,代碼為 '1'。

但是直接開啟command視窗執行是正常的。 後來又發現在Powershell ISE 裡執行指令就會有一樣的錯誤。 原來兇手是 powershell 自己,害我錯怪 docker-compose 好幾天。

自此,才有比較明確的追查方向。
找到在stackoverflow上一樣症頭的討論

https://stackoverflow.com/questions/2095088/error-when-calling-3rd-party-executable-from-powershell-when-using-an-ide/20950421#20950421

原來是因為 powershell 在處理 STDERR (standard error) 有不同的行為才造成這樣的錯

照文章內的好幾個做法,要在 Pipelines裡可以正常執行要改成這樣
用 2>&1 來吃掉多出來的錯誤

&cmd /c "docker-compose up -d 2>&1"

下面是完整的script

Set-Location -Path C:\composefile

$proxy = 'iisproxy'
$site1 = 'site-blue'
$site2 = 'site-green'

$cID = $(docker ps -qf "name=$proxy")

if(-NOT $cID){
 Write-Host "create new container"
 docker pull myhub.local/iisproxy
 docker pull myhub.local/app
        &cmd /c "docker-compose up -d 2>&1"
    }
    else {
        Write-Host "update container"
 docker pull myhub.local/app
        &cmd /c "docker-compose stop $site1 2>&1"
        &cmd /c "docker-compose up -d --force-recreate --no-deps $site1 2>&1"
 Start-Sleep -s 5
        &cmd /c "docker-compose stop $site2 2>&1"
        &cmd /c "docker-compose up -d --force-recreate --no-deps $site2 2>&1"
    }

沒有留言:

張貼留言