1

我正在使用 TeamCity 进行构建的项目。

我有一个虚拟机,并编写了一个 PowerShell 脚本来备份一些文件,打开一个我从 TeamCity 手动下载的 ZIP 工件,然后将其复制到我的虚拟机。

我想通过检索 ZIP 工件(始终具有相同的名称)来增强我的脚本。

问题是下载路径包含始终在变化的内部版本号。除了请求 ZIP 工件的下载路径之外,我真的不在乎它是什么。

一个示例工件路径可能是:

http://{server}/repository/download/{project}/{build_number}:id/{project}.zip

TeamCity 中有一个“最后成功的构建”页面,我可能可以从中获取内部版本号。

您认为解决这个问题的最佳方法是什么?

我是 TeamCity 的新手,但答案也可能是“TeamCity 执行此操作 - 您不需要 PowerShell 脚本”。因此,这方面的指导会有所帮助。

目前,我的 PowerShell 脚本可以做到这一点,并且只需要大约 30 秒即可运行(这比手动复制所有文件的同行要快得多)。我会很高兴仅自动化 ZIP 下载,这样我就可以“触发并忘记”我的脚本并最终得到一个更新的 VM。

似乎是在运行时使用 PowerShell 填补和检索变化的路径信息的最小知识差距似乎是一项相当不错的技能。

我可能只是在 PS 中使用 C# 来收集这些信息,但我希望有一种更 PS 的方式来做到这一点。

提前感谢您的想法和建议!

更新:事实证明,其他一些团队一直在使用 Octopus Deploy ( https://octopus.com/ ) 来完成这类事情,所以我现在正在使用它——尽管它实际上似乎比整体 PS 解决方案更麻烦,因为它涉及登录到 Octopus 服务器并通过几个步骤在此时手动启动新构建。

我也在等待 TC 管理员提供一个 Webhook 或其他东西,以便在有新版本可用时通知 Octopus。一旦我有了这个,八达通管理员说我们应该能够让部署自动发生。

从好的方面来说,我确实通过可用于 Octopus 的 webhook 插件将构建过程与 Microsoft Teams 集成。此外,Octopus 的开发人员正在考虑制作 Microsoft Teams 连接器来简化此操作。很高兴在我的团队聊天中收到新版本可用的通知。

4

4 回答 4

0

您可以尝试从此网址获取您的人工制品:

http://<ServerUrl>/repository/downloadAll/<BuildId>/.lastSuccessful

其中 BuildId 是构建配置的唯一标识符。

我对这个问题的实现是,在powershell中:

#
# GetArtefact.ps1
#
Param(
    [Parameter(Mandatory=$false)][string]$TeamcityServer="",
    [Parameter(Mandatory=$false)][string]$BuildConfigurationId="",
    [Parameter(Mandatory=$false)][string]$LocalPathToSave=""
)
Begin
{
    $username = "guest";
    $password = "guest";

    function Execute-HTTPGetCommand() {
        param(
            [string] $target = $null
        )
        $request = [System.Net.WebRequest]::Create($target)
        $request.PreAuthenticate = $true
        $request.Method = "GET"         

        $request.Headers.Add("AUTHORIZATION", "Basic");
        $request.Accept = "*"
        $request.Credentials = New-Object    System.Net.NetworkCredential($username, $password)
        $response = $request.GetResponse()

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

    Execute-HTTPGetCommand http://$TeamcityServer/repository/downloadAll/$BuildConfigurationId/.lastSuccessful | Out-File $LocalPathToSave

}

并使用适当的参数调用它。

编辑:请注意,我在这里使用的当前凭据是访客帐户。您应该检查来宾帐户是否具有执行此操作的权限,或指定适当的帐户。

于 2017-04-07T13:48:58.920 回答
0

TeamCity 能够将其工件发布到内置的 NuGet 源。然后,您可以使用 NuGet 安装创建的包,而不关心工件的位置。完成此操作后,您可以通过将源指向 NuGet 源 URL 来使用 nuget.exe 进行安装。在https://confluence.jetbrains.com/display/TCD10/NuGet了解如何配置提要。

于 2017-05-05T04:10:35.860 回答
0

尝试使用 TeamCity REST API构建 URL 以下载构建工件。您可以使用各种标准(例如上次成功构建或上次使用特定标签标记等)获得永久链接。

例如,要获得最后一次成功,您可以使用以下内容:http://{server}/app/rest/builds/buildType:(id:{build.conf.id}),status:SUCCESS/artifacts/content/{file.姓名}

于 2017-04-08T13:56:22.743 回答
-1
  1. 读取 TEAMCITY_BUILD_PROPERTIES_FILE 环境变量中路径的文件内容。
  2. 在文件中找到 teamcity.configuration.properties.file 行,iirc 值是反斜杠编码的。
  3. 读取那个文件,找到 teamcity.serverUrl 值,解码它。
  4. 像这样构造 url:{serverurl}/httpAuth/repository/download/{buildtypeid}/.lastSuccessful/file.txt

这是一个示例(C#): https ://github.com/WideOrbit/buildtools/blob/master/RunTests.csx#L272

于 2017-04-06T23:25:33.623 回答