Let us say that you want to execute a job periodically, what comes to your mind first? If you are familiar with Linux, I can hear your screaming cron. Well, no doubt about that, cron is great, but what if I told you there is another approach which you can take to execute periodic jobs? Our good old continuous integration server Jenkins can supplant cron as a tool to execute periodic jobs and it kicks ass in doing so.
What makes Jenkins such a gem for executing periodic jobs?
1. You get a great web front end which is comfortably accessible from the browser.
2. The front end gives you a complete history of the previous runs with detailed information like when did the last execution occur, how long it took, what was the output during this execution, historic trend of the execution time and other diagnostic information.
3. You can leverage the Jenkins plugin eco system and do some nifty things. For example, you can use log parser plugin to parse the execution output and alert if a specific format is found in the output. The great part here is that your job need not have alerting logic baked in, your job concentrates on doing what it does best, let Jenkins take care of the rest.
4. You can configure regular Jenkins build rules like alerting on execution failure, preventing subsequent executions if the current one fails, etc.
5. You can chain multiple jobs and the chain is very obvious thanks to the great Jenkins UI.
All this is great, but one problem I faced with Jenkins is that you cannot have a Job call itself recursively with a delay in between, you have to schedule the job execution using cron expression. The difference is subtle, but there are implications of this limitation which I will expound with an example. Let us say that I have a job which ideally should run every 15 minutes, but sometimes this job execution takes more than 15 minutes to complete, in that case what happens is, job executions queue up and fire successively one after the other. The way I want this scenario to pan out is, once the execution finishes, it should wait for 15 minutes before the next execution starts. I could not find a way to do this in Jenkins and hence selfie was born.
Selfie is a Jenkins build trigger plugin which lets a project to trigger itself after a configured delay. The plugin appears as one of the build triggers while configuring a new project.
This is my first attempt at writing a Jenkins plugin, pull requests and code reviews are more than welcome.
3 thoughts on “Selfie”
There is yet another way. You could also use Quartz.NET
I find the UI lacking in all these tools :(.
Oh i see. The one which I refereed to is used for pragmatically scheduling jobs to run some logic. It works like a trigger. Say if you are interested to run some tasks at regular intervals of time. I believe you can also do some interesting things like building the project etc.
Good work. Keep sharing.