Jenkins job config.xml not reflecting the plugin usage - jenkins

tl;dr : Plugin mentioned in Jenkins jobs config.xml is not matching the Plugin used in the JenkinsFile/Groovy script.
I've landed up with a Jenkins server, that is actively used and unfortunately not updated.
Owing to this, the Jenkins version is old and most of the plugins need urgent, as they are having vulnerabilities.
Now this is a system with 209 Plugin and too many jobs having multi-branch pipelines.
I started with:
def plugins = jenkins.model.Jenkins.instance.getPluginManager().getPlugins() plugins.each {println "${it.getShortName()}: ${it.getLongName()} : ${it.getVersion()}"}
The outcome was useful, I got an elaborate list of plugins in the system.
In my attempt to chart out the job -> plugin dependencies, I started out using this solution supplied by another stackoverflow user. The output was really useful, as it classified which plugin is being used by which job.
The thing that baffled me was, out of those 209 odd plugins, only 20 were being used across all the jobs.
To be precise, say a job's JenkinsFile explicitly mentions usage of ansible plugin, from what I read the config.xml of that job should have ansible plugin mentioned, in my case it doesn't list the ansible plugin in it.
Usage of Plugin-Usage plugin is ruled out for now, as there are dependent plugins that need to be updated.
Can someone please advise me what should be my approach to this. I dont want to update a plugin and regret finding 100 of jobs failed the next day.

Related

How does the Build Pipeline Plugin relate to the Jenkins 2 Pipeline Plugin?

Currently, I use the Build Pipeline Plugin to orchestrate the delivery of my code through the different environments:
Build the code and execute unit tests
Manually deploy to the development environment
Automatically execute tests on the development environment
Manually release the software and put the version number to the released version.
Manually deploy to the integration test environment by downloading the artefact from a repository, based on the version put by the release build.
Manually deploy to ...
With Jenkins 2.0 comes the Pipeline plugin. But how do these two plugins relate to each other?
Should I migrate to the latest plugin? The things I seem to miss from the Jenkins 2 Pipeline plugin:
Manually trigger a stage. I can wait for an input, but it does not seem to be so elegant
Restart a stage to retrigger a deployment. This does not seem possible.
Visibility into the parameters that were used to trigger a stage, e.g. the version number of the software that was deployed.
Am I missing the point here? Should the two of them be combined? Or how are you approaching a pipeline like this?
With the current state of Jenkins 2 pipelines you are correct to state all the 'missing features' you listed.
One of the advantages of the Jenkins 2 pipeline plugin is that rather than chaining together a series of jobs as with the Build Pipeline Plugin, your entire pipeline is 1 'job', which makes user administration much easier IMO.
The other advantage of Jenkins 2 pipelines would be 'configuration as code', so you can track changes to your pipeline as you would any other file in version control.
Jenkins 2 pipelines are very much the new 'hotness', and there's many plugins implementing compatability day after day.
Once the new UI becomes production ready, I'd imagine that the old build pipeline plugin will begin to be deprecated.
Also you should be aware that the Build Pipeline plugin is not maintained by the Jenkins or CloudBees teams as far as I know, whereas Jenkins 2 pipelines are.
Would I recommend migrating now? No, I personally still don't consider the Jenkins 2 pipelines mature enough for deployment to production in an organisation. I'd stay to stick with what you know for now while you wait for the Jenkins 2 Pipeline ecosystem to mature.
My reasoning I gave in a blog post a few weeks ago (read more here if you want, but I've extracted out the 'weaknesses' here for you):
There are still plenty of plugins that I and many others will consider 'core to their CI pipeline' missing full or partial support for pipelines.
The lack of 'per-project-configuration' in pipelines for many plugins. e.g. Slack - the current implementation 'assumes' that all Jenkins 2 Pipeline projects should be communicated to the same Slack channel/team - whereas you may want to have multiple Slack teams configured. There are multiple other plugins like this.
At present the documentation of Jenkins 2 Pipelines is very limited, though this is improving.

How to identify projects using a specific JDK installation in Jenkins

I would like to clean up the list of JDKs managed by our Jenkins CI server.
For instance there are several versions of JDK 8 whereas I'd like to only have one of them (the latest). So I am looking for a simple way for identifying all those Jenkins jobs explicitly using one of the other JDK installations so I can change them to use the one remaining JDK install.
Is there a better way to do so apart from manually clicking through all jobs and examine which JDK they use?
I often use the Jenkins Script Console for tasks like this. The Groovy plugin provides the Script Console, but if you're going to use the Script Console for periodic maintenance, you'll also want the Scriptler plugin which allows you to manage the scripts that you run.
From Manage Jenkins -> Script Console, you can write a groovy script that iterates through the jobs:
for (job in Jenkins.instance.items) {
println job.name
...examine more details of job...
}
It often takes some iteration to figure out the right set of job properties to examine. It's not clear to me how your jobs are configured, so you'll have to figure out what property describes the JDK used by the job. The Change JVM Options script might provide some hints.
As I describe in another answer, you can write functions to introspect the objects available to scripting. And so with some trial and error, develop a script that walks the list of jobs and examines the properties that you're interested in.

Configuring Jenkins plugins with Puppet

I'm using the rtyler/jenkins Puppet module to deploy my Jenkins instance. One thing I can't seem to find documentation on is how to use Puppet to configure the Jenkins plugins once I've installed them. Can someone point me to some documentation and/or write a quick example? Thanks.
the module he provides is only for managing/configuring jenkins and managing plugins. All plugins are vastly different, there is no possibility his scripts would be able to manage the wide breadth of jenkins plugins out there. You would want to try to capture that using jenkins backups or by looking into how each module allows configuration.
For anyone interested in how to pull this off, I'm using the Jenkins SCM plugin available here: https://wiki.jenkins-ci.org/display/JENKINS/SCM+Sync+configuration+plugin
This requires manually setting up Jenkins and having the plugin sync all the configuration settings to a repository. All future Jenkins instances provisioned by Puppet will need to have all the necessary plugins installed, but the SCM plugin will automatically download all the necessary settings. However, do note that some of the plugins will require you to manually add includes into the SCM to begin tracking them: https://wiki.jenkins-ci.org/display/JENKINS/SCM+Sync+Config+shared+additionnal+includes

Is there a way to turn Jenkins job into a Jenkins DSL script automatically?

I use Job DSL Plugin to generate my Jenkins builds. But sometimes I make small changes to the build in Jenkins and I want to port those changes back to my DSL script automatically. Is there any way to achieve this?
Currently there is no way to generate a Job DSL script for an existing job. This has been reported in the Jenkins issue tracker as JENKINS-16360 some time ago and someone even offered a bounty, but AFAIK no one is working on the issue.

Can I store Jenkins configuration in the project repo (like Travis CI)?

How do you maintain the Jenkins job configuration in SCM along side the source code?
As source code evolves, so does the job configuration. It would be ideal to be able to keep the job configuration in SCM, for the following benefits:
easy to see who a history of the changes, including the author and the description
able to rebuild old branch/tag by checking out the revision and build just work
not having to scroll through the UI to find the appropriate section and make change
I see there is a Jenkins Job Builder plugin. I prefer a solution along the lines of Travis CI, where the job configuration is maintained in a YAML file (.travis.yml). Any good suggestions?
Note: Most of our projects are using Java & Maven.
Update 2016: Jenkins now provides a Jenkinsfile which provides exactly this. This is supported by the core Jenkins developers and actively developed.
Benefits:
Creating a Jenkinsfile, which is checked into source control, provides a number of immediate benefits:
Code review/iteration on the Pipeline
Audit trail for the Pipeline
Single source of truth for the Pipeline, which can be viewed and edited by multiple members of the project.
I've written a plugin that does this!
Other than my plugin, you have some (limited) options with existing Jenkins plugins:
Use a single test script
If you configure your Jenkins to simply run:
$ bash run_tests.sh
You can then check in a run_tests.sh file into your SCM repo and you're now tracking changes for how you run tests. However, this won't track configuration of any plugins.
Similarly, if you're using Maven, the Maven Project Plugin simply runs a specified goal for your repo.
The Literate Plugin does allow Jenkins to run the commands in your README.md, but it hasn't yet been released.
Track changes to Jenkins configuration
You can use the SCM Sync configuration plugin to write configuration changes to SCM, so you at least have a persistent record. This is global, across all projects on your Jenkins instance.
There's also the job config history plugin, which stores config history on the filesystem.
Write Jenkins configuration from SCM
The Jenkins job builder project you mentioned lets you check config changes into SCM and have them applied to your Jenkins instance. Again, this is across all projects on your Jenkins instance.
Write Jenkins configuration from another job
You can use the Job DSL Plugin with a repo of groovy scripts. Jenkins then polls that repo, executes the groovy scripts, which create job configurations.
Discussions
Issue 996 (now closed) discusses this, and it has also been discussed on the mailing list: 'Keeping track of Hudson's configuration changes', and 'save hudson config in svn'.
you can do this all with the workflow plugin and a lot more. Workflow is one of the most advanced technics to use jenkins and it has a very strong support.
It is based on a groovy DSL and allows you to keep the whole configuration in the SCM of your choise (e.g. GIT, SVN...).

Resources