2017-01-06 3 views
1

Существует три агента сборки, которые могут запускать мою конфигурацию TC. Я хочу, чтобы только один из этих агентов запускал сборки в течение дня, так что две другие системы можно использовать для ручного тестирования. После 6Pm накануне, поскольку они не будут использоваться для ручного тестирования, я хочу, чтобы сборные городские сборки выполнялись на всех трех системах. Любые идеи, как я могу это сделать?Агент сборки должен быть доступен только в течение определенного времени

Заранее спасибо.

ответ

1

Использование системы бассейна:

У вас есть агент в пуле «используемые агенты» влияет на ваш проект.

На этапе 6PM, используя конфигурацию сборки teamcity, вы можете выполнить собственный скрипт, который повлияет на ваши машины на пул «агенты использования».

В 6 утра другой скрипт повлияет на этих агентов на другой пул: «непригодный для использования агент», который не влияет на какую-либо конфигурацию.

Вот TeamCity ресурс: https://confluence.jetbrains.com/display/TCD10/REST+API#RESTAPI-AgentPools

Основание реализации будет, в PowerShell:

В этом случае AgentId является идентификатором вашего агента вашего хотят переместить. И PoolId, является идентификатором целевого пула.

Вы можете получить идентификаторы вашего бассейна по этому адресу: http://teamcityURL/app/rest/agentPools/ Вы можете получить идентификаторы ваших агентов по этому адресу: http://teamcityURL/app/rest/agents

# 
# AgentToPool.ps1 
# 
Param(
    [Parameter(Mandatory=$true)][string]$AgentId = "0", 
    [Parameter(Mandatory=$true)][string]$PoolId = "0" 
) 
Begin { 
    $username = "guest" 
    $password = "guest" 
    $serverURL = "http://teamcityURL/" 

    function Execute-HTTPPostCommand() { 
      param(
       [string] $target = $null, 
       [string] $data = "" 
      ) 

     $PostStr = [System.Text.Encoding]::UTF8.GetBytes($data) 
     $request = [System.Net.WebRequest]::Create($target) 

     $request.PreAuthenticate = $true 
     $request.Method = "POST" 
     $request.ContentLength = $PostStr.Length 
     $request.ContentType = "application/xml" 
     $request.Headers.Add("AUTHORIZATION", "Basic"); 
     $request.Accept = "*" 
     $request.Credentials = New-Object System.Net.NetworkCredential($username, $password) 

     $requestStream = $request.GetRequestStream() 
     $requestStream.Write($PostStr, 0,$PostStr.length) 
     $requestStream.Close() 

     $response = $request.GetResponse() 
     $xmlout = "" 

     if($response) 
     { 
      $sr = [Io.StreamReader]($response.GetResponseStream()) 
      $xmlout = $sr.ReadToEnd() 
     } 
     return $xmlout; 
    } 

    $data = "<agent id='$AgentId'/>" 
    Execute-HTTPPostCommand $serverURL/app/rest/agentPools/id:$PoolId/agents $data 
} 

Ваш текущий пользователь должен иметь роль: Manage agent pools

В моем случае, учитывая бассейны, как:

 
| Id | Pool   | 
| 1 | Usage agents | 
| 2 | Unusable agents | 
 
| Id | Agent   | 
| 1 | AllDay   | 
| 2 | Nightly1   | 
| 3 | Nightly2   | 

Выполнение на 6PM:

конфигурации Powershell работает: AgentToPool.ps1 С параметрами -AgentId:2 -PoolId:1

конфигурации Powershell работает: AgentToPool.ps1 С параметрами -AgentId:3 -PoolId:1

Исполнительные на 6AM:

Конфигурация Powershell: AgentToPool.ps1 Wit ч Параметры -AgentId:2 -PoolId:2

Конфигурация Powershell бегущего AgentToPool.ps1 с параметрами -AgentId:3 -PoolId:2

+0

Я пытался искать более простое решение. Я не эксперт по силовой оболочке. Попробуем попробовать. – user1220815

Смежные вопросы