在 TeamCity 分支移除时通过 Octopus Deploy 自动清理 IIS 站点

Automate cleanup of IIS sites via Octopus Deploy on TeamCity branch removal

我对此非常陌生,如果这是一个愚蠢的问题,我深表歉意,但我在 help.octopusdeploy.com 或 google.[=12= 找不到任何相关信息]

此外,我是一名 DevOps 工程师,而不是开发人员,并且已经使用 TC 和 Octopus 大约 3 周了。到目前为止我很喜欢它,但如果你认为我是一个新手,那可能是最好的 ;)

我目前在 TeamCity 中有一个构建配置,在成功构建后 运行,在 Octopus 中创建一个版本,并在成功构建时将项目部署到测试服务器。它保持独立,但与主构建一起部署。因此,在 IIS 中它看起来像:

IIS Sites
    site.domain.com (master build)
    featurebuild1-site.domain.com (feature branch 1)
    featurebuild2-site.domain.com (feature branch 2)
    etc...

显然,这让开发人员在测试他们的功能构建时的生活变得非常轻松,但它在测试和集成服务器上留下了一团糟。我可以进入并手动清理它们,但我非常希望在他们删除 TeamCity 中的分支后不要留下废话。

因此,TeamCity 中的项目如下所示:

Project Name
    Feature
        /Featurebuild1
        /Featurebuild2
        /Featurebuild3
    Master

假设所有三个功能构建 运行 成功,我将在测试服务器上与主服务器一起拥有 3 个功能构建 IIS 站点。如果他们决定完成 Featurebuild3 并将其删除,我想以某种方式在我的测试服务器上的 IIS 中自动删除 featurebuild3-site.domain.com 。这可能吗?如果是这样,如何?

我最初的想法是创建另一个 Octopus 项目,该项目将进入并删除网站,但我不知道我是否 can/how 会触发它。

相关详情:
TeamCity 版本:9.1.1(内部版本 37059)
Octopus Deploy 版本:3.0.10.2278

好吧,我花了一点时间才弄明白,但这就是我最终做的事情(以防其他人试图做同样的事情)。

我最终完全绕过了 TeamCity,并使用我们的 Stash 存储库作为源。另外,因为我不需要它在删除后立即清理,所以我很高兴每晚都有它 运行。一旦我决定这样做,接下来就是一堆嵌套的 REST API 调用来循环遍历每个项目和团队以枚举所有不同的存储库(如果我在这里使用术语,我深表歉意)。

$stashroot = "http://<yourstashsite>/rest/api/1.0"
$stashsuffix = "/repos/"
$stashappendix = "/branches"

$teamquery = curl $stash -erroraction silentlycontinue

此时,我开始使用 jq (https://stedolan.github.io/jq/) 来更好地解析我返回的文本

$teams = $teamquery.content | jq -r ".values[].link.url"

Foreach ($team in $teams)
{
# Get the list of branches in the repository
# Feature branch URL format be like: http://<yourstashsite>/projects/<projectname>/repos/<repositoryname>/branches #
$project = $stashroot +$team +$stashsuffix
$projectquery = curl $project -erroraction silentlycontinue
$repos = $projectquery.content | jq -r ".values[].name"
Foreach ($repo in $repos)
    {
    Try
        {
        $repository = $stashroot +$team +$stashsuffix +$repo +$stashappendix
        $repositoryquery = curl $repository -erroraction silentlycontinue
        $reponames = $repositoryquery.content | jq -r ".values[].displayId"
        Foreach ($reponame in $reponames)
            {
            #write-host $team "/" $repo "/" $reponame -erroraction silentlycontinue
            $NewObject = new-object PSObject
            $NewObject | add-member -membertype NoteProperty -name "Team" -value $team
            $NewObject | add-member -membertype NoteProperty -name "Repository" -value $repo
            $NewObject | add-member -membertype NoteProperty -name "Branch" -value $reponame
            $NewObject | export-csv <desiredfilepath> -notype -append
            }
        }
    Catch{} # Yes, I know this is terrible; it makes me sad too :(
    }
}

之后,只需对两天的 CSV 文件进行比较即可(我有适当的逻辑来查找预先存在的 csv 并将其重命名以将“_yesterday”附加到it), 输出到一个文件,所有 repositories/builds 从昨天开始就被破坏了。

之后,它会删除功能分支名称(我们用它来为 IIS 中的测试站点名称添加前缀,并循环查找 IIS 中与该站点前缀匹配的任何站点,删除它们,关联的应用程序池,并删除服务器上存储站点内容的目录。

我确信有 更好的方法来实现这一点,特别是如果您知道如何编码。不过我只是一只可怜的小脚本猴子,所以我必须用我所拥有的:)