Skip to content

Commit 58972d1

Browse files
authored
Merge pull request #198 from mikecirioli/JENKINS-71789
[JENKINS-71789] Enable ${variable} support for email and cc fields
2 parents 8835ed6 + 70df3e1 commit 58972d1

File tree

2 files changed

+41
-3
lines changed

2 files changed

+41
-3
lines changed

src/main/java/com/cloudbees/jenkins/plugins/advisor/casc/AdvisorRootConfigurator.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import io.jenkins.plugins.casc.ConfigurationContext;
1111
import io.jenkins.plugins.casc.ConfiguratorException;
1212
import io.jenkins.plugins.casc.RootElementConfigurator;
13+
import io.jenkins.plugins.casc.SecretSourceResolver;
1314
import io.jenkins.plugins.casc.model.CNode;
1415
import io.jenkins.plugins.casc.model.Mapping;
1516
import io.jenkins.plugins.casc.model.Scalar;
@@ -56,7 +57,10 @@ public String getDisplayName() {
5657
protected AdvisorGlobalConfiguration instance(Mapping mapping, ConfigurationContext configurationContext)
5758
throws ConfiguratorException {
5859
// Scalar values
59-
final String email = (mapping.get(EMAIL_ATTR) != null ? mapping.getScalarValue(EMAIL_ATTR) : StringUtils.EMPTY);
60+
final String email = configurationContext
61+
.getSecretSourceResolver()
62+
.resolve((mapping.get(EMAIL_ATTR) != null ? mapping.getScalarValue(EMAIL_ATTR) : StringUtils.EMPTY));
63+
6064
final boolean nagDisabled = (mapping.get(NAG_DISABLED_ATTR) != null
6165
&& BooleanUtils.toBoolean(mapping.getScalarValue(NAG_DISABLED_ATTR)));
6266
final boolean acceptToS = (mapping.get(ACCEPT_TOS_ATTR) != null
@@ -69,7 +73,9 @@ protected AdvisorGlobalConfiguration instance(Mapping mapping, ConfigurationCont
6973
if (ccCN instanceof Sequence) {
7074
Sequence s = (Sequence) ccCN;
7175
for (CNode cNode : s) {
72-
cc.add(new Recipient(cNode.asScalar().getValue()));
76+
cc.add(new Recipient(configurationContext
77+
.getSecretSourceResolver()
78+
.resolve(cNode.asScalar().getValue())));
7379
}
7480
// We don't want to process it anymore because the mapping in YAML
7581
// doesn't map the objects model (List<String> vs List<Recipient>
@@ -151,13 +157,15 @@ public CNode describe(AdvisorGlobalConfiguration instance, ConfigurationContext
151157
mapping.put(ACCEPT_TOS_ATTR, attribute.describe(instance, context));
152158
break;
153159
case EMAIL_ATTR:
154-
mapping.put(EMAIL_ATTR, attribute.describe(instance, context));
160+
mapping.put(EMAIL_ATTR, String.valueOf(attribute.describe(instance, context)));
155161
break;
156162
case CCS_ATTR:
157163
// We build it manually because we don't want to expose the Bean model
164+
SecretSourceResolver r = context.getSecretSourceResolver();
158165
Sequence ccs = new Sequence();
159166
instance.getCcs().stream()
160167
.map(Recipient::getEmail)
168+
.map(r::encode)
161169
.map(Scalar::new)
162170
.forEach(ccs::add);
163171
if (!ccs.isEmpty()) {

src/test/java/com/cloudbees/jenkins/plugins/advisor/casc/AdvisorRootConfiguratorTest.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import static org.hamcrest.MatcherAssert.assertThat;
99
import static org.hamcrest.Matchers.arrayContainingInAnyOrder;
1010
import static org.hamcrest.Matchers.contains;
11+
import static org.hamcrest.Matchers.equalTo;
1112
import static org.junit.Assert.assertEquals;
1213
import static org.junit.Assert.assertFalse;
1314
import static org.junit.Assert.assertNotNull;
@@ -32,6 +33,7 @@
3233
import org.junit.ClassRule;
3334
import org.junit.Rule;
3435
import org.junit.Test;
36+
import org.junit.contrib.java.lang.system.EnvironmentVariables;
3537
import org.junit.rules.ExpectedException;
3638
import org.jvnet.hudson.test.JenkinsRule;
3739

@@ -50,6 +52,9 @@ public class AdvisorRootConfiguratorTest {
5052
@Rule
5153
public final ExpectedException thrown = ExpectedException.none();
5254

55+
@Rule
56+
public final EnvironmentVariables environment = new EnvironmentVariables();
57+
5358
private AdvisorRootConfigurator configurator;
5459
private AdvisorGlobalConfiguration configuration;
5560
private Mapping mapping;
@@ -159,6 +164,31 @@ public void testDescribeWithBlankEmail() throws Exception {
159164
assertTrue(described.isEmpty());
160165
}
161166

167+
@Test
168+
public void testDescribeWithVarialbeValue() throws Exception {
169+
List<Recipient> cc_with_var = Arrays.asList(new Recipient("${admin_cc}"), new Recipient("${admin_cc}"));
170+
final AdvisorGlobalConfiguration c = new AdvisorGlobalConfiguration("${admin_email}", cc_with_var, EXCLUDED);
171+
c.setAcceptToS(ACCEPT_TOS);
172+
c.setNagDisabled(NAG_DISABLED);
173+
174+
Mapping described = configurator.describe(c, context).asMapping();
175+
assertNotNull(described);
176+
String email = described.getScalarValue(EMAIL_ATTR);
177+
178+
assertEquals("^${admin_email}", email);
179+
assertTrue(
180+
"encoded email cc not found in list",
181+
toListValues(described.get(CCS_ATTR).asSequence()).stream().anyMatch(cc -> cc.equals("^${admin_cc}")));
182+
}
183+
184+
@Test
185+
public void testResolveWithVariableName() throws Exception {
186+
ConfiguratorRegistry registry = ConfiguratorRegistry.get();
187+
context = new ConfigurationContext(registry);
188+
environment.set("admin_email", "[email protected]");
189+
assertThat(context.getSecretSourceResolver().resolve("${admin_email}"), equalTo("[email protected]"));
190+
}
191+
162192
@Test
163193
public void testDescribeWithEmptyCC() throws Exception {
164194
final AdvisorGlobalConfiguration c =

0 commit comments

Comments
 (0)