通过提交SHA1获取构建状态 [英] Get Build status by Commit SHA1

查看:107
本文介绍了通过提交SHA1获取构建状态的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们的团队正在使用TeamCity进行持续集成,并使用Gi​​t-TFS(TFS2015 RC)进行版本控制。



我想检查TeamCity是否已成功构建了特定的Commit,因此可以将其重新集成。



可以使用其REST API查询TeamCity构建,例如:

 获取http:// teamcity:8000 / guestAuth / app / rest / builds / 18 

结果包含一些显示git commit SHA的xml:

 < revisions count = 1> 
< revision version = 96b1db05b64ecc895da070137e93cde3d2cadfa1>
< vcs-root-instance [...] />
< / revision>
< / revisions>

事实上,该信息在理论上是可用的,这使我希望可以查询TeamCity通过此特定信息构建,例如:

 获取http:// teamcity:8000 / guestAuth / app / rest / builds / revision :96b1db05b64ecc895da [...] 

但这会产生#400错误请求回应。我无法在 TeamCity 9文档中找到或不。我宁愿不迭代所有构建以检查它们是否包含此特定提交。



注意::此功能现已由JetBrains实现,可在 TeamCity 9.1 EAP4

解决方案

我不相信没有迭代就可以做到这一点,这有点烦人



您可以按哈希查看更改

  / httpAuth / app / rest / changes?version:SHA_HASH 

,您可以通过构建定位器查找更改

  / httpAuth / app / rest / changes?locator = build:(id:BUILD_ID)

,但您不能采用其他方法,否则可以简单地完成。



buildLocator不允许您使用修订维度,所以我看不到任何解决方法



如果您自己尚未编写以下脚本,则可能对您有用-将其保存到名为 get-build-status-by-git-commit.ps1 的文件,因此它可以与样本末尾一起使用



< pre class = lang-bsh prettyprint-override> #------------------------------- ----------------
#通过Git提交构建状态提交
#-----------------------------------------------

#Ver Who When What
#1.0 DevOpsGuys 01-07-15初始版本

#脚本输入参数
param(
[ValidateNotNullOrEmpty()]
[字符串] $ TeamCityServer = $(抛出 -TeamCityServer是强制性的,请提供一个值。),
[ValidateNotNullOrEmpty()]
[string] $ ApiUsername = $(抛出 -ApiUsername为必填项,请提供一个值。),
[ValidateNotNullOrEmpty()]
[string] $ ApiPassword = $(抛出 -ApiPassword为必填项,请提供一个值。),
[ValidateNotNullOrEmpty()]
[string] $ GitSha = $(抛出 -GitSha是强制性的,请提供一个值。)


函数Main()
{
$ CurrentScriptVersion = 1.0
$ ApiCredentials =新对象System.Management.Automation.PSCredential($ ApiUsername,(ConvertTo-SecureString $ ApiPassword -AsPlainText -Force))

写主机 =============== ===通过Git Commit获取构建状态-版本 $ CurrentScriptVersion:START =================

#记录传入的输入变量
对数变量
写主机

#设置初始查询网址
$ queryBuilds = / httpAuth / app / rest / builds?fields = nextHref,build( id,status,revisions)

while($ queryBuilds)
{
$ buildsToCheck = Api-Get $ TeamCityServer $ queryBuilds
$ queryBuilds = $ buildsToCheck .builds.nextHref;
foreach($ builds在$ buildsToCheck.builds.build中)
{
if($ build.revisions.revision.version -eq $ GitSha){
Write-Host STATUS : $ build.status
退出0
}
}
}

写入主机 ============ =======通过Git提交获取构建状态-版本 $ CurrentScriptVersion:END =================
}

函数Log-Variables
{
Write-Host TeamCityServer: $ TeamCityServer
Write-Host GitSha: $ GitSha
Write-Host Computername:( gc env:computername)
}

函数Api-Get($ Url)
{
Write-Host $ Url
return Invoke-RestMethod -Credential $ ApiCredentials -Uri $ Url -Method Get -TimeoutSec 20;
}

Main

您可以在以下使用

  。\get-build-status-by-git-commit.ps1 http:// teamcity:8000 / 用户名密码96b1db05b64ecc895da070137e93cde3d2cadfa1 

这是使用httpAuth,但是您可以轻松地定制脚本以使用guest。我已经使用了httpAuth,以防其他人使用它。



希望这会有所帮助


Our team is using TeamCity for continuous integration and Git-TFS (TFS2015 RC) for versioning.

I want to check if a specific Commit has been built (successfully) by TeamCity and thus can be reintegrated.

It is possible to query TeamCity builds by using their REST API, e.g.:

GET http://teamcity:8000/guestAuth/app/rest/builds/18

with the result containing some xml that shows the git commit SHA:

<revisions count="1">
    <revision version="96b1db05b64ecc895da070137e93cde3d2cadfa1">
        <vcs-root-instance [...]/>
    </revision>
</revisions>

The fact, that this information is in theory available, makes me hope that it is possible to query TeamCity builds by this particular information, like:

GET http://teamcity:8000/guestAuth/app/rest/builds/revision:96b1db05b64ecc895da[...]

but this yields a #400 BAD REQUEST response. I was not able to find out in the TeamCity 9 Documentation, whether this is possible or not. I would rather not iterate all builds to check if they contain this specific commit.

NOTE: This feature has now been implemented by JetBrains and is available in TeamCity 9.1 EAP4 now.

解决方案

I don't believe this can be done without iteration, which is a little annoying

You can view changes by hash

/httpAuth/app/rest/changes?version:SHA_HASH

and you can find changes by build locator

/httpAuth/app/rest/changes?locator=build:(id:BUILD_ID)

but you can't go the other way, otherwise this could be done simply.

The buildLocator doesn't allow you to query using a revision dimension so I can't see any way around this

The following script may be of use to you if you haven't already written it yourself - save this to a file called get-build-status-by-git-commit.ps1 so it works with the sample at the end

# -----------------------------------------------
# Get Build Status By Git Commit
# -----------------------------------------------
#
# Ver   Who         When      What
# 1.0   DevOpsGuys  01-07-15  Initial Version

# Script Input Parameters
param (
    [ValidateNotNullOrEmpty()]
    [string] $TeamCityServer = $(throw "-TeamCityServer is mandatory, please provide a value."),
    [ValidateNotNullOrEmpty()]
    [string] $ApiUsername = $(throw "-ApiUsername is mandatory, please provide a value."),
    [ValidateNotNullOrEmpty()]
    [string] $ApiPassword = $(throw "-ApiPassword is mandatory, please provide a value."),
    [ValidateNotNullOrEmpty()]
    [string] $GitSha = $(throw "-GitSha is mandatory, please provide a value.")
)

function Main() 
{
    $CurrentScriptVersion = "1.0"
    $ApiCredentials = New-Object System.Management.Automation.PSCredential($ApiUsername, (ConvertTo-SecureString $ApiPassword -AsPlainText -Force))

    Write-Host "================== Get Build Status By Git Commit - Version"$CurrentScriptVersion": START =================="

    # Log input variables passed in
    Log-Variables
    Write-Host

    # Set initial query url
    $queryBuilds = "/httpAuth/app/rest/builds?fields=nextHref,build(id,status,revisions)"

    while($queryBuilds)
    {
        $buildsToCheck = Api-Get "$TeamCityServer$queryBuilds"
        $queryBuilds = $buildsToCheck.builds.nextHref;
        foreach($build in $buildsToCheck.builds.build)
        {
            if ($build.revisions.revision.version -eq $GitSha) {
                Write-Host "STATUS: "$build.status
                Exit 0
            }
        }
    }

    Write-Host "================== Get Build Status By Git Commit - Version"$CurrentScriptVersion": END =================="
}

function Log-Variables
{
    Write-Host "TeamCityServer: " $TeamCityServer
    Write-Host "GitSha: " $GitSha
    Write-Host "Computername:" (gc env:computername)
}

function Api-Get($Url)
{
    Write-Host $Url
    return Invoke-RestMethod -Credential $ApiCredentials -Uri $Url -Method Get -TimeoutSec 20;
}

Main

You can use this in the following way

.\get-build-status-by-git-commit.ps1 "http://teamcity:8000/" username password 96b1db05b64ecc895da070137e93cde3d2cadfa1

This is using httpAuth, but you could easily tailor the script to be using guest. I've used httpAuth in case it's of use to anyone else.

Hope this helps

这篇关于通过提交SHA1获取构建状态的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆