diff --git a/src/main/java/org/jenkinsci/plugins/dockerbuildstep/DockerEnvContributor.java b/src/main/java/org/jenkinsci/plugins/dockerbuildstep/DockerEnvContributor.java index 989fb5b..52636e0 100644 --- a/src/main/java/org/jenkinsci/plugins/dockerbuildstep/DockerEnvContributor.java +++ b/src/main/java/org/jenkinsci/plugins/dockerbuildstep/DockerEnvContributor.java @@ -8,9 +8,13 @@ import java.io.IOException; import java.util.List; +import java.util.Map; import org.jenkinsci.plugins.dockerbuildstep.action.EnvInvisibleAction; +import com.github.dockerjava.client.model.ExposedPort; +import com.github.dockerjava.client.model.Ports.Binding; + /** * This contributor adds various Docker relate variable like container IDs or IP addresses into build environment * variables. @@ -22,6 +26,10 @@ public class DockerEnvContributor extends EnvironmentContributor { public final String ID_SEPARATOR = ","; + public final String CONTAINER_IDS_ENV_VAR = "DOCKER_CONTAINER_IDS"; + public final String CONTAINER_IP_PREFIX = "DOCKER_IP_"; + public final String PORT_BINDINGS_ENV_VAR = "DOCKER_HOST_BIND_PORTS"; + public final String PORT_BINDING_PREFIX = "DOCKER_HOST_PORT_"; @Override public void buildEnvironmentFor(@SuppressWarnings("rawtypes") Run r, EnvVars envs, TaskListener listener) @@ -32,17 +40,31 @@ public void buildEnvironmentFor(@SuppressWarnings("rawtypes") Run r, EnvVars env return; } - String containerIds = envs.get("DOCKER_CONTAINER_IDS", ""); + String containerIds = envs.get(CONTAINER_IDS_ENV_VAR, ""); if (!containerIds.equals("")) { containerIds.concat(ID_SEPARATOR); } for (EnvInvisibleAction action : envActions) { containerIds = containerIds.concat(action.getId()).concat(ID_SEPARATOR); - envs.put("DOCKER_IP_" + action.getHostName(), action.getIpAddress()); + envs.put(CONTAINER_IP_PREFIX + action.getHostName(), action.getIpAddress()); + exportPortBindings(envs, action.getPortBindings()); } + containerIds = containerIds.substring(0, containerIds.length() - 1); - envs.put("DOCKER_CONTAINER_IDS", containerIds); + envs.put(CONTAINER_IDS_ENV_VAR, containerIds); + + } + private void exportPortBindings(EnvVars envs, Map bindings) { + StringBuilder ports = new StringBuilder(); + for (ExposedPort hostPort : bindings.keySet()) { + ports.append(hostPort.toString()).append(ID_SEPARATOR); + envs.put(PORT_BINDING_PREFIX + hostPort.getScheme().toUpperCase() + "_" + hostPort.getPort(), + Integer.toString(bindings.get(hostPort).getHostPort())); + } + String bindPorts = ports.substring(0, ports.length() - 1).toString(); + envs.put(PORT_BINDINGS_ENV_VAR, bindPorts); } + } diff --git a/src/main/java/org/jenkinsci/plugins/dockerbuildstep/action/EnvInvisibleAction.java b/src/main/java/org/jenkinsci/plugins/dockerbuildstep/action/EnvInvisibleAction.java index b83581d..bb69092 100644 --- a/src/main/java/org/jenkinsci/plugins/dockerbuildstep/action/EnvInvisibleAction.java +++ b/src/main/java/org/jenkinsci/plugins/dockerbuildstep/action/EnvInvisibleAction.java @@ -2,10 +2,14 @@ import hudson.model.InvisibleAction; +import java.util.Map; + import org.jenkinsci.plugins.dockerbuildstep.DockerEnvContributor; import org.jenkinsci.plugins.dockerbuildstep.cmd.DockerCommand; import com.github.dockerjava.client.model.ContainerInspectResponse; +import com.github.dockerjava.client.model.ExposedPort; +import com.github.dockerjava.client.model.Ports.Binding; /** * Helper invisible action which is used for exchanging information between {@link DockerCommand}s and other object like @@ -46,5 +50,9 @@ public String getHostName() { public String getIpAddress() { return containerInfo.getNetworkSettings().getIpAddress(); } + + public Map getPortBindings() { + return containerInfo.getNetworkSettings().getPorts().getBindings(); + } }