jenkinsci / jenkinsci/git-plugin

[JENKINS-25508] Git plugin doesn't parse changelog (false "First time build")

Open
#2,559 9 comments 0 reactions 0 assignees View on GitHub
component:git-plugin imported-jira-issue priority:major resolution:unresolved
Dominant language
Java
Stars
694
Forks
1.1k
Avg merge
1h 29m
Merged PRs (30d)
3

Description

The job is triggered because of SCM change:


Poll log

[poll] Last Built Revision: Revision 3281126a340c0e863f12c11a7f9ccd31bceb587a (origin/master)

[git] $ sh -e /DATA/jenkins/app-data/tools/git/hudson598255919908413882.sh
> git ls-remote -h [CENSURED] master # timeout=10
[poll] Latest remote head revision is: e72acfe796b818f51ba549991a8f1876657d8986
Done. Took 0.32 sec
Changes found


But in the run git log we see that it skips changelog becuase of "First time build" -falsely:


Run log

16:27:52  > /usr/bin/git checkout -f e72acfe796b818f51ba549991a8f1876657d8986

16:27:55 > /usr/bin/git rev-list 3281126a340c0e863f12c11a7f9ccd31bceb587a # timeout=10
16:27:55 First time build. Skipping changelog.

Looking at the current code of Git Plugin I see there's some kind of condition on "exclusion" but I've yet understood what sets it:

from GitSCM.java

  private void computeChangeLog(GitClient git, Revision revToBuild, TaskListener listener, BuildData previousBuildData, FilePath changelogFile, BuildChooserContext context) throws IOException, InterruptedException {

Writer out = new OutputStreamWriter(changelogFile.write(),"UTF-8");

boolean executed = false;
ChangelogCommand changelog = git.changelog();
changelog.includes(revToBuild.getSha1());
try {
boolean exclusion = false;
ChangelogToBranch changelogToBranch = getExtensions().get(ChangelogToBranch.class);
if (changelogToBranch != null) {
listener.getLogger().println("Using 'Changelog to branch' strategy.");
changelog.excludes(changelogToBranch.getOptions().getRef());
exclusion = true;
} else {
for (Branch b : revToBuild.getBranches()) {
Build lastRevWas = getBuildChooser().prevBuildForChangelog(b.getName(), previousBuildData, git, context);
if (lastRevWas != null && git.isCommitInRepo(lastRevWas.getSHA1())) {
changelog.excludes(lastRevWas.getSHA1());
exclusion = true;
}
}
}

if (!exclusion) {
// this is the first time we are building this branch, so there's no base line to compare against.
// if we force the changelog, it'll contain all the changes in the repo, which is not what we want.
listener.getLogger().println("First time build. Skipping changelog.");
} else {
changelog.to(out).max(MAX_CHANGELOG).execute();
executed = true;
}
} catch (GitException ge) {
ge.printStackTrace(listener.error("Unable to retrieve changeset"));
} finally {
if (!executed) changelog.abort();
IOUtils.closeQuietly(out);
}
}


I might take the task to fix it on my own - but maybe for some of you it may be obvious...

---
Originally reported by or_shachar, imported from: Git plugin doesn't parse changelog (false "First time build")


  • status: Open
  • priority: Major
  • component(s): git-plugin
  • label(s): changelog, git, git-client
  • resolution: Unresolved
  • votes: 5
  • watchers: 11
  • imported: 2025-12-02

Raw content of original issue

The job is triggered because of SCM change:


Poll log

[poll] Last Built Revision: Revision 3281126a340c0e863f12c11a7f9ccd31bceb587a (origin/master)

[git] $ sh -e /DATA/jenkins/app-data/tools/git/hudson598255919908413882.sh
> git ls-remote -h [CENSURED] master # timeout=10
[poll] Latest remote head revision is: e72acfe796b818f51ba549991a8f1876657d8986
Done. Took 0.32 sec
Changes found


But in the run git log we see that it skips changelog becuase of "First time build" -falsely:


Run log

16:27:52  > /usr/bin/git checkout -f e72acfe796b818f51ba549991a8f1876657d8986

16:27:55 > /usr/bin/git rev-list 3281126a340c0e863f12c11a7f9ccd31bceb587a # timeout=10
16:27:55 First time build. Skipping changelog.

Looking at the current code of Git Plugin I see there's some kind of condition on "exclusion" but I've yet understood what sets it:

from GitSCM.java

  private void computeChangeLog(GitClient git, Revision revToBuild, TaskListener listener, BuildData previousBuildData, FilePath changelogFile, BuildChooserContext context) throws IOException, InterruptedException {

Writer out = new OutputStreamWriter(changelogFile.write(),"UTF-8");

boolean executed = false;
ChangelogCommand changelog = git.changelog();
changelog.includes(revToBuild.getSha1());
try {
boolean exclusion = false;
ChangelogToBranch changelogToBranch = getExtensions().get(ChangelogToBranch.class);
if (changelogToBranch != null) {
listener.getLogger().println("Using 'Changelog to branch' strategy.");
changelog.excludes(changelogToBranch.getOptions().getRef());
exclusion = true;
} else {
for (Branch b : revToBuild.getBranches()) {
Build lastRevWas = getBuildChooser().prevBuildForChangelog(b.getName(), previousBuildData, git, context);
if (lastRevWas != null && git.isCommitInRepo(lastRevWas.getSHA1())) {
changelog.excludes(lastRevWas.getSHA1());
exclusion = true;
}
}
}

if (!exclusion) {
// this is the first time we are building this branch, so there's no base line to compare against.
// if we force the changelog, it'll contain all the changes in the repo, which is not what we want.
listener.getLogger().println("First time build. Skipping changelog.");
} else {
changelog.to(out).max(MAX_CHANGELOG).execute();
executed = true;
}
} catch (GitException ge) {
ge.printStackTrace(listener.error("Unable to retrieve changeset"));
} finally {
if (!executed) changelog.abort();
IOUtils.closeQuietly(out);
}
}


I might take the task to fix it on my own - but maybe for some of you it may be obvious...

environment

```
Jenkins 1.565.2, 1.580.3

Git-Client 1.11.0, 1.14.1

Git plugin 2.2.7, 2.3.4

SCM-API 0.2

Both master and slave works on RHEL 6.3 with Java 7u51
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.