重新引导代理作为TeamCity中的构建步骤或依赖关系

时间:2015-06-26 21:53:17

标签: continuous-integration teamcity

有没有办法在TeamCity中构建作业期间重新启动代理计算机,如何实现? 我尝试使用" shutdown -r -f -t 0"添加依赖项作业或构建步骤。但随后TeamCity报告构建已经被解决,因为它不再能够与代理进行通信,直到它重新启动并导致另一个代理接管构建。

点击重新启动时会显示确认弹出窗口。当我使用Curl时,我找不到实际的链接。如何点击确认链接?它看起来一样!

var headnav = document.getElementById('headnav');
var headnavPos = headnav.offsetTop;

window.onscroll = function() {
    if(document.body.scrollTop > headnavPos) {
        if(headnav.style.position !== 'fixed') {
            headnav.style.position = 'fixed';
        }
    } else  {
        if(headnav.style.position === 'fixed') {
            headnav.style.position = '';
        }
    }
}

5 个答案:

答案 0 :(得分:2)

我可以使用以下curl请求重新启动代理。但我不知道 如何获取代理的ID列表。你如何获得AgentID?

         curl -u User:Password -X POST "http://MyTeamCityServerURL/remoteAccess/reboot.html?agent=2&rebootAfterBuild=true"

答案 1 :(得分:1)

以下是TeamCity问题跟踪器中的相关请求:https://youtrack.jetbrains.com/issue/TW-36298。 从9.0开始,可以使用代理详细信息页面上的“重新启动代理程序计算机”链接从UI手动重新启动代理。作为解决方法,您可以通过模拟从UI手动操作调用发送的浏览器请求,从构建脚本重新启动代理。

答案 2 :(得分:1)

我需要重新启动(非云)构建代理作为构建的最后一步;作为需要重新启动的代理上的构建安装软件。

然而,它是Windows构建代理 - 因此必须在PowerShell中或作为批处理脚本执行此操作。

使用TeamCity 9.x REST API documentationAccessing Server by HTTP我能够构建一个简单的两行PowerShell构建步骤。

第一个请求获取运行构建的代理的代理ID(安装软件的代理)。第二个请求使用相同的代理ID重新启动代理。

身份验证凭据是构建的配置参数,其用户名和密码值可以执行httpAuth到TeamCity。

感谢Ivan Leonenko's Blog post获取授权标头并使用[System.Net.WebRequest]

$username = "%buildAgentAccessUser%"
$password = "%buildAgentAccessPassword%"
$authInfo = $username + ":" + $password
$authInfo = [System.Convert]::ToBase64String([System.Text.Encoding]::Default.GetBytes($authInfo))

$uri = "%teamcity.serverUrl%/httpAuth/app/rest/agents/name:%teamcity.agent.name%/id"

$webRequest = [System.Net.WebRequest]::Create($uri)
$webRequest.Headers["Authorization"] = "Basic " + $authInfo
$webRequest.PreAuthenticate = $true 
[System.Net.WebResponse] $resp = $webRequest.GetResponse();
$rs = $resp.GetResponseStream();
[System.IO.StreamReader] $sr = New-Object System.IO.StreamReader -argumentList $rs;
[string] $id = $sr.ReadToEnd();
Write-Output "Rebooting Agent ID: $id"

$uri = "%teamcity.serverUrl%/httpAuth/remoteAccess/reboot.html?agent=$id&rebootAfterBuild=true"

$webRequest = [System.Net.WebRequest]::Create($uri)
$webRequest.Headers["Authorization"] = "Basic " + $authInfo
$webRequest.PreAuthenticate = $true 
[System.Net.WebResponse] $resp = $webRequest.GetResponse();
$rs = $resp.GetResponseStream();
[System.IO.StreamReader] $sr = New-Object System.IO.StreamReader -argumentList $rs;
$sr.ReadToEnd();

这是我上一次构建步骤,并在构建完成后重新启动代理。

答案 3 :(得分:0)

我们有类似的要求,要在MacOS上定期重置USB堆栈,因为Mac的USB堆栈不可靠(Android设备可以与Linux或Windows完美配合)。

我们有这些选项的先决条件任务:

  • 在同一代理上运行构建
  • 失败的依赖关系:make build无法启动
  • 未能启动/取消依赖项:make build无法启动

运行'shutdown -r now'并立即使用'echo #teamcity ...'系统向服务器报告成功,尝试捕获重启实际启动和发送到服务器的回显之间的小时间差距

不幸的是,当TeamCity尝试在代理上启动新作业时,脚本完成和代理实际重启之间的时间很短,因此我们有大量已中止的构建 - 它们已重新启动,因此它们并不完全正确打破任何东西,但它们会使日志混乱。

我们尝试用以下内容替换它,它将代理标记为重新启动,然后将shutdown命令委派给后台任务,等待TeamCity任务完成后再发出关闭:

echo "Running: '/sbin/shutdown -r shortly'"
echo rebooting=yes >> $HOME/buildAgent/conf/buildAgent.properties

CONFIG_PROPERTIES=$(grep teamcity.configuration.properties.file $TEAMCITY_BUILD_PROPERTIES_FILE | cut -d= -f2)
TC_SERVER=$(grep teamcity.serverUrl $CONFIG_PROPERTIES | cut -d= -f2)
BUILD_ID=$(grep teamcity.build.id $CONFIG_PROPERTIES | cut -d= -f2)
STATUS=$( echo "${TC_SERVER}/guestAuth/app/rest/builds/id:${BUILD_ID}"|tr -d \\ )
echo Polling $STATUS in background until parent task cannot be confirmed still running.

((
  while true; do
    sleep 5
    if curl -s $STATUS | xmllint --xpath "//build/@running" - | grep true ; then
      :
    else
      echo "passw0rd" | /usr/bin/sudo -p "" -S /sbin/shutdown -r now
    fi
  done
) 2>/dev/null >/dev/null &)&

我在机器的重启过程中添加了一个步骤,以便在代理启动备份之前的某个时刻删除'rebooting'参数。 (这是一台Mac,所以我在/ Library / LaunchDemon中添加了一个plist

/usr/bin/sed -i~ -e /rebooting=yes/d /Users/qa/buildAgent/conf/buildAgent.properties

将logfile目录精心编写为适当的用户 - plist默默地失败,否则......)

不幸的是,TeamCity似乎没有注意到新的9.1版本的'rebooting'参数,所以我们不得不在这个重启步骤和实际任务之间添加一个额外的依赖:这个新任务只是等到它不能看到配置文件中的'rebooting'参数,以及取消和重新安排的时间的一半 - 这很好,因为它将'已取消'的消息保留在主构建的日志之外,这就是我们想要的:

echo This task runs after the reboot script, as a buffer between the reboot script and the real reboot.
echo That is, THIS task will get all the INTERRUPTED errors, not the real scripts.

echo Uptime:
uptime

echo Infinite loop until machine reboot, unless reboot is already complete:
while grep rebooting=yes $HOME/buildAgent/conf/buildAgent.properties; do
  echo $(date) Awaiting reboot to interrupt task and clear rebooting=yes from buildAgent.properties file.
  sleep 15
done

显然,复制buildAgent.properties文件然后在原始文件的顶部移动副本会使9.x代理注意到更改,只要您的后续构建任务知道等待'',就不需要这个中间步骤。 rebooting = yes'引导进程要删除的参数。我没试过,但那肯定会更好。

答案 4 :(得分:0)

基于Lantrix方案,只需要设置post请求方法

$ErrorActionPreference = "Stop"
$auth = "%username%:%password%"
$auth = [System.Convert]::ToBase64String([System.Text.Encoding]::Default.GetBytes($auth))
$uri = "%teamcity.serverUrl%/httpAuth/app/rest/agents/name:%teamcity.agent.name%/id"
$request = [System.Net.WebRequest]::Create($uri)
$request.Headers["Authorization"] = "Basic " + $auth
$request.PreAuthenticate = $true 
[System.Net.WebResponse] $response = $request.GetResponse();
[System.IO.StreamReader] $streamReader = New-Object System.IO.StreamReader -argumentList $response.GetResponseStream();
[string] $id = $streamReader.ReadToEnd();
Write-Output "Trigger reboot of Agent ID: $id"
$uri = "%teamcity.serverUrl%/httpAuth/remoteAccess/reboot.html?agent=$id&rebootAfterBuild=true"
$request = [System.Net.WebRequest]::Create($uri)
$request.Method="POST"
$request.Headers["Authorization"] = "Basic " + $auth
$request.PreAuthenticate = $true 
[System.Net.WebResponse] $response = $request.GetResponse();
[System.IO.StreamReader] $streamReader = New-Object System.IO.StreamReader -argumentList $response.GetResponseStream();
[string] $response = $streamReader.ReadToEnd();
相关问题