Stop Octopus Deploy queuing deployments triggered by a scheduled trigger if deployment already running

logic-in-deployments
(Lianne Crocker) #1

We have a project that runs every few minutes using a scheduled trigger (it cannot be a runbook for several reasons). Sometimes, the deployment takes longer than five minutes to run and when that happens, another deploy is scheduled before the first one is finished, which means that the process is running unnecessarily.

Is there any way to tell the trigger mechanism or the deploy mechanism to not queue a deploy if one is already running?

(Lianne Crocker) #2

Scheduled deployment triggers in Octopus (https://octopus.com/docs/projects/project-triggers/scheduled-deployment-trigger) solely queue a deployment, they do not perform any checks, so, as you are probably encountering if the project is already running, a deployment task will be queued.

One way to avoid this is to have two projects. Let’s call the project that does the actual (potentially long-running) work, that you want to run on a schedule ChildProject and the second ParentProject.

The ParentProject will have a script step which checks to see if the ChildProject is currently running for the current Environment, if it is not, it creates a deployment for ChildProject for the current Environment. Because the ParentProject will take seconds to complete, we avoid project deployments queuing up.

Let’s say ChildProject runs a Powershell Sleep for 3 minutes, and there is a scheduled deployment trigger for ParentProject that triggers a deployment every 2 minutes. In this example it will be quite common that ChildProject will not be deployed.

In the image above, we can see that ParentProject ran on the schedule and that on the 2:20 PM deployment it found the ChildProject was already executing, so did not create a new deployment for it.

A script to use in the script step of the ParentProject can be found here: https://github.com/OctopusDeploy/OctopusDeploy-Api/blob/master/Octopus.Client/PowerShell/Deployments/CreateProjectDeploymentIfNotRunningAlready.ps1

You can parameterize the environment and project to deploy.

(Lianne Crocker) listed #3