Skip to content

fix: Tuleap job should send the right SHA-1 to the Tuleap git repository #353

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 9, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
import io.jenkins.plugins.tuleap_api.deprecated_client.TuleapClientCommandConfigurer;
import io.jenkins.plugins.tuleap_api.deprecated_client.TuleapClientRawCmd;
import io.jenkins.plugins.tuleap_api.deprecated_client.api.TuleapBranches;
import io.jenkins.plugins.tuleap_api.deprecated_client.api.TuleapFileContent;
import io.jenkins.plugins.tuleap_api.deprecated_client.api.TuleapGitRepository;
import io.jenkins.plugins.tuleap_api.deprecated_client.api.TuleapProject;
import io.jenkins.plugins.tuleap_credentials.TuleapAccessToken;
Expand Down Expand Up @@ -311,7 +310,7 @@ protected SCMRevision retrieve(SCMHead head, TaskListener listener) throws IOExc
listener.getLogger().format("Cannot find the branch %s in repo : %s", head.getName(), repositoryPath);
}
if (revision.isPresent()) {
return new SCMRevisionImpl(head, revision.get());
return new TuleapBranchSCMRevision(head, revision.get());
}
} else if (head instanceof TuleapPullRequestSCMHead) {
TuleapPullRequestSCMHead tlpSCMHead = (TuleapPullRequestSCMHead) head;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.jenkinsci.plugins.tuleap_git_branch_source.notify;

public class InvalidRetrievedRevisionType extends RuntimeException {
public InvalidRetrievedRevisionType() {
super("Given revision is not from a Tuleap revision");
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package org.jenkinsci.plugins.tuleap_git_branch_source.notify;

import hudson.model.Run;
import hudson.plugins.git.util.BuildData;
import io.jenkins.plugins.tuleap_api.client.GitApi;
import io.jenkins.plugins.tuleap_api.client.internals.entities.TuleapBuildStatus;
import io.jenkins.plugins.tuleap_credentials.TuleapAccessToken;

import jenkins.scm.api.SCMRevision;
import jenkins.scm.api.SCMRevisionAction;
import org.jenkinsci.plugins.tuleap_git_branch_source.TuleapBranchSCMRevision;
import org.jenkinsci.plugins.tuleap_git_branch_source.TuleapPullRequestRevision;
import org.jenkinsci.plugins.tuleap_git_branch_source.TuleapSCMSource;
import org.jenkinsci.plugins.tuleap_git_branch_source.config.TuleapConnector;
import org.jetbrains.annotations.Nullable;
Expand All @@ -27,12 +30,7 @@ public void sendBuildStatusToTuleap(Run<?, ?> build, PrintStream logger, TuleapB
);
}

final BuildData gitData = build.getAction(BuildData.class);
if (gitData == null) {
throw new RuntimeException(
"Failed to retrieve Git Data. Please check the configuration."
);
}
String hash = this.getRevisionHash(source, build);

final int repository_id = source.getTuleapGitRepository().getId();
logger.printf(
Expand All @@ -42,7 +40,7 @@ public void sendBuildStatusToTuleap(Run<?, ?> build, PrintStream logger, TuleapB

this.gitApi.sendBuildStatus(
Integer.toString(repository_id),
gitData.lastBuild.getSHA1().name(),
hash,
status,
token
);
Expand All @@ -56,4 +54,18 @@ private TuleapAccessToken getAccessKey(TuleapSCMSource source) {
source.getCredentialsId()
);
}

private String getRevisionHash(TuleapSCMSource source, Run<?,?> build){
SCMRevision revision = SCMRevisionAction.getRevision(source, build);
String hash;
if (revision instanceof TuleapBranchSCMRevision) {
hash = ((TuleapBranchSCMRevision) revision).getHash();
} else if (revision instanceof TuleapPullRequestRevision) {
TuleapBranchSCMRevision origin = (TuleapBranchSCMRevision) ((TuleapPullRequestRevision) revision).getOrigin();
hash = origin.getHash();
} else {
throw new InvalidRetrievedRevisionType();
}
return hash;
}
}
Original file line number Diff line number Diff line change
@@ -1,22 +1,25 @@
package org.jenkinsci.plugins.tuleap_git_branch_source.notify;

import hudson.plugins.git.util.Build;
import hudson.plugins.git.util.BuildData;
import io.jenkins.plugins.tuleap_api.client.GitApi;
import io.jenkins.plugins.tuleap_api.client.GitHead;
import io.jenkins.plugins.tuleap_api.client.GitPullRequest;
import io.jenkins.plugins.tuleap_api.client.GitRepositoryReference;
import io.jenkins.plugins.tuleap_api.client.internals.entities.TuleapBuildStatus;
import io.jenkins.plugins.tuleap_api.deprecated_client.api.TuleapGitRepository;
import io.jenkins.plugins.tuleap_credentials.TuleapAccessToken;
import jenkins.plugins.git.AbstractGitSCMSource;
import jenkins.scm.api.SCMHead;
import jenkins.scm.api.SCMHeadOrigin;
import jenkins.scm.api.SCMRevisionAction;
import jenkins.scm.api.SCMSource;
import org.eclipse.jgit.lib.ObjectId;
import org.jenkinsci.plugins.tuleap_git_branch_source.TuleapSCMSource;
import org.jenkinsci.plugins.tuleap_git_branch_source.*;
import org.jenkinsci.plugins.tuleap_git_branch_source.config.TuleapConnector;
import org.jenkinsci.plugins.workflow.job.WorkflowJob;
import org.jenkinsci.plugins.workflow.job.WorkflowRun;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.MockedStatic;
import org.mockito.Mockito;

import java.io.PrintStream;

Expand All @@ -28,13 +31,15 @@ public class TuleapPipelineStatusNotifierTest {
private TuleapAccessToken accessKey;
private MockedStatic<SCMSource.SourceByItem> sourceByItem;
private MockedStatic<TuleapConnector> tuleapConnector;
private MockedStatic<SCMRevisionAction> scmRevisionAction;

@Before
public void setUp() {
this.gitApi = mock(GitApi.class);
this.accessKey = mock(TuleapAccessToken.class);
this.sourceByItem = Mockito.mockStatic(SCMSource.SourceByItem.class);
this.tuleapConnector = Mockito.mockStatic(TuleapConnector.class);
this.sourceByItem = mockStatic(SCMSource.SourceByItem.class);
this.tuleapConnector = mockStatic(TuleapConnector.class);
this.scmRevisionAction = mockStatic(SCMRevisionAction.class);

this.notifier = new TuleapPipelineStatusNotifier(this.gitApi);
}
Expand All @@ -43,6 +48,7 @@ public void setUp() {
public void tearDown() {
this.sourceByItem.close();
this.tuleapConnector.close();
this.scmRevisionAction.close();
}

@Test(expected = RuntimeException.class)
Expand All @@ -56,9 +62,9 @@ public void testItThrowsAnExceptionWhenAccessKeyNotFound() {

this.sourceByItem.when(() -> SCMSource.SourceByItem.findSource(workflowJob)).thenReturn(source);
this.tuleapConnector.when(() -> TuleapConnector.lookupScanCredentials(
Mockito.any(),
Mockito.any(),
Mockito.any()
any(),
any(),
any()
)).thenReturn(null);

verify(this.gitApi, never()).sendBuildStatus(
Expand All @@ -80,13 +86,45 @@ public void testItThrowsAnExceptionWhenGitDataNotFound() {
final TuleapAccessToken accessKey = mock(TuleapAccessToken.class);

when(build.getParent()).thenReturn(workflowJob);
when(build.getAction(BuildData.class)).thenReturn(null);

this.sourceByItem.when(() -> SCMSource.SourceByItem.findSource(workflowJob)).thenReturn(source);
this.tuleapConnector.when(() -> TuleapConnector.lookupScanCredentials(
Mockito.any(),
Mockito.any(),
Mockito.any()
any(),
any(),
any()
)).thenReturn(accessKey);

verify(this.gitApi, never()).sendBuildStatus(
"5",
"aeiouy123456",
TuleapBuildStatus.success,
this.accessKey
);

this.notifier.sendBuildStatusToTuleap(build, logger, TuleapBuildStatus.success, source);
}

@Test(expected = RuntimeException.class)
public void testItThrowsAnExceptionWhenTheHashIsNotFromTuleapRevisionSource() {
final WorkflowRun build = mock(WorkflowRun.class);
final TuleapSCMSource source = mock(TuleapSCMSource.class);
final PrintStream logger = mock(PrintStream.class);
final WorkflowJob workflowJob = mock(WorkflowJob.class);
final TuleapAccessToken accessKey = mock(TuleapAccessToken.class);

when(build.getParent()).thenReturn(workflowJob);

this.sourceByItem.when(() -> SCMSource.SourceByItem.findSource(workflowJob)).thenReturn(source);

this.scmRevisionAction.when(() -> SCMRevisionAction.getRevision(
source,
build
)).thenReturn(new AbstractGitSCMSource.SCMRevisionImpl(new SCMHead("master"), "efjrigjaefgaefg8487"));

this.tuleapConnector.when(() -> TuleapConnector.lookupScanCredentials(
any(),
any(),
any()
)).thenReturn(accessKey);

verify(this.gitApi, never()).sendBuildStatus(
Expand All @@ -100,40 +138,125 @@ public void testItThrowsAnExceptionWhenGitDataNotFound() {
}

@Test
public void testItNotifiesTuleap() {
public void testItNotifiesTuleapIfTheRevisionIsATuleapBranchRevision() {
final WorkflowRun build = mock(WorkflowRun.class);
final TuleapSCMSource source = mock(TuleapSCMSource.class);
final PrintStream logger = mock(PrintStream.class);
final WorkflowJob workflowJob = mock(WorkflowJob.class);
final TuleapAccessToken accessKey = mock(TuleapAccessToken.class);
final BuildData gitData = mock(BuildData.class);
final ObjectId sha1 = mock(ObjectId.class);
final TuleapGitRepository repository = new TuleapGitRepository();
final Build lastBuild = mock(Build.class);

repository.setId(5);
gitData.lastBuild = lastBuild;

when(build.getParent()).thenReturn(workflowJob);
when(build.getAction(BuildData.class)).thenReturn(gitData);
when(lastBuild.getSHA1()).thenReturn(sha1);
when(sha1.name()).thenReturn("aeiouy123465");
this.scmRevisionAction.when(() -> SCMRevisionAction.getRevision(
source,
build
)).thenReturn(new TuleapBranchSCMRevision(new TuleapBranchSCMHead("master"), "efjrigjaefgaefg8487"));
when(source.getTuleapGitRepository()).thenReturn(repository);

this.sourceByItem.when(() -> SCMSource.SourceByItem.findSource(workflowJob)).thenReturn(source);
this.tuleapConnector.when(() -> TuleapConnector.lookupScanCredentials(
Mockito.any(),
Mockito.any(),
Mockito.any()
any(),
any(),
any()
)).thenReturn(accessKey);

verify(this.gitApi, atMostOnce()).sendBuildStatus(
"5",
"aeiouy123456",
"efjrigjaefgaefg8487",
TuleapBuildStatus.success,
accessKey
);

this.notifier.sendBuildStatusToTuleap(build, logger, TuleapBuildStatus.success, source);
}

@Test
public void testItNotifiesTuleapIfTheRevisionIsATuleapPullRequestRevision() {
final WorkflowRun build = mock(WorkflowRun.class);
final TuleapSCMSource source = mock(TuleapSCMSource.class);
final PrintStream logger = mock(PrintStream.class);
final WorkflowJob workflowJob = mock(WorkflowJob.class);
final TuleapAccessToken accessKey = mock(TuleapAccessToken.class);
final TuleapGitRepository repository = new TuleapGitRepository();

repository.setId(5);

when(build.getParent()).thenReturn(workflowJob);

GitPullRequest gitPullRequest = this.getPullRequestStub();

this.scmRevisionAction.when(() -> SCMRevisionAction.getRevision(
source,
build
)).thenReturn(new TuleapPullRequestRevision(
new TuleapPullRequestSCMHead(
gitPullRequest,
SCMHeadOrigin.DEFAULT,
new TuleapBranchSCMHead("master"),
1,
1,
"head_ref1"
),
new TuleapBranchSCMRevision(new TuleapBranchSCMHead("master"), "efjrigjaefgaefg8487"),
new TuleapBranchSCMRevision(new TuleapBranchSCMHead("pr1"), "dfsddsfsdf48")
));
when(source.getTuleapGitRepository()).thenReturn(repository);

this.sourceByItem.when(() -> SCMSource.SourceByItem.findSource(workflowJob)).thenReturn(source);
this.tuleapConnector.when(() -> TuleapConnector.lookupScanCredentials(
any(),
any(),
any()
)).thenReturn(accessKey);

verify(this.gitApi, atMostOnce()).sendBuildStatus(
"5",
"efjrigjaefgaefg8487",
TuleapBuildStatus.success,
accessKey
);

this.notifier.sendBuildStatusToTuleap(build, logger, TuleapBuildStatus.success, source);
}

private GitPullRequest getPullRequestStub() {
return new GitPullRequest() {
@Override
public String getId() {
return null;
}

@Override
public String getTitle() {
return null;
}

@Override
public GitRepositoryReference getSourceRepository() {
return null;
}

@Override
public GitRepositoryReference getDestinationRepository() {
return null;
}

@Override
public String getSourceBranch() {
return null;
}

@Override
public String getDestinationBranch() {
return null;
}

@Override
public GitHead getHead() {
return null;
}
};
}
}