|
27 | 27 | import com.cloudbees.plugins.credentials.CredentialsScope;
|
28 | 28 | import com.cloudbees.plugins.credentials.SecretBytes;
|
29 | 29 | import com.cloudbees.plugins.credentials.domains.Domain;
|
| 30 | +import hudson.Launcher; |
30 | 31 | import hudson.model.FileParameterValue;
|
31 | 32 | import hudson.model.Result;
|
32 | 33 | import hudson.tools.ToolProperty;
|
|
35 | 36 | import java.util.logging.Level;
|
36 | 37 |
|
37 | 38 | import hudson.util.VersionNumber;
|
| 39 | +import java.io.IOException; |
| 40 | +import java.util.Set; |
38 | 41 | import org.apache.commons.fileupload.FileItem;
|
39 | 42 | import org.apache.commons.io.FileUtils;
|
40 | 43 | import org.hamcrest.Matchers;
|
|
48 | 51 | import org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition;
|
49 | 52 | import org.jenkinsci.plugins.workflow.job.WorkflowJob;
|
50 | 53 | import org.jenkinsci.plugins.workflow.job.WorkflowRun;
|
| 54 | +import org.jenkinsci.plugins.workflow.steps.Step; |
51 | 55 | import org.jenkinsci.plugins.workflow.steps.StepConfigTester;
|
| 56 | +import org.jenkinsci.plugins.workflow.steps.StepContext; |
| 57 | +import org.jenkinsci.plugins.workflow.steps.StepDescriptor; |
| 58 | +import org.jenkinsci.plugins.workflow.steps.StepExecution; |
| 59 | +import org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution; |
52 | 60 | import org.jenkinsci.plugins.workflow.test.steps.SemaphoreStep;
|
53 | 61 | import org.junit.Assume;
|
54 | 62 | import org.junit.ClassRule;
|
|
61 | 69 | import org.jvnet.hudson.test.Issue;
|
62 | 70 | import org.jvnet.hudson.test.LoggerRule;
|
63 | 71 | import org.jvnet.hudson.test.RestartableJenkinsRule;
|
| 72 | +import org.jvnet.hudson.test.TestExtension; |
| 73 | +import org.kohsuke.stapler.DataBoundConstructor; |
64 | 74 |
|
65 | 75 | public class WithContainerStepTest {
|
66 | 76 |
|
@@ -299,4 +309,47 @@ public class WithContainerStepTest {
|
299 | 309 | });
|
300 | 310 | }
|
301 | 311 |
|
| 312 | + @Ignore("TODO reproducible") |
| 313 | + @Issue("JENKINS-56674") |
| 314 | + @Test public void envMasking() { |
| 315 | + story.then(r -> { |
| 316 | + DockerTestUtil.assumeDocker(); |
| 317 | + WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p"); |
| 318 | + p.setDefinition(new CpsFlowDefinition( |
| 319 | + "node {\n" + |
| 320 | + " withDockerContainer('ubuntu') {\n" + |
| 321 | + " stepWithLauncher()\n" + |
| 322 | + " }\n" + |
| 323 | + "}", true)); |
| 324 | + WorkflowRun b = story.j.assertBuildStatusSuccess(p.scheduleBuild2(0)); |
| 325 | + story.j.assertLogContains("hello from some step", b); |
| 326 | + story.j.assertLogNotContains("s3cr3t", b); |
| 327 | + }); |
| 328 | + } |
| 329 | + public static final class StepWithLauncher extends Step { |
| 330 | + @DataBoundConstructor public StepWithLauncher() {} |
| 331 | + @Override public StepExecution start(StepContext context) throws Exception { |
| 332 | + return new Execution(context); |
| 333 | + } |
| 334 | + private static final class Execution extends SynchronousNonBlockingStepExecution<Void> { |
| 335 | + Execution(StepContext context) { |
| 336 | + super(context); |
| 337 | + } |
| 338 | + @Override protected Void run() throws Exception { |
| 339 | + if (getContext().get(Launcher.class).launch().envs("SENSITIVE=s3cr3t").cmds("echo", "hello", "from", "some", "step").join() != 0) { |
| 340 | + throw new IOException("failed to run echo"); |
| 341 | + } |
| 342 | + return null; |
| 343 | + } |
| 344 | + } |
| 345 | + @TestExtension("envMasking") public static final class DescriptorImpl extends StepDescriptor { |
| 346 | + @Override public String getFunctionName() { |
| 347 | + return "stepWithLauncher"; |
| 348 | + } |
| 349 | + @Override public Set<? extends Class<?>> getRequiredContext() { |
| 350 | + return Collections.singleton(Launcher.class); |
| 351 | + } |
| 352 | + } |
| 353 | + } |
| 354 | + |
302 | 355 | }
|
0 commit comments