Get build number of triggering project in Jenkins - jenkins

I configured a Jenkins project B to run when project A completes succesfully.
How can I find the buildnumber of A in the project B pipeline?

If you just need the last successful build of A you can just read it from Jenkins:
http://JenkinsMaster:Port/job/MyJob/lastSuccessfulBuild/buildNumber
If you need the build the triggered B you can use the Parametized Trigger Plugin and use :
TRIGGERED_BUILD_NUMBER_MyJob="Last build number triggered"

You can do the following:
Use the Execute windows batch or Execute shell build step to store the build version in a file during the build of project A - e.g. from a windows batch:
echo "VARIABLEA=%BUILD_NUMBER%" > %WORKSPACE%\myartifact.properties:
Use the Archive the artifacts post build step to store the file against that build in project A
At the start of project B use the Copy artifacts from another project build step, point to project A and use the Artifacts to copy field to filter down to the file you created and choos Last successful build for the Which build field
Read the file in a shell script during the build of project A to pickup the build number
If you output the artifact in the format:
VARIABLEA=${BUILD_NUMBER}
VARIABLEB=${BUILD_NUMBER}
and you're using Linux on the Jenkins server, you could use the source command to make VARIABLEA and VARIABLEB available in that shell session, e.g.:
source "${WORKSPACE}/myartifact.properties"
echo ${VARIABLEA}
You could then do something with that variable in the shell script.
Alternately, you could simply use the Trigger parameterized build on other projects post build step (which I believe requires the Parameterized Trigger Plugin) on project A and setup project B to accept those parameters.

Related

I have Job A and B in Jenkins. How can I always execute a file in the most recent build of A in the build steps in job B

I have these Jenkins jobs A and B. Job A Builds a bunch of Files for my project. In Job B i wanna execute a command to run a file in the most recent build of job A.
My execution even works fine, but only because I have hard coded the build number and I am picking that from the files stored by Jenkins in my C:JenkinsData Directory, I would wanna have that called from the Workspace instead
See image for clarification.
Jenkins build steps illustration
For e.g my last build right now is 70 I want to know how I can be always executing those same files but in the most recent Build
Or if its even way better Can I execute those same file from Job A since the built files are in the Workspace.
You could get the last build index using this API and "number" property:
/lastBuild/api/json
ie:
http://localhost:8080/job/yourJobName/lastBuild/api/json
This could help:
Jenkins - Get last completed build status

Previous Build Number in Jenkins

I have a batch Job (not the pipeline Job) in Jenkins where I am using a plugin called "Naginator" which will check if the current build is failed/unstable - If the current build is failed/unstable it will run immediately the next build to confirm the error is genuine. If the error is not genuine then the run is successful and it will periodically set the next build to run. Along with this, I use some CMD commands to move my data into another folder with the Build number as my folder name.
Now here is the issue, if the previous build was unstable and Naginator runs the next build and that build is stable then what I need to do is delete the previous unstable build data from the folder manually. Is it possible to fetch the previous build number in Jenkins so that I can delete the file in an automated way - lets say in CMD Commands .BAT file.
Jenkins has it's own global variables. You can check whem in your pipeline job -> Pipeline Syntax -> Global Variables Reference.
Additionally check http://jenkins_url:port/env-vars.html/
For your purpose BUILD_NUMBER exist.
Just create new env var like this:
PREV_BUILD_NUMBER = $($BUILD_NUMBER -1)
Excuse me if this piece of code will not work, I'm not good about scripting) Just for example.
UPDATE:
also you can find in mentioned reference a list of variables:
previousBuild
previousBuildInProgress
previousBuiltBuild
previousCompletedBuild
previousFailedBuild
previousNotFailedBuild
previousSuccessfulBuild

Dynamic Properties file in Jenkins for injecting Env variables

So this is my entire Use case:
I have a parameterized build job which accepts file parameters. After the build I need to send a mail with that file and the size of the file. For this, I'm trying to add the name and size of the file as an Env variable using EnvInject Plugin.
But EnvInject is in the Build Environment step. The file parameter gets stored in the Workspace of the build only in the Build step, not in Build environment. So, there will be an error like File not found.
Due to which, I'm trying a crooked way of defining a properties file somewhere on my local system.I'm mentioning this properties file in "Properties File Path" of Inject Environment variables. In the build step I'm adding FOO=BAR and other values in the file so that I can use those values as my env variables down the line, like when I configure my e-mail template in Post Build Actions.
Can this process be done easily? I was initially making the properties file in JENKINS_HOME. I just got to know that I'm not allowed to do that as in master-agent architecture, JENKINS_HOME will be different and build will fail.
PS-1. The workspace gets deleted after every build
2. Any other plugins which can be used? If possible, please suggest without installing some new plugin as I'm not Jenkins admin
One way of solving this problem is by creating 3 different jobs as follows -
job 1 --> should call below 2 jobs(job 2 & job 3)
job 2:
Build --> Trigger/call builds on other projects --> job 2(block until the triggerred projects finish their builds)
select"Build on the same node" from Add Parameters.
job 3:
Build --> Trigger/call builds on other projects --> job 2(block until the triggerred projects finish their builds)
select"Build on the same node" from Add Parameters.
Job 2 (Create this job as follows):
Execution API --> using "GET_FILE" option you can download the required details on to the current working directory of your job.
Execute shell -->
now within "Execute Shell", download "consoleText" using wget command.
process the "consoleText" using unix command prepare a key-value pairs and store it under /tmp folder. i.e. "/tmp/env.prop"
Job 3 (Create this job as follows):
Bindings:
select "Inject environment variable to the build process" and under 'Properties File Path' enter "/tmp/env.prop"
now you can use the variable which you created in Job2 in the current job without any issue.
please note that it is important to select "Build on the same node" in Job 1, because this will preserve the data and it allows other jobs to access this information.
Let me know if its not clear.

How can I use the value from "Run Parameter" in "Copy artifacts from another project" for our Jenkins job?

I have a Jenkins job I want to use to run automation on a build created in another job. I want the user to specify that build job's build number using the drop-down box created by the Run Parameter plug-in and then have the automation job copy the artifacts from the user-specified build job.
These are the settings for Run Parameter:
Name: BUILD_SELECTOR
Project: Foo
Filter: All Builds
The user then selects a build like which is saved to BUILD_SELECTOR like "https://blah.com/job/Foo/4/"
Then later in my job, I have Copy artifacts from another project and I want to copy the artifact from the job selected above:
Project Name: Foo
Which build: ?
This is where I get stumped. I have tried the URL above as a permanent link and also tried stripping out the "4" above for Specific build, but nothing seems to work. How can I use that value to do what I need to do?
As stated in https://issues.jenkins-ci.org/browse/JENKINS-21519
You can use ${BUILD_SELECTOR_NUMBER} to get just the build number which you can use with specific build.

Rename container for archived artifacts

We use Jenkins ver. 1.617 for nightly builds. To archive the build results, the post-build-action "archive artifacts" is activated. This works well and Jenkins creates a ZIP-file named archive.zip with following structure.
archive.zip
|
+--archive
|
+--out
|
|--*.elf
|--*.map
+--*.hex
I'd like to replace every archive with Project_Build# (Build# stands for the current build number). How can I configure Jenkins to do so?
You can simply create a needed archive during the job, i.e. if running a shell script with Jenkins - zip all files to an archive called
Projekt_Build${BUILD_NUMBER}
The build number variable is accessible in shell environment. The simply add the path to the artifact in Jenkins "Archive build artifacts" post-build-action:
/path/to/file/Projekt_build${BUILD_NUMBER}

Resources