Uploaded image for project: 'Jenkins'
  1. Jenkins
  2. JENKINS-20804

showDependencies for ${CHANGES} doesn't seem to work

      I'm using the email-ext plugin and it works great except for this problem with "showDependencies".

      This is how I use it (I only use global configs for all jobs in email-ext, just triggers are set per job):
      ${CHANGES, showPaths=true, showDependencies=true}

      I have a 'build' project A that triggers 'unit test' project B, C and D. B, C and D are shown as "Downstream Projects" on project A's "Status" page.

      B and C are started by standard "Build other projects" post-build action of A.
      D is started by "Build other projects (extended)" post-build action of A if Build result is "Equal or over SUCCESS" and with "Trigger only if downstream project has SCM changes" - that is available due to https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Trigger+Plugin, version 2.21.

      When project B fails due to a change in project A's SCM, in the email I don't see the commits from project A that resulted in this failure, although "showDependencies" is true.

      Did I misunderstand what "showDependencies" is meant for or misused it? If that's not its purpose, then please consider this a feature req. to add the ability to have the changes from A above in email.

      Thanks.

      BTW: from token docs, it seems to me that you can't use "showDependencies" with ${CHANGES_SINCE_LAST_SUCCESS}, just with ${CHANGES}. Is that true? Cause that would be exactly what I want.

          [JENKINS-20804] showDependencies for ${CHANGES} doesn't seem to work

          Thanks for checking.

          Andrei Costescu added a comment - Thanks for checking.

          Alex Earl added a comment -

          This is what it does for showDependencies, I'm not real familiar with this code, so I can't comment on what exactly it should do

          for (Entry<AbstractProject, DependencyChange> e : build.getDependencyChanges(previousBuild).entrySet()) {
              buf.append("\n=======================\n");
              buf.append("\nChanges in ").append(e.getKey().getName())
                  .append(":\n");
              for (AbstractBuild<?, ?> b : e.getValue().getBuilds()) {
                  for (ChangeLogSet.Entry entry : b.getChangeSet()) {
                      Util.printf(buf, format, new ChangesSincePrintfSpec(entry, pathFormat, dateFormatter));
                  }
              }
          }
          

          Alex Earl added a comment - This is what it does for showDependencies, I'm not real familiar with this code, so I can't comment on what exactly it should do for (Entry<AbstractProject, DependencyChange> e : build.getDependencyChanges(previousBuild).entrySet()) { buf.append( "\n=======================\n" ); buf.append( "\nChanges in " ).append(e.getKey().getName()) .append( ":\n" ); for (AbstractBuild<?, ?> b : e.getValue().getBuilds()) { for (ChangeLogSet.Entry entry : b.getChangeSet()) { Util.printf(buf, format, new ChangesSincePrintfSpec(entry, pathFormat, dateFormatter)); } } }

          Dirk Hain added a comment -

          I am running into a similar issue with

          Jenkins: 1.548
          email-ext: 2.37.2

          However, for me the email-ext plugin will return changes with dependencies IF the build ends with a FAILURE. If the build is unstable the changes will not be populated. Here are the settings I am using:

          ${CHANGES, showDependencies=true, format="[%a] %d, %r: %m
          n %p
          n"}

          Dirk Hain added a comment - I am running into a similar issue with Jenkins: 1.548 email-ext: 2.37.2 However, for me the email-ext plugin will return changes with dependencies IF the build ends with a FAILURE. If the build is unstable the changes will not be populated. Here are the settings I am using: ${CHANGES, showDependencies=true, format=" [%a] %d, %r: %m n %p n"}

          Alex Earl added a comment -

          showDependencies uses the following code:

          for (Entry<AbstractProject, DependencyChange> e : build.getDependencyChanges(previousBuild).entrySet()) {
              buf.append("\n=======================\n");
              buf.append("\nChanges in ").append(e.getKey().getName()).append(":\n");
              for (AbstractBuild<?, ?> b : e.getValue().getBuilds()) {
                  for (ChangeLogSet.Entry entry : b.getChangeSet()) {
                      Util.printf(buf, format, new ChangesSincePrintfSpec(entry, pathFormat, dateFormatter));
                  }
              }
          }
          

          AbstractBuild.getDependencyChanges returns an EMPTY Map if there is no Fingerprinter.FingerprintAction for the project. The showDependencies is all based on core Jenkins classes, so you'd need to determine if your projects are meeting the requirements for the dependency graph being populated.

          Alex Earl added a comment - showDependencies uses the following code: for (Entry<AbstractProject, DependencyChange> e : build.getDependencyChanges(previousBuild).entrySet()) { buf.append( "\n=======================\n" ); buf.append( "\nChanges in " ).append(e.getKey().getName()).append( ":\n" ); for (AbstractBuild<?, ?> b : e.getValue().getBuilds()) { for (ChangeLogSet.Entry entry : b.getChangeSet()) { Util.printf(buf, format, new ChangesSincePrintfSpec(entry, pathFormat, dateFormatter)); } } } AbstractBuild.getDependencyChanges returns an EMPTY Map if there is no Fingerprinter.FingerprintAction for the project. The showDependencies is all based on core Jenkins classes, so you'd need to determine if your projects are meeting the requirements for the dependency graph being populated.

          Dirk Hain added a comment -

          Thanks for your comment, Alex. I checked the dependency graph and it is populated correctly. However, in the job that has the test failures I am copying test artifacts around. Not sure if that is the problem, I enabled fingerprinting of the copied artifacts to no avail. The fact that the dependent changes are shown correctly IF the job does not complete (no tests run) but does not show dependent changes IF the job completes unstable (tests are run with some failing) indicates that the root cause could be the copying of files. I will try to investigate further and see if I can get it working.

          Dirk Hain added a comment - Thanks for your comment, Alex. I checked the dependency graph and it is populated correctly. However, in the job that has the test failures I am copying test artifacts around. Not sure if that is the problem, I enabled fingerprinting of the copied artifacts to no avail. The fact that the dependent changes are shown correctly IF the job does not complete (no tests run) but does not show dependent changes IF the job completes unstable (tests are run with some failing) indicates that the root cause could be the copying of files. I will try to investigate further and see if I can get it working.

          Dirk Hain added a comment -

          Ok, I was able to resolve the issue by creating a correct chain of fingerprinting across my builds. The piece that was missing was that the build where I was not able to see dependent changes did not have a copy of the artifacts in the workspace. Although that particular build does not require the artifacts Jenkins needs them in the workspace to establish the connection that the build is dependent on a previous build that created the artifact. Since Jenkins does not support fingerprinting outside the workspace directory it is easiest just to use the "Copy artifacts from another build" option and tick the fingerprinting option.

          Dirk Hain added a comment - Ok, I was able to resolve the issue by creating a correct chain of fingerprinting across my builds. The piece that was missing was that the build where I was not able to see dependent changes did not have a copy of the artifacts in the workspace. Although that particular build does not require the artifacts Jenkins needs them in the workspace to establish the connection that the build is dependent on a previous build that created the artifact. Since Jenkins does not support fingerprinting outside the workspace directory it is easiest just to use the "Copy artifacts from another build" option and tick the fingerprinting option.

          Alex Earl added a comment -

          I think we can close this issue then, anyone opposed?

          Alex Earl added a comment - I think we can close this issue then, anyone opposed?

          Dirk Hain added a comment -

          Cool with me.

          Dirk Hain added a comment - Cool with me.

          Alex Earl added a comment -

          Please read Dirk's comments on how he got showDependencies=true to work.

          Alex Earl added a comment - Please read Dirk's comments on how he got showDependencies=true to work.

          Ok, I'll try it out.

          Andrei Costescu added a comment - Ok, I'll try it out.

            slide_o_mix Alex Earl
            costescuandrei Andrei Costescu
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: