You could build the downstream jobs without propagating the error to the
top level job calling them.
Then you could get the results from each downstream job and handle it to do
the notifications according to SUCCESS/FAILURE/UNSTABLE etc.
I do this sort of thing using declarative pipeline then I do all the
notifications in post { failure {}} sections in one place for the job or a
stage (you can have post handling in declarative at the stage or job level).
I would recommend doing something like this:
def buildResults = [:]
void nofify_email(Map results) {
echo "TEST SIMULATE notify: ${results.toString()}"
}
pipeline {
agent any
stages {
stage('Build testJob') {
steps {
script {
def jobBuild = build job: 'testJob', propagate: false
def jobResult = jobBuild.getResult()
echo "Build of 'testJob' returned result: ${jobResult}"
buildResults['testJob'] = jobResult
if (jobResult != 'SUCCESS') {
error("testJob failed with result: ${jobResult}")
}
}
}
}
}
post {
always {
echo "Build results: ${buildResults.toString()}"
}
success {
echo "All builds completed OK"
}
failure {
echo "A job failed"
script {
nofify_email(buildResults)
}
}
}
}
Here is what the output would look like for success and failure:
Started by user anonymous
[Pipeline] node
Running on master in /var/jenkins_home/workspace/foo
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Build testJob)
[Pipeline] script
[Pipeline] {
[Pipeline] build (Building testJob)
Scheduling project: testJob
Starting building: testJob #1
[Pipeline] echo
Build of 'testJob' returned result: SUCCESS
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Declarative: Post Actions)
[Pipeline] echo
Build results: [testJob:SUCCESS]
[Pipeline] echo
All builds completed OK
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
Started by user anonymous
[Pipeline] node
Running on master in /var/jenkins_home/workspace/foo
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Build testJob)
[Pipeline] script
[Pipeline] {
[Pipeline] build (Building testJob)
Scheduling project: testJob
Starting building: testJob #2
[Pipeline] echo
Build of 'testJob' returned result: FAILURE
[Pipeline] error
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Declarative: Post Actions)
[Pipeline] echo
Build results: [testJob:FAILURE]
[Pipeline] echo
A job failed
[Pipeline] script
[Pipeline] {
[Pipeline] echo
TEST SIMULATE notify: [testJob:FAILURE]
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: testJob failed with result: FAILURE
Finished: FAILURE
I recommend using declarative pipeline!
--Bill
On Wednesday, 17 May 2017 03:45:27 UTC+1, Jesse Kinross-Smith wrote:
>
> How can I do this right - I want the results from a job I run (I need to
> run a dozen of these in succession and will email devs if one of them
> fails)
>
> try{ BuildResults = build job: 'testJob'; currentBuild.result='SUCCESS'; }
>> catch(e){ currentBuild.result = 'FAILURE'; } finally {
>> notify_email(BuildResults); }
>
>
> if i do the above I only get a valid BuildResults in notify_email IF the
> job is successful,
> if it fails it causes an exception saying No such property: BuildResults
>
> currentBuild is useless as it's the pipeline results, not the job results
> which is what I want
>
> I need the try/catch so I can continue to run my other jobs - otherwise
> it'll stop immediately once one job fails
>
> I'm sure there's some syntax I'm missing here, but I'm struggling to find
> it.
>
> Any help you can provide is appreciated.
>
> Regards,
>
> Jesse
>
--
You received this message because you are subscribed to the Google Groups
"Jenkins Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/jenkinsci-users/db320dcc-c6ed-4373-b56b-9efcef78d960%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.