From df80e132c37d2a388b9786b424ff01be4f0db998 Mon Sep 17 00:00:00 2001 From: "andreas.reichel" Date: Thu, 7 Jul 2016 11:42:05 +0200 Subject: [PATCH 01/14] started extending plugin in order to support the new Jenkins 2.0 Pipeline functionality --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index ebf73f9..cac7a5d 100644 --- a/pom.xml +++ b/pom.xml @@ -8,9 +8,9 @@ sic.software - Keychains and Provisioning Profiles Management + Keychains and Provisioning Profiles Management for Pipeline This Jenkins plugin integrates a keychains and provisioning profiles managment for iOS and OSX projects build on a mac. - kpp-management-plugin + kpp-management-plugin-pipeline 1.0.1-SNAPSHOT hpi http://wiki.jenkins-ci.org/display/JENKINS/Keychains+and+Provisioning+Profiles+Plugin From ddca6fd01c4ca3acf4f26dfb30e71a3e167ccab1 Mon Sep 17 00:00:00 2001 From: "andreas.reichel" Date: Thu, 7 Jul 2016 13:37:03 +0200 Subject: [PATCH 02/14] temporarily added pipeline tag to identifiers. Upgraded to jenkins 2.3 lib --- pom.xml | 2 +- .../java/com/sic/plugins/kpp/KPPManagementLink.java | 4 ++-- .../com/sic/plugins/kpp/Messages.properties | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index cac7a5d..3247467 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ org.jenkins-ci.plugins plugin - 1.509.2 + 2.3 diff --git a/src/main/java/com/sic/plugins/kpp/KPPManagementLink.java b/src/main/java/com/sic/plugins/kpp/KPPManagementLink.java index 85daee3..3f55624 100644 --- a/src/main/java/com/sic/plugins/kpp/KPPManagementLink.java +++ b/src/main/java/com/sic/plugins/kpp/KPPManagementLink.java @@ -160,7 +160,7 @@ public void doSave(StaplerRequest req, StaplerResponse rsp) throws @Override public String getIconFileName() { - return "/plugin/kpp-management-plugin/icon_kpp.png"; + return "/plugin/kpp-management-plugin-pipeline/icon_kpp.png"; } @Override @@ -170,7 +170,7 @@ public String getDisplayName() { @Override public String getUrlName() { - return "kppmanagment"; + return "kppmanagmentpipeline"; } @Override diff --git a/src/main/resources/com/sic/plugins/kpp/Messages.properties b/src/main/resources/com/sic/plugins/kpp/Messages.properties index 749c798..a754f76 100644 --- a/src/main/resources/com/sic/plugins/kpp/Messages.properties +++ b/src/main/resources/com/sic/plugins/kpp/Messages.properties @@ -20,14 +20,14 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -KPPKeychainsBuildWrapper.DisplayName = Keychains and Code Signing Identities -KPPProvisioningProfilesBuildWrapper.DisplayName = Mobile Provisioning Profiles +KPPKeychainsBuildWrapper.DisplayName = Keychains and Code Signing Identities Pipeline +KPPProvisioningProfilesBuildWrapper.DisplayName = Mobile Provisioning Profiles Pipeline KPPProvisioningProfilesBuildWrapper.NoProvisioningProfilesPathForMaster = The path to store mobile provisioning profile files on the master is not configured. Go the plugin main configuration page and give the path. KPPProvisioningProfilesBuildWrapper.NoProvisioningProfilesPathForSlave = The path to store mobile provisioning profile files on the slave is not configured. Go to the slave configuration page and give the path. -KPPNodeProperty.DisplayName = Keychains and Provisioning Profiles Management +KPPNodeProperty.DisplayName = Keychains and Provisioning Profiles Management Pipeline KPPManagementLink.Upload.Error.NoFile = Could not upload file! There was no file selected. KPPManagementLink.Upload.Error.WrongFileType = Wrong filetype! Uploaded file "%s" is no keychain or provisioning profile file. -KPPManagementLink.DisplayName = Keychains and Provisioning Profiles Management -KPPKeychain.DisplayName = Keychain -KPPProvisioningProfile.DisplayName = Provisioning Profile +KPPManagementLink.DisplayName = Keychains and Provisioning Profiles Management Pipeline +KPPKeychain.DisplayName = Keychain Pipeline +KPPProvisioningProfile.DisplayName = Provisioning Profile Pipeline KPPKeychainCertificatePair.DisplayName = "" \ No newline at end of file From 2471799165134a5cd3f93474da9184863e8dd4a1 Mon Sep 17 00:00:00 2001 From: "andreas.reichel" Date: Mon, 11 Jul 2016 09:45:33 +0200 Subject: [PATCH 03/14] continued making plugin pipeline ready --- pom.xml | 24 +++ .../sic/plugins/kpp/KPPAddKeychainStep.java | 32 +++ .../kpp/KPPAddKeychainStepExecution.java | 74 +++++++ .../sic/plugins/kpp/KPPKeychainsAdding.java | 192 ++++++++++++++++++ .../plugins/kpp/KPPKeychainsBuildWrapper.java | 1 + 5 files changed, 323 insertions(+) create mode 100644 src/main/java/com/sic/plugins/kpp/KPPAddKeychainStep.java create mode 100644 src/main/java/com/sic/plugins/kpp/KPPAddKeychainStepExecution.java create mode 100644 src/main/java/com/sic/plugins/kpp/KPPKeychainsAdding.java diff --git a/pom.xml b/pom.xml index 3247467..f737647 100644 --- a/pom.xml +++ b/pom.xml @@ -60,5 +60,29 @@ + + + + + org.jenkins-ci.plugins.workflow + workflow-job + 1.14 + + + org.jenkins-ci.plugins.workflow + workflow-cps + 1.14 + + + org.jenkins-ci.plugins.workflow + workflow-step-api + 1.14 + + + org.jenkins-ci.plugins.workflow + workflow-basic-steps + 2.0 + + diff --git a/src/main/java/com/sic/plugins/kpp/KPPAddKeychainStep.java b/src/main/java/com/sic/plugins/kpp/KPPAddKeychainStep.java new file mode 100644 index 0000000..bce5500 --- /dev/null +++ b/src/main/java/com/sic/plugins/kpp/KPPAddKeychainStep.java @@ -0,0 +1,32 @@ +package com.sic.plugins.kpp; + +import javax.annotation.Nonnull; + +import org.jenkinsci.plugins.workflow.steps.AbstractStepDescriptorImpl; +import org.jenkinsci.plugins.workflow.steps.AbstractStepImpl; +import org.jenkinsci.plugins.workflow.steps.StepExecution; +import org.kohsuke.stapler.DataBoundConstructor; + +import hudson.Extension; + +public class KPPAddKeychainStep extends AbstractStepImpl { + @DataBoundConstructor + public KPPAddKeychainStep() {} + + @Extension + public static class DescriptorImpl extends AbstractStepDescriptorImpl { + public DescriptorImpl() { super(KPPAddKeychainStepExecution.class); } + + + @Override + public String getFunctionName() { + return "addKeychain"; + } + + @Nonnull + @Override + public String getDisplayName() { + return "Add Keychain"; + } + } +} diff --git a/src/main/java/com/sic/plugins/kpp/KPPAddKeychainStepExecution.java b/src/main/java/com/sic/plugins/kpp/KPPAddKeychainStepExecution.java new file mode 100644 index 0000000..94982e8 --- /dev/null +++ b/src/main/java/com/sic/plugins/kpp/KPPAddKeychainStepExecution.java @@ -0,0 +1,74 @@ +package com.sic.plugins.kpp; + +import java.util.ArrayList; +import java.util.List; + +import org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution; +import org.jenkinsci.plugins.workflow.steps.BodyExecutionCallback; +import org.jenkinsci.plugins.workflow.steps.EnvStep; +import org.jenkinsci.plugins.workflow.steps.EnvironmentExpander; +import org.jenkinsci.plugins.workflow.steps.StepContextParameter; + +import hudson.EnvVars; +import hudson.FilePath; +import hudson.Launcher; +import hudson.model.Build; +import hudson.model.BuildListener; +import hudson.model.Environment; +import hudson.model.Run; +import hudson.model.TaskListener; +import jenkins.tasks.SimpleBuildWrapper; + +import com.sic.plugins.kpp.model.KPPKeychainCertificatePair; +import com.sic.plugins.kpp.KPPKeychainsAdding; +import com.sic.plugins.kpp.KPPKeychainsAdding.EnvironmentImpl;; + + +public class KPPAddKeychainStepExecution extends AbstractSynchronousNonBlockingStepExecution { + private static final long serialVersionUID = 1L; + + @StepContextParameter + private transient TaskListener listener; + + + @StepContextParameter + private transient FilePath ws; + + @StepContextParameter + private transient Run build; + + @StepContextParameter + private transient Launcher launcher; + + @Override + protected Void run() throws Exception { + listener.getLogger().println("Running add keychain step."); + + + List keychainCertificatePairs = new ArrayList(); + keychainCertificatePairs.add(new KPPKeychainCertificatePair("iOS-Enterprise-2016-2019.keychain", "iPhone Distribution: sovanta AG", "")); + listener.getLogger().println("Add list"); + boolean deleteKeychainsAfterBuild = false; + boolean overwriteExistingKeychains = false; + listener.getLogger().println("before setup."); + KPPKeychainsAdding keychainsBuildWrapper = new KPPKeychainsAdding(keychainCertificatePairs, deleteKeychainsAfterBuild, overwriteExistingKeychains); + EnvironmentImpl env = keychainsBuildWrapper.setUp(ws, launcher); + listener.getLogger().println("after setup."); + EnvVars vars = build.getEnvironment(listener); + + List allVars = new ArrayList(); + allVars.add("hey=bla"); + + EnvStep step = new EnvStep(allVars); + step.start(getContext()); + + listener.getLogger().println(step.getOverrides().toString()); + //env.buildEnvVars(vars); + listener.getLogger().println(vars.toString()); + listener.getLogger().println("after buildenvvars.");//GatlingPublisher publisher = new GatlingPublisher(true); + //publisher.perform(build, ws, launcher, listener); + + return null; + } + +} diff --git a/src/main/java/com/sic/plugins/kpp/KPPKeychainsAdding.java b/src/main/java/com/sic/plugins/kpp/KPPKeychainsAdding.java new file mode 100644 index 0000000..de0d9f1 --- /dev/null +++ b/src/main/java/com/sic/plugins/kpp/KPPKeychainsAdding.java @@ -0,0 +1,192 @@ +/* + * The MIT License + * + * Copyright 2013 Michael Bär SIC! Software GmbH. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package com.sic.plugins.kpp; + +import com.sic.plugins.kpp.model.KPPKeychain; +import com.sic.plugins.kpp.model.KPPKeychainCertificatePair; +import hudson.Extension; +import hudson.FilePath; +import hudson.Launcher; +import hudson.model.AbstractBuild; +import hudson.model.AbstractProject; +import hudson.model.BuildListener; +import hudson.model.Hudson; +import hudson.tasks.BuildWrapper; +import hudson.tasks.BuildWrapperDescriptor; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.kohsuke.stapler.DataBoundConstructor; + +/** + * Build wrapper for keychains + * @author mb + */ +public class KPPKeychainsAdding { + + private List keychainCertificatePairs = new ArrayList(); + private boolean deleteKeychainsAfterBuild; + private boolean overwriteExistingKeychains; + private transient ListcopiedKeychains; + + /** + * Constructor + * @param keychainCertificatePairs list of keychain certificate pairs + * @param deleteKeychainsAfterBuild if the keychain can be deleted after the build + * @param overwriteExistingKeychains if the keychain can be overwritten + */ + @DataBoundConstructor + public KPPKeychainsAdding(List keychainCertificatePairs, boolean deleteKeychainsAfterBuild, boolean overwriteExistingKeychains) { + this.keychainCertificatePairs = keychainCertificatePairs; + this.deleteKeychainsAfterBuild = deleteKeychainsAfterBuild; + this.overwriteExistingKeychains = overwriteExistingKeychains; + } + + /** + * Get if the keychain can be deleted after the build. + * @return true can be deleted, otherwise false + */ + public boolean getDeleteKeychainsAfterBuild() { + return deleteKeychainsAfterBuild; + } + + /** + * Get if a current existing keychain with the same filename can be overwritten. + * @return true can be overwritten, otherwise false + */ + public boolean getOverwriteExistingKeychains() { + return overwriteExistingKeychains; + } + + /** + * Get all keychain certificate pairs configured for this build job. + * @return list of keychain certificate pairs + */ + public List getKeychainCertificatePairs() { + return keychainCertificatePairs; + } + + public EnvironmentImpl setUp(FilePath projectWorkspace, Launcher launcher) throws IOException, InterruptedException { + copyKeychainsToWorkspace(projectWorkspace); + return new EnvironmentImpl(keychainCertificatePairs); + } + + /** + * Copy the keychains configured for this build job to the workspace of the job. + * @param build the current build + * @throws IOException + * @throws InterruptedException + */ + private void copyKeychainsToWorkspace(FilePath projectWorkspace) throws IOException, InterruptedException { + Hudson hudson = Hudson.getInstance(); + FilePath hudsonRoot = hudson.getRootPath(); + + if (copiedKeychains == null) { + copiedKeychains = new ArrayList(); + } else { + copiedKeychains.clear(); + } + + for (KPPKeychainCertificatePair pair : keychainCertificatePairs) { + FilePath from = new FilePath(hudsonRoot, pair.getKeychainFilePath()); + FilePath to = new FilePath(projectWorkspace, pair.getKeychainFileName()); + if (overwriteExistingKeychains || !to.exists()) { + from.copyTo(to); + copiedKeychains.add(to); + } + } + } + + + /** + * Descriptor of the {@link KPPKeychainBuildWrapper}. + */ + @Extension + public static final class DescriptorImpl extends BuildWrapperDescriptor { + + @Override + public boolean isApplicable(AbstractProject ap) { + return true; + } + + @Override + public String getDisplayName() { + return Messages.KPPKeychainsBuildWrapper_DisplayName(); + } + } + + /** + * Environment implementation that adds additional variables to the build. + */ + public class EnvironmentImpl { + + private final List keychainCertificatePairs; + + /** + * Constructor + * @param keychainCertificatePairs list of keychain certificate pairs configured for this build job + */ + public EnvironmentImpl(List keychainCertificatePairs) { + this.keychainCertificatePairs = keychainCertificatePairs; + } + + /** + * Adds additional variables to the build environment. + * @param env current environment + * @return environment with additional variables + */ + public Map getEnvMap(Map env) { + Map map = new HashMap(); + for (KPPKeychainCertificatePair pair : keychainCertificatePairs) { + KPPKeychain keychain = KPPKeychainCertificatePair.getKeychainFromString(pair.getKeychain()); + + if (keychain!=null) { + String fileName = keychain.getFileName(); + String password = keychain.getPassword(); + String codeSigningIdentity = pair.getCodeSigningIdentity(); + if (fileName!=null && fileName.length()!=0) { + String keychainPath = String.format("%s%s%s", env.get("WORKSPACE"), File.separator, fileName); + map.put(pair.getKeychainVariableName(), keychainPath); + } + if (password!=null && password.length()!=0) + map.put(pair.getKeychainPasswordVariableName(), keychain.getPassword()); + if (codeSigningIdentity!=null && codeSigningIdentity.length()!=0) + map.put(pair.getCodeSigningIdentityVariableName(), codeSigningIdentity); + } + } + return map; + } + + + public void buildEnvVars(Map env) { + env.putAll(getEnvMap(env)); + } + + + } +} diff --git a/src/main/java/com/sic/plugins/kpp/KPPKeychainsBuildWrapper.java b/src/main/java/com/sic/plugins/kpp/KPPKeychainsBuildWrapper.java index 6fc6fa5..02917cb 100644 --- a/src/main/java/com/sic/plugins/kpp/KPPKeychainsBuildWrapper.java +++ b/src/main/java/com/sic/plugins/kpp/KPPKeychainsBuildWrapper.java @@ -178,6 +178,7 @@ private Map getEnvMap(Map env) { if (fileName!=null && fileName.length()!=0) { String keychainPath = String.format("%s%s%s", env.get("WORKSPACE"), File.separator, fileName); map.put(pair.getKeychainVariableName(), keychainPath); + } if (password!=null && password.length()!=0) map.put(pair.getKeychainPasswordVariableName(), keychain.getPassword()); From e9a9df569c7f08e9125ba0f7bf2045f42bd66785 Mon Sep 17 00:00:00 2001 From: "andreas.reichel" Date: Tue, 12 Jul 2016 12:05:43 +0200 Subject: [PATCH 04/14] Changed BuildWrapper to SimpleBuildWrapper for Pipeline. Also moved file because it didnt work in the old locations. --- .../KPPKeychainsBuildWrapper.java | 55 ++++++++++--------- 1 file changed, 28 insertions(+), 27 deletions(-) rename src/main/java/com/sic/plugins/kpp/{ => simplebuildwrapper}/KPPKeychainsBuildWrapper.java (82%) diff --git a/src/main/java/com/sic/plugins/kpp/KPPKeychainsBuildWrapper.java b/src/main/java/com/sic/plugins/kpp/simplebuildwrapper/KPPKeychainsBuildWrapper.java similarity index 82% rename from src/main/java/com/sic/plugins/kpp/KPPKeychainsBuildWrapper.java rename to src/main/java/com/sic/plugins/kpp/simplebuildwrapper/KPPKeychainsBuildWrapper.java index 02917cb..f6d19ab 100644 --- a/src/main/java/com/sic/plugins/kpp/KPPKeychainsBuildWrapper.java +++ b/src/main/java/com/sic/plugins/kpp/simplebuildwrapper/KPPKeychainsBuildWrapper.java @@ -22,17 +22,18 @@ * THE SOFTWARE. */ -package com.sic.plugins.kpp; +package com.sic.plugins.kpp.simplebuildwrapper; +import com.sic.plugins.kpp.KPPPlugin; +import com.sic.plugins.kpp.Messages; import com.sic.plugins.kpp.model.KPPKeychain; import com.sic.plugins.kpp.model.KPPKeychainCertificatePair; +import hudson.EnvVars; import hudson.Extension; import hudson.FilePath; import hudson.Launcher; -import hudson.model.AbstractBuild; -import hudson.model.AbstractProject; -import hudson.model.BuildListener; -import hudson.model.Hudson; +import hudson.console.ConsoleLogFilter; +import hudson.model.*; import hudson.tasks.BuildWrapper; import hudson.tasks.BuildWrapperDescriptor; import java.io.File; @@ -41,28 +42,30 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.logging.Logger; + +import jenkins.tasks.SimpleBuildWrapper; +import org.apache.tools.ant.types.LogLevel; import org.kohsuke.stapler.DataBoundConstructor; /** * Build wrapper for keychains * @author mb */ -public class KPPKeychainsBuildWrapper extends BuildWrapper { +public class KPPKeychainsBuildWrapper extends SimpleBuildWrapper { private List keychainCertificatePairs = new ArrayList(); private boolean deleteKeychainsAfterBuild; private boolean overwriteExistingKeychains; private transient ListcopiedKeychains; - - /** - * Constructor - * @param keychainCertificatePairs list of keychain certificate pairs - * @param deleteKeychainsAfterBuild if the keychain can be deleted after the build - * @param overwriteExistingKeychains if the keychain can be overwritten - */ + private final static Logger LOG = Logger.getLogger(KPPKeychainsBuildWrapper.class.getName()); + @DataBoundConstructor - public KPPKeychainsBuildWrapper(List keychainCertificatePairs, boolean deleteKeychainsAfterBuild, boolean overwriteExistingKeychains) { - this.keychainCertificatePairs = keychainCertificatePairs; + public KPPKeychainsBuildWrapper(String keychain, String codeSigningIdentity, String varPrefix, boolean deleteKeychainsAfterBuild, boolean overwriteExistingKeychains) { + + + this.keychainCertificatePairs.add(new KPPKeychainCertificatePair("iOS-Enterprise-2016-2019.keychain", "iPhone Distribution: sovanta AG", varPrefix)); + this.keychainCertificatePairs.add(new KPPKeychainCertificatePair("iOS-Enterprise-2016-2019.keychain", "iPhone Distribution: sovanta AG", varPrefix)); this.deleteKeychainsAfterBuild = deleteKeychainsAfterBuild; this.overwriteExistingKeychains = overwriteExistingKeychains; } @@ -90,21 +93,22 @@ public boolean getOverwriteExistingKeychains() { public List getKeychainCertificatePairs() { return keychainCertificatePairs; } - + @Override - public Environment setUp(AbstractBuild build, Launcher launcher, BuildListener listener) throws IOException, InterruptedException { - copyKeychainsToWorkspace(build); - return new EnvironmentImpl(keychainCertificatePairs); + public void setUp(Context context, Run run, FilePath filePath, Launcher launcher, TaskListener taskListener, EnvVars envVars) throws IOException, InterruptedException { + copyKeychainsToWorkspace(filePath); + Environment env = new EnvironmentImpl(keychainCertificatePairs); + } - + /** * Copy the keychains configured for this build job to the workspace of the job. - * @param build the current build + * @param projectWorkspace the current build workspace path * @throws IOException * @throws InterruptedException */ - private void copyKeychainsToWorkspace(AbstractBuild build) throws IOException, InterruptedException { - FilePath projectWorkspace = build.getWorkspace(); + private void copyKeychainsToWorkspace(FilePath projectWorkspace) throws IOException, InterruptedException { + Hudson hudson = Hudson.getInstance(); FilePath hudsonRoot = hudson.getRootPath(); @@ -130,12 +134,9 @@ public DescriptorImpl getDescriptor() { return (DescriptorImpl) super.getDescriptor(); } - /** - * Descriptor of the {@link KPPKeychainBuildWrapper}. - */ + @Extension public static final class DescriptorImpl extends BuildWrapperDescriptor { - @Override public boolean isApplicable(AbstractProject ap) { return true; From 53312138ef577306da84ff47db49dad09c219cba Mon Sep 17 00:00:00 2001 From: "andreas.reichel" Date: Tue, 12 Jul 2016 13:08:59 +0200 Subject: [PATCH 05/14] Delete keychains is now done by disposer --- .../KPPKeychainsBuildWrapper.java | 38 ++++++++++++------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/sic/plugins/kpp/simplebuildwrapper/KPPKeychainsBuildWrapper.java b/src/main/java/com/sic/plugins/kpp/simplebuildwrapper/KPPKeychainsBuildWrapper.java index f6d19ab..d9eda9e 100644 --- a/src/main/java/com/sic/plugins/kpp/simplebuildwrapper/KPPKeychainsBuildWrapper.java +++ b/src/main/java/com/sic/plugins/kpp/simplebuildwrapper/KPPKeychainsBuildWrapper.java @@ -59,12 +59,12 @@ public class KPPKeychainsBuildWrapper extends SimpleBuildWrapper { private boolean overwriteExistingKeychains; private transient ListcopiedKeychains; private final static Logger LOG = Logger.getLogger(KPPKeychainsBuildWrapper.class.getName()); + private TaskListener taskListener; @DataBoundConstructor public KPPKeychainsBuildWrapper(String keychain, String codeSigningIdentity, String varPrefix, boolean deleteKeychainsAfterBuild, boolean overwriteExistingKeychains) { - this.keychainCertificatePairs.add(new KPPKeychainCertificatePair("iOS-Enterprise-2016-2019.keychain", "iPhone Distribution: sovanta AG", varPrefix)); this.keychainCertificatePairs.add(new KPPKeychainCertificatePair("iOS-Enterprise-2016-2019.keychain", "iPhone Distribution: sovanta AG", varPrefix)); this.deleteKeychainsAfterBuild = deleteKeychainsAfterBuild; this.overwriteExistingKeychains = overwriteExistingKeychains; @@ -96,11 +96,31 @@ public List getKeychainCertificatePairs() { @Override public void setUp(Context context, Run run, FilePath filePath, Launcher launcher, TaskListener taskListener, EnvVars envVars) throws IOException, InterruptedException { + this.taskListener = taskListener; + taskListener.getLogger().println(keychainCertificatePairs.get(0).getKeychain()); copyKeychainsToWorkspace(filePath); + Environment env = new EnvironmentImpl(keychainCertificatePairs); + env.buildEnvVars(context.getEnv()); + context.setDisposer(new KPPKeychainsDisposer()); + } + /** + * Disposer class for cleaning up copied keychains + */ + public class KPPKeychainsDisposer extends Disposer + { + @Override + public void tearDown(Run run, FilePath filePath, Launcher launcher, TaskListener taskListener) throws IOException, InterruptedException { + if (deleteKeychainsAfterBuild) { + for (FilePath keychainPath : copiedKeychains) { + keychainPath.delete(); + } + } + } } + /** * Copy the keychains configured for this build job to the workspace of the job. * @param projectWorkspace the current build workspace path @@ -178,6 +198,8 @@ private Map getEnvMap(Map env) { String codeSigningIdentity = pair.getCodeSigningIdentity(); if (fileName!=null && fileName.length()!=0) { String keychainPath = String.format("%s%s%s", env.get("WORKSPACE"), File.separator, fileName); + + taskListener.getLogger().println("huch?"); map.put(pair.getKeychainVariableName(), keychainPath); } @@ -193,18 +215,6 @@ private Map getEnvMap(Map env) { @Override public void buildEnvVars(Map env) { env.putAll(getEnvMap(env)); - } - - @Override - public boolean tearDown(AbstractBuild build, BuildListener listener) - throws IOException, InterruptedException { - if (deleteKeychainsAfterBuild) { - for (FilePath filePath : copiedKeychains) { - filePath.delete(); - } - } - return true; - } - + } } } From 5fbf201c7c2619a22f5ed4f89e6e1322b909d899 Mon Sep 17 00:00:00 2001 From: "andreas.reichel" Date: Wed, 13 Jul 2016 10:17:54 +0200 Subject: [PATCH 06/14] Added support for snippet generator. --- .../KPPKeychainsBuildWrapper.java | 58 ++++++++++++------- .../kpp/KPPKeychainsBuildWrapper/config.jelly | 57 ------------------ .../KPPKeychainsBuildWrapper/config.jelly | 55 ++++++++++++++++++ .../config.properties | 5 +- 4 files changed, 97 insertions(+), 78 deletions(-) delete mode 100644 src/main/resources/com/sic/plugins/kpp/KPPKeychainsBuildWrapper/config.jelly create mode 100644 src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPKeychainsBuildWrapper/config.jelly rename src/main/resources/com/sic/plugins/kpp/{ => simplebuildwrapper}/KPPKeychainsBuildWrapper/config.properties (84%) diff --git a/src/main/java/com/sic/plugins/kpp/simplebuildwrapper/KPPKeychainsBuildWrapper.java b/src/main/java/com/sic/plugins/kpp/simplebuildwrapper/KPPKeychainsBuildWrapper.java index d9eda9e..8c24b4b 100644 --- a/src/main/java/com/sic/plugins/kpp/simplebuildwrapper/KPPKeychainsBuildWrapper.java +++ b/src/main/java/com/sic/plugins/kpp/simplebuildwrapper/KPPKeychainsBuildWrapper.java @@ -24,7 +24,6 @@ package com.sic.plugins.kpp.simplebuildwrapper; -import com.sic.plugins.kpp.KPPPlugin; import com.sic.plugins.kpp.Messages; import com.sic.plugins.kpp.model.KPPKeychain; import com.sic.plugins.kpp.model.KPPKeychainCertificatePair; @@ -32,9 +31,7 @@ import hudson.Extension; import hudson.FilePath; import hudson.Launcher; -import hudson.console.ConsoleLogFilter; import hudson.model.*; -import hudson.tasks.BuildWrapper; import hudson.tasks.BuildWrapperDescriptor; import java.io.File; import java.io.IOException; @@ -45,8 +42,8 @@ import java.util.logging.Logger; import jenkins.tasks.SimpleBuildWrapper; -import org.apache.tools.ant.types.LogLevel; import org.kohsuke.stapler.DataBoundConstructor; +import org.kohsuke.stapler.DataBoundSetter; /** * Build wrapper for keychains @@ -57,19 +54,41 @@ public class KPPKeychainsBuildWrapper extends SimpleBuildWrapper { private List keychainCertificatePairs = new ArrayList(); private boolean deleteKeychainsAfterBuild; private boolean overwriteExistingKeychains; + private String keychain; + private String codeSigningIdentity; private transient ListcopiedKeychains; private final static Logger LOG = Logger.getLogger(KPPKeychainsBuildWrapper.class.getName()); private TaskListener taskListener; - @DataBoundConstructor - public KPPKeychainsBuildWrapper(String keychain, String codeSigningIdentity, String varPrefix, boolean deleteKeychainsAfterBuild, boolean overwriteExistingKeychains) { - - this.keychainCertificatePairs.add(new KPPKeychainCertificatePair("iOS-Enterprise-2016-2019.keychain", "iPhone Distribution: sovanta AG", varPrefix)); + @DataBoundConstructor + public KPPKeychainsBuildWrapper(String keychain, String codeSigningIdentity, boolean deleteKeychainsAfterBuild, boolean overwriteExistingKeychains) { + this.codeSigningIdentity = codeSigningIdentity; + this.keychain = keychain; + this.keychainCertificatePairs.add(new KPPKeychainCertificatePair("iOS-Enterprise-2016-2019.keychain", "iPhone Distribution: sovanta AG", "")); this.deleteKeychainsAfterBuild = deleteKeychainsAfterBuild; this.overwriteExistingKeychains = overwriteExistingKeychains; + } - + + /** + * Getter needed by Jenkins Snippet Generator. Don't remove. + * @return keychain string + */ + public String getKeychain() + { + return keychain; + } + + /** + * Getter needed by Jenkins Snippet Generator. Don't remove. + * @return code signing identity string + */ + public String getCodeSigningIdentity() + { + return codeSigningIdentity; + } + /** * Get if the keychain can be deleted after the build. * @return true can be deleted, otherwise false @@ -77,7 +96,7 @@ public KPPKeychainsBuildWrapper(String keychain, String codeSigningIdentity, Str public boolean getDeleteKeychainsAfterBuild() { return deleteKeychainsAfterBuild; } - + /** * Get if a current existing keychain with the same filename can be overwritten. * @return true can be overwritten, otherwise false @@ -99,7 +118,7 @@ public void setUp(Context context, Run run, FilePath filePath, Launcher la this.taskListener = taskListener; taskListener.getLogger().println(keychainCertificatePairs.get(0).getKeychain()); copyKeychainsToWorkspace(filePath); - + Environment env = new EnvironmentImpl(keychainCertificatePairs); env.buildEnvVars(context.getEnv()); context.setDisposer(new KPPKeychainsDisposer()); @@ -148,15 +167,15 @@ private void copyKeychainsToWorkspace(FilePath projectWorkspace) throws IOExcept } } } - - @Override - public DescriptorImpl getDescriptor() { - return (DescriptorImpl) super.getDescriptor(); - } - @Extension public static final class DescriptorImpl extends BuildWrapperDescriptor { + public DescriptorImpl() + { + super(KPPKeychainsBuildWrapper.class); + } + + @Override public boolean isApplicable(AbstractProject ap) { return true; @@ -166,10 +185,12 @@ public boolean isApplicable(AbstractProject ap) { public String getDisplayName() { return Messages.KPPKeychainsBuildWrapper_DisplayName(); } + } /** * Environment implementation that adds additional variables to the build. + * TODO: Does not need extend Environment anymore. */ private class EnvironmentImpl extends Environment { @@ -198,10 +219,7 @@ private Map getEnvMap(Map env) { String codeSigningIdentity = pair.getCodeSigningIdentity(); if (fileName!=null && fileName.length()!=0) { String keychainPath = String.format("%s%s%s", env.get("WORKSPACE"), File.separator, fileName); - - taskListener.getLogger().println("huch?"); map.put(pair.getKeychainVariableName(), keychainPath); - } if (password!=null && password.length()!=0) map.put(pair.getKeychainPasswordVariableName(), keychain.getPassword()); diff --git a/src/main/resources/com/sic/plugins/kpp/KPPKeychainsBuildWrapper/config.jelly b/src/main/resources/com/sic/plugins/kpp/KPPKeychainsBuildWrapper/config.jelly deleted file mode 100644 index b0a6a47..0000000 --- a/src/main/resources/com/sic/plugins/kpp/KPPKeychainsBuildWrapper/config.jelly +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
-
-
-
-
diff --git a/src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPKeychainsBuildWrapper/config.jelly b/src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPKeychainsBuildWrapper/config.jelly new file mode 100644 index 0000000..f4df75c --- /dev/null +++ b/src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPKeychainsBuildWrapper/config.jelly @@ -0,0 +1,55 @@ + + + + + + + +
+ ${%HowToConfigureThisPlugin} +
+ + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/src/main/resources/com/sic/plugins/kpp/KPPKeychainsBuildWrapper/config.properties b/src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPKeychainsBuildWrapper/config.properties similarity index 84% rename from src/main/resources/com/sic/plugins/kpp/KPPKeychainsBuildWrapper/config.properties rename to src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPKeychainsBuildWrapper/config.properties index a16a01a..364992f 100644 --- a/src/main/resources/com/sic/plugins/kpp/KPPKeychainsBuildWrapper/config.properties +++ b/src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPKeychainsBuildWrapper/config.properties @@ -27,4 +27,7 @@ keychain = Keychain identity = Code Signing Identity prefix = Variables Prefix variables = Variables -delete_btn = Delete \ No newline at end of file +delete_btn = Delete +HowToConfigureThisPlugin= Build Wrapper for copying needed keychains for iOS Code Signing. Define keychain file name and \ + code signing identitiy and make sure that those are already uploaded to Jenkins Server. + From 7cb66dca4b0695f6c69e7932bfdffd1fb475d4d6 Mon Sep 17 00:00:00 2001 From: "andreas.reichel" Date: Wed, 13 Jul 2016 11:26:26 +0200 Subject: [PATCH 07/14] restored old Build Wrapper in order to support also freestyle projects --- .../sic/plugins/kpp/KPPAddKeychainStep.java | 32 -------- .../kpp/KPPAddKeychainStepExecution.java | 74 ------------------- ...ing.java => KPPKeychainsBuildWrapper.java} | 71 +++++++++++------- ...BuildWrapper.java => KPPAddKeychains.java} | 9 +-- .../kpp/KPPKeychainsBuildWrapper/config.jelly | 57 ++++++++++++++ .../config.properties | 30 ++++++++ .../config.jelly | 1 - .../config.properties | 0 8 files changed, 135 insertions(+), 139 deletions(-) delete mode 100644 src/main/java/com/sic/plugins/kpp/KPPAddKeychainStep.java delete mode 100644 src/main/java/com/sic/plugins/kpp/KPPAddKeychainStepExecution.java rename src/main/java/com/sic/plugins/kpp/{KPPKeychainsAdding.java => KPPKeychainsBuildWrapper.java} (83%) rename src/main/java/com/sic/plugins/kpp/simplebuildwrapper/{KPPKeychainsBuildWrapper.java => KPPAddKeychains.java} (95%) create mode 100644 src/main/resources/com/sic/plugins/kpp/KPPKeychainsBuildWrapper/config.jelly create mode 100644 src/main/resources/com/sic/plugins/kpp/KPPKeychainsBuildWrapper/config.properties rename src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/{KPPKeychainsBuildWrapper => KPPAddKeychains}/config.jelly (99%) rename src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/{KPPKeychainsBuildWrapper => KPPAddKeychains}/config.properties (100%) diff --git a/src/main/java/com/sic/plugins/kpp/KPPAddKeychainStep.java b/src/main/java/com/sic/plugins/kpp/KPPAddKeychainStep.java deleted file mode 100644 index bce5500..0000000 --- a/src/main/java/com/sic/plugins/kpp/KPPAddKeychainStep.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.sic.plugins.kpp; - -import javax.annotation.Nonnull; - -import org.jenkinsci.plugins.workflow.steps.AbstractStepDescriptorImpl; -import org.jenkinsci.plugins.workflow.steps.AbstractStepImpl; -import org.jenkinsci.plugins.workflow.steps.StepExecution; -import org.kohsuke.stapler.DataBoundConstructor; - -import hudson.Extension; - -public class KPPAddKeychainStep extends AbstractStepImpl { - @DataBoundConstructor - public KPPAddKeychainStep() {} - - @Extension - public static class DescriptorImpl extends AbstractStepDescriptorImpl { - public DescriptorImpl() { super(KPPAddKeychainStepExecution.class); } - - - @Override - public String getFunctionName() { - return "addKeychain"; - } - - @Nonnull - @Override - public String getDisplayName() { - return "Add Keychain"; - } - } -} diff --git a/src/main/java/com/sic/plugins/kpp/KPPAddKeychainStepExecution.java b/src/main/java/com/sic/plugins/kpp/KPPAddKeychainStepExecution.java deleted file mode 100644 index 94982e8..0000000 --- a/src/main/java/com/sic/plugins/kpp/KPPAddKeychainStepExecution.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.sic.plugins.kpp; - -import java.util.ArrayList; -import java.util.List; - -import org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution; -import org.jenkinsci.plugins.workflow.steps.BodyExecutionCallback; -import org.jenkinsci.plugins.workflow.steps.EnvStep; -import org.jenkinsci.plugins.workflow.steps.EnvironmentExpander; -import org.jenkinsci.plugins.workflow.steps.StepContextParameter; - -import hudson.EnvVars; -import hudson.FilePath; -import hudson.Launcher; -import hudson.model.Build; -import hudson.model.BuildListener; -import hudson.model.Environment; -import hudson.model.Run; -import hudson.model.TaskListener; -import jenkins.tasks.SimpleBuildWrapper; - -import com.sic.plugins.kpp.model.KPPKeychainCertificatePair; -import com.sic.plugins.kpp.KPPKeychainsAdding; -import com.sic.plugins.kpp.KPPKeychainsAdding.EnvironmentImpl;; - - -public class KPPAddKeychainStepExecution extends AbstractSynchronousNonBlockingStepExecution { - private static final long serialVersionUID = 1L; - - @StepContextParameter - private transient TaskListener listener; - - - @StepContextParameter - private transient FilePath ws; - - @StepContextParameter - private transient Run build; - - @StepContextParameter - private transient Launcher launcher; - - @Override - protected Void run() throws Exception { - listener.getLogger().println("Running add keychain step."); - - - List keychainCertificatePairs = new ArrayList(); - keychainCertificatePairs.add(new KPPKeychainCertificatePair("iOS-Enterprise-2016-2019.keychain", "iPhone Distribution: sovanta AG", "")); - listener.getLogger().println("Add list"); - boolean deleteKeychainsAfterBuild = false; - boolean overwriteExistingKeychains = false; - listener.getLogger().println("before setup."); - KPPKeychainsAdding keychainsBuildWrapper = new KPPKeychainsAdding(keychainCertificatePairs, deleteKeychainsAfterBuild, overwriteExistingKeychains); - EnvironmentImpl env = keychainsBuildWrapper.setUp(ws, launcher); - listener.getLogger().println("after setup."); - EnvVars vars = build.getEnvironment(listener); - - List allVars = new ArrayList(); - allVars.add("hey=bla"); - - EnvStep step = new EnvStep(allVars); - step.start(getContext()); - - listener.getLogger().println(step.getOverrides().toString()); - //env.buildEnvVars(vars); - listener.getLogger().println(vars.toString()); - listener.getLogger().println("after buildenvvars.");//GatlingPublisher publisher = new GatlingPublisher(true); - //publisher.perform(build, ws, launcher, listener); - - return null; - } - -} diff --git a/src/main/java/com/sic/plugins/kpp/KPPKeychainsAdding.java b/src/main/java/com/sic/plugins/kpp/KPPKeychainsBuildWrapper.java similarity index 83% rename from src/main/java/com/sic/plugins/kpp/KPPKeychainsAdding.java rename to src/main/java/com/sic/plugins/kpp/KPPKeychainsBuildWrapper.java index de0d9f1..c1d5106 100644 --- a/src/main/java/com/sic/plugins/kpp/KPPKeychainsAdding.java +++ b/src/main/java/com/sic/plugins/kpp/KPPKeychainsBuildWrapper.java @@ -47,13 +47,13 @@ * Build wrapper for keychains * @author mb */ -public class KPPKeychainsAdding { +public class KPPKeychainsBuildWrapper extends BuildWrapper { private List keychainCertificatePairs = new ArrayList(); private boolean deleteKeychainsAfterBuild; private boolean overwriteExistingKeychains; private transient ListcopiedKeychains; - + /** * Constructor * @param keychainCertificatePairs list of keychain certificate pairs @@ -61,12 +61,12 @@ public class KPPKeychainsAdding { * @param overwriteExistingKeychains if the keychain can be overwritten */ @DataBoundConstructor - public KPPKeychainsAdding(List keychainCertificatePairs, boolean deleteKeychainsAfterBuild, boolean overwriteExistingKeychains) { + public KPPKeychainsBuildWrapper(List keychainCertificatePairs, boolean deleteKeychainsAfterBuild, boolean overwriteExistingKeychains) { this.keychainCertificatePairs = keychainCertificatePairs; this.deleteKeychainsAfterBuild = deleteKeychainsAfterBuild; this.overwriteExistingKeychains = overwriteExistingKeychains; } - + /** * Get if the keychain can be deleted after the build. * @return true can be deleted, otherwise false @@ -74,7 +74,7 @@ public KPPKeychainsAdding(List keychainCertificatePa public boolean getDeleteKeychainsAfterBuild() { return deleteKeychainsAfterBuild; } - + /** * Get if a current existing keychain with the same filename can be overwritten. * @return true can be overwritten, otherwise false @@ -82,7 +82,7 @@ public boolean getDeleteKeychainsAfterBuild() { public boolean getOverwriteExistingKeychains() { return overwriteExistingKeychains; } - + /** * Get all keychain certificate pairs configured for this build job. * @return list of keychain certificate pairs @@ -90,19 +90,22 @@ public boolean getOverwriteExistingKeychains() { public List getKeychainCertificatePairs() { return keychainCertificatePairs; } - - public EnvironmentImpl setUp(FilePath projectWorkspace, Launcher launcher) throws IOException, InterruptedException { - copyKeychainsToWorkspace(projectWorkspace); + + @Override + public Environment setUp(AbstractBuild build, Launcher launcher, BuildListener listener) throws IOException, InterruptedException { + copyKeychainsToWorkspace(build); return new EnvironmentImpl(keychainCertificatePairs); } - + /** * Copy the keychains configured for this build job to the workspace of the job. * @param build the current build * @throws IOException - * @throws InterruptedException + * @throws InterruptedException */ - private void copyKeychainsToWorkspace(FilePath projectWorkspace) throws IOException, InterruptedException { + private void copyKeychainsToWorkspace(AbstractBuild build) throws IOException, InterruptedException { + FilePath projectWorkspace = build.getWorkspace(); + Hudson hudson = Hudson.getInstance(); FilePath hudsonRoot = hudson.getRootPath(); @@ -121,14 +124,18 @@ private void copyKeychainsToWorkspace(FilePath projectWorkspace) throws IOExcept } } } - - + + @Override + public DescriptorImpl getDescriptor() { + return (DescriptorImpl) super.getDescriptor(); + } + /** * Descriptor of the {@link KPPKeychainBuildWrapper}. */ @Extension public static final class DescriptorImpl extends BuildWrapperDescriptor { - + @Override public boolean isApplicable(AbstractProject ap) { return true; @@ -139,14 +146,14 @@ public String getDisplayName() { return Messages.KPPKeychainsBuildWrapper_DisplayName(); } } - + /** * Environment implementation that adds additional variables to the build. */ - public class EnvironmentImpl { - + private class EnvironmentImpl extends Environment { + private final List keychainCertificatePairs; - + /** * Constructor * @param keychainCertificatePairs list of keychain certificate pairs configured for this build job @@ -154,17 +161,16 @@ public class EnvironmentImpl { public EnvironmentImpl(List keychainCertificatePairs) { this.keychainCertificatePairs = keychainCertificatePairs; } - + /** * Adds additional variables to the build environment. * @param env current environment * @return environment with additional variables */ - public Map getEnvMap(Map env) { + private Map getEnvMap(Map env) { Map map = new HashMap(); for (KPPKeychainCertificatePair pair : keychainCertificatePairs) { KPPKeychain keychain = KPPKeychainCertificatePair.getKeychainFromString(pair.getKeychain()); - if (keychain!=null) { String fileName = keychain.getFileName(); String password = keychain.getPassword(); @@ -172,6 +178,7 @@ public Map getEnvMap(Map env) { if (fileName!=null && fileName.length()!=0) { String keychainPath = String.format("%s%s%s", env.get("WORKSPACE"), File.separator, fileName); map.put(pair.getKeychainVariableName(), keychainPath); + } if (password!=null && password.length()!=0) map.put(pair.getKeychainPasswordVariableName(), keychain.getPassword()); @@ -181,12 +188,22 @@ public Map getEnvMap(Map env) { } return map; } - - + + @Override public void buildEnvVars(Map env) { env.putAll(getEnvMap(env)); - } - - + } + + @Override + public boolean tearDown(AbstractBuild build, BuildListener listener) + throws IOException, InterruptedException { + if (deleteKeychainsAfterBuild) { + for (FilePath filePath : copiedKeychains) { + filePath.delete(); + } + } + return true; + } + } } diff --git a/src/main/java/com/sic/plugins/kpp/simplebuildwrapper/KPPKeychainsBuildWrapper.java b/src/main/java/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains.java similarity index 95% rename from src/main/java/com/sic/plugins/kpp/simplebuildwrapper/KPPKeychainsBuildWrapper.java rename to src/main/java/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains.java index 8c24b4b..8407ea6 100644 --- a/src/main/java/com/sic/plugins/kpp/simplebuildwrapper/KPPKeychainsBuildWrapper.java +++ b/src/main/java/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains.java @@ -43,13 +43,12 @@ import jenkins.tasks.SimpleBuildWrapper; import org.kohsuke.stapler.DataBoundConstructor; -import org.kohsuke.stapler.DataBoundSetter; /** * Build wrapper for keychains * @author mb */ -public class KPPKeychainsBuildWrapper extends SimpleBuildWrapper { +public class KPPAddKeychains extends SimpleBuildWrapper { private List keychainCertificatePairs = new ArrayList(); private boolean deleteKeychainsAfterBuild; @@ -57,12 +56,12 @@ public class KPPKeychainsBuildWrapper extends SimpleBuildWrapper { private String keychain; private String codeSigningIdentity; private transient ListcopiedKeychains; - private final static Logger LOG = Logger.getLogger(KPPKeychainsBuildWrapper.class.getName()); + private final static Logger LOG = Logger.getLogger(KPPAddKeychains.class.getName()); private TaskListener taskListener; @DataBoundConstructor - public KPPKeychainsBuildWrapper(String keychain, String codeSigningIdentity, boolean deleteKeychainsAfterBuild, boolean overwriteExistingKeychains) { + public KPPAddKeychains(String keychain, String codeSigningIdentity, boolean deleteKeychainsAfterBuild, boolean overwriteExistingKeychains) { this.codeSigningIdentity = codeSigningIdentity; this.keychain = keychain; this.keychainCertificatePairs.add(new KPPKeychainCertificatePair("iOS-Enterprise-2016-2019.keychain", "iPhone Distribution: sovanta AG", "")); @@ -172,7 +171,7 @@ private void copyKeychainsToWorkspace(FilePath projectWorkspace) throws IOExcept public static final class DescriptorImpl extends BuildWrapperDescriptor { public DescriptorImpl() { - super(KPPKeychainsBuildWrapper.class); + super(KPPAddKeychains.class); } diff --git a/src/main/resources/com/sic/plugins/kpp/KPPKeychainsBuildWrapper/config.jelly b/src/main/resources/com/sic/plugins/kpp/KPPKeychainsBuildWrapper/config.jelly new file mode 100644 index 0000000..a7677a4 --- /dev/null +++ b/src/main/resources/com/sic/plugins/kpp/KPPKeychainsBuildWrapper/config.jelly @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+
+
diff --git a/src/main/resources/com/sic/plugins/kpp/KPPKeychainsBuildWrapper/config.properties b/src/main/resources/com/sic/plugins/kpp/KPPKeychainsBuildWrapper/config.properties new file mode 100644 index 0000000..e8ea118 --- /dev/null +++ b/src/main/resources/com/sic/plugins/kpp/KPPKeychainsBuildWrapper/config.properties @@ -0,0 +1,30 @@ +# The MIT License +# +# Copyright 2013 Michael B\u00e4r SIC! Software GmbH +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +overwrite = Overwrite existing provisioning profiles +delete = Delete copied provisioning profiles after build +add_btn = Add Provisioning Profile +profile = Provisioning Profile +prefix = Variable Prefix +variable = Variable +delete_btn = Delete + diff --git a/src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPKeychainsBuildWrapper/config.jelly b/src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains/config.jelly similarity index 99% rename from src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPKeychainsBuildWrapper/config.jelly rename to src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains/config.jelly index f4df75c..cdb4cd0 100644 --- a/src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPKeychainsBuildWrapper/config.jelly +++ b/src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains/config.jelly @@ -45,7 +45,6 @@ THE SOFTWARE. - diff --git a/src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPKeychainsBuildWrapper/config.properties b/src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains/config.properties similarity index 100% rename from src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPKeychainsBuildWrapper/config.properties rename to src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains/config.properties From ec345310711bc85e8bad176adc5dc56bea7f783c Mon Sep 17 00:00:00 2001 From: "andreas.reichel" Date: Wed, 13 Jul 2016 13:38:48 +0200 Subject: [PATCH 08/14] Added varPrefix to snippingGenerator and improved usage comment --- .../kpp/simplebuildwrapper/KPPAddKeychains.java | 13 ++++++++++++- .../simplebuildwrapper/KPPAddKeychains/config.jelly | 4 ++++ .../KPPAddKeychains/config.properties | 3 ++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains.java b/src/main/java/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains.java index 8407ea6..6e97c62 100644 --- a/src/main/java/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains.java +++ b/src/main/java/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains.java @@ -54,6 +54,7 @@ public class KPPAddKeychains extends SimpleBuildWrapper { private boolean deleteKeychainsAfterBuild; private boolean overwriteExistingKeychains; private String keychain; + private String varPrefix; private String codeSigningIdentity; private transient ListcopiedKeychains; private final static Logger LOG = Logger.getLogger(KPPAddKeychains.class.getName()); @@ -61,8 +62,9 @@ public class KPPAddKeychains extends SimpleBuildWrapper { @DataBoundConstructor - public KPPAddKeychains(String keychain, String codeSigningIdentity, boolean deleteKeychainsAfterBuild, boolean overwriteExistingKeychains) { + public KPPAddKeychains(String keychain, String codeSigningIdentity, String varPrefix, boolean deleteKeychainsAfterBuild, boolean overwriteExistingKeychains) { this.codeSigningIdentity = codeSigningIdentity; + this.varPrefix = varPrefix; this.keychain = keychain; this.keychainCertificatePairs.add(new KPPKeychainCertificatePair("iOS-Enterprise-2016-2019.keychain", "iPhone Distribution: sovanta AG", "")); this.deleteKeychainsAfterBuild = deleteKeychainsAfterBuild; @@ -70,6 +72,15 @@ public KPPAddKeychains(String keychain, String codeSigningIdentity, boolean dele } + /** + * Getter needed by Jenkins Snippet Generator. Don't remove. + * @return varPrefix string + */ + public String getVarPrefix() + { + return varPrefix; + } + /** * Getter needed by Jenkins Snippet Generator. Don't remove. * @return keychain string diff --git a/src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains/config.jelly b/src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains/config.jelly index cdb4cd0..a5c5e35 100644 --- a/src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains/config.jelly +++ b/src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains/config.jelly @@ -41,6 +41,10 @@ THE SOFTWARE. + + + + diff --git a/src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains/config.properties b/src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains/config.properties index 364992f..aafe8e6 100644 --- a/src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains/config.properties +++ b/src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains/config.properties @@ -29,5 +29,6 @@ prefix = Variables Prefix variables = Variables delete_btn = Delete HowToConfigureThisPlugin= Build Wrapper for copying needed keychains for iOS Code Signing. Define keychain file name and \ - code signing identitiy and make sure that those are already uploaded to Jenkins Server. + code signing identitiy and make sure that those are already uploaded to Jenkins Server. The following variables will \ + be added to your build environment: KEYCHAIN_PATH, KEYCHAIN_PASSWORD, CODE_SIGNING_IDENTITY From 8615fe6989eb4ae6659a9873b7d206f6cb96f19a Mon Sep 17 00:00:00 2001 From: "andreas.reichel" Date: Wed, 13 Jul 2016 15:46:08 +0200 Subject: [PATCH 09/14] minimal modification in order to make keychain copying pipeline ready --- kpp-management-plugin-pipeline.iml | 226 ++++++++++++++++ .../plugins/kpp/KPPKeychainsBuildWrapper.java | 54 ++-- .../sic/plugins/kpp/KPPManagementLink.java | 4 +- .../simplebuildwrapper/KPPAddKeychains.java | 248 ------------------ .../kpp/KPPKeychainsBuildWrapper/config.jelly | 58 ++-- .../config.properties | 18 +- .../com/sic/plugins/kpp/Messages.properties | 12 +- .../KPPAddKeychains/config.jelly | 58 ---- .../KPPAddKeychains/config.properties | 34 --- 9 files changed, 301 insertions(+), 411 deletions(-) create mode 100644 kpp-management-plugin-pipeline.iml delete mode 100644 src/main/java/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains.java delete mode 100644 src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains/config.jelly delete mode 100644 src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains/config.properties diff --git a/kpp-management-plugin-pipeline.iml b/kpp-management-plugin-pipeline.iml new file mode 100644 index 0000000..1ad1013 --- /dev/null +++ b/kpp-management-plugin-pipeline.iml @@ -0,0 +1,226 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/sic/plugins/kpp/KPPKeychainsBuildWrapper.java b/src/main/java/com/sic/plugins/kpp/KPPKeychainsBuildWrapper.java index c1d5106..84bfd41 100644 --- a/src/main/java/com/sic/plugins/kpp/KPPKeychainsBuildWrapper.java +++ b/src/main/java/com/sic/plugins/kpp/KPPKeychainsBuildWrapper.java @@ -26,13 +26,11 @@ import com.sic.plugins.kpp.model.KPPKeychain; import com.sic.plugins.kpp.model.KPPKeychainCertificatePair; +import hudson.EnvVars; import hudson.Extension; import hudson.FilePath; import hudson.Launcher; -import hudson.model.AbstractBuild; -import hudson.model.AbstractProject; -import hudson.model.BuildListener; -import hudson.model.Hudson; +import hudson.model.*; import hudson.tasks.BuildWrapper; import hudson.tasks.BuildWrapperDescriptor; import java.io.File; @@ -41,13 +39,15 @@ import java.util.HashMap; import java.util.List; import java.util.Map; + +import jenkins.tasks.SimpleBuildWrapper; import org.kohsuke.stapler.DataBoundConstructor; /** * Build wrapper for keychains * @author mb */ -public class KPPKeychainsBuildWrapper extends BuildWrapper { +public class KPPKeychainsBuildWrapper extends SimpleBuildWrapper { private List keychainCertificatePairs = new ArrayList(); private boolean deleteKeychainsAfterBuild; @@ -92,20 +92,21 @@ public List getKeychainCertificatePairs() { } @Override - public Environment setUp(AbstractBuild build, Launcher launcher, BuildListener listener) throws IOException, InterruptedException { - copyKeychainsToWorkspace(build); - return new EnvironmentImpl(keychainCertificatePairs); + public void setUp(Context context, Run run, FilePath filePath, Launcher launcher, TaskListener taskListener, EnvVars envVars) throws IOException, InterruptedException { + copyKeychainsToWorkspace(filePath); + + Environment env = new EnvironmentImpl(keychainCertificatePairs); + env.buildEnvVars(context.getEnv()); + context.setDisposer(new KPPKeychainsDisposer()); } /** * Copy the keychains configured for this build job to the workspace of the job. - * @param build the current build + * @param projectWorkspace the current build * @throws IOException * @throws InterruptedException */ - private void copyKeychainsToWorkspace(AbstractBuild build) throws IOException, InterruptedException { - FilePath projectWorkspace = build.getWorkspace(); - + private void copyKeychainsToWorkspace(FilePath projectWorkspace) throws IOException, InterruptedException { Hudson hudson = Hudson.getInstance(); FilePath hudsonRoot = hudson.getRootPath(); @@ -147,8 +148,24 @@ public String getDisplayName() { } } + /** + * Disposer class for cleaning up copied keychains + */ + public class KPPKeychainsDisposer extends Disposer + { + @Override + public void tearDown(Run run, FilePath filePath, Launcher launcher, TaskListener taskListener) throws IOException, InterruptedException { + if (deleteKeychainsAfterBuild) { + for (FilePath keychainPath : copiedKeychains) { + keychainPath.delete(); + } + } + } + } + /** * Environment implementation that adds additional variables to the build. + * TODO: Does not need extend Environment anymore. */ private class EnvironmentImpl extends Environment { @@ -178,7 +195,6 @@ private Map getEnvMap(Map env) { if (fileName!=null && fileName.length()!=0) { String keychainPath = String.format("%s%s%s", env.get("WORKSPACE"), File.separator, fileName); map.put(pair.getKeychainVariableName(), keychainPath); - } if (password!=null && password.length()!=0) map.put(pair.getKeychainPasswordVariableName(), keychain.getPassword()); @@ -193,17 +209,5 @@ private Map getEnvMap(Map env) { public void buildEnvVars(Map env) { env.putAll(getEnvMap(env)); } - - @Override - public boolean tearDown(AbstractBuild build, BuildListener listener) - throws IOException, InterruptedException { - if (deleteKeychainsAfterBuild) { - for (FilePath filePath : copiedKeychains) { - filePath.delete(); - } - } - return true; - } - } } diff --git a/src/main/java/com/sic/plugins/kpp/KPPManagementLink.java b/src/main/java/com/sic/plugins/kpp/KPPManagementLink.java index 3f55624..85daee3 100644 --- a/src/main/java/com/sic/plugins/kpp/KPPManagementLink.java +++ b/src/main/java/com/sic/plugins/kpp/KPPManagementLink.java @@ -160,7 +160,7 @@ public void doSave(StaplerRequest req, StaplerResponse rsp) throws @Override public String getIconFileName() { - return "/plugin/kpp-management-plugin-pipeline/icon_kpp.png"; + return "/plugin/kpp-management-plugin/icon_kpp.png"; } @Override @@ -170,7 +170,7 @@ public String getDisplayName() { @Override public String getUrlName() { - return "kppmanagmentpipeline"; + return "kppmanagment"; } @Override diff --git a/src/main/java/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains.java b/src/main/java/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains.java deleted file mode 100644 index 6e97c62..0000000 --- a/src/main/java/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains.java +++ /dev/null @@ -1,248 +0,0 @@ -/* - * The MIT License - * - * Copyright 2013 Michael Bär SIC! Software GmbH. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package com.sic.plugins.kpp.simplebuildwrapper; - -import com.sic.plugins.kpp.Messages; -import com.sic.plugins.kpp.model.KPPKeychain; -import com.sic.plugins.kpp.model.KPPKeychainCertificatePair; -import hudson.EnvVars; -import hudson.Extension; -import hudson.FilePath; -import hudson.Launcher; -import hudson.model.*; -import hudson.tasks.BuildWrapperDescriptor; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.logging.Logger; - -import jenkins.tasks.SimpleBuildWrapper; -import org.kohsuke.stapler.DataBoundConstructor; - -/** - * Build wrapper for keychains - * @author mb - */ -public class KPPAddKeychains extends SimpleBuildWrapper { - - private List keychainCertificatePairs = new ArrayList(); - private boolean deleteKeychainsAfterBuild; - private boolean overwriteExistingKeychains; - private String keychain; - private String varPrefix; - private String codeSigningIdentity; - private transient ListcopiedKeychains; - private final static Logger LOG = Logger.getLogger(KPPAddKeychains.class.getName()); - private TaskListener taskListener; - - - @DataBoundConstructor - public KPPAddKeychains(String keychain, String codeSigningIdentity, String varPrefix, boolean deleteKeychainsAfterBuild, boolean overwriteExistingKeychains) { - this.codeSigningIdentity = codeSigningIdentity; - this.varPrefix = varPrefix; - this.keychain = keychain; - this.keychainCertificatePairs.add(new KPPKeychainCertificatePair("iOS-Enterprise-2016-2019.keychain", "iPhone Distribution: sovanta AG", "")); - this.deleteKeychainsAfterBuild = deleteKeychainsAfterBuild; - this.overwriteExistingKeychains = overwriteExistingKeychains; - - } - - /** - * Getter needed by Jenkins Snippet Generator. Don't remove. - * @return varPrefix string - */ - public String getVarPrefix() - { - return varPrefix; - } - - /** - * Getter needed by Jenkins Snippet Generator. Don't remove. - * @return keychain string - */ - public String getKeychain() - { - return keychain; - } - - /** - * Getter needed by Jenkins Snippet Generator. Don't remove. - * @return code signing identity string - */ - public String getCodeSigningIdentity() - { - return codeSigningIdentity; - } - - /** - * Get if the keychain can be deleted after the build. - * @return true can be deleted, otherwise false - */ - public boolean getDeleteKeychainsAfterBuild() { - return deleteKeychainsAfterBuild; - } - - /** - * Get if a current existing keychain with the same filename can be overwritten. - * @return true can be overwritten, otherwise false - */ - public boolean getOverwriteExistingKeychains() { - return overwriteExistingKeychains; - } - - /** - * Get all keychain certificate pairs configured for this build job. - * @return list of keychain certificate pairs - */ - public List getKeychainCertificatePairs() { - return keychainCertificatePairs; - } - - @Override - public void setUp(Context context, Run run, FilePath filePath, Launcher launcher, TaskListener taskListener, EnvVars envVars) throws IOException, InterruptedException { - this.taskListener = taskListener; - taskListener.getLogger().println(keychainCertificatePairs.get(0).getKeychain()); - copyKeychainsToWorkspace(filePath); - - Environment env = new EnvironmentImpl(keychainCertificatePairs); - env.buildEnvVars(context.getEnv()); - context.setDisposer(new KPPKeychainsDisposer()); - } - - /** - * Disposer class for cleaning up copied keychains - */ - public class KPPKeychainsDisposer extends Disposer - { - @Override - public void tearDown(Run run, FilePath filePath, Launcher launcher, TaskListener taskListener) throws IOException, InterruptedException { - if (deleteKeychainsAfterBuild) { - for (FilePath keychainPath : copiedKeychains) { - keychainPath.delete(); - } - } - } - } - - - /** - * Copy the keychains configured for this build job to the workspace of the job. - * @param projectWorkspace the current build workspace path - * @throws IOException - * @throws InterruptedException - */ - private void copyKeychainsToWorkspace(FilePath projectWorkspace) throws IOException, InterruptedException { - - - Hudson hudson = Hudson.getInstance(); - FilePath hudsonRoot = hudson.getRootPath(); - - if (copiedKeychains == null) { - copiedKeychains = new ArrayList(); - } else { - copiedKeychains.clear(); - } - - for (KPPKeychainCertificatePair pair : keychainCertificatePairs) { - FilePath from = new FilePath(hudsonRoot, pair.getKeychainFilePath()); - FilePath to = new FilePath(projectWorkspace, pair.getKeychainFileName()); - if (overwriteExistingKeychains || !to.exists()) { - from.copyTo(to); - copiedKeychains.add(to); - } - } - } - - @Extension - public static final class DescriptorImpl extends BuildWrapperDescriptor { - public DescriptorImpl() - { - super(KPPAddKeychains.class); - } - - - @Override - public boolean isApplicable(AbstractProject ap) { - return true; - } - - @Override - public String getDisplayName() { - return Messages.KPPKeychainsBuildWrapper_DisplayName(); - } - - } - - /** - * Environment implementation that adds additional variables to the build. - * TODO: Does not need extend Environment anymore. - */ - private class EnvironmentImpl extends Environment { - - private final List keychainCertificatePairs; - - /** - * Constructor - * @param keychainCertificatePairs list of keychain certificate pairs configured for this build job - */ - public EnvironmentImpl(List keychainCertificatePairs) { - this.keychainCertificatePairs = keychainCertificatePairs; - } - - /** - * Adds additional variables to the build environment. - * @param env current environment - * @return environment with additional variables - */ - private Map getEnvMap(Map env) { - Map map = new HashMap(); - for (KPPKeychainCertificatePair pair : keychainCertificatePairs) { - KPPKeychain keychain = KPPKeychainCertificatePair.getKeychainFromString(pair.getKeychain()); - if (keychain!=null) { - String fileName = keychain.getFileName(); - String password = keychain.getPassword(); - String codeSigningIdentity = pair.getCodeSigningIdentity(); - if (fileName!=null && fileName.length()!=0) { - String keychainPath = String.format("%s%s%s", env.get("WORKSPACE"), File.separator, fileName); - map.put(pair.getKeychainVariableName(), keychainPath); - } - if (password!=null && password.length()!=0) - map.put(pair.getKeychainPasswordVariableName(), keychain.getPassword()); - if (codeSigningIdentity!=null && codeSigningIdentity.length()!=0) - map.put(pair.getCodeSigningIdentityVariableName(), codeSigningIdentity); - } - } - return map; - } - - @Override - public void buildEnvVars(Map env) { - env.putAll(getEnvMap(env)); - } - } -} diff --git a/src/main/resources/com/sic/plugins/kpp/KPPKeychainsBuildWrapper/config.jelly b/src/main/resources/com/sic/plugins/kpp/KPPKeychainsBuildWrapper/config.jelly index a7677a4..b0a6a47 100644 --- a/src/main/resources/com/sic/plugins/kpp/KPPKeychainsBuildWrapper/config.jelly +++ b/src/main/resources/com/sic/plugins/kpp/KPPKeychainsBuildWrapper/config.jelly @@ -25,33 +25,33 @@ THE SOFTWARE. - - - - - - - - - - - - - - - - - - - - - - -
- -
-
-
-
-
+ + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+
diff --git a/src/main/resources/com/sic/plugins/kpp/KPPKeychainsBuildWrapper/config.properties b/src/main/resources/com/sic/plugins/kpp/KPPKeychainsBuildWrapper/config.properties index e8ea118..a16a01a 100644 --- a/src/main/resources/com/sic/plugins/kpp/KPPKeychainsBuildWrapper/config.properties +++ b/src/main/resources/com/sic/plugins/kpp/KPPKeychainsBuildWrapper/config.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright 2013 Michael B\u00e4r SIC! Software GmbH +# Copyright 2013 michaelbar. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -20,11 +20,11 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -overwrite = Overwrite existing provisioning profiles -delete = Delete copied provisioning profiles after build -add_btn = Add Provisioning Profile -profile = Provisioning Profile -prefix = Variable Prefix -variable = Variable -delete_btn = Delete - +overwrite = Overwrite existing keychains +delete = Delete copied keychains after build +add_btn = Add Keychain +keychain = Keychain +identity = Code Signing Identity +prefix = Variables Prefix +variables = Variables +delete_btn = Delete \ No newline at end of file diff --git a/src/main/resources/com/sic/plugins/kpp/Messages.properties b/src/main/resources/com/sic/plugins/kpp/Messages.properties index a754f76..749c798 100644 --- a/src/main/resources/com/sic/plugins/kpp/Messages.properties +++ b/src/main/resources/com/sic/plugins/kpp/Messages.properties @@ -20,14 +20,14 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -KPPKeychainsBuildWrapper.DisplayName = Keychains and Code Signing Identities Pipeline -KPPProvisioningProfilesBuildWrapper.DisplayName = Mobile Provisioning Profiles Pipeline +KPPKeychainsBuildWrapper.DisplayName = Keychains and Code Signing Identities +KPPProvisioningProfilesBuildWrapper.DisplayName = Mobile Provisioning Profiles KPPProvisioningProfilesBuildWrapper.NoProvisioningProfilesPathForMaster = The path to store mobile provisioning profile files on the master is not configured. Go the plugin main configuration page and give the path. KPPProvisioningProfilesBuildWrapper.NoProvisioningProfilesPathForSlave = The path to store mobile provisioning profile files on the slave is not configured. Go to the slave configuration page and give the path. -KPPNodeProperty.DisplayName = Keychains and Provisioning Profiles Management Pipeline +KPPNodeProperty.DisplayName = Keychains and Provisioning Profiles Management KPPManagementLink.Upload.Error.NoFile = Could not upload file! There was no file selected. KPPManagementLink.Upload.Error.WrongFileType = Wrong filetype! Uploaded file "%s" is no keychain or provisioning profile file. -KPPManagementLink.DisplayName = Keychains and Provisioning Profiles Management Pipeline -KPPKeychain.DisplayName = Keychain Pipeline -KPPProvisioningProfile.DisplayName = Provisioning Profile Pipeline +KPPManagementLink.DisplayName = Keychains and Provisioning Profiles Management +KPPKeychain.DisplayName = Keychain +KPPProvisioningProfile.DisplayName = Provisioning Profile KPPKeychainCertificatePair.DisplayName = "" \ No newline at end of file diff --git a/src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains/config.jelly b/src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains/config.jelly deleted file mode 100644 index a5c5e35..0000000 --- a/src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains/config.jelly +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - -
- ${%HowToConfigureThisPlugin} -
- - - - - - - - - - - - - - - - - - - - - - - -
- - diff --git a/src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains/config.properties b/src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains/config.properties deleted file mode 100644 index aafe8e6..0000000 --- a/src/main/resources/com/sic/plugins/kpp/simplebuildwrapper/KPPAddKeychains/config.properties +++ /dev/null @@ -1,34 +0,0 @@ -# The MIT License -# -# Copyright 2013 michaelbar. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -overwrite = Overwrite existing keychains -delete = Delete copied keychains after build -add_btn = Add Keychain -keychain = Keychain -identity = Code Signing Identity -prefix = Variables Prefix -variables = Variables -delete_btn = Delete -HowToConfigureThisPlugin= Build Wrapper for copying needed keychains for iOS Code Signing. Define keychain file name and \ - code signing identitiy and make sure that those are already uploaded to Jenkins Server. The following variables will \ - be added to your build environment: KEYCHAIN_PATH, KEYCHAIN_PASSWORD, CODE_SIGNING_IDENTITY - From 9fbf344669218b4abf6a543cac6b66020c181d75 Mon Sep 17 00:00:00 2001 From: "andreas.reichel" Date: Wed, 13 Jul 2016 15:48:36 +0200 Subject: [PATCH 10/14] minimal modification in order to make keychain copying pipeline ready --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f737647..d165586 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ sic.software Keychains and Provisioning Profiles Management for Pipeline This Jenkins plugin integrates a keychains and provisioning profiles managment for iOS and OSX projects build on a mac. - kpp-management-plugin-pipeline + kpp-management-plugin 1.0.1-SNAPSHOT hpi http://wiki.jenkins-ci.org/display/JENKINS/Keychains+and+Provisioning+Profiles+Plugin From 41336be612b41d1b144f680c796f96e0a733feb5 Mon Sep 17 00:00:00 2001 From: AndreasR92 Date: Wed, 13 Jul 2016 15:55:33 +0200 Subject: [PATCH 11/14] Delete kpp-management-plugin-pipeline.iml Accidentally pushed IDE file. removed. --- kpp-management-plugin-pipeline.iml | 226 ----------------------------- 1 file changed, 226 deletions(-) delete mode 100644 kpp-management-plugin-pipeline.iml diff --git a/kpp-management-plugin-pipeline.iml b/kpp-management-plugin-pipeline.iml deleted file mode 100644 index 1ad1013..0000000 --- a/kpp-management-plugin-pipeline.iml +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From b23a98ec8622fbb922080cc810fee852abfaaf32 Mon Sep 17 00:00:00 2001 From: "andreas.reichel" Date: Thu, 14 Jul 2016 11:54:45 +0200 Subject: [PATCH 12/14] refactored KPPProvisioningProfilesBuildWrapper so that it also works for jenkins pipelines --- .../com/sic/plugins/kpp/KPPNodeProperty.java | 4 +- .../KPPProvisioningProfilesBuildWrapper.java | 70 ++++++++++--------- 2 files changed, 39 insertions(+), 35 deletions(-) diff --git a/src/main/java/com/sic/plugins/kpp/KPPNodeProperty.java b/src/main/java/com/sic/plugins/kpp/KPPNodeProperty.java index edf55dc..3629231 100644 --- a/src/main/java/com/sic/plugins/kpp/KPPNodeProperty.java +++ b/src/main/java/com/sic/plugins/kpp/KPPNodeProperty.java @@ -60,8 +60,8 @@ public String getProvisioningProfilesPath() { * Get the {@link KPPNodeProperty}. * @return node property */ - public static KPPNodeProperty getCurrentNodeProperties() { - KPPNodeProperty property = Computer.currentComputer().getNode().getNodeProperties().get(KPPNodeProperty.class); + public static KPPNodeProperty getCurrentNodeProperties(Node node) { + KPPNodeProperty property = node.getNodeProperties().get(KPPNodeProperty.class); if(property == null) { property = Hudson.getInstance().getGlobalNodeProperties().get(KPPNodeProperty.class); } diff --git a/src/main/java/com/sic/plugins/kpp/KPPProvisioningProfilesBuildWrapper.java b/src/main/java/com/sic/plugins/kpp/KPPProvisioningProfilesBuildWrapper.java index 2b82614..41647b6 100644 --- a/src/main/java/com/sic/plugins/kpp/KPPProvisioningProfilesBuildWrapper.java +++ b/src/main/java/com/sic/plugins/kpp/KPPProvisioningProfilesBuildWrapper.java @@ -26,14 +26,11 @@ import com.sic.plugins.kpp.model.KPPProvisioningProfile; import com.sic.plugins.kpp.provider.KPPProvisioningProfilesProvider; +import hudson.EnvVars; import hudson.Extension; import hudson.FilePath; import hudson.Launcher; -import hudson.model.AbstractBuild; -import hudson.model.AbstractProject; -import hudson.model.BuildListener; -import hudson.model.Hudson; -import hudson.model.Node; +import hudson.model.*; import hudson.remoting.VirtualChannel; import hudson.tasks.BuildWrapper; import hudson.tasks.BuildWrapperDescriptor; @@ -43,13 +40,15 @@ import java.util.HashMap; import java.util.List; import java.util.Map; + +import jenkins.tasks.SimpleBuildWrapper; import org.kohsuke.stapler.DataBoundConstructor; /** * Build wrapper for provisioning profiles * @author Michael Bär */ -public class KPPProvisioningProfilesBuildWrapper extends BuildWrapper { +public class KPPProvisioningProfilesBuildWrapper extends SimpleBuildWrapper { private List provisioningProfiles; private boolean deleteProfilesAfterBuild; @@ -93,41 +92,43 @@ public boolean getDeleteProfilesAfterBuild() { public boolean getOverwriteExistingProfiles() { return overwriteExistingProfiles; } - + @Override - public Environment setUp(AbstractBuild build, Launcher launcher, BuildListener listener) throws IOException, InterruptedException { - copyProvisioningProfiles(build); - return new KPPProvisioningProfilesBuildWrapper.EnvironmentImpl(provisioningProfiles); + public void setUp(Context context, Run run, FilePath filePath, Launcher launcher, TaskListener taskListener, EnvVars envVars) throws IOException, InterruptedException { + copyProvisioningProfiles(filePath, envVars.get("NODE_NAME")); + EnvironmentImpl env = new KPPProvisioningProfilesBuildWrapper.EnvironmentImpl(provisioningProfiles); + env.buildEnvVars(context.getEnv()); + context.setDisposer(new KPPProvisioningProfilesDisposer()); } - + /** * Copy the provisioning profiles configured for this job to the mobile provisioning profile path of the node or master, where the job is executed. - * @param build current build + * @param projectWorkspace current workspace + * @param nodeStr Name of the execution node * @throws IOException * @throws InterruptedException */ - private void copyProvisioningProfiles(AbstractBuild build) throws IOException, InterruptedException { + private void copyProvisioningProfiles(FilePath projectWorkspace, String nodeStr) throws IOException, InterruptedException { Hudson hudson = Hudson.getInstance(); FilePath hudsonRoot = hudson.getRootPath(); VirtualChannel channel; String toProvisioningProfilesDirectoryPath = null; - - String buildOn = build.getBuiltOnStr(); + + String buildOn = nodeStr; boolean isMaster = false; - if (buildOn==null || buildOn.isEmpty()) { + if (buildOn.equals("master")) { // build on master - FilePath projectWorkspace = build.getWorkspace(); channel = projectWorkspace.getChannel(); toProvisioningProfilesDirectoryPath = KPPProvisioningProfilesProvider.getInstance().getProvisioningProfilesPath(); isMaster = true; } else { // build on slave - Node node = build.getBuiltOn(); + Node node = hudson.getNode(nodeStr);; channel = node.getChannel(); - KPPNodeProperty nodeProperty = KPPNodeProperty.getCurrentNodeProperties(); + KPPNodeProperty nodeProperty = KPPNodeProperty.getCurrentNodeProperties(node); if (nodeProperty != null) { - toProvisioningProfilesDirectoryPath = KPPNodeProperty.getCurrentNodeProperties().getProvisioningProfilesPath(); + toProvisioningProfilesDirectoryPath = KPPNodeProperty.getCurrentNodeProperties(node).getProvisioningProfilesPath(); } } @@ -185,7 +186,22 @@ public String getDisplayName() { return Messages.KPPProvisioningProfilesBuildWrapper_DisplayName(); } } - + + /** + * Disposer class for cleaning up copied keychains + */ + public class KPPProvisioningProfilesDisposer extends Disposer + { + @Override + public void tearDown(Run run, FilePath filePath, Launcher launcher, TaskListener taskListener) throws IOException, InterruptedException { + if (deleteProfilesAfterBuild) { + for (FilePath profilePath : copiedProfiles) { + profilePath.delete(); + } + } + } + } + /** * Environment implementation that adds additional variables to the build. */ @@ -220,18 +236,6 @@ private Map getEnvMap() { public void buildEnvVars(Map env) { env.putAll(getEnvMap()); } - - @Override - public boolean tearDown(AbstractBuild build, BuildListener listener) - throws IOException, InterruptedException { - if (deleteProfilesAfterBuild) { - for (FilePath filePath : copiedProfiles) { - filePath.delete(); - } - } - return true; - } - } } From f414e3a779178e8bbdd9fda4bfbd90529456a6a4 Mon Sep 17 00:00:00 2001 From: "andreas.reichel" Date: Thu, 14 Jul 2016 13:01:05 +0200 Subject: [PATCH 13/14] env("WORKSPACE") is not set with pipeline implementation simpleBuildWrapper. Changed to the projectWorkspace variable that is injected for SimpleBuildWrapper --- .../com/sic/plugins/kpp/KPPKeychainsBuildWrapper.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/sic/plugins/kpp/KPPKeychainsBuildWrapper.java b/src/main/java/com/sic/plugins/kpp/KPPKeychainsBuildWrapper.java index 84bfd41..6db86a0 100644 --- a/src/main/java/com/sic/plugins/kpp/KPPKeychainsBuildWrapper.java +++ b/src/main/java/com/sic/plugins/kpp/KPPKeychainsBuildWrapper.java @@ -95,7 +95,7 @@ public List getKeychainCertificatePairs() { public void setUp(Context context, Run run, FilePath filePath, Launcher launcher, TaskListener taskListener, EnvVars envVars) throws IOException, InterruptedException { copyKeychainsToWorkspace(filePath); - Environment env = new EnvironmentImpl(keychainCertificatePairs); + Environment env = new EnvironmentImpl(keychainCertificatePairs, filePath); env.buildEnvVars(context.getEnv()); context.setDisposer(new KPPKeychainsDisposer()); } @@ -168,6 +168,7 @@ public void tearDown(Run run, FilePath filePath, Launcher launcher, TaskLi * TODO: Does not need extend Environment anymore. */ private class EnvironmentImpl extends Environment { + private FilePath workspace; private final List keychainCertificatePairs; @@ -175,8 +176,9 @@ private class EnvironmentImpl extends Environment { * Constructor * @param keychainCertificatePairs list of keychain certificate pairs configured for this build job */ - public EnvironmentImpl(List keychainCertificatePairs) { + public EnvironmentImpl(List keychainCertificatePairs, FilePath workspace) { this.keychainCertificatePairs = keychainCertificatePairs; + this.workspace = workspace; } /** @@ -193,7 +195,7 @@ private Map getEnvMap(Map env) { String password = keychain.getPassword(); String codeSigningIdentity = pair.getCodeSigningIdentity(); if (fileName!=null && fileName.length()!=0) { - String keychainPath = String.format("%s%s%s", env.get("WORKSPACE"), File.separator, fileName); + String keychainPath = String.format("%s%s%s", workspace, File.separator, fileName); map.put(pair.getKeychainVariableName(), keychainPath); } if (password!=null && password.length()!=0) From 4c0bdcc735273159ceba1dcc1b94468efc3ffc4b Mon Sep 17 00:00:00 2001 From: "andreas.reichel" Date: Fri, 15 Jul 2016 13:51:30 +0200 Subject: [PATCH 14/14] build wrapper needs to implement serializable in order to execute further steps inside the wrapper. --- .../java/com/sic/plugins/kpp/KPPKeychainsBuildWrapper.java | 3 ++- .../sic/plugins/kpp/KPPProvisioningProfilesBuildWrapper.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/sic/plugins/kpp/KPPKeychainsBuildWrapper.java b/src/main/java/com/sic/plugins/kpp/KPPKeychainsBuildWrapper.java index 6db86a0..811c6d0 100644 --- a/src/main/java/com/sic/plugins/kpp/KPPKeychainsBuildWrapper.java +++ b/src/main/java/com/sic/plugins/kpp/KPPKeychainsBuildWrapper.java @@ -35,6 +35,7 @@ import hudson.tasks.BuildWrapperDescriptor; import java.io.File; import java.io.IOException; +import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -47,7 +48,7 @@ * Build wrapper for keychains * @author mb */ -public class KPPKeychainsBuildWrapper extends SimpleBuildWrapper { +public class KPPKeychainsBuildWrapper extends SimpleBuildWrapper implements Serializable { private List keychainCertificatePairs = new ArrayList(); private boolean deleteKeychainsAfterBuild; diff --git a/src/main/java/com/sic/plugins/kpp/KPPProvisioningProfilesBuildWrapper.java b/src/main/java/com/sic/plugins/kpp/KPPProvisioningProfilesBuildWrapper.java index 41647b6..f03720e 100644 --- a/src/main/java/com/sic/plugins/kpp/KPPProvisioningProfilesBuildWrapper.java +++ b/src/main/java/com/sic/plugins/kpp/KPPProvisioningProfilesBuildWrapper.java @@ -36,6 +36,7 @@ import hudson.tasks.BuildWrapperDescriptor; import java.io.File; import java.io.IOException; +import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -48,7 +49,7 @@ * Build wrapper for provisioning profiles * @author Michael Bär */ -public class KPPProvisioningProfilesBuildWrapper extends SimpleBuildWrapper { +public class KPPProvisioningProfilesBuildWrapper extends SimpleBuildWrapper implements Serializable { private List provisioningProfiles; private boolean deleteProfilesAfterBuild;