From d97d999253013da6d1ce51f671cffba26a76596c Mon Sep 17 00:00:00 2001 From: Jimmi Dyson Date: Tue, 1 Nov 2016 09:38:27 +0000 Subject: [PATCH 1/8] Update jenkins LTS version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index eff2eed4e..3f727cabf 100644 --- a/pom.xml +++ b/pom.xml @@ -32,7 +32,7 @@ - 1.642.2 + 1.651.3 7 From 12230461e35218f0c4ceb6a7f150ff1268a46af2 Mon Sep 17 00:00:00 2001 From: Jimmi Dyson Date: Tue, 1 Nov 2016 09:38:55 +0000 Subject: [PATCH 2/8] Update openshift client version for better websocket support --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3f727cabf..fbb7f861a 100644 --- a/pom.xml +++ b/pom.xml @@ -42,7 +42,7 @@ ~ hpi-plugin.version: The HPI Maven Plugin version used by the plugin.. ~ stapler-plugin.version: The Stapler Maven plugin version required by the plugin. --> - 1.4.11 + 1.4.17 OpenShift Sync From 8af5467911bcde62c8184a87093c6d2b6c4b064c Mon Sep 17 00:00:00 2001 From: Jimmi Dyson Date: Tue, 1 Nov 2016 09:39:13 +0000 Subject: [PATCH 3/8] Update pipeline plugin dependencies --- pom.xml | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 53 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index fbb7f861a..2a850fb14 100644 --- a/pom.xml +++ b/pom.xml @@ -113,25 +113,73 @@ org.jenkins-ci.plugins git - 2.4.2 + 3.0.0 + + + + org.jenkins-ci.plugins + git-client + 2.0.0 + + + + org.jenkins-ci.plugins.workflow + workflow-api + 2.5 + + + + org.jenkins-ci.plugins.workflow + workflow-step-api + 2.4 + + + + org.jenkins-ci.plugins.workflow + workflow-durable-task-step + 2.5 + + + + org.jenkins-ci.plugins.workflow + workflow-cps-global-lib + 2.4 org.jenkins-ci.plugins.workflow workflow-job - 2.0 + 2.8 org.jenkins-ci.plugins.workflow workflow-cps - 2.0 + 2.21 + + + + org.jenkins-ci.plugins.workflow + workflow-basic-steps + 2.2 + + + + org.jenkins-ci.plugins.workflow + workflow-support + 2.10 org.jenkins-ci.plugins.pipeline-stage-view pipeline-rest-api - 1.4 + 2.1 + + + + org.jenkins-ci.plugins + structs + 1.5 @@ -144,7 +192,7 @@ org.jenkins-ci.plugins.pipeline-stage-view pipeline-stage-view - 1.0 + 2.1 test From 063c9325393d1ceb9d42e6f5565659c8589a6834 Mon Sep 17 00:00:00 2001 From: Jimmi Dyson Date: Tue, 1 Nov 2016 11:34:20 +0000 Subject: [PATCH 4/8] Switch to SafeTimerTask to prevent killing timer --- .../fabric8/jenkins/openshiftsync/BuildConfigWatcher.java | 5 +++-- .../fabric8/jenkins/openshiftsync/BuildSyncRunListener.java | 5 +++-- .../io/fabric8/jenkins/openshiftsync/NewBuildWatcher.java | 6 +++--- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/io/fabric8/jenkins/openshiftsync/BuildConfigWatcher.java b/src/main/java/io/fabric8/jenkins/openshiftsync/BuildConfigWatcher.java index 050aaabc0..cd881bc98 100644 --- a/src/main/java/io/fabric8/jenkins/openshiftsync/BuildConfigWatcher.java +++ b/src/main/java/io/fabric8/jenkins/openshiftsync/BuildConfigWatcher.java @@ -19,6 +19,7 @@ import hudson.model.Computer; import hudson.model.Job; import hudson.security.ACL; +import hudson.triggers.SafeTimerTask; import hudson.util.XStream2; import io.fabric8.kubernetes.client.KubernetesClientException; import io.fabric8.kubernetes.client.Watch; @@ -76,9 +77,9 @@ public void start(final Callable completionCallback) { logger.info("Now handling startup build configs!!"); // lets do this in a background thread to avoid errors like: // Tried proxying io.fabric8.jenkins.openshiftsync.GlobalPluginConfiguration to support a circular dependency, but it is not an interface. - Runnable task = new Runnable() { + Runnable task = new SafeTimerTask() { @Override - public void run() { + public void doRun() { logger.info("Waiting for Jenkins to be started"); while (true) { Jenkins jenkins = Jenkins.getInstance(); diff --git a/src/main/java/io/fabric8/jenkins/openshiftsync/BuildSyncRunListener.java b/src/main/java/io/fabric8/jenkins/openshiftsync/BuildSyncRunListener.java index 846f83807..509f023f1 100644 --- a/src/main/java/io/fabric8/jenkins/openshiftsync/BuildSyncRunListener.java +++ b/src/main/java/io/fabric8/jenkins/openshiftsync/BuildSyncRunListener.java @@ -26,6 +26,7 @@ import hudson.model.Run; import hudson.model.TaskListener; import hudson.model.listeners.RunListener; +import hudson.triggers.SafeTimerTask; import io.fabric8.openshift.api.model.Build; import jenkins.util.Timer; import org.jenkinsci.plugins.workflow.job.WorkflowRun; @@ -125,9 +126,9 @@ public synchronized void onStarted(Run run, TaskListener listener) { protected void checkTimerStarted() { if (timerStarted.compareAndSet(false, true)) { - Runnable task = new Runnable() { + Runnable task = new SafeTimerTask() { @Override - public void run() { + protected void doRun() throws Exception { pollLoop(); } }; diff --git a/src/main/java/io/fabric8/jenkins/openshiftsync/NewBuildWatcher.java b/src/main/java/io/fabric8/jenkins/openshiftsync/NewBuildWatcher.java index f408b0866..41dc4eaae 100644 --- a/src/main/java/io/fabric8/jenkins/openshiftsync/NewBuildWatcher.java +++ b/src/main/java/io/fabric8/jenkins/openshiftsync/NewBuildWatcher.java @@ -17,7 +17,7 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.model.Job; -import io.fabric8.kubernetes.api.model.Status; +import hudson.triggers.SafeTimerTask; import io.fabric8.kubernetes.client.KubernetesClientException; import io.fabric8.kubernetes.client.Watch; import io.fabric8.kubernetes.client.Watcher; @@ -64,9 +64,9 @@ public void start() { logger.info("Now handling startup builds!!"); // lets do this in a background thread to avoid errors like: // Tried proxying io.fabric8.jenkins.openshiftsync.GlobalPluginConfiguration to support a circular dependency, but it is not an interface. - Runnable task = new Runnable() { + Runnable task = new SafeTimerTask() { @Override - public void run() { + public void doRun() { logger.info("Waiting for Jenkins to be started"); while (true) { Jenkins jenkins = Jenkins.getInstance(); From 2488258801f9ee41c1f7f638e3424b9c6f8babd9 Mon Sep 17 00:00:00 2001 From: Jimmi Dyson Date: Wed, 2 Nov 2016 15:15:18 +0000 Subject: [PATCH 5/8] Add openshift pipeline plugin for hpi:run to test out steps --- pom.xml | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 2a850fb14..bee212834 100644 --- a/pom.xml +++ b/pom.xml @@ -182,12 +182,6 @@ 1.5 - - org.csanchez.jenkins.plugins - kubernetes - 0.6 - - org.jenkins-ci.plugins.pipeline-stage-view @@ -196,6 +190,27 @@ test + + com.openshift.jenkins + openshift-pipeline + 1.0.28 + + + com.openshift + openshift-restclient-java + + + com.squareup.okhttp3 + okhttp + + + io.fabric8.jenkins.plugins + openshift-sync + + + test + + org.apache.httpcomponents httpclient From a86ce1cd6658ba82f4ac88ba87aee0ec56198cfe Mon Sep 17 00:00:00 2001 From: Jimmi Dyson Date: Wed, 2 Nov 2016 15:15:34 +0000 Subject: [PATCH 6/8] Refactor job config creation/update --- .../openshiftsync/BuildConfigToJobMapper.java | 19 +++------ .../openshiftsync/BuildConfigWatcher.java | 41 +++++++++++-------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/main/java/io/fabric8/jenkins/openshiftsync/BuildConfigToJobMapper.java b/src/main/java/io/fabric8/jenkins/openshiftsync/BuildConfigToJobMapper.java index 20a4c7702..6c095dde9 100644 --- a/src/main/java/io/fabric8/jenkins/openshiftsync/BuildConfigToJobMapper.java +++ b/src/main/java/io/fabric8/jenkins/openshiftsync/BuildConfigToJobMapper.java @@ -15,11 +15,11 @@ */ package io.fabric8.jenkins.openshiftsync; -import hudson.model.Job; import hudson.plugins.git.BranchSpec; import hudson.plugins.git.GitSCM; import hudson.plugins.git.SubmoduleConfig; import hudson.plugins.git.UserRemoteConfig; +import hudson.plugins.git.extensions.GitSCMExtension; import hudson.scm.SCM; import io.fabric8.openshift.api.model.BuildConfig; import io.fabric8.openshift.api.model.BuildConfigSpec; @@ -27,7 +27,6 @@ import io.fabric8.openshift.api.model.BuildStrategy; import io.fabric8.openshift.api.model.GitBuildSource; import io.fabric8.openshift.api.model.JenkinsPipelineBuildStrategy; -import jenkins.model.Jenkins; import org.apache.commons.lang.StringUtils; import org.eclipse.jgit.transport.RemoteConfig; import org.eclipse.jgit.transport.URIish; @@ -35,9 +34,9 @@ import org.jenkinsci.plugins.workflow.cps.CpsScmFlowDefinition; import org.jenkinsci.plugins.workflow.flow.FlowDefinition; import org.jenkinsci.plugins.workflow.job.WorkflowJob; -import org.jenkinsci.plugins.workflow.job.WorkflowRun; import java.io.File; +import java.io.IOException; import java.util.Collections; import java.util.List; import java.util.logging.Logger; @@ -50,13 +49,11 @@ public class BuildConfigToJobMapper { public static final String DEFAULT_JENKINS_FILEPATH = "Jenkinsfile"; private static final Logger LOGGER = Logger.getLogger(BuildConfigToJobMapper.class.getName()); - public static Job mapBuildConfigToJob(BuildConfig bc, String defaultNamespace) { + public static FlowDefinition mapBuildConfigToFlow(BuildConfig bc, String namespace) throws IOException { if (!OpenShiftUtils.isJenkinsBuildConfig(bc)) { return null; } - WorkflowJob job = new WorkflowJob(Jenkins.getInstance(), OpenShiftUtils.jenkinsJobName(bc, defaultNamespace)); - BuildConfigSpec spec = bc.getSpec(); BuildSource source = null; String jenkinsfile = null; @@ -96,20 +93,16 @@ public static Job mapBuildConfigToJob(BuildConfig bc, Collections.emptyList(), null, null, - null + Collections.emptyList() ); - job.setDefinition(new CpsScmFlowDefinition(scm, jenkinsfilePath)); + return new CpsScmFlowDefinition(scm, jenkinsfilePath); } else { LOGGER.warning("BuildConfig does not contain source repository information - cannot map BuildConfig to Jenkins job"); return null; } } else { - job.setDefinition(new CpsFlowDefinition(jenkinsfile, true)); + return new CpsFlowDefinition(jenkinsfile, true); } - - job.addTrigger(new BuildTrigger()); - - return job; } /** diff --git a/src/main/java/io/fabric8/jenkins/openshiftsync/BuildConfigWatcher.java b/src/main/java/io/fabric8/jenkins/openshiftsync/BuildConfigWatcher.java index cd881bc98..eca0ae52f 100644 --- a/src/main/java/io/fabric8/jenkins/openshiftsync/BuildConfigWatcher.java +++ b/src/main/java/io/fabric8/jenkins/openshiftsync/BuildConfigWatcher.java @@ -29,14 +29,13 @@ import jenkins.model.Jenkins; import jenkins.security.NotReallyRoleSensitiveCallable; import jenkins.util.Timer; - import org.apache.tools.ant.filters.StringInputStream; +import org.jenkinsci.plugins.workflow.flow.FlowDefinition; +import org.jenkinsci.plugins.workflow.job.WorkflowJob; import org.jvnet.hudson.reactor.ReactorException; import javax.xml.transform.Source; import javax.xml.transform.stream.StreamSource; - -import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.concurrent.Callable; @@ -44,7 +43,7 @@ import java.util.logging.Level; import java.util.logging.Logger; -import static io.fabric8.jenkins.openshiftsync.BuildConfigToJobMapper.mapBuildConfigToJob; +import static io.fabric8.jenkins.openshiftsync.BuildConfigToJobMapper.mapBuildConfigToFlow; import static io.fabric8.jenkins.openshiftsync.OpenShiftUtils.getOpenShiftClient; import static io.fabric8.jenkins.openshiftsync.OpenShiftUtils.isJenkinsBuildConfig; import static io.fabric8.jenkins.openshiftsync.OpenShiftUtils.parseResourceVersion; @@ -118,7 +117,7 @@ public void doRun() { } }; // lets give jenkins a while to get started ;) - Timer.get().schedule(task, 10, TimeUnit.SECONDS); + Timer.get().schedule(task, 1, TimeUnit.SECONDS); } public void stop() { @@ -147,7 +146,7 @@ public void onInitialBuildConfigs(BuildConfigList buildConfigs) { for (BuildConfig buildConfig : items) { try { upsertJob(buildConfig); - } catch (IOException e) { + } catch (Exception e) { e.printStackTrace(); } } @@ -175,14 +174,20 @@ public void eventReceived(Watcher.Action action, BuildConfig buildConfig) { } @SuppressFBWarnings("NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE") - private void upsertJob(final BuildConfig buildConfig) throws IOException { + private void upsertJob(final BuildConfig buildConfig) throws Exception { if (isJenkinsBuildConfig(buildConfig)) { - ACL.impersonate(ACL.SYSTEM, new NotReallyRoleSensitiveCallable() { + ACL.impersonate(ACL.SYSTEM, new NotReallyRoleSensitiveCallable() { @Override - public Void call() throws IOException { + public Void call() throws Exception { String jobName = OpenShiftUtils.jenkinsJobName(buildConfig, namespace); - Job jobFromBuildConfig = mapBuildConfigToJob(buildConfig, namespace); - if (jobFromBuildConfig == null) { + WorkflowJob job = (WorkflowJob) BuildTrigger.getDscp().getJobFromBuildConfigUid(buildConfig.getMetadata().getUid()); + boolean newJob = job == null; + if (newJob) { + job = new WorkflowJob(Jenkins.getInstance(), jobName); + } + + FlowDefinition flowFromBuildConfig = mapBuildConfigToFlow(buildConfig, namespace); + if (flowFromBuildConfig == null) { return null; } @@ -191,7 +196,7 @@ public Void call() throws IOException { contextDir = buildConfig.getSpec().getSource().getContextDir(); } - jobFromBuildConfig.addProperty( + job.addProperty( new BuildConfigProjectProperty( buildConfig.getMetadata().getNamespace(), buildConfig.getMetadata().getName(), @@ -200,19 +205,21 @@ public Void call() throws IOException { contextDir ) ); + job.addTrigger(new BuildTrigger()); + job.setDefinition(flowFromBuildConfig); - InputStream jobStream = new StringInputStream(new XStream2().toXML(jobFromBuildConfig)); + InputStream jobStream = new StringInputStream(new XStream2().toXML(job)); Jenkins jenkins = Jenkins.getInstance(); - Job job = BuildTrigger.getDscp().getJobFromBuildConfigUid(buildConfig.getMetadata().getUid()); - if (job == null) { + + if (newJob) { jenkins.createProjectFromXML( jobName, jobStream - ); + ).save(); logger.info("Created job " + jobName + " from BuildConfig " + NamespaceName.create(buildConfig) + " with revision: " + buildConfig.getMetadata().getResourceVersion()); } else { - BuildConfigProjectProperty buildConfigProjectProperty = (BuildConfigProjectProperty) job.getProperty(BuildConfigProjectProperty.class); + BuildConfigProjectProperty buildConfigProjectProperty = job.getProperty(BuildConfigProjectProperty.class); if (buildConfigProjectProperty != null) { long updatedBCResourceVersion = parseResourceVersion(buildConfig); long oldBCResourceVersion = parseResourceVersion(buildConfigProjectProperty.getResourceVersion()); From c0293fb88066a06b5421541d291811c73f45f15b Mon Sep 17 00:00:00 2001 From: Jimmi Dyson Date: Wed, 2 Nov 2016 21:14:17 +0000 Subject: [PATCH 7/8] Downgrade required version of Jenkins --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bee212834..c20c351c6 100644 --- a/pom.xml +++ b/pom.xml @@ -32,7 +32,7 @@ - 1.651.3 + 1.651.2 7 From fbca919767194aa35d2aa578c54468b76a9ef3d8 Mon Sep 17 00:00:00 2001 From: Jimmi Dyson Date: Thu, 3 Nov 2016 08:59:06 +0000 Subject: [PATCH 8/8] Correctly scope dependencies --- pom.xml | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/pom.xml b/pom.xml index c20c351c6..002039f43 100644 --- a/pom.xml +++ b/pom.xml @@ -110,6 +110,12 @@ ${openshift-client.version} + + org.jenkins-ci.plugins.workflow + workflow-job + 2.8 + + org.jenkins-ci.plugins git @@ -129,60 +135,60 @@ - org.jenkins-ci.plugins.workflow - workflow-step-api - 2.4 + org.jenkins-ci.plugins.pipeline-stage-view + pipeline-rest-api + 2.1 org.jenkins-ci.plugins.workflow - workflow-durable-task-step - 2.5 + workflow-cps + 2.21 + org.jenkins-ci.plugins.workflow - workflow-cps-global-lib + workflow-step-api 2.4 + test org.jenkins-ci.plugins.workflow - workflow-job - 2.8 + workflow-durable-task-step + 2.5 + test org.jenkins-ci.plugins.workflow - workflow-cps - 2.21 + workflow-cps-global-lib + 2.4 + test org.jenkins-ci.plugins.workflow workflow-basic-steps 2.2 + test org.jenkins-ci.plugins.workflow workflow-support 2.10 - - - - org.jenkins-ci.plugins.pipeline-stage-view - pipeline-rest-api - 2.1 + test org.jenkins-ci.plugins structs 1.5 + test - org.jenkins-ci.plugins.pipeline-stage-view pipeline-stage-view