How to synchronize subproject build number - jenkins

Jenkins JobA triggers JobB as a subproject.
Is there any way that I can force JobB to have the same build number as JobA?
I am currently passing an environment variable into JobB so that JobB can use the correct number during its build. But it's still confusing having JobA and JobB have different build numbers.
I am also using the "Next Build Number Plugin", but JobA and JobB's build numbers keep drifting apart over time as JobA fails before it calls JobB, forcing me to come back and manually fix it.

You should consider Build Name Setter Plugin, as it allows setting a BUILD_NUMBER through a variable. Configure it to use something like $parentBuildNumber
Now, in JobB configure a text/string parameter, parentBuildNumber.
When you trigger JobB from JobA, you should be using Parameterized Trigger Plugin.
There configure a predefined parameter set as parentBuildNumber=$BUILD_NUMBER

In the parent job get the next build number, substract by 1 if needed and pass it to child job:
cat $JENKINS_HOME/jobs/$JOB_NAME/nextBuildNumber
And output it to
$JENKINS_HOME/jobs/$CHILD_JOB_NAME/nextBuildNumber
You may or may not have to install the NextBuildNumber plugin:
Also, there is a CLI command set-next-build-number. Try executing jenkins CLI help.

Related

How to pass the current build number to a triggered job in Jenkins

I have a Jenkins job that triggers another job as a post-build action. Let's call the jobs job1 and job2 accordingly. job2 needs to know the build number of the job that triggered it which is job1. I found about Parameterized Plugin that seems to be able to accomplish that task but I can't get my head around how to do that. What I tried is to export the build number environmental variable %BUILD_NUMBER% from job1 hoping that can somehow to access it in job2. So in job1 I did:
and then, in job2 I tried to access this value but it doesn't look like this approach works.
In this case, %BUILD_NUMBER% prints out the build of current job (job2) and buildNum does not resolve and just remains plain text.
What can I do to achieve the above?
Job1
Installing the Parameterized Trigger Plugin
Creating a trigger like this
Change target1 to Job2
Change foo=bar to buildNum=%BUILD_NUMBER%
Job2
Installing the Parameterized Trigger Plugin
Config it like this

How can I analyze console output data from a triggered jenkins job?

I have 2 jobs 'job1' and 'job2'. I will be triggering 'job2' from 'job1'. I need to get the console output of the 'job1' build which triggered 'job2' and want to process it in 'job2'.
The difficult part is to find out the build number of the upstream job (job1) that triggered the downstream job (job2). Once you have it, you can access the console log, e.g. via ${BUILD_URL}consoleOutput, as pointed out by ivoruJavaBoy.
How can a downstream build determine by what job and build number it has been triggered? This is surprisingly difficult in Jenkins:
Solution A ("explicit" approach): use the Parameterized Trigger Plugin to "manually" pass a build number parameter from job1 to job2. Apart from the administrational overhead, there is one bigger drawback with that approach: job1 and job2 will no longer run asynchronously; there will be exactly one run of job2 for each run of job1. If job2 is slower than job1, then you need to plan your resources to avoid builds of job2 piling up in the queue.
So, some solution "B" will be better, where you extract the implicit upstream information from Jenkins' internal data. You can use Groovy for that; a simpler approch may be to use the Job Exporter Plugin in job2. That plugin will create a "properties" (text) file in the workspace of a job2 build. That file contains two entries that contain exactly the information that you're looking for:
build.upstream.number Number of upstream job that triggered this job. Only filled if the build was triggered by an upstream project.
build.upstream.project Upstream project that triggered this job.
Read that file, then use the information to read the console log via the URL above.
You can use the Post Build Task plugin, then you can get the console output with a wget command:
wget -O console-output.log ${BUILD_URL}consoleOutput

In Jenkins how to trigger another build job based on the build parameter passed to current build job?

I have build jobs like a-build, a-deploy. b-build, b-deploy.
*-deploy are downstream job for *-build jobs. So they look like,
a-build
|
+-a-deploy
b-build
|
+-b-deploy
Now I have another job X-build. It accepts a-build, b-build etc as a parameter. So I if I run X-build with a-build as parameter it should complete with a post build action that triggers a-deploy. How can that be done?
You can accomplish this quite easily if you receive the job name in a parameter.
You can then use "Call/Trigger Builds on Other Projects" step, and use the Parameter you receive in the job name:
If the step is not available to you via Post Build menu, you can get to it via "Execute set of scripts" post-build step.

Downstream Jenkins project gets wrong upstream run parameter

I'm having a problem with a Jenkins build pipeline. All jobs after the first one are parameterized with the "Run Parameter" of the first job. By default, this should reference the most recent stable build of the first job. Each subsequent job uses the "Run Parameter" of the first job to access saved artifacts from the first job. Each subsequent job triggers the next job of the pipeline as a parameterized build and passes the aforementioned "Run Parameter". The first job of the pipeline triggers the second job as a simple (i.e., not parameterized) build.
Here's a screenshot of the relevant configuration of a downstream job:
My problem is that the job number in the "Run Parameter" isn't the job number of the first job of the pipeline. Instead, it's the job number of the first job of the previous pipeline. Thus, if the first job is on build #11, then all subsequent job of that pipeline will access the archive of build #10 of the first job.
How can I get the subsequent jobs of the pipeline to access the archive directory of the first job of the pipeline?
I discovered the answer. Apparently, the reason the downstream job was using the artifacts from the upstream job of the previous pipeline was because I had set the "Run Parameter" filter in the configuration of the downstream job to "Stable Builds Only". Setting this filter to "All Builds" results in correct behavior.
It's as if Jenkins doesn't consider an upstream job to be stable when it's starting another build in its post-build section.
Quote: "By default, this should reference the most recent stable build of the first job."
Do you mean the last successful build of the Top job. Since in that case there might be a case where the last successful build of the top job was #7 and current build is #11. So you want the downstream jobs to look for #7 and not #10.
If that is the case then I will suggest putting a groovy build step. Install the groovy plugin for that. But before that test the script.
Open: YourJenkinsServerURL/script
Run this script.
def tmp = hudson.model.Hudson.instance
def myJobName="YourTopJobName";
tmp.getItems(hudson.model.Job).each {job ->
if(job.displayName == myJobName)
{
println(job.getLastSuccessfulBuild())
}
}
In groovy you can access and set an environment variable (injected via envInject plugin maybe) to this last successful build number and then pass on this variable to downstream job.
If that is not the case then I will suggest use Nant Script.
Use "int::parse()" to convert the string format build number to integer. Decrement the value and then pass on the value to the downstream job.

Add automatic counter field to Jenkins

I have field containing sprint number.
I want to add to Jenkins additional field that will to grow one for each run of the job.
Is it possible?
Thanks.
BUILD_NUMBER is the right parameter which automatically increases with each build. If you want to reset the build number, you can do so by running the following script in the jenkins master groovy script console
jenkins = hudson.model.Hudson.instance
job = jenkins.getJob("JOBNAME")
println job.getNextBuildNumber()
job.updateNextBuildNumber(0)
println job.getNextBuildNumber()
This will set the build number to 0. You can then on rely on BUILD_NUMBER. If your requirement is only for a parameter that increases by 1 for each build, use BUILD_NUMBER
See the Jenkins documentation. The BUILD_NUMBER environment variable does this and is provided by Jenkins to your job.

Resources