How can I make a maven plugin to notify build results? - maven-3

I develop a simple plugin to notify build results to desktop like growl.
https://github.com/kompiro/notification-maven-plugin
Now, I think there are no good way to listen build result event.
I tested two way to listen the event.
a. ExecutionListener from MavenSession#getRequest()
This way is implemented below.
https://github.com/kompiro/notification-maven-plugin/blob/master/src/main/java/org/kompiro/nortification/buildresult/NotificationMojo.java
This way is running well to notify, but there is a problem. It replaced default maven event execution listener.
So, if user add this plugin, there are no maven execution log.
I thought my implementation extends the default event execution listener "ExecutionEventLogger",
But I can't because The constructor of ExecutionEventLogger needs plexus's logger.
I can't get the logger object.
b. use EventSpy
This is not public interface and user must add the plugin to maven.ext classpath.It is not good for user.
How can I listen the event correctly?

Why not just setup a Jenkins server on your local desktop and have it run the tests and notify you?
There is probably a growl-like notifier for Jenkins somewhere, or worst case just get it to sent an email to localhost with the test results. This also has the advantage of keeping historical test results.
If you are using a nice SCM such as GIT then you can set Jenkins up to poll your local checkout as its upstream, so that you check all your commits individually. If using a less good SCM, I would just have the first step of the job copy all the sources from your workspace into Jenkins' workspace so that you can continue to code away without fear of breaking Jenkins' compile phases.
Also I would favour a FreeStyle project with Maven build step to the built in Maven project type (but then that might just be my own personal bias)

Related

versioning and deployment of application configuration files to server

We use visual svn for version control. I have few cloud web servers where my websites are running.
I would like to create some repositories for the websites content. I checkout them in local editors (notepad ++), edit them and checkin to SVN. But when check-in to visualSVN, I would like them to get deployed to the webservers docroot. In some cases I would like to restart the webserver too.
Is it possible using Jenkins+deployment plugins. I am very new to jenkins, can somebody help me with some information how we can achieve this.
It is one of the scenarios Jenkins is designed for (Continuous Delivery, aka. CD). Your perfect plan might look like this:
Get a new instance of Jenkins up/running (for experiments) (if you're familiar with Docker it is one of the best ways to experiment with Jenkins);
Configure Subversion Plugin in Jenkins (integration with SVN);
Setup your first FreeStyle job in Jenkins that polls your Visual SVN server for changes (things you check-in to SVN) and learn how that works (* * * * * <~-
this polls changes from your source control an every minute, great for experiments);
Setup your second FreeStyle job that connects to one of your webservers (probably via SSH) and creates a file (simple "touch hello_world.log" is great to start with) in a special folder dedicated for that kind of tests (DO NOT MESS WITH YOUR PRODUCTUION CONTENT FOLDER(s));
Setup your third FreeStyle job that combines your experiences acquired in #1 and #2, and still writes to a test folder;
Compare results of the job output with your production deployment expectations (eq. files in place, content is processed the right way, configuration files are looking good and etc.);
Try it out on one of the production web servers, one folder/site at a time;
Apply your newly crafted delivery pipeline to the rest of servers/sites;
Learn how backup your Jenkins instance and actually make your first backup;
Try to restore your Jenkins instance from the backup made in the previous step;
Decide whether it is okay for you to maintain your own Jenkins instance or you will be better off with a hosted version of it (CloudBees Inc.);
Learn more about Pipeline in Jenkins and possibly (because it is not immediately obvious) migrate your FreeStyle job(s) to Pipeline DSL
and/or Jenkinsfile;
At times you might need to get back to "Get Started with Jenkins" manual and look up for the ideas or answers, it is okay - do not give up and feel free to post your questions here, at SO.
Hope these ideas will help you to get started.

Modify notifications on a running build in jenkins

I occasionally want to get notified when a particular jenkins job that is building finishes. Is there any way to do this?
Scripting it through the API would be fine. I already have the jenkins IRC bot that notifies me of many things, so if I could just dynamically modify the running job build, that would be enough to do what I want -- I'm just having a hard time finding how to accomplish that.
AFAIK, you cannot change a job's config while it's running.
Here is an idea: Use a post-build step to check for an external resource status (like a file containing an action by text) and running an action based on the content of the file.
The external file can be modified while the build is running, so when the post-build is executed, it will follow the logic defined based on the content of the file.
I hope this helps.
You can use email notifier, It will send you an email
https://wiki.jenkins-ci.org/display/JENKINS/Email-ext+plugin

Jenkins plugin code that should excute before any kind of job is run in Jenkins

I am new to Jenkins plugin development. M trying to write a plugin that should be executed before any Multi configuration type job runs in Jenkins.
In this plugin I want to write rules that will check what configuration parameters user has selected while submitting the job, based on selected parameters, I want to decide whether to allow the job to run or to restrict it.
User should be shown reason as to why that job cannot be run in the Console Output.
Does anyone have any ideas which class I need to extend or which interface I need to implement in order to get a hook into Jenkins job run?
You could look at the Matrix Execution Strategy which allows for a groovy script to select which matrix combinations to run. I would think if your script threw an exception it would stop the build.
For background, the multi configuration projects run a control job (or flyweight) which runs the SCM phase then starts all the actual combinations. This plugin runs after the flyweight SCM checkout.
If nothing else, this will give you a working plugin to start from
Disclaimer: I wrote this plugin
Blocked queue job plugin was what I needed
Out of the box that plugin supports two ways to block the jobs -
Based on the result of last run of another project.
Based on result of last run of the current project
In that plugin the BlockQueueItemTaskDispatcher.java extends Jenkin's QueueTaskDispatcher providing us a hook into Jenkins logic to allow or block the jobs present in the queue from running.
I used this plugin as a starting point for developing a new plugin that allows us to restrict project based on parameters selected and the current time. Ultimate goal is to restrict production migrations from running during the day.
Overriding the isBlocked() method of QueueTaskDispatcher gave access to hudson.model.Queue.Item instance as an argument to me. Then I used the Item instance's getParams method to get access to build parameters selected by the user at runtime. Parsed the lifecyle value from it. Checked the current time. If lifecycle was Production and current time was day time then restricted the job by returning non null CauseOfBlockage from isBlocked() method. If that condition was false, then returnedCauseOfBlockage as null allowing the queued job to run.

How to fire an alert when a Jenkins job runs for too long?

I want to be alerted when my Jenkins jobs run for too long.
I didn't find such a plugin, do you know of such a plugin, or another way to do it?
Thanks!
As far as I know there is no such plugin or configuration available. There is buildtimeout-plugin, which will abort the build on a given timeout, but AFAIK doesn't support just giving an alert and not aborting.
if you're willing to make a custom build of the plugin, it might be reasonable to extend that yourself. Like you can see from its source code, it defines a general BuildTimeoutOperation interface which should be extendable to give an alert on build timeout instead of aborting a build. The existing implementations of the interface could give you some ideas on how that would be done.
Try this,
For sound & mail alert :
-> Use Jenkins Sounds plugin & build triggers to achieve your task.
Create a separate job for alert and trigger the job when you want. (stable, unstable or failed)
In that same job itself, you can configure email notification.
To find long running job, Use parallel (time counter configuration or use build-timeout plugin) job. If it takes time more than specified then trigger an alert job (configured with sound or email)

To get build status through environment variable

I am using jenkins for continous integration.
For my build purpose, i triggering email using Ant task. I am not able to find an environment variable to pass ant for sending email build status(success/failure/stable).
i want to know how can i get environment variable for build status?..if not available, what is the alternative option for build status?
Thanks in Advance
varghese
Why use ANT to send emails from Jenkins when you have two great plugins that does just that?
The default mail notification is quite good, and if you would like to have more control
I suggest using the Email-ext plugin which is very comprehensive.
If still wish to use ANT to sent your mail-notifications including the status
you will have to break your process into two steps,
where the first part runs the build and the second one runs the ANT script to report the status.
In this case, you will need to trigger the second job from the first job via the Parameterized Build plugin -
see my answer here:
trigger other configuration and send current build status with Jenkins
The build status is not set until the job has finished running, so there is no easy way to push build status to a process triggered within the build itself. You could pull build status via the API, but this would have to be an externally triggered process due to the constraint mentioned above. Any reason you aren't using the built in email support or one of the excellent email extension plugins such as this one?

Resources