Skip to content

Commit 3e65181

Browse files
committed
[JENKINS-38830] Added support for tracking credentials.
1 parent fd42f5e commit 3e65181

File tree

5 files changed

+101
-1
lines changed

5 files changed

+101
-1
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@
122122
<dependency>
123123
<groupId>org.jenkins-ci.plugins</groupId>
124124
<artifactId>credentials</artifactId>
125-
<version>2.1.0</version>
125+
<version>2.1.1</version>
126126
</dependency>
127127
<dependency>
128128
<groupId>org.jenkins-ci.plugins</groupId>

src/main/java/com/cloudbees/jenkins/plugins/sshagent/SSHAgentBuildWrapper.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ public void preCheckout(AbstractBuild build, Launcher launcher, BuildListener li
204204
SSHUserPrivateKey.class,
205205
build
206206
);
207+
CredentialsProvider.track(build, c);
207208
if (c == null && !ignoreMissing) {
208209
IOException ioe = new IOException(Messages.SSHAgentBuildWrapper_CredentialsNotFound());
209210
ioe.printStackTrace(listener.fatalError(""));

src/main/java/com/cloudbees/jenkins/plugins/sshagent/SSHAgentStepExecution.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ private void initRemoteAgent() throws IOException {
142142
List<SSHUserPrivateKey> userPrivateKeys = new ArrayList<SSHUserPrivateKey>();
143143
for (String id : new LinkedHashSet<String>(step.getCredentials())) {
144144
final SSHUserPrivateKey c = CredentialsProvider.findCredentialById(id, SSHUserPrivateKey.class, build);
145+
CredentialsProvider.track(build, c);
145146
if (c == null && !step.isIgnoreMissing()) {
146147
listener.fatalError(Messages.SSHAgentBuildWrapper_CredentialsNotFound());
147148
}

src/test/java/com/cloudbees/jenkins/plugins/sshagent/SSHAgentBuildWrapperTest.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
import com.cloudbees.jenkins.plugins.sshcredentials.SSHUserPrivateKey;
44
import com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey;
5+
import com.cloudbees.plugins.credentials.CredentialsProvider;
56
import com.cloudbees.plugins.credentials.CredentialsScope;
67
import com.cloudbees.plugins.credentials.SystemCredentialsProvider;
8+
import hudson.model.Fingerprint;
79
import hudson.model.FreeStyleProject;
810
import hudson.model.Result;
911
import hudson.tasks.Shell;
@@ -13,8 +15,15 @@
1315
import org.junit.Rule;
1416
import org.junit.Test;
1517
import org.jvnet.hudson.test.BuildWatcher;
18+
import org.jvnet.hudson.test.Issue;
1619
import org.jvnet.hudson.test.JenkinsRule;
1720

21+
import static org.hamcrest.CoreMatchers.is;
22+
import static org.hamcrest.MatcherAssert.assertThat;
23+
import static org.hamcrest.core.IsCollectionContaining.hasItem;
24+
import static org.hamcrest.core.IsNull.notNullValue;
25+
import static org.hamcrest.core.IsNull.nullValue;
26+
1827
public class SSHAgentBuildWrapperTest extends SSHAgentBase {
1928

2029
@Rule
@@ -138,4 +147,43 @@ public void sshAgentWithInvalidCredentials() throws Exception {
138147

139148
stopMockSSHServer();
140149
}
150+
151+
@Issue("JENKINS-38830")
152+
@Test
153+
public void testTrackingOfCredential() throws Exception {
154+
startMockSSHServer();
155+
156+
List<String> credentialIds = new ArrayList<String>();
157+
credentialIds.add(CREDENTIAL_ID);
158+
159+
SSHUserPrivateKey key = new BasicSSHUserPrivateKey(CredentialsScope.GLOBAL, credentialIds.get(0), "cloudbees",
160+
new BasicSSHUserPrivateKey.DirectEntryPrivateKeySource(getPrivateKey()), "cloudbees", "test");
161+
SystemCredentialsProvider.getInstance().getCredentials().add(key);
162+
SystemCredentialsProvider.getInstance().save();
163+
164+
Fingerprint fingerprint = CredentialsProvider.getFingerprintOf(key);
165+
assertThat("No fingerprint created until first use", fingerprint, nullValue());
166+
167+
FreeStyleProject job = r.createFreeStyleProject();
168+
169+
SSHAgentBuildWrapper sshAgent = new SSHAgentBuildWrapper(credentialIds, false);
170+
job.getBuildWrappersList().add(sshAgent);
171+
172+
Shell shell = new Shell("set | grep SSH_AUTH_SOCK "
173+
+ "&& ssh-add -l "
174+
+ "&& ssh -o NoHostAuthenticationForLocalhost=yes -o StrictHostKeyChecking=no -p " + getAssignedPort()
175+
+ " -v -l cloudbees " + SSH_SERVER_HOST);
176+
job.getBuildersList().add(shell);
177+
178+
r.assertBuildStatusSuccess(job.scheduleBuild2(0));
179+
180+
fingerprint = CredentialsProvider.getFingerprintOf(key);
181+
assertThat(fingerprint, notNullValue());
182+
assertThat(fingerprint.getJobs(), hasItem(is(job.getFullName())));
183+
Fingerprint.RangeSet rangeSet = fingerprint.getRangeSet(job);
184+
assertThat(rangeSet, notNullValue());
185+
assertThat(rangeSet.includes(job.getLastBuild().getNumber()), is(true));
186+
187+
stopMockSSHServer();
188+
}
141189
}

src/test/java/com/cloudbees/jenkins/plugins/sshagent/SSHAgentStepWorkflowTest.java

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,13 @@
22

33
import com.cloudbees.jenkins.plugins.sshcredentials.SSHUserPrivateKey;
44
import com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey;
5+
import com.cloudbees.plugins.credentials.CredentialsProvider;
56
import com.cloudbees.plugins.credentials.CredentialsScope;
67
import com.cloudbees.plugins.credentials.SystemCredentialsProvider;
8+
import com.cloudbees.plugins.credentials.domains.Domain;
79
import hudson.Util;
10+
import hudson.model.Fingerprint;
11+
import hudson.util.Secret;
812
import org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition;
913
import org.jenkinsci.plugins.workflow.cps.CpsFlowExecution;
1014
import org.jenkinsci.plugins.workflow.job.WorkflowJob;
@@ -15,6 +19,7 @@
1519
import org.junit.Test;
1620
import org.junit.runners.model.Statement;
1721
import org.jvnet.hudson.test.BuildWatcher;
22+
import org.jvnet.hudson.test.Issue;
1823
import org.jvnet.hudson.test.JenkinsRule;
1924
import org.jvnet.hudson.test.RestartableJenkinsRule;
2025

@@ -24,6 +29,10 @@
2429
import java.util.regex.Matcher;
2530
import java.util.regex.Pattern;
2631

32+
import static org.hamcrest.CoreMatchers.is;
33+
import static org.hamcrest.core.IsCollectionContaining.hasItem;
34+
import static org.hamcrest.core.IsNull.notNullValue;
35+
import static org.hamcrest.core.IsNull.nullValue;
2736
import static org.junit.Assert.*;
2837

2938
public class SSHAgentStepWorkflowTest extends SSHAgentBase {
@@ -141,4 +150,45 @@ public void evaluate() throws Throwable {
141150

142151
}
143152

153+
@Issue("JENKINS-38830")
154+
@Test
155+
public void testTrackingOfCredential() {
156+
157+
158+
story.addStep(new Statement() {
159+
@Override
160+
public void evaluate() throws Throwable {
161+
startMockSSHServer();
162+
163+
List<String> credentialIds = new ArrayList<String>();
164+
credentialIds.add(CREDENTIAL_ID);
165+
166+
SSHUserPrivateKey key = new BasicSSHUserPrivateKey(CredentialsScope.GLOBAL, credentialIds.get(0), "cloudbees",
167+
new BasicSSHUserPrivateKey.DirectEntryPrivateKeySource(getPrivateKey()), "cloudbees", "test");
168+
SystemCredentialsProvider.getInstance().getCredentials().add(key);
169+
SystemCredentialsProvider.getInstance().save();
170+
171+
Fingerprint fingerprint = CredentialsProvider.getFingerprintOf(key);
172+
173+
WorkflowJob job = story.j.jenkins.createProject(WorkflowJob.class, "sshAgentAvailable");
174+
job.setDefinition(new CpsFlowDefinition(""
175+
+ "node {\n"
176+
+ " sshagent (credentials: ['" + CREDENTIAL_ID + "']) {\n"
177+
+ " sh 'ls -l $SSH_AUTH_SOCK && ssh -o StrictHostKeyChecking=no -p " + getAssignedPort() + " -v -l cloudbees " + SSH_SERVER_HOST + "'\n"
178+
+ " }\n"
179+
+ "}\n", true)
180+
);
181+
182+
assertThat("No fingerprint created until first use", fingerprint, nullValue());
183+
184+
story.j.assertBuildStatusSuccess(job.scheduleBuild2(0));
185+
186+
fingerprint = CredentialsProvider.getFingerprintOf(key);
187+
assertThat(fingerprint, notNullValue());
188+
assertThat(fingerprint.getJobs(), hasItem(is(job.getFullName())));
189+
190+
stopMockSSHServer();
191+
}
192+
});
193+
}
144194
}

0 commit comments

Comments
 (0)