Я пытаюсь создать конфигурацию сборки TeamCity для создания образа Docker.
Для обеспечения избыточности я хочу, чтобы на первом этапе сборки был проверен ли 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:
, но результат остается тем же: скрипт выдает ошибку, и Docker не запускается на сервере TeamCity.
Теперь мой основной вопрос: возможно ли то, что я пытаюсь сделать технически? Потому что я мог представить, что TeamCity использует какой-то механизм защиты, который предотвращает определенные изменения на сервере, с которого он запускается. Опять же, в прошлом я успешно использовал сценарии PowerShell для копирования и удаления файлов на Сервере, поэтому, честно говоря, на данный момент я больше смущен, чем все это, почему это не работает.
Любая информация по этому вопросу будет принята с благодарностью.