Skip to content

Commit 1b62a44

Browse files
author
Girondel Etienne
committed
Enable Additional Docker Run Arguments
1 parent 19b84d6 commit 1b62a44

File tree

10 files changed

+107
-8
lines changed

10 files changed

+107
-8
lines changed

src/main/java/org/jenkinsci/plugins/docker/workflow/WithContainerStep.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import org.jenkinsci.plugins.docker.commons.tools.DockerTool;
5656
import org.jenkinsci.plugins.docker.workflow.client.DockerClient;
5757
import org.jenkinsci.plugins.docker.workflow.client.WindowsDockerClient;
58+
import org.jenkinsci.plugins.docker.workflow.declarative.DeclarativeDockerUtils;
5859
import org.jenkinsci.plugins.workflow.steps.AbstractStepDescriptorImpl;
5960
import org.jenkinsci.plugins.workflow.steps.AbstractStepExecutionImpl;
6061
import org.jenkinsci.plugins.workflow.steps.AbstractStepImpl;
@@ -197,7 +198,8 @@ public Execution() {
197198
}
198199

199200
String command = launcher.isUnix() ? "cat" : "cmd.exe";
200-
container = dockerClient.run(env, step.image, step.args, ws, volumes, volumesFromContainers, envReduced, dockerClient.whoAmI(), /* expected to hang until killed */ command);
201+
String args = (DeclarativeDockerUtils.getAdditionalRunArgs() + " " + Util.fixNull(step.args)).trim();
202+
container = dockerClient.run(env, step.image, args, ws, volumes, volumesFromContainers, envReduced, dockerClient.whoAmI(), /* expected to hang until killed */ command);
201203
final List<String> ps = dockerClient.listProcess(env, container);
202204
if (!ps.contains(command)) {
203205
listener.error(

src/main/java/org/jenkinsci/plugins/docker/workflow/declarative/DeclarativeDockerUtils.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,27 @@ public static String getLabel(@Nullable String override) {
8585
return null;
8686
}
8787

88+
@Whitelisted
89+
public static String getAdditionalRunArgs() {
90+
return getAdditionalRunArgs(null);
91+
}
92+
93+
@Whitelisted
94+
public static String getAdditionalRunArgs(@Nullable String override) {
95+
if (!StringUtils.isBlank(override)) {
96+
return override;
97+
} else {
98+
Run<?,?> r = currentRun();
99+
for (DockerPropertiesProvider provider : DockerPropertiesProvider.all()) {
100+
String additionalRunArgs = provider.getAdditionalRunArgs(r);
101+
if (!StringUtils.isBlank(additionalRunArgs)) {
102+
return additionalRunArgs;
103+
}
104+
}
105+
}
106+
return "";
107+
}
108+
88109
@Whitelisted
89110
public static WithScriptScript<?> getLabelScript(AbstractDockerAgent<?> describable, CpsScript script) throws Exception {
90111
String targetLabel = getLabel(describable.getLabel());

src/main/java/org/jenkinsci/plugins/docker/workflow/declarative/DockerPropertiesProvider.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ public abstract class DockerPropertiesProvider implements ExtensionPoint {
4444
@CheckForNull
4545
public abstract String getLabel(@Nullable Run run);
4646

47+
@CheckForNull
48+
public abstract String getAdditionalRunArgs(@Nullable Run run);
49+
4750
public static ExtensionList<DockerPropertiesProvider> all() {
4851
return ExtensionList.lookup(DockerPropertiesProvider.class);
4952
}

src/main/java/org/jenkinsci/plugins/docker/workflow/declarative/FolderConfig.java

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import edu.umd.cs.findbugs.annotations.NonNull;
3232
import edu.umd.cs.findbugs.annotations.Nullable;
3333
import hudson.Extension;
34+
import hudson.Util;
3435
import hudson.model.Item;
3536
import hudson.model.ItemGroup;
3637
import hudson.model.Items;
@@ -47,6 +48,7 @@
4748
*/
4849
public class FolderConfig extends AbstractFolderProperty<AbstractFolder<?>> {
4950
private String dockerLabel;
51+
private String additionalRunArgs;
5052
private DockerRegistryEndpoint registry;
5153

5254
@DataBoundConstructor
@@ -60,20 +62,30 @@ public FolderConfig() {
6062
* @param url The registry URL
6163
* @param creds the registry credentials ID
6264
*/
63-
public FolderConfig(String dockerLabel, String url, String creds) {
65+
public FolderConfig(String dockerLabel, String additionalRunArgs, String url, String creds) {
6466
this.dockerLabel = dockerLabel;
67+
this.additionalRunArgs = additionalRunArgs;
6568
this.registry = new DockerRegistryEndpoint(url, creds);
6669
}
6770

6871
public String getDockerLabel() {
6972
return dockerLabel;
7073
}
7174

75+
public String getAdditionalRunArgs() {
76+
return Util.fixNull(additionalRunArgs);
77+
}
78+
7279
@DataBoundSetter
7380
public void setDockerLabel(String dockerLabel) {
7481
this.dockerLabel = dockerLabel;
7582
}
7683

84+
@DataBoundSetter
85+
public void setAdditionalRunArgs(String additionalArgs) {
86+
this.additionalRunArgs = additionalArgs;
87+
}
88+
7789
public DockerRegistryEndpoint getRegistry() {
7890
return registry;
7991
}
@@ -128,6 +140,34 @@ public String getLabel(@Nullable Run run) {
128140
return null;
129141
}
130142

143+
@Override
144+
public String getAdditionalRunArgs(@Nullable Run run) {
145+
if (run != null) {
146+
Job job = run.getParent();
147+
ItemGroup parent = job.getParent();
148+
while (parent != null) {
149+
150+
if (parent instanceof AbstractFolder) {
151+
AbstractFolder folder = (AbstractFolder) parent;
152+
FolderConfig config = (FolderConfig) folder.getProperties().get(FolderConfig.class);
153+
if (config != null) {
154+
String additionalRunArgs = config.getAdditionalRunArgs();
155+
if (!StringUtils.isBlank(additionalRunArgs)) {
156+
return additionalRunArgs;
157+
}
158+
}
159+
}
160+
161+
if (parent instanceof Item) {
162+
parent = ((Item) parent).getParent();
163+
} else {
164+
parent = null;
165+
}
166+
}
167+
}
168+
return "";
169+
}
170+
131171
@Override
132172
public String getRegistryUrl(@Nullable Run run) {
133173
if (run != null) {

src/main/java/org/jenkinsci/plugins/docker/workflow/declarative/GlobalConfig.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ public class GlobalConfig extends GlobalConfiguration {
5757
private static final Logger LOGGER = Logger.getLogger(GlobalConfig.class.getName());
5858

5959
private String dockerLabel;
60+
private String additionalRunArgs;
6061
private DockerRegistryEndpoint registry;
6162

6263
public GlobalConfig() {
@@ -79,11 +80,20 @@ public String getDockerLabel() {
7980
return Util.fixEmpty(dockerLabel);
8081
}
8182

83+
public String getAdditionalRunArgs() {
84+
return Util.fixNull(additionalRunArgs);
85+
}
86+
8287
@DataBoundSetter
8388
public void setDockerLabel(String dockerLabel) {
8489
this.dockerLabel = dockerLabel;
8590
}
8691

92+
@DataBoundSetter
93+
public void setAdditionalRunArgs(String additionalRunArgs) {
94+
this.additionalRunArgs = additionalRunArgs;
95+
}
96+
8797
public DockerRegistryEndpoint getRegistry() {
8898
return registry;
8999
}
@@ -114,6 +124,11 @@ public String getLabel(@Nullable Run run) {
114124
return config.getDockerLabel();
115125
}
116126

127+
@Override
128+
public String getAdditionalRunArgs(@Nullable Run run) {
129+
return config.getAdditionalRunArgs();
130+
}
131+
117132
@Override
118133
public String getRegistryUrl(@Nullable Run run) {
119134
if (config.getRegistry() != null && !StringUtils.isBlank(config.getRegistry().getUrl())) {

src/main/resources/org/jenkinsci/plugins/docker/workflow/declarative/FolderConfig/config.groovy

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,7 @@ def f = namespace(lib.FormTagLib)
3131
f.entry(field: "dockerLabel", title: _("Docker Label")) {
3232
f.textbox()
3333
}
34+
f.entry(field: "additionalRunArgs", title:_("Docker Additional Run Arguments")) {
35+
f.textbox()
36+
}
3437
f.property(field: "registry")

src/main/resources/org/jenkinsci/plugins/docker/workflow/declarative/GlobalConfig/config.groovy

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,8 @@ f.section(title:_("Declarative Pipeline (Docker)")) {
3232
f.entry(field: "dockerLabel", title:_("Docker Label")) {
3333
f.textbox()
3434
}
35+
f.entry(field: "additionalRunArgs", title:_("Docker Additional Run Arguments")) {
36+
f.textbox()
37+
}
3538
f.property(field: "registry")
3639
}

src/test/java/org/jenkinsci/plugins/docker/workflow/declarative/DeclarativeDockerUtilsTest.java

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,10 @@ public void plainSystemConfig() throws Exception {
8282
Assume.assumeFalse("Fails using the version of Git installed on the Windows ACI agents on ci.jenkins.io", Functions.isWindows());
8383
GlobalConfig.get().setDockerLabel("config_docker");
8484
GlobalConfig.get().setRegistry(new DockerRegistryEndpoint("https://docker.registry", globalCred.getId()));
85+
GlobalConfig.get().setAdditionalRunArgs("-v /tmp:/tmptest:ro,z");
8586
expect("org/jenkinsci/plugins/docker/workflow/declarative/declarativeDockerConfig")
8687
.logContains("Docker Label is: config_docker",
88+
"Docker Run Additional Arguments are: -v /tmp:/tmptest:ro,z",
8789
"Registry URL is: https://docker.registry",
8890
"Registry Creds ID is: " + globalCred.getId()).go();
8991
}
@@ -100,11 +102,12 @@ public void testExtensionOrdinal() {
100102
public void directParent() throws Exception {
101103
Folder folder = j.createProject(Folder.class);
102104
getFolderStore(folder).addCredentials(Domain.global(), folderCred);
103-
folder.addProperty(new FolderConfig("folder_docker", "https://folder.registry", folderCred.getId()));
105+
folder.addProperty(new FolderConfig("folder_docker", "", "https://folder.registry", folderCred.getId()));
104106
expect("org/jenkinsci/plugins/docker/workflow/declarative/declarativeDockerConfig")
105107
.inFolder(folder)
106108
.runFromRepo(false)
107109
.logContains("Docker Label is: folder_docker",
110+
"Docker Run Additional Arguments are: ",
108111
"Registry URL is: https://folder.registry",
109112
"Registry Creds ID is: " + folderCred.getId()).go();
110113
}
@@ -114,29 +117,33 @@ public void withDefaults() throws Exception {
114117
Folder folder = j.createProject(Folder.class);
115118
getFolderStore(folder).addCredentials(Domain.global(), folderCred);
116119
getFolderStore(folder).addCredentials(Domain.global(), grandParentCred);
117-
folder.addProperty(new FolderConfig("folder_docker", "https://folder.registry", folderCred.getId()));
120+
folder.addProperty(new FolderConfig("folder_docker", "", "https://folder.registry", folderCred.getId()));
118121
expect("org/jenkinsci/plugins/docker/workflow/declarative/declarativeDockerConfigWithOverride")
119122
.inFolder(folder)
120123
.runFromRepo(false)
121124
.logContains("Docker Label is: other-label",
125+
"Docker Run Additional Arguments are: ",
122126
"Registry URL is: https://other.registry",
123127
"Registry Creds ID is: " + grandParentCred.getId()).go();
124128
}
125129

126130
@Test
127131
public void directParentNotSystem() throws Exception {
128132
GlobalConfig.get().setDockerLabel("config_docker");
133+
GlobalConfig.get().setAdditionalRunArgs("-v /tmp:/tmp1:ro,z");
129134
GlobalConfig.get().setRegistry(new DockerRegistryEndpoint("https://docker.registry", globalCred.getId()));
130135
Folder folder = j.createProject(Folder.class);
131136
getFolderStore(folder).addCredentials(Domain.global(), folderCred);
132-
folder.addProperty(new FolderConfig("folder_docker", "https://folder.registry", folderCred.getId()));
137+
folder.addProperty(new FolderConfig("folder_docker", "-v /tmp:/tmp2:ro,z", "https://folder.registry", folderCred.getId()));
133138
expect("org/jenkinsci/plugins/docker/workflow/declarative/declarativeDockerConfig")
134139
.inFolder(folder)
135140
.runFromRepo(false)
136141
.logContains("Docker Label is: folder_docker",
142+
"Docker Run Additional Arguments are: -v /tmp:/tmp2:ro,z",
137143
"Registry URL is: https://folder.registry",
138144
"Registry Creds ID is: " + folderCred.getId())
139145
.logNotContains("Docker Label is: config_docker",
146+
"Docker Run Additional Arguments are: -v /tmp:/tmp1:ro,z",
140147
"Registry URL is: https://docker.registry",
141148
"Registry Creds ID is: " + globalCred.getId()).go();
142149
}
@@ -145,12 +152,13 @@ public void directParentNotSystem() throws Exception {
145152
public void grandParent() throws Exception {
146153
Folder grandParent = j.createProject(Folder.class);
147154
getFolderStore(grandParent).addCredentials(Domain.global(), grandParentCred);
148-
grandParent.addProperty(new FolderConfig("parent_docker", "https://parent.registry", grandParentCred.getId()));
155+
grandParent.addProperty(new FolderConfig("parent_docker", "", "https://parent.registry", grandParentCred.getId()));
149156
Folder parent = grandParent.createProject(Folder.class, "testParent"); //Can be static since grandParent should be unique
150157
expect("org/jenkinsci/plugins/docker/workflow/declarative/declarativeDockerConfig")
151158
.inFolder(parent)
152159
.runFromRepo(false)
153160
.logContains("Docker Label is: parent_docker",
161+
"Docker Run Additional Arguments are: ",
154162
"Registry URL is: https://parent.registry",
155163
"Registry Creds ID is: " + grandParentCred.getId()).go();
156164
}
@@ -159,18 +167,20 @@ public void grandParent() throws Exception {
159167
public void grandParentOverride() throws Exception {
160168
Folder grandParent = j.createProject(Folder.class);
161169
getFolderStore(grandParent).addCredentials(Domain.global(), grandParentCred);
162-
grandParent.addProperty(new FolderConfig("parent_docker", "https://parent.registry", grandParentCred.getId()));
170+
grandParent.addProperty(new FolderConfig("parent_docker", "-v /tmp:/tmp1:ro,z", "https://parent.registry", grandParentCred.getId()));
163171
Folder parent = grandParent.createProject(Folder.class, "testParent"); //Can be static since grandParent should be unique
164172
getFolderStore(parent).addCredentials(Domain.global(), folderCred);
165-
parent.addProperty(new FolderConfig("folder_docker", "https://folder.registry", folderCred.getId()));
173+
parent.addProperty(new FolderConfig("folder_docker", "-v /tmp:/tmp2:ro,z", "https://folder.registry", folderCred.getId()));
166174

167175
expect("org/jenkinsci/plugins/docker/workflow/declarative/declarativeDockerConfig")
168176
.inFolder(parent)
169177
.runFromRepo(false)
170178
.logContains("Docker Label is: folder_docker",
179+
"Docker Run Additional Arguments are: -v /tmp:/tmp2:ro,z",
171180
"Registry URL is: https://folder.registry",
172181
"Registry Creds ID is: " + folderCred.getId())
173182
.logNotContains("Docker Label is: parent_docker",
183+
"Docker Run Additional Arguments are: -v /tmp:/tmp1:ro,z",
174184
"Registry URL is: https://parent.registry",
175185
"Registry Creds ID is: " + grandParentCred.getId()).go();
176186
}

src/test/resources/org/jenkinsci/plugins/docker/workflow/declarative/declarativeDockerConfig.groovy

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,6 @@ import org.jenkinsci.plugins.docker.workflow.declarative.DeclarativeDockerUtils
2626

2727

2828
echo "Docker Label is: ${DeclarativeDockerUtils.getLabel()}"
29+
echo "Docker Run Additional Arguments are: ${DeclarativeDockerUtils.getAdditionalRunArgs()}"
2930
echo "Registry URL is: ${DeclarativeDockerUtils.getRegistryUrl()}"
3031
echo "Registry Creds ID is: ${DeclarativeDockerUtils.getRegistryCredentialsId()}"

src/test/resources/org/jenkinsci/plugins/docker/workflow/declarative/declarativeDockerConfigWithOverride.groovy

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,6 @@
2525
import org.jenkinsci.plugins.docker.workflow.declarative.DeclarativeDockerUtils
2626

2727
echo "Docker Label is: ${DeclarativeDockerUtils.getLabel('other-label')}"
28+
echo "Docker Run Additional Arguments are: ${DeclarativeDockerUtils.getAdditionalRunArgs()}"
2829
echo "Registry URL is: ${DeclarativeDockerUtils.getRegistryUrl('https://other.registry')}"
2930
echo "Registry Creds ID is: ${DeclarativeDockerUtils.getRegistryCredentialsId('grandParentCreds')}"

0 commit comments

Comments
 (0)