We have an OctopusDeploy deployment that deploys our code to an automated acceptance test environment. And we have a TeamCity build that executes our automated acceptance tests.
The challenge is: the TeamCity build kicked off after our code was merged, not after the deployment was finished. We wanted the tests to kick off only after the environment was ready.
Solution
I created an OctopusDeploy step template to kick off a TeamCity build, and then utilized that step template in the Octopus deployment.
It works via crafting an HTTP POST
request against the TeamCity API.
Step Template Contents
I created a PowerShell script that utilizes some parameters
$parsedUrlString = "$TeamCityServerURL" + "/app/rest/buildQueue" $parsedXmlBody = '<build><buildType id="' + $TeamCityBuildConfigID + '"/></build>'
$HeaderFields = @{} $HeaderFields.add("Authorization", "Bearer $TeamCityAccessToken")
$HeaderFields.add("Origin", "$TeamCityServerURL")
Write-Host "Attempting to run the $TeamCityBuildConfigID build" Write-Host "Connecting to $parsedUrlString"
Invoke-WebRequest -UseBasicParsing $parsedUrlString -ContentType "application/xml" -Method POST -Body $parsedXmlBody -Headers $HeaderFields
The Parameters
From the variables in the script, Octopus will generate step templates:
Generating the TeamCity Access Token
- Open TeamCity and head to the settings menu:
- Click to create the access token:
- Give the access token a name:
- Copy the access token
Adding the build step
- In OctopusDeploy, open the deployment in question
- Add a deployment step, and select the step template
- Add the applicable parameters
The Result
Now, when we commit code:
- The build finishes
- The Octopus deployment kicks off
- After the deployment, the last step calls the other TeamCity build
- The TeamCity build kicks off to run our automated acceptance tests
Happy deploying!