Skip to end of metadata
Go to start of metadata


This plugin allows a job to be run after all the immediate downstream jobs have completed.   In this way,  the execution can branch out and perform many steps in parallel, and then run a final aggregation step just once after all the parallel work is finished.
The plugin is useful for creating a 'diamond' shape project dependency.   This means there is a single parent job that starts several downstream jobs.   Once those jobs are finished, a single aggregation job runs.   More complex interactions are not possible with this plugin.

The downstream projects are specified using Hudson's normal project relationship mechanism. 

Plugin Information

View Join on the plugin site for more information.



Example:

Our build consists of four jobs - test, testDown1, testDown2 and testJoin. Basically they have to run in sequence, but testDown1 and testDown2 could be run in parallel.(Maybe something like build - run tests - metrics - release). The logical overview of our jobs would be:

First we have to define our four jobs. With normal Hudson job dependency ("Build other projects") we add testDown1 and testDown2 to test. This is the fork in the diagram.

Adding the testJoin in that way is not possible, because would start it immediately after finishing the test-job. This is where this plugin jumps into: the test-job configures the Join Trigger and specifies the job to run after the join. The plugin is now able to start the testJoin job - but it needs to know when the forked jobs have finished. That's why we add the Join Trigger Upstream Notifier to these jobs.

Now the plugin gets the list of all forked jobs by its base job (test), gets informed by all forked jobs, waits for all "own" jobs to be completed and then starts the final job (testJoin).

Configuration of the base job (test):



Configuration of forked jobs - testDown1 + testDown2:

No configuration required.

Having multiple forks&joins in Hudson

The first example shows the use of this plugin for creating one 'diamond' job dependency. Having multiple diamonds is also easy (I whished it would be in real world (wink) ) But the resulting logical overview is a little bit different:
You have two base jobs (testA and testB) and Hudson forks them in the first step. Each of the diamonds has its own fork (2A and 2B). But ALL forked jobs inform the SAME observer (here shown as join bar JobJoin Observer). This ONE observer has two joins configured: the A-diamond and the B-diamond. And each fragment waits for recieving all the notifications it needs.

Example:

  1. Hudson starts
  2. Hudson starts testB
  3. Hudson starts testA
  4. testA finishes
  5. Hudson starts downA1
  6. Hudson starts downA2
  7. testB finishes
  8. Hudson starts downB2
  9. Hudson starts downB1
  10. downA2 finishes
  11. downA2 notifies the plugin
  12. PlugIn: downA2 belongs to diamond A
  13. PlugIn: diamond A requires downA1 and downA2
  14. PlugIn: diamond A is missing downA1, so do nothing
  15. downB2 finishes
  16. downB2 notifies the plugin
  17. PlugIn: downB2 belongs to diamond B
  18. PlugIn: diamond B requires downB1 and downB2
  19. PlugIn: diamond B is missing downB1, so do nothing
  20. downB1 finishes
  21. downB1 notifies the plugin
  22. PlugIn: downB1 belongs to diamond B
  23. PlugIn: diamond B requires downB1 and downB2
  24. PlugIn: all notifications recieved, so start joinB
  25. downA1 finishes
  26. downA1 notifies the plugin
  27. PlugIn: downA1 belongs to diamond A
  28. PlugIn: diamond A requires downA1 and downA2
  29. PlugIn: all notifications recieved, so start joinA

Build Parameters

By default, parameters of the current build will not be passed to the join project (like the default build trigger). If you want to do this, choose "Post-Join Action" -> "Trigger parameterized build on other project" and then choose "Current Build Parameters" (or other parameters you want to use).
For example:

Although you can specify in your Post-Join Actions build triggers other than "Stable", only "Stable" seems to work.

Changelog

Version 1.16 - August 2, 2015

  • Removed integration with deprecated CopyArchiver Plugin (pull #6)
  • Pick up job renames properly
  • JENKINS-16201 - Handle cache reloads correctly.  Previous behavior may not see all downstream jobs as completed, and so would never start the join job
  • JENKINS-25710 - Work with folders

Version 1.15 - May 3, 2012

  • Supported hierarchical projects (even more)

Version 1.14 - April 5, 2012

  • Supported hierarchical projects

Version 1.13 - September 18, 2011

  • Add a method fromSameSplitProject to JoinDependency for use in other plugins - e.g. the Build Pipeline View.

Version 1.12 - August 28, 2011

  • Add support for downstream-ext plugin
  • Fix 9903: Downstream projects include the "join" project when using the downstream-ext plugin

Version 1.11 - July 11, 2011

  • Fix 10301: Jenkins does not start when the parameterized trigger plugin with version 2.10 and the join plugin with version 1.10.1 are installed.

    Join Plugin does not work with versions of the Parameterized Trigger Plugin prior to 2.10.

Version 1.10.1 - April 11, 2011

  • Fix 8443
  • Added autocompletion and form validation to join projects text field

    Jobs in the join projects field which don't exist will be pruned on save

Version 1.10 - April 11, 2011

  • Failure when publishing artifacts

Version 1.9 - September 13, 2010

  • Fix NPE on newer versions of Hudson when adding a post-build action like the copy-archiver or the parameterized-trigger plugin (7344)
  • Run parametrized-trigger after join should work again on Hudson version newer than 1.341 (5602)
  • Respect disabled projects: Start join projects when all non-disabled downstream projects are finished (5972).

Version 1.7 - January 16, 2010

  • Avoid error if parameterized-trigger plugin is installed, but current project doesn't use a parameterized BuildTrigger. (5159)

Version 1.6 - September 30, 2009

  • The join plugin will now wait for downstream builds triggered by the parameterized-trigger plugin, in addition to the built-in downstream projects, before performing the join actions.
  • Implement the getRequiredMonitorService method to indicate no dependency on the previous build. This should allow more parallelism when using concurrent builds.

Version 1.5 - September 18, 2009

  • Fix problem where email recipients were cleared on job save (4384)

Version 1.4 - September 2, 2009

  • Fix NPE for builds that are automatically upgraded from version 1.2 or earlier (4370)
  • Re-add Maven projects as applicable for the Join plugin. Matrix (multi-config) projects remain incompatible.  Feedback of using this plugin with Maven projects is sought.

Version 1.3 - August 31, 2009

  • Remove console log warnings from builds that are not using the join plugin (report)
  • Provide initial support for running arbitrary post-build actions as part of the join process. The parameterized-build plugin is the first candidate (3959)
  • Only offer Join plugin with Freestyle builds, due to report of Matrix build incompatibility. (report)

Version 1.2 - June 28, 2009

  • Downstream failure detection was broken previous to this version. Previously, the join projects were started no matter what the result of the downstream builds. With this fix, failed downstream builds block the join projects from being started (report)

Version 1.1 - May 30, 2009

  • Fix a NPE that occurs when the join plugin is enabled, but no downstream jobs are specified (report)
  • Start the join projects immediately if there are no downstream jobs specified.

Version 1.0 - May 23, 2009

  • Basic support for joining. After the downstream jobs finish, a comma separated list of jobs can be started as the join jobs.

37 Comments

  1. Hi there,

    I just installed Hudson 1.322 and the Join Pugin 1.3 but now I've got the following error running my builds:

    ERROR: Processing failed due to a bug in the code. Please report this to users@hudson.dev.java.net
    java.lang.NullPointerException
    at join.JoinTrigger.prebuild(JoinTrigger.java:70)

    With Hudson 1.320 and the Join Plugin 1.2 everything was fine.

    Can anybody help?

    Regards,

    Christian

    1. Unknown User (djmacphee208)

      Hi,

         Definately something going on here, however on encountering the same problem I looked at the jobs configure area. There is now a post join action. On populating this the exception is no longer happening.

      Hope this helps people move forward and with debugging.

      Dave

  2. Unknown User (shannon977)

    I am using Join Plugin 1.6 in Hudson1.328. And I met with the following exception:

    FATAL: null
    java.lang.NullPointerException
    at join.JoinTrigger.TryGetParameterizedDownstreamNames(JoinTrigger.java:94)
    at join.JoinTrigger.perform(JoinTrigger.java:82)
    at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:19)
    at hudson.model.AbstractBuild$AbstractRunner.perform(AbstractBuild.java:501)
    at hudson.model.AbstractBuild$AbstractRunner.performAllBuildStep(AbstractBuild.java:487)
    at hudson.model.AbstractBuild$AbstractRunner.performAllBuildStep(AbstractBuild.java:475)
    at hudson.model.Build$RunnerImpl.post2(Build.java:181)
    at hudson.model.AbstractBuild$AbstractRunner.post(AbstractBuild.java:459)
    at hudson.model.Run.run(Run.java:1143)
    at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:46)
    at hudson.model.ResourceController.execute(ResourceController.java:88)
    at hudson.model.Executor.run(Executor.java:123)

    below is my configure:
    I tried for three times:
    1. fill in "Projects to build once, after all downstream projects have finished" with "Run post-build actions at join" unchecked.
    2. have "Run post-build actions at join" configued with the former blank.
    3. have both configured
    But none succeeds.

    1. Unknown User (shannon977)

      I read your source codes and came out with some work-around.

      The plugin function can work after the parameterized-trigger is simply disabled.

      I am afraid there's some conflict of Join-plugin against parameterized-trigger when the former intends to work together with the latter.

  3. We use join as the email notifier after the Windows, Linux, Mac, etc, builds all finished.  Unfortunately, the name of the person I want to mail is in the parametrized trigger variables and is not passed to the join.  Is this a feature in plan for this plug-in? 

    1. Unknown User (jl.pinardon)

      I was really interesting with the Join Plugin until some new constraints makes me test the Parameterized Trigger Build plugin. Both works well, but they clearly seem to not be able to work altogether... It is a real problem, because both plugins are really important ones for complex job sequences.

  4. Unknown User (samerelhelou)

    Hello, I have installed the latest version of the Join Plugin, but I can't seem to make the Post-Join Actions jobs run. Is there any special configuartion for jobs to be able to run this mode?
    Thanks

  5. Unknown User (wedamija@gmail.com)

    Is there any way to pass the bulid numbers from the downstream jobs to the join job?  Possibly in combination with the Parameterized Build plugin.

  6. Unknown User (hetal)

    I have created the job with the Option "Build multi-configuration project". But in that case the join trigger is not available. In case of other job which I have created with the Option "Build a free-style software project" it is available. Is there any special configuration needs to be done to enable it for "Build multi-configuration project" ?

    Thanks,
    Hetal

    1. The join trigger is not jet available for multi-configuration projects. Please open a feature request in jira. When I have time I will investigate this.

    2. This is now filed in JIRA as JENKINS-8443

  7. I am trying to use the join plugin as follows:

         job-a

    job-b job-c

        job-d

    job-a build other projects are  job-b and job-c with join trigger job-d

    When job-a builds job-b and job-c get built and then job-d runs when both are complete. This is the expected behavior and works as advertised.

    However, if job-b is started by an SCM change or manually then it builds job-b but does not build job-d.

    The two scenarios I need to cover are:

    1) job-a is triggered manually or by SCM then job-b and job-c need to build in parallel and job-d must run when both are done. This works

    2) if one of the parallel jobs is triggered manually or by SCM then just that job needs to build AND job-d needs to build when it completes. This does not work.

    Can the join plugin support both of these situations?

    1. This is probably possible but needs some code change. One possibility would be to add a checkbox where one can choose this behaviour. Please open a jira ticket.

  8. Unknown User (paradoxpixel@gmail.com)

    I'm trying to use the join plugin to define a flow of jobs but I have a slight problem :)

    I have a job A, B and C;

    I define a job ABC to "build other projects" - job A and B, and after they complete I trigger job C. It all works well.

    Now I have another job, D. And I define another job called ABCD.

    I define job ABCD to "build other project"  - job ABC, and trigger job -D.

    The problem is when I run job ABCD.

    When building ABCD. It triggers a build of job ABC. - Expected behavior.

    Right after job ABC is triggered the build of jobs A and B are triggered but it also triggers job D, as if job ABC has been completed (and I suppose it has, becuase it's all defined in the post-build).

    Is this a bug, misuse or a limitation? If the latter anyone has an idea how to implement my flow?

    Thanks!

    1. For me it is the same problem ... I want to use a 'double diamond' job dependency, i.e. I want to have some jobs in a 'diamond' job dependency as shown above and then also a kind of master job which initialises all the diamonds (like the ABCD job) and after all diamonds (the ABC job with C as join) are finished there should be the master join (the D job in your example).

      As I understand the join trigger plugin, it is not possible to do this?!?!? The ABCD job waits for the triggered jobs to be finished (ABC in your case) and then directly starts the join job D - it does not pay any attention to the fact that ABC itself triggers and joins ...

      Unfortunately I don't see any possibility to overcome the problem.

      @maintainer of the plugin: is it possible to define (in your second example above) a job 'join' that joins the joinA and joinB jobs and is the JoinTrigger of 'Hudson fork 1'???

      addendum: I now have a solution for the problem which is not perfect but at least it works ... you can set job ABCD to trigger job ABC but NOT use the join on job D. Instead setup job D to be build after job C finished successfully. The only drawback I see is that job D gets triggered even if you do not start ABCD but only ABC ...

  9. I'm in the same boat as the previous 2 posters (Daniel Adrian and hbockelmann).

    Dependency issues are constantly biting us big time, and we would absolutely love this plugin to get beefed up to do some of the things that are mentioned here.

    For instance, I would love to be able to do something like this (similar to a double diamond dependency):

                O     (master job)
               /  \
             O    O   (JobA, JobB)
              |    /   \
              |  O    O (JobC, JobD)
              |   \     /      
              |     O   (JobE)
               \   /
                O     (JobF)

    If this is possible, let us know :)

    (I wish I knew enough about Jenkins plugins to actually help in implementing this...)          

  10. I am using the Join plugin that executes a series of jobs, similar to previous discussions. When the last job completes I would like to travel backward in the job chain using groovy, from the last job to the first, to collect information. I've looked through groovy and haven't been able to discover anything that might do this. Any help would be appreciated.

  11. Does the Join plugin work with https://wiki.jenkins-ci.org/display/JENKINS/Downstream-Ext+Plugin

    I'm seeing all downstream projects (including the Join project) being triggered at the same time ie. the Join project is not waiting for the other projects before building.

    Any ideas?

  12. I use the version 1.12 of the plugin with hudson 2.1.0, I don't have the checkbox "run post-build action at join" and what comes after !!

    What can be the problem ?

  13. hi and thanks for the great work on the plugin.

    I have a simple question: is there a way of displaying the time needed by the execution of all the downstream jobs?

    In the first example, i would like to know what time elapsed between test and testJoin.

    Thank you for your answer.

  14. Hi, the article is so wonderful, I am interested in it. I will pay attention to your articles. And I like cheap clothes very much, and I have found a wholesale in china online, there are cheap shoes on their website. 

    Especially the cheap clothing and cheap bags, the wholesale shoes and wholesale jewelry are also very nice, they are my favorite!

  15. Do you like motorcycling and have your own motor equiments?You can come here Belstaff Outlet to find your Belstaff Jacket.Belstaff Coat can not little.If your foot is cold,Belstaff Boots is not bad.

    You can buy a Belstaff Bag to hold those equipments.

  16. Hi, I'm experiencing an issue that was claimed to have been fixed back in 1.2 (currently running 1.13). My joined job is executing even if one of the sub-jobs fail.

                O     (master job)
               /  \
             O   O  (Job1, Job2)
              |     |
              |    O   (Job3)
               \   /
                O     (joined job)

    In my test scenario described above, everything works great if all jobs succeed. However, when I forced Job3 to fail, the joined job still started.

    Specifically, I want to know if the plugin has a limitation I don't fully understand. As I understand it, the 'diamond' in my picture can be any *width* (meaning, you can have as many different jobs spawn off of master job as you want) but it can only have a *height* of 1 (meaning, my problem is happening because the left side of the diamond is only 1 high while the right side is 2 high). Is that correct? If so, is there any way around it?

  17. Hi, I've been using this plugin and it is very helpful but i have a scenario to execute jobs on join condition even on "Failure" of downstream jobs or always.

    Currently I've seen only one check box "Trigger even if some downstream projects are unstable". How can I achieve this enven on Fails / Complete(always)

  18. Hi all

    i've just upgraded to Jenkins core 1.458 and join trigger to 1.14, since then i was getting an exception:

    java.lang.IllegalArgumentException: Can't parse <Job Name>

            at hudson.matrix.Combination.fromString(Combination.java:218)

            at hudson.matrix.MatrixProject.getItem(MatrixProject.java:568)

            at hudson.matrix.MatrixProject.getItem(MatrixProject.java:90)

            at jenkins.model.Jenkins.getItem(Jenkins.java:2158)

            at jenkins.model.Jenkins.getItem(Jenkins.java:2179)

            at hudson.model.Items.fromNameList(Items.java:100)

            at join.JoinTrigger$DescriptorImpl$RunListenerImpl.notifyJob(JoinTrigger.java:403)

            at join.JoinTrigger$DescriptorImpl$RunListenerImpl.onCompleted(JoinTrigger.java:396)

            at hudson.model.listeners.RunListener.fireCompleted(RunListener.java:178)

            at hudson.model.Run.run(Run.java:1463)

            at hudson.matrix.MatrixRun.run(MatrixRun.java:146)

            at hudson.model.ResourceController.execute(ResourceController.java:88)

            at hudson.model.Executor.run(Executor.java:238)

    which was causing matrix jobs not to finish correctly. It still looked as they finished successfully but the last line in logs was:

    "Notifying upstream projects of job completion" 

    and no log was saved for downstream jobs, only for parent.

    After reverting join trigger to 1.13, everything seem to get back to normal.

    Anyone else had this issue?

  19. A simple question: is there anyway I can pass some build status of parallelized jobs back to master build so it will simply fail if one of the sub jobs failed?

  20. This is a great plugin, however this ONLY informs the 'join' job, of a successful 'completion' of all the downstream jobs.     For my instance, without going through the J-CLI, I would like to know that the job finished (including failures).  (i.e. a "inform_on_failure" to let me know that the job has finished, but there were failures).

  21. Is it possible to have three downstream jobs, but have the join only wait for two of them?

    eg, Job A launches jobs B, C and D, but job B is long-running, I want Job F to only wait for C & D before it is triggered.

         A
        /|\
       / | \
      /  |  \
     B   C   D
     |    \ /
     E     F
    

    I know I could have the join task trigger both B&F after C&D complete, but I want to start B as soon as possible...

    Any thoughts or advice appreciated.

       matt

    1. I would think you could insert a parent task G just for C and D and configure the join task on that job instead of on A:

           A
          /  \
         /    G
        /    /  \
      B   C   D

      |      \   /

      E      F

      The G task does nothing and always succeeds.

  22. Is there any way to pass parameters (ex: the bulid numbers) from the downstream jobs to the join job?

    This was already asked but not answered: https://wiki.jenkins-ci.org/display/JENKINS/Join+Plugin?focusedCommentId=46337262#comment-46337262

  23. Unknown User (es developer)

    Join job is sometimes not triggered after all the downstream jobs have with success completed.
    No error messages, no warnings, no condition for this happening found, just sometimes not triggered.
    Bug?
    Jenkins ver. 1.492;  join plugin Ver 1.13

    1. Unknown User (es developer)

      Condition found for this error: Join job will be not triggered if downstream jobs started not parallel, but follow each other.

  24. Hi I am using version 1.15 and I am trying to do this tree

        A
        |
        B
       / \
      C   D
       \ /
        E
    

    Current configuration is:
    Job A triggers job B, has a Join trigger for Job E
    Job B triggers job C,D it has no join triggers

    Shouldn't the join trigger in A wait for B and all its downstram projects execution to start?

    I can just move the join on B, just asking /
    it makes more sense when calling the project with their function
    A is main build
    B is acceptance test
    C,D and others are integration tests
    E is quality analysis

    that's why I would prefer to attach the join to A

  25. Hi,

    This Plugin is very useful for me, but I meet one issue in downstream job

    Join notifier cannot find upstream run: LIB_BUILD number 107

    but I make sure this job (LIB_BUILD) and build number (107) is exist.

    Any one konw the reason?

    thanks

  26. Any chance that this project could choose a license? MIT License is the most common for Jenkins plugins.

  27. Re Posting :

    Is there any way to pass parameters (ex: the bulid numbers) from the downstream jobs to the join job?

    This was already asked but not answered: https://wiki.jenkins-ci.org/display/JENKINS/Join+Plugin?focusedCommentId=46337262#comment-46337262