diff --git a/pom.xml b/pom.xml
index ebf73f9..d165586 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,12 +3,12 @@
org.jenkins-ci.plugins
plugin
- 1.509.2
+ 2.3
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
1.0.1-SNAPSHOT
@@ -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/KPPKeychainsBuildWrapper.java b/src/main/java/com/sic/plugins/kpp/KPPKeychainsBuildWrapper.java
index 6fc6fa5..811c6d0 100644
--- a/src/main/java/com/sic/plugins/kpp/KPPKeychainsBuildWrapper.java
+++ b/src/main/java/com/sic/plugins/kpp/KPPKeychainsBuildWrapper.java
@@ -26,34 +26,35 @@
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;
import java.io.IOException;
+import java.io.Serializable;
import java.util.ArrayList;
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 implements Serializable {
private List keychainCertificatePairs = new ArrayList();
private boolean deleteKeychainsAfterBuild;
private boolean overwriteExistingKeychains;
private transient ListcopiedKeychains;
-
+
/**
* Constructor
* @param keychainCertificatePairs list of keychain certificate pairs
@@ -66,7 +67,7 @@ public KPPKeychainsBuildWrapper(List keychainCertifi
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 +75,7 @@ public KPPKeychainsBuildWrapper(List keychainCertifi
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 +83,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,22 +91,23 @@ 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, filePath);
+ 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
+ * @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();
@@ -124,18 +126,18 @@ private void copyKeychainsToWorkspace(AbstractBuild build) throws IOException, I
}
}
}
-
+
@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;
@@ -146,22 +148,40 @@ public String getDisplayName() {
return Messages.KPPKeychainsBuildWrapper_DisplayName();
}
}
-
+
+ /**
+ * 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 {
-
+ private FilePath workspace;
+
private final List keychainCertificatePairs;
-
+
/**
* 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;
}
-
+
/**
* Adds additional variables to the build environment.
* @param env current environment
@@ -176,7 +196,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)
@@ -187,22 +207,10 @@ private 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/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..f03720e 100644
--- a/src/main/java/com/sic/plugins/kpp/KPPProvisioningProfilesBuildWrapper.java
+++ b/src/main/java/com/sic/plugins/kpp/KPPProvisioningProfilesBuildWrapper.java
@@ -26,30 +26,30 @@
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;
import java.io.File;
import java.io.IOException;
+import java.io.Serializable;
import java.util.ArrayList;
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 implements Serializable {
private List provisioningProfiles;
private boolean deleteProfilesAfterBuild;
@@ -93,41 +93,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 +187,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 +237,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;
- }
-
}
}