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

时间:2015-12-16 14:40:10

标签: iis teamcity octopus-deploy

我对此非常陌生,如果这是一个愚蠢的问题而道歉,但我无法在这里,在help.octopusdeploy.com或google找到任何相关信息。

此外,我是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(build 37059)
Octopus Deploy版本:3.0.10.2278

1 个答案:

答案 0 :(得分:0)

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

我最终完全绕过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”) ,输出到文件,自昨天以来已经核化的所有存储库/构建。

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

我确信有更好的方法来实现这一目标,特别是如果您知道如何编码。我只是一个可怜的小楷猴,所以我必须做我所拥有的:)