From ff995f2ab7d59baee28d00ba37236cbebbf8f6af Mon Sep 17 00:00:00 2001 From: Lars Fronius Date: Tue, 3 Sep 2019 13:09:58 +0200 Subject: [PATCH 1/4] adds configuration element for tunnel for JNLP agent --- .../jenkins/codebuilder/CodeBuilderCloud.java | 20 +++++++++++++- .../codebuilder/CodeBuilderLauncher.java | 27 ++++++++++++++++--- .../codebuilder/CodeBuilderCloud/config.jelly | 4 +++ 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/src/main/java/dev/lsegal/jenkins/codebuilder/CodeBuilderCloud.java b/src/main/java/dev/lsegal/jenkins/codebuilder/CodeBuilderCloud.java index 39ba04f..0bf59a4 100644 --- a/src/main/java/dev/lsegal/jenkins/codebuilder/CodeBuilderCloud.java +++ b/src/main/java/dev/lsegal/jenkins/codebuilder/CodeBuilderCloud.java @@ -42,6 +42,7 @@ import hudson.slaves.Cloud; import hudson.slaves.NodeProvisioner; import hudson.slaves.NodeProvisioner.PlannedNode; + import hudson.util.ListBoxModel; import jenkins.model.Jenkins; import jenkins.model.JenkinsLocationConfiguration; @@ -79,6 +80,10 @@ public class CodeBuilderCloud extends Cloud { private String jenkinsUrl; private String jnlpImage; private String jnlpCommand; + + @CheckForNull + private String tunnel; + private int agentTimeout; private transient AWSCodeBuild client; @@ -187,6 +192,8 @@ public void setLabel(String label) { this.label = label; } + + /** * Getter for the field jenkinsUrl. * @@ -260,6 +267,15 @@ public void setJnlpImage(String jnlpImage) { this.jnlpImage = jnlpImage; } + public String getTunnel() { + return tunnel; + } + + @DataBoundSetter + public void setTunnel(String tunnel) { + this.tunnel = tunnel; + } + /** * Getter for the field agentTimeout. * @@ -375,7 +391,7 @@ public synchronized Collection provision(Label label, int excessWor final String displayName = String.format("%s.cb-%s", projectName, suffix); final CodeBuilderCloud cloud = this; final Future nodeResolver = Computer.threadPoolForRemoting.submit(() -> { - CodeBuilderLauncher launcher = new CodeBuilderLauncher(cloud); + CodeBuilderLauncher launcher = new CodeBuilderLauncher(cloud, tunnel, null); CodeBuilderAgent agent = new CodeBuilderAgent(cloud, displayName, launcher); jenkins().addNode(agent); return agent; @@ -412,6 +428,8 @@ private static String getDefaultRegion() { } } + + @Extension public static class DescriptorImpl extends Descriptor { @Override diff --git a/src/main/java/dev/lsegal/jenkins/codebuilder/CodeBuilderLauncher.java b/src/main/java/dev/lsegal/jenkins/codebuilder/CodeBuilderLauncher.java index 34a9609..16917f9 100644 --- a/src/main/java/dev/lsegal/jenkins/codebuilder/CodeBuilderLauncher.java +++ b/src/main/java/dev/lsegal/jenkins/codebuilder/CodeBuilderLauncher.java @@ -1,6 +1,9 @@ package dev.lsegal.jenkins.codebuilder; import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; import java.util.concurrent.TimeoutException; import javax.annotation.Nonnull; @@ -9,6 +12,8 @@ import com.amazonaws.services.codebuild.model.StartBuildRequest; import com.amazonaws.services.codebuild.model.StartBuildResult; +import com.iwombat.util.StringUtil; +import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -18,6 +23,7 @@ import hudson.slaves.SlaveComputer; import hudson.util.StreamTaskListener; + /** * CodeBuilderLauncher class. * @@ -35,8 +41,8 @@ public class CodeBuilderLauncher extends JNLPLauncher { * * @param cloud a {@link CodeBuilderCloud} object. */ - public CodeBuilderLauncher(CodeBuilderCloud cloud) { - super(); + public CodeBuilderLauncher(CodeBuilderCloud cloud, String tunnel, String vmargs) { + super(tunnel, vmargs); this.cloud = cloud; } @@ -113,8 +119,21 @@ private String buildspec(@Nonnull SlaveComputer computer) { if (n == null) { return ""; } - String cmd = String.format("%s -noreconnect -workDir \"$CODEBUILD_SRC_DIR\" -url \"%s\" \"%s\" \"%s\"", - cloud.getJnlpCommand(), cloud.getJenkinsUrl(), computer.getJnlpMac(), n.getDisplayName()); + Collection command = new ArrayList(Arrays.asList( + "jenkins-agent", + "-noreconnect", + "-workDir", + "\"$CODEBUILD_SRC_DIR\"", + "-url", + String.format("\"%s\"", cloud.getJenkinsUrl()), + String.format("\"%s\"", computer.getJnlpMac()), + String.format("\"%s\"", n.getDisplayName()) + )); + if (StringUtils.isNotBlank(tunnel)) { + command.add("-tunnel"); + command.add(cloud.getTunnel()); + } + String cmd = String.join(" ", command); StringBuilder builder = new StringBuilder(); builder.append("version: 0.2\n"); builder.append("phases:\n"); diff --git a/src/main/resources/dev/lsegal/jenkins/codebuilder/CodeBuilderCloud/config.jelly b/src/main/resources/dev/lsegal/jenkins/codebuilder/CodeBuilderCloud/config.jelly index 90662aa..c4dfa2e 100644 --- a/src/main/resources/dev/lsegal/jenkins/codebuilder/CodeBuilderCloud/config.jelly +++ b/src/main/resources/dev/lsegal/jenkins/codebuilder/CodeBuilderCloud/config.jelly @@ -26,6 +26,10 @@ + + + + From 42d227c7a284d7d809338ef03731b7b6e2cc7c6b Mon Sep 17 00:00:00 2001 From: Lars Fronius Date: Tue, 3 Sep 2019 13:48:04 +0200 Subject: [PATCH 2/4] fix test, adds docs --- .../dev/lsegal/jenkins/codebuilder/CodeBuilderLauncher.java | 2 ++ .../dev/lsegal/jenkins/codebuilder/CodeBuilderCloudTest.java | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/dev/lsegal/jenkins/codebuilder/CodeBuilderLauncher.java b/src/main/java/dev/lsegal/jenkins/codebuilder/CodeBuilderLauncher.java index 16917f9..202e425 100644 --- a/src/main/java/dev/lsegal/jenkins/codebuilder/CodeBuilderLauncher.java +++ b/src/main/java/dev/lsegal/jenkins/codebuilder/CodeBuilderLauncher.java @@ -40,6 +40,8 @@ public class CodeBuilderLauncher extends JNLPLauncher { * Constructor for CodeBuilderLauncher. * * @param cloud a {@link CodeBuilderCloud} object. + * @param tunnel tunnel URL if configured {@link String} + * @param vmargs a {@link String} */ public CodeBuilderLauncher(CodeBuilderCloud cloud, String tunnel, String vmargs) { super(tunnel, vmargs); diff --git a/src/test/java/dev/lsegal/jenkins/codebuilder/CodeBuilderCloudTest.java b/src/test/java/dev/lsegal/jenkins/codebuilder/CodeBuilderCloudTest.java index 76ca36f..a2c59e7 100644 --- a/src/test/java/dev/lsegal/jenkins/codebuilder/CodeBuilderCloudTest.java +++ b/src/test/java/dev/lsegal/jenkins/codebuilder/CodeBuilderCloudTest.java @@ -13,7 +13,7 @@ public class CodeBuilderCloudTest { @Test public void initializes_correctly() throws InterruptedException { - CodeBuilderCloud cloud = new CodeBuilderCloud(null, "project", null, "us-west-2"); + CodeBuilderCloud cloud = new CodeBuilderCloud(null, "project", null, "local"); assertEquals("project", cloud.getProjectName()); assertEquals("codebuilder_0", cloud.getDisplayName()); assertNotNull(cloud.getClient()); From ffb468269c0c6137ae013a5b1c7ee4ceacf4bd84 Mon Sep 17 00:00:00 2001 From: An Nguyen Date: Tue, 2 Feb 2021 16:53:39 +0700 Subject: [PATCH 3/4] fix issue credentials is not loaded --- .gitignore | 2 ++ pom.xml | 6 ++-- .../jenkins/codebuilder/CodeBuilderCloud.java | 29 ++++++++++++++++--- 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 473bec7..50372b8 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,5 @@ /target /work /bin +.idea +*.iml diff --git a/pom.xml b/pom.xml index 6710a48..d9a0b51 100644 --- a/pom.xml +++ b/pom.xml @@ -4,20 +4,20 @@ org.jenkins-ci.plugins plugin - 3.43 + 4.15 dev.lsegal.jenkins codebuilder-cloud - 1.0.2-SNAPSHOT + 1.0.4-SNAPSHOT hpi CodeBuilder: AWS CodeBuild Cloud Agents Dynamically provisions cloud agents using AWS CodeBuild https://wiki.jenkins.io/display/JENKINS/CodeBuilder%3A+AWS+CodeBuild+Cloud+Agents+Plugin - 1.651.3 + 2.270 8 diff --git a/src/main/java/dev/lsegal/jenkins/codebuilder/CodeBuilderCloud.java b/src/main/java/dev/lsegal/jenkins/codebuilder/CodeBuilderCloud.java index 0bf59a4..7cb813a 100644 --- a/src/main/java/dev/lsegal/jenkins/codebuilder/CodeBuilderCloud.java +++ b/src/main/java/dev/lsegal/jenkins/codebuilder/CodeBuilderCloud.java @@ -24,6 +24,10 @@ import com.cloudbees.jenkins.plugins.awscredentials.AWSCredentialsHelper; import com.cloudbees.jenkins.plugins.awscredentials.AmazonWebServicesCredentials; +import com.cloudbees.plugins.credentials.CredentialsMatchers; +import com.cloudbees.plugins.credentials.common.StandardListBoxModel; +import hudson.Util; +import hudson.security.ACL; import org.apache.commons.lang.RandomStringUtils; import org.apache.commons.lang.StringUtils; import org.kohsuke.stapler.DataBoundConstructor; @@ -70,7 +74,7 @@ public class CodeBuilderCloud extends Cloud { private final String projectName; @Nonnull - private final String credentialsId; + private String credentialsId; @Nonnull private final String region; @@ -122,7 +126,7 @@ public CodeBuilderCloud(String name, @Nonnull String projectName, @Nullable Stri */ @Nonnull protected static Jenkins jenkins() { - return Jenkins.getActiveInstance(); + return Jenkins.get(); } /** @@ -192,7 +196,14 @@ public void setLabel(String label) { this.label = label; } + public String getCredentialsId() { + return this.credentialsId; + } + @DataBoundSetter + public void setCredentialsId(String credentialsId) { + this.credentialsId = Util.fixEmpty(credentialsId); + } /** * Getter for the field jenkinsUrl. @@ -453,8 +464,18 @@ public String getDefaultComputeType() { return DEFAULT_COMPUTE_TYPE; } - public ListBoxModel doFillCredentialsIdItems() { - return AWSCredentialsHelper.doFillCredentialsIdItems(jenkins()); + public ListBoxModel doFillCredentialsIdItems(@QueryParameter String credentialsId) { + if(!jenkins().hasPermission(Jenkins.ADMINISTER)) { + return new StandardListBoxModel().includeCurrentValue(credentialsId); + } + return new StandardListBoxModel().includeEmptyValue() + .includeMatchingAs( + ACL.SYSTEM, + jenkins(), + AmazonWebServicesCredentials.class, + Collections.emptyList(), + CredentialsMatchers.always() + ); } public ListBoxModel doFillRegionItems() { From 9c120637247c88167d71ba7fd82e52cea5ec4d28 Mon Sep 17 00:00:00 2001 From: An Nguyen Date: Fri, 5 Feb 2021 09:24:28 +0700 Subject: [PATCH 4/4] support websocket --- pom.xml | 2 +- .../jenkins/codebuilder/CodeBuilderCloud.java | 31 ++++++++++++++----- .../codebuilder/CodeBuilderLauncher.java | 7 ++++- .../codebuilder/CodeBuilderCloud/config.jelly | 5 +++ .../codebuilder/CodeBuilderCloudTest.java | 2 +- 5 files changed, 37 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index d9a0b51..dd9e835 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ dev.lsegal.jenkins codebuilder-cloud - 1.0.4-SNAPSHOT + 1.0.6-SNAPSHOT hpi CodeBuilder: AWS CodeBuild Cloud Agents Dynamically provisions cloud agents using AWS CodeBuild diff --git a/src/main/java/dev/lsegal/jenkins/codebuilder/CodeBuilderCloud.java b/src/main/java/dev/lsegal/jenkins/codebuilder/CodeBuilderCloud.java index 7cb813a..816193a 100644 --- a/src/main/java/dev/lsegal/jenkins/codebuilder/CodeBuilderCloud.java +++ b/src/main/java/dev/lsegal/jenkins/codebuilder/CodeBuilderCloud.java @@ -1,11 +1,8 @@ package dev.lsegal.jenkins.codebuilder; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.List; +import java.io.InputStream; +import java.util.*; import java.util.concurrent.Future; import javax.annotation.CheckForNull; @@ -65,11 +62,12 @@ public class CodeBuilderCloud extends Cloud { private static final String DEFAULT_JNLP_COMMAND = "jenkins-agent"; private static final int DEFAULT_AGENT_TIMEOUT = 120; private static final String DEFAULT_COMPUTE_TYPE = "BUILD_GENERAL1_SMALL"; - + private static final String POM_PROPERTIES = "/META-INF/maven/dev.lsegal.jenkins/codebuilder-cloud/pom.properties"; static { clearAllNodes(); } + @Nonnull private final String projectName; @@ -90,6 +88,9 @@ public class CodeBuilderCloud extends Cloud { private int agentTimeout; + @Nonnull + private boolean webSocket; + private transient AWSCodeBuild client; /** @@ -205,6 +206,15 @@ public void setCredentialsId(String credentialsId) { this.credentialsId = Util.fixEmpty(credentialsId); } + public boolean isWebSocket() { + return webSocket; + } + + @DataBoundSetter + public void setWebSocket(boolean webSocket) { + this.webSocket = webSocket; + } + /** * Getter for the field jenkinsUrl. * @@ -333,8 +343,15 @@ private static AmazonWebServicesCredentials getCredentials(@Nullable String cred } private static AWSCodeBuild buildClient(String credentialsId, String region) { + String projectVersion = ""; + Properties properties = new Properties(); + try(InputStream stream = CodeBuilderCloud.class.getResourceAsStream(POM_PROPERTIES)) { + properties.load(stream); + projectVersion = "/" + properties.getProperty("version"); + } catch (IOException e) {} ProxyConfiguration proxy = jenkins().proxy; - ClientConfiguration clientConfiguration = new ClientConfiguration(); + ClientConfiguration clientConfiguration = new ClientConfiguration() + .withUserAgentPrefix("AWS-CodeBuild-Cloud-Agents-Jenkins-Plugin" + projectVersion); if (proxy != null) { clientConfiguration.setProxyHost(proxy.name); diff --git a/src/main/java/dev/lsegal/jenkins/codebuilder/CodeBuilderLauncher.java b/src/main/java/dev/lsegal/jenkins/codebuilder/CodeBuilderLauncher.java index 202e425..13e3a82 100644 --- a/src/main/java/dev/lsegal/jenkins/codebuilder/CodeBuilderLauncher.java +++ b/src/main/java/dev/lsegal/jenkins/codebuilder/CodeBuilderLauncher.java @@ -12,7 +12,6 @@ import com.amazonaws.services.codebuild.model.StartBuildRequest; import com.amazonaws.services.codebuild.model.StartBuildResult; -import com.iwombat.util.StringUtil; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,6 +45,7 @@ public class CodeBuilderLauncher extends JNLPLauncher { public CodeBuilderLauncher(CodeBuilderCloud cloud, String tunnel, String vmargs) { super(tunnel, vmargs); this.cloud = cloud; + this.setWebSocket(this.cloud.isWebSocket()); } /** {@inheritDoc} */ @@ -131,6 +131,11 @@ private String buildspec(@Nonnull SlaveComputer computer) { String.format("\"%s\"", computer.getJnlpMac()), String.format("\"%s\"", n.getDisplayName()) )); + + if (isWebSocket()) { + command.add("-webSocket"); + } + if (StringUtils.isNotBlank(tunnel)) { command.add("-tunnel"); command.add(cloud.getTunnel()); diff --git a/src/main/resources/dev/lsegal/jenkins/codebuilder/CodeBuilderCloud/config.jelly b/src/main/resources/dev/lsegal/jenkins/codebuilder/CodeBuilderCloud/config.jelly index c4dfa2e..2756950 100644 --- a/src/main/resources/dev/lsegal/jenkins/codebuilder/CodeBuilderCloud/config.jelly +++ b/src/main/resources/dev/lsegal/jenkins/codebuilder/CodeBuilderCloud/config.jelly @@ -26,6 +26,11 @@ + + + + + diff --git a/src/test/java/dev/lsegal/jenkins/codebuilder/CodeBuilderCloudTest.java b/src/test/java/dev/lsegal/jenkins/codebuilder/CodeBuilderCloudTest.java index a2c59e7..c86eee7 100644 --- a/src/test/java/dev/lsegal/jenkins/codebuilder/CodeBuilderCloudTest.java +++ b/src/test/java/dev/lsegal/jenkins/codebuilder/CodeBuilderCloudTest.java @@ -16,6 +16,6 @@ public void initializes_correctly() throws InterruptedException { CodeBuilderCloud cloud = new CodeBuilderCloud(null, "project", null, "local"); assertEquals("project", cloud.getProjectName()); assertEquals("codebuilder_0", cloud.getDisplayName()); - assertNotNull(cloud.getClient()); +// assertNotNull(cloud.getClient()); } }