Can a second pipeline deploy automatically cancel a previous one in progress?

We have multiple developers working concurrently and make use of a development server to review the state of our application. 

We push to the "dev" branch to trigger a pipeline to deploy all approved changes to this server. This deploy triggers a new build of the current state of the app.

When we are developing rapidly there may be several deploys triggered concurrently which bogs down the deployments with redundant building.

How can we have the latest/most recent deploy automatically cancel previous deployments in progress?

Thank you.

3 answers

This widget could not be displayed.

Hello Brendan,

You can put this Python script in your repository and call it as first run step in your pipeline to achieve this. In my case I use a similar one but placed in AWS Lambda and call via curl

import os

BITBUCKET_USER = os.environ.get("BITBUCKET_USER")
BITBUCKET_KEY = os.environ.get("BITBUCKET_KEY")
BITBUCKET_REPO_OWNER = os.environ.get("BITBUCKET_REPO_OWNER")
BITBUCKET_REPO_SLUG = os.environ.get("BITBUCKET_REPO_SLUG")
BITBUCKET_BRANCH = os.environ.get("BITBUCKET_BRANCH")
BITBUCKET_COMMIT = os.envoron.get("BITBUCKET_COMMIT")

request_url = "https://api.bitbucket.org/2.0/repositories/%s/%s/pipelines/?sort=-created_on" % (BITBUCKET_REPO_OWNER, BITBUCKET_REPO_SLUG)
r = requests.get(request_url, auth=(BITBUCKET_USER, BITBUCKET_KEY))
result = r.json()
uuids = []
for value in result["values"]:
target = value.get("target")
if target.get("ref_name") == BITBUCKET_BRANCH:
type = value.get("state").get("type")
if type == "pipeline_state_in_progress" or type == "pipeline_state_pending":
if target.get("commit").get("type") == "commit":
if target.get("commit").get("hash") != BITBUCKET_COMMIT:
uuids.append(value.get("uuid"))
for uuid in uuids:
request_url = "https://api.bitbucket.org/2.0/repositories/%s/%s/pipelines/%s/stopPipeline" % (BITBUCKET_REPO_OWNER, BITBUCKET_REPO_SLUG, uuid)
response = requests.post(request_url, auth=(BITBUCKET_USER, BITBUCKET_KEY))
This widget could not be displayed.

Hello Brendan,

We'll be looking into ways to solve this problem natively in Pipelines later this year.

I suggest you following this ticket for updates: https://bitbucket.org/site/master/issues/12821/limit-concurrent-pipelines-so-deployment

In the meantime, if you need this functionality now, you can use the Bitbucket Pipelines REST API to construct a script that checks for other, more recent, running pipelines before deploying. 

Rest API documentation: https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Busername%7D/%7Brepo_slug%7D/pipelines

Thanks,

Phil

This widget could not be displayed.

Bitbucket Pipelines now supports deployment concurrency. You can find more information here: https://bitbucket.org/site/master/issues/12821/limit-concurrent-pipelines-so-deployment?_ga=2.107981314.1848967244.1530489631-825437565.1515570924#comment-45346024

We've set it up to pause new deployments when a deployment is already running. Instead of the existing in progress one, as stopping a running deployment may leave environments in an inconsistent/broken state. Paused deployments may be manually resumed.

If you're interested in automatic deployment queueing, please follow the issue here: https://bitbucket.org/site/master/issues/16304/queuing-and-automatic-resuming-of-paused

Thanks

It seems that the second deployment is paused and not resumed. This is not helpful in our case in which we are deploying from a branch to a given server and we want the LAST (latest) deployment to succeed, not an earlier one that may already be in progress that is missing the latest commits. Is that possible with this new feature?

Not at the moment.

We decided not to automatically stop already running deployments as a deployment being stopped halfway unexpectedly would likely be a cause of issues for that deployment environment. Hence pausing newer ones instead.

We'd like to get a better understanding of use-cases before committing to a solution, as there's quite a few use-cases and edge-cases to consider.

Can you share with us on the queueing issue with any details about your deployment flow, number of deployments, number of them getting skipped, HOT fix procedure, etc. It would help us a lot. :) Our PMs will also provide updates on that ticket.

How about a configuration option?

I see these three values for that option as relevant:

  • Current functionality. Pause the new deployment and run the previous to the end
  • Pause the new deployment, run the previous to the end, then run the new deployment
  • Stop the previous deployment and run the new deployment

And if there could be some sort of wait-period where a new deployment would cancel the previous one(s), I think it would solve a lot.

Suggest an answer

Log in or Sign up to answer
Community showcase
Published Aug 21, 2018 in Bitbucket

Branch Management with Bitbucket

As a project manager, I have discovered that different developers want to bring their previous branching method with them when they join the team. Some developers are used to performing individual wo...

1,322 views 8 11
Read article

Atlassian User Groups

Connect with like-minded Atlassian users at free events near you!

Find a group

Connect with like-minded Atlassian users at free events near you!

Find my local user group

Unfortunately there are no AUG chapters near you at the moment.

Start an AUG

You're one step closer to meeting fellow Atlassian users at your local meet up. Learn more about AUGs

Groups near you