【发布时间】:2018-11-19 09:38:57
【问题描述】:
我正在尝试创建用于创建 Docker 映像的 TeamCity 构建配置。
为了冗余,我希望第一个构建步骤检查 Docker 是否在 TeamCity 服务器上运行,并在必要时启动它。
我已经创建了以下 PowerShell 脚本来执行此操作。该脚本甚至会等到 Docker 完全正常运行后再完成。
# This File checks if docker is running, and starts it if necessary, waiting until it has finished starting up before exiting
# ---------
# VARIABLES
# ---------
$TimeoutInterval = 10 #Timeout interval for checking whether docker has finished starting, in seconds
$DockerPath = "C:\Program Files\Docker\Docker\Docker for Windows.exe"
# ---------
# FUNCTIONS
# ---------
Function ProcessRunning([string] $ProcessName) {
[bool] $Return = $False
if ( Get-Process | Where-Object {$_.Name -like $ProcessName} ) {
$Return = $True
}
Return $Return
}
# -------
# PROGRAM
# -------
# Enables Error Action Preference to stop to enable try-catches
$ErrorActionPreference = 'Stop'
if(ProcessRunning("Docker for Windows")){
echo "Docker is running"
echo ""
docker version
}else{
echo "Docker is not running"
echo ""
echo "Starting Docker"
echo ""
Start-Process $DockerPath
#Waits while Docker has not finished starting up
$dockerStarting = $true
while($dockerStarting){
try{
docker version
$dockerStarting = $false
}catch{
echo ""
echo "Docker is still starting up..."
echo ""
$dockerStarting = $true
Wait-Event -Timeout $TimeoutInterval
}
}
echo ""
echo "Docker has finished starting up!"
echo ""
}
此脚本在 TeamCity 服务器上本地执行时可以正常工作。但是,当我尝试将其作为 BuildStep 运行时,它似乎忽略了 try-catch 块,就像在我设置 $ErrorActionPreference = 'Stop'
具体来说,docker version 命令失败,因为我希望它表明 Docker 尚未完全运行。但是,try-catch 块无法像在服务器上本地运行时那样捕获它。
我已经尝试了Format stderr output as: 和Script execution mode: 的两个值,但结果仍然相同:脚本抛出错误,并且没有在 TeamCity 服务器上启动 Docker。
现在,我的基本问题是:我正在尝试的东西在技术上是否可行?因为我可以想象 TeamCity 采用某种保护机制来防止运行它的服务器上的某些更改。再说一次,我过去曾成功地使用 PowerShell 脚本来复制和删除服务器上的文件,所以老实说,在这一点上,我对为什么这似乎不起作用感到更加困惑。
对此的任何意见将不胜感激。
【问题讨论】:
标签: powershell docker teamcity