Execute Final script only on build failure
Asked by Adam Terlson:

I want to execute an arbitrary shell script, but I only want it to run on build failure. Is there some way to either:

- Set up Bamboo to run this script only on build failure  
- Or check from within the script whether the build was successful. Perhaps an environment/build variable?

Thoughts and ideas appreciated!


Answers:
author: cbenard1
body: Hi Adam,

Currently Bamboo builds are not able to access active data about a build from within that build. The data required to determine that a build failed would not be available until the build completed, not giving the script time to run. Depending on the types of tasks you are running in Bamboo you could potentially create a test task that runs the script based on the results so far.

It would take the results of the build from the last Job that would usually run just before the build finished. Then it should parse those, and run the script based on the results, before sending the exact same results it tested on and sending those to Bamboo.

If this doesn't work for your particular workflow could you please detail what you're looking to do here so I can maybe provide further assistance.

Thanks

Turner

comments: author: Adam Terlson
body: Thanks for the reply Turner. I consider my use-case to be quite simple. We use Slack, and I want to message my team in Slack when the build goes down via a curl command which does a POST with a JSON payload. I just want to fire off a curl when the build fails. If you have an idea for a different approach I'm all ears! Basically I want exactly what bitbucket does with its notifications drop down with hipchat, except with Slack.


author: Adam Terlson
body: @Carlen Benard Another thought I had: can I set a variable from one script task and read that variable from another script?


author: cbenard1
body: Hi Adam,That makes perfect sense. What you'll wanna do to achieve it is this:- Add a new task at the end of your build that takes the results as input- Have this new task check for a non-zero exit code (this is the check Bamboo does to determine pass v fail).-If the build exit code is non-zero (aka would fail to Bamboo) have it run the script then push the results it got as input to their appropriate test or out to Bamboo.- If the build would succeed just pass Bamboo a good exit codeThanks!Turner


author: adamterlson
body: @Carlen Benard Phew, that seems like a good approach, but I'm not sure how to start due to my relative newness to Bamboo. Can you provide any code snippets or docs that might get me started?


author: cbenard1
body: Hi Adam,Unfortunately I do not know of any docs that have the exact code bits you would need to accomplish this. No promises but if you can provide a bit more detail on what your build is doing I may be able to point you in the right direction. The way I see it now:- Have your current build output it's results to a file (xml, log, text, etc.)- Have the current build save that file somewhere accessible to the build (local or remote server where it can be downloaded from though this may be redundant)- Create a new script that runs at the end of the build. This guy will pull in the newly created output file, parse it to determine if it's a failure, and respond according.Unfortunately without specifics of the code you're currently running I have to give you general terms!Best of luck!Turner


author: adamterlson
body: @Carlen Benard I'm doing a node build, so it's quite simplistic. I currently have a single stage that has a single job: Build and package. This (Task 1) gets the code from bitbucket, then (Task 2) runs a script which does things like "npm install" and then bundles up a zip file which represents the build artifact. I suspect the presence of this build artifact could be used as a description of "success" of the build. I just need to know: 1) How to run a script that will be able to look for this log file regardless of the previous task failing or not, 2) How to check to see if the artifact file exists from an inline script. As a side note, can you get me up to 25 rep so we can continue this conversation without me needing to create another account to get around the 3 post limit per 24 hours?


author: cbenard1
body: Hi Adam,You should be able to respond with one of the two accounts here. I've gotten it a couple upvotes/rep. Please allow me to address your questions in order.1) You'll want to create a script and drag it to the "Final Task" section of the job:<https://www.dropbox.com/s/e6fvrykga3cychf/Screenshot%202014-10-29%2015.16.33.png?dl=0>1.5) In order to create that file initially you'll want the original script creating your artifact to direct output to a file.2) Since the task is final (after the other build tasks) Bamboo will already have identified whether the artifact was created. If you'd like to incorporate that into the final script you'd have to first check where the artifact is created locally before being copied back to Bamboo sever. Run the build once and look at the logs to find this out. Once you have the location of the artifact you'll just substitute the upper level folder name (all named after builds) with a variable supplying your current build. Now you can have the script manually crawl the folder and check for the file.Hope this helps!Turner


author: adamterlson
body: @Carlen Benard Maybe this is easier... How do I grep the log file for my build? As in, the log file that I see on the Logs tab of the build summary screen?


author: cbenard1
body: Hi Adam,Apologies for not doing a great job explaining. Maybe I can give you another approach that makes more sense.This will build off of your current job:- Create a new task that simply says "touch buildfinished"-- This should create a file in Linux/Unix- You'll put this task at the end of your job _but_ before the 'final task' line-- This way if the build fails in any way this task won't be reach and the {{buildfinished}} will not exist.- Create a second task that will be a final task that will check for the existence of that file-- If the build failed the file won't exist and the script can fire off the curl command to notify slack-- If the build succeeds the final task will check for the file (it'll exist) and simply delete it, allowing the build to complete as normalPlease let me know if I can clarify this further!Turner


author: Adam Terlson
body: I think that sounds like a really good approach. What path do I use to look for that file?<http://stackoverflow.com/questions/638975/how-do-i-tell-if-a-file-does-not-exist-in-bash> \<--- Here's what I'm planning on doing. What do I replace '/tmp/foo.txt' with?


author: Adam Terlson
body: @Carlen Benard Can you help me just this \*one\* last time? I think with understanding this last bit I'll be squared away and can stop bugging you! Thank you for all your help!


author: cbenard1
body: Hi Adam,You can replace it with anything. The specific path will depend on the file structure of your remote agent instance. There isn't a requirement for where the file needs to go and it'll be deleted anyways so wherever you like!Thanks!Turner


author: Adam Terlson
body: @Carlen Benard Thanks for the reply. I was more asking, how do I refer to the same directory from both jobs? Will a relative path work? Do I need to use an environment variable? If I did \`touch somefile.temp\` in one job, can I then just do \`if \[ ! -f somefile.temp \]; then\` in the next?


author: cbenard1
body: Hi Adam!Sorry I can't be more specific and have to keep suggestions general (as I don't know your specific env). A relative path should do the trick, you can also definitely search for it. If it were me I would do a simple search, but that's simply preference. You can configure the path to an environment variable if you like, but it's not necessary.Thanks!Turner


author: Zsolt Bako
body: Hi guys!Thank you Turner, your instructions made perfect sense. I had the same situation, and with this tricky workaround I was able to send notification via Slack. I hope that you will consider a more simple integration in the future :)Adam: it works with relative path ;) simply use a file 'buildfinished' without absolute reference in both scriptsZsolt


author: Krystian Brazulewicz
body: This plugin does exactly what you need: <https://marketplace.atlassian.com/plugins/com.sysbliss.bamboo.plugins.prepost-build-command>

comments: author: Adam Terlson
body: Sorry, I think you may have posted the wrong link or something.


author: Krystian Brazulewicz
body: Thanks, I fixed the link


author: Adam Terlson
body: Yes indeed it does do exactly what I want. However, it is not available for cloud.


author: Zsolt Bako
body: Could be a good solution, but my install was unable to add this plugin :( (bamboo 5.7.1)


author: Krystian Brazulewicz
body: @Zsolt Bako - what was the issue with the installation?


author: Zsolt Bako
body: UPM was unable to install it because it's a 'version 1' type plugin... so I downloaded and placed it into the right directory, restarted bamboo, and it showed the plugin, but didn't allow to enable it.


author: Krystian Brazulewicz
body: Please contact support on this. This should definitely work


author: phil
body: We were able to install it and it shows as active but it does not appear to have enabled any of the functionality.


Tags: cloud