通过删除TeamCity分支的Octopus Deploy自动清理IIS站点



我对此非常陌生,如果这是一个愚蠢的问题,我很抱歉,但我在这里、help.octopusdeploy.com或谷歌上都找不到任何关于它的信息。

此外,我是一名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。这可能吗?如果是,如何?

我最初的想法是有另一个八达通项目,它将进入并删除网站,但我不知道我是否可以/如何触发它。

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

好吧,我花了一点时间才弄清楚,但这是我最终做的事情(只是在其他人试图做同样的事情的情况下)。

我最终完全绕过了TeamCity,使用我们的Stash存储库作为源代码。此外,由于我不需要它在删除后立即清理,我很高兴它能在晚上运行。一旦我决定了这一点,接下来就是一系列嵌套的RESTneneneba 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,并将其重命名为附加"_yestery"),输出到一个文件中,即自昨天以来被破坏的所有存储库/构建。

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

我相信有更好的方法来实现这一点,尤其是如果你知道如何编码的话。不过,我只是一个可怜的小脚本猴子,所以我不得不将就一下:)

最新更新