Get status of the jenkins job from scripted pipeline - jenkins

I have 3 pre job defined in Jenkins file that i want to run in sequence . Like test1 should execute after test job is completed and test2 should execute after test1 is completed
Currently i read this job in while loop and will trigger in parallel and it works fine
in scripted pipeline how can i check the status of the job and wait for it until that job is completed so basically i will need to keep on polling the status of the 1st job and move to 2nd job when 1st one is completed
"preDeployJobs" : {
"devl" : [
["Deploy/test_prejob:[parameters: [string(name: 'BUILD_ID_PARAM', value:'%UCD_BUILD_DISPLAY_NAME%')]]"],
["Deploy/test1_prejob:[parameters: [string(name: 'BUILD_ID_PARAM', value:'%UCD_BUILD_DISPLAY_NAME%')]]"],
["Deploy/test2_prejob:[parameters: [string(name: 'BUILD_ID_PARAM', value:'%UCD_BUILD_DISPLAY_NAME%')]]"]
]
}

Related

jenkinsfile doesn't retrieve downstream build ID on ABORT or FAILURE

I am writing a groovy code in a Jenkinsfile, In a stage, I am building another pipeline this way,
stage("1"){
steps{
script{
def u1Results = build job: 'ChildPipeline1', parameters: [string(name : 'PARAM', value: "1")]
print u1Results.number
}
}
}
u1Results.number works when ChildPipeline1 succeeds, but no clue to get the ChildPipeline1 build ID if it was aborted or failed normally, Even if I added a post-class to the stage
I'd like to know the build-id of ChildPipeline1 anyway.

Jenkins Pipeline use parameters from one job to another between stages

We Have a Jenkins pipeline with several stages (powershell).
each stage has one or more jobs to be executed.
I need to use the results of the first job and pass them to the next job at the next stage.
except the pipeline all jobs are powershell.
example:
node('one'){
stage ('Get Info from DB'){
build job: 'test1'
}
stage ('Do Something'){
build job: 'test2' parameters: [string(name: 'PARAM1', value: $PARAM_FROM_test1 )]
}
}
Assuming that you want to retrieve the outputs of the first job test1 and use these outputs in a second job, you can simply in the second job use the copyArtifact class :
step([$class: 'CopyArtifact', projectName: 'test1'])
This is achieved, assuming that in test1 job, you use the ArtifactArchiver class like (for instance):
step([$class: "ArtifactArchiver", artifacts: "*.tgz", fingerprint: true])

Jenkins pipeline script to trigger other pipeline jobs

I want to create a parent pipeline job with stages that call trigger other jobs, which are also pipeline jobs.
Can I achieve this?
Here is a skeleton of what I want:
Parent job's script:
pipeline {
parallel{
stage("A") {
build 'name of job 1 which is a pipeline job again and has a parallel block with stages in it'
}
stage("B") {
build 'name of job 2 which is a pipeline job again and has a parallel block with stages in it'
}
stage("C") {
build 'name of job 3 which is a pipeline job again and has a parallel block with stages in it'
}
}
}
Does it work this way? Is there any way to achieve this
Sure does,
This is what we are using, we promote between environments by kicking off the same job from the current execution and don't wait for the result.
build(job: "org/${jobName}/${BRANCH_NAME}",
parameters: [
new StringParameterValue('ENV', env),
new StringParameterValue('ENV_NO', env_no),
new StringParameterValue('ARTIFACT_NAME', params.ARTIFACT_NAME)
],
propagate: false,
wait: false,
)
Refer to the reference for all options
https://jenkins.io/doc/pipeline/steps/pipeline-build-step/

Jenkins pipeline to call other pipeline stage

I am using Jenkins Pipeline and have a scenario where the expectation is:
In the pipeline job 'Test A' - Stage 'Checkout_A' it calls other pipeline job 'Test B' - Stage 'Checkout_B' , after that stage in Test B is completed the controller should retun back to pipeline job 'Test A' and execute Stage ('Build_A') which again calls pipeline job 'Test B' - Stage ('Build_B') then controller should retun back to pipeline job 'Test A' and execute Stage ('Transfer_A').
1)Below is the syntax i am using but its not working as above expected, appricate your inputs on how to achive this approach.
2)I want to use this approach mainly to show the pipeline different stages in upstream job itself instead of in downstream job. Is there any way or plugin available to show the stages of downstream job along with upstream job flow.
Test A
_______
Stage ('Checkout_A')
build job: 'Test B, stage: 'Checkout_B'',
parameters: [string(name: 'GIT_URL', value: String.valueOf(ssh://git#xxx/aaa.git )),
string(name: 'CREDENTIALS', value: String.valueOf('xxxx123')
]
Stage ('Build_A')
build job: 'Test B, stage: 'Build_B',
parameters: [string(name: 'GIT_URL', value: String.valueOf(ssh://git#xxx/aaa.git )),
string(name: 'CREDENTIALS', value: String.valueOf('xxxx123')
]
Stage ('Transfer_A')
build job: 'Test B', Stage: 'Transfer_B'
Test B
________
stage 'Checkout_B'
git (url: '${GIT_URL}',
credentialsId: '${CREDENTIALS}')
build job: 'Test A, stage: Build_A'
Stage ('Build_B')
bat 'call "E:\\MSBuild\\12.0\\Bin\\MSBuild.exe" Sample.sln '
build job: 'Test A, stage: Transfer_A'
Stage ('Transfer_B')
Xcopy(Source, destination)
As you noticed, the build step has no parameter called stage. You simply cannot run arbitrary stages in other jobs - you can only trigger complete jobs, start to end. If you really want to separate that out (for reusability as well?), make the contents of the stage an extra job.
Regarding the visualization inline in the calling job: No, I wouldn't expect this to be possible soon. Have a look at the roadmap and you will only see the item that you actually get a link to go to the called job.

How can I trigger another job from a jenkins pipeline (jenkinsfile) with GitHub Org Plugin?

How can I trigger build of another job from inside the Jenkinsfile?
I assume that this job is another repository under the same github organization, one that already has its own Jenkins file.
I also want to do this only if the branch name is master, as it doesn't make sense to trigger downstream builds of any local branches.
Update:
stage 'test-downstream'
node {
def job = build job: 'some-downtream-job-name'
}
Still, when executed I get an error
No parameterized job named some-downtream-job-name found
I am sure that this job exists in jenkins and is under the same organization folder as the current one. It is another job that has its own Jenkinsfile.
Please note that this question is specific to the GitHub Organization Plugin which auto-creates and maintains jobs for each repository and branch from your GitHub Organization.
In addition to the above mentioned answers: I wanted to start a job with a simple parameter passed to a second pipeline and found the answer on http://web.archive.org/web/20160209062101/https://dzone.com/refcardz/continuous-delivery-with-jenkins-workflow
So i used:
stage ('Starting ART job') {
build job: 'RunArtInTest', parameters: [[$class: 'StringParameterValue', name: 'systemname', value: systemname]]
}
First of all, it is a waste of an executor slot to wrap the build step in node. Your upstream executor will just be sitting idle for no reason.
Second, from a multibranch project, you can use the environment variable BRANCH_NAME to make logic conditional on the current branch.
Third, the job parameter takes an absolute or relative job name. If you give a name without any path qualification, that would refer to another job in the same folder, which in the case of a multibranch project would mean another branch of the same repository.
Thus what you meant to write is probably
if (env.BRANCH_NAME == 'master') {
build '../other-repo/master'
}
You can use the build job step from Jenkins Pipeline (Minimum Jenkins requirement: 2.130).
Here's the full API for the build step: https://jenkins.io/doc/pipeline/steps/pipeline-build-step/
How to use build:
job: Name of a downstream job to build. May be another Pipeline job, but more commonly a freestyle or other project.
Use a simple name if the job is in the same folder as this upstream Pipeline job;
You can instead use relative paths like ../sister-folder/downstream
Or you can use absolute paths like /top-level-folder/nested-folder/downstream
Trigger another job using a branch as a param
At my company many of our branches include "/". You must replace any instances of "/" with "%2F" (as it appears in the URL of the job).
In this example we're using relative paths
stage('Trigger Branch Build') {
steps {
script {
echo "Triggering job for branch ${env.BRANCH_NAME}"
BRANCH_TO_TAG=env.BRANCH_NAME.replace("/","%2F")
build job: "../my-relative-job/${BRANCH_TO_TAG}", wait: false
}
}
}
Trigger another job using build number as a param
build job: 'your-job-name',
parameters: [
string(name: 'passed_build_number_param', value: String.valueOf(BUILD_NUMBER)),
string(name: 'complex_param', value: 'prefix-' + String.valueOf(BUILD_NUMBER))
]
Trigger many jobs in parallel
Source: https://jenkins.io/blog/2017/01/19/converting-conditional-to-pipeline/
More info on Parallel here: https://jenkins.io/doc/book/pipeline/syntax/#parallel
stage ('Trigger Builds In Parallel') {
steps {
// Freestyle build trigger calls a list of jobs
// Pipeline build() step only calls one job
// To run all three jobs in parallel, we use "parallel" step
// https://jenkins.io/doc/pipeline/examples/#jobs-in-parallel
parallel (
linux: {
build job: 'full-build-linux', parameters: [string(name: 'GIT_BRANCH_NAME', value: env.BRANCH_NAME)]
},
mac: {
build job: 'full-build-mac', parameters: [string(name: 'GIT_BRANCH_NAME', value: env.BRANCH_NAME)]
},
windows: {
build job: 'full-build-windows', parameters: [string(name: 'GIT_BRANCH_NAME', value: env.BRANCH_NAME)]
},
failFast: false)
}
}
Or alternatively:
stage('Build A and B') {
failFast true
parallel {
stage('Build A') {
steps {
build job: "/project/A/${env.BRANCH}", wait: true
}
}
stage('Build B') {
steps {
build job: "/project/B/${env.BRANCH}", wait: true
}
}
}
}
The command build in pipeline is there to trigger other jobs in jenkins.
Example on github
The job must exist in Jenkins and can be parametrized.
As for the branch, I guess you can read it from git
Use build job plugin for that task in order to trigger other jobs from jenkins file.
You can add variety of logic to your execution such as parallel ,node and agents options and steps for triggering external jobs. I gave some easy-to-read cookbook example for that.
1.example for triggering external job from jenkins file with conditional example:
if (env.BRANCH_NAME == 'master') {
build job:'exactJobName' , parameters:[
string(name: 'keyNameOfParam1',value: 'valueOfParam1')
booleanParam(name: 'keyNameOfParam2',value:'valueOfParam2')
]
}
2.example triggering multiple jobs from jenkins file with conditionals example:
def jobs =[
'job1Title'{
if (env.BRANCH_NAME == 'master') {
build job:'exactJobName' , parameters:[
string(name: 'keyNameOfParam1',value: 'valueNameOfParam1')
booleanParam(name: 'keyNameOfParam2',value:'valueNameOfParam2')
]
}
},
'job2Title'{
if (env.GIT_COMMIT == 'someCommitHashToPerformAdditionalTest') {
build job:'exactJobName' , parameters:[
string(name: 'keyNameOfParam3',value: 'valueOfParam3')
booleanParam(name: 'keyNameOfParam4',value:'valueNameOfParam4')
booleanParam(name: 'keyNameOfParam5',value:'valueNameOfParam5')
]
}
}

Resources