From 0351db33d527091a3a4575e5328f282dab0cc434 Mon Sep 17 00:00:00 2001 From: boxheed Date: Tue, 24 Feb 2015 21:36:43 +0000 Subject: [PATCH] implementation of ability to plug in custom CI providers using the ServiceLoader --- .../ci/ContinuousIntegrationInfoPlugin.groovy | 12 ++---- ...uousIntegrationInfoProviderResolver.groovy | 27 ++++++++++++ ....info.ci.ContinuousIntegrationInfoProvider | 1 + ...IntegrationInfoProviderResolverSpec.groovy | 41 +++++++++++++++++++ 4 files changed, 73 insertions(+), 8 deletions(-) create mode 100644 src/main/groovy/nebula/plugin/info/ci/ContinuousIntegrationInfoProviderResolver.groovy create mode 100644 src/main/resources/META-INF/services/nebula.plugin.info.ci.ContinuousIntegrationInfoProvider create mode 100644 src/test/groovy/nebula/plugin/info/ci/ContinuousIntegrationInfoProviderResolverSpec.groovy diff --git a/src/main/groovy/nebula/plugin/info/ci/ContinuousIntegrationInfoPlugin.groovy b/src/main/groovy/nebula/plugin/info/ci/ContinuousIntegrationInfoPlugin.groovy index d599c06..2359b33 100644 --- a/src/main/groovy/nebula/plugin/info/ci/ContinuousIntegrationInfoPlugin.groovy +++ b/src/main/groovy/nebula/plugin/info/ci/ContinuousIntegrationInfoPlugin.groovy @@ -2,13 +2,15 @@ package nebula.plugin.info.ci import nebula.plugin.info.InfoBrokerPlugin import nebula.plugin.info.InfoCollectorPlugin + import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.internal.IConventionAware class ContinuousIntegrationInfoPlugin implements Plugin, InfoCollectorPlugin { protected Project project - List providers + + ContinuousIntegrationInfoProvider selectedProvider ContinuousIntegrationInfoExtension extension @@ -16,7 +18,6 @@ class ContinuousIntegrationInfoPlugin implements Plugin, InfoCollectorP void apply(Project project) { this.project = project - providers = [new JenkinsProvider(), new UnknownContinuousIntegrationProvider()] selectedProvider = findProvider() extension = project.extensions.create('ciinfo', ContinuousIntegrationInfoExtension) @@ -37,11 +38,6 @@ class ContinuousIntegrationInfoPlugin implements Plugin, InfoCollectorP } ContinuousIntegrationInfoProvider findProvider() { - def provider = providers.find { it.supports(project) } - if (provider) { - return provider - } else { - throw new IllegalStateException('Unable to find a SCM provider, even the Unknown provider') - } + return new ContinuousIntegrationInfoProviderResolver().findProvider(project) } } \ No newline at end of file diff --git a/src/main/groovy/nebula/plugin/info/ci/ContinuousIntegrationInfoProviderResolver.groovy b/src/main/groovy/nebula/plugin/info/ci/ContinuousIntegrationInfoProviderResolver.groovy new file mode 100644 index 0000000..5138844 --- /dev/null +++ b/src/main/groovy/nebula/plugin/info/ci/ContinuousIntegrationInfoProviderResolver.groovy @@ -0,0 +1,27 @@ +package nebula.plugin.info.ci; + +import java.util.Collection; +import java.util.LinkedList; +import java.util.ServiceLoader; + +public class ContinuousIntegrationInfoProviderResolver { + + private static ServiceLoader continuousIntegrationInfoProviderServiceLoader = ServiceLoader + .load(ContinuousIntegrationInfoProvider.class); + + def all () { + return continuousIntegrationInfoProviderServiceLoader.asList() << new UnknownContinuousIntegrationProvider(); + } + + ContinuousIntegrationInfoProvider findProvider(project) { + + def provider = continuousIntegrationInfoProviderServiceLoader.find { it.supports(project) } + + if (provider) { + return provider + } else { + return new UnknownContinuousIntegrationProvider() + } + } + +} diff --git a/src/main/resources/META-INF/services/nebula.plugin.info.ci.ContinuousIntegrationInfoProvider b/src/main/resources/META-INF/services/nebula.plugin.info.ci.ContinuousIntegrationInfoProvider new file mode 100644 index 0000000..f897fc7 --- /dev/null +++ b/src/main/resources/META-INF/services/nebula.plugin.info.ci.ContinuousIntegrationInfoProvider @@ -0,0 +1 @@ +nebula.plugin.info.ci.JenkinsProvider \ No newline at end of file diff --git a/src/test/groovy/nebula/plugin/info/ci/ContinuousIntegrationInfoProviderResolverSpec.groovy b/src/test/groovy/nebula/plugin/info/ci/ContinuousIntegrationInfoProviderResolverSpec.groovy new file mode 100644 index 0000000..f025e2d --- /dev/null +++ b/src/test/groovy/nebula/plugin/info/ci/ContinuousIntegrationInfoProviderResolverSpec.groovy @@ -0,0 +1,41 @@ +package nebula.plugin.info.ci + +import nebula.plugin.info.InfoBrokerPlugin +import nebula.plugin.info.InfoBrokerPlugin.ManifestEntry +import nebula.plugin.info.basic.BasicInfoPlugin +import nebula.test.ProjectSpec + +import org.gradle.api.NamedDomainObjectContainer + +import spock.lang.Ignore + +import java.util.concurrent.atomic.AtomicBoolean + +class ContinuousIntegrationInfoProviderResolverSpec extends ProjectSpec { + + def 'get all configured info providers'() { + when: + def resolver = new ContinuousIntegrationInfoProviderResolver() + + then: + def providers = resolver.all() + providers != null + providers.size() == 2 + providers[0].getClass().equals(JenkinsProvider.class) + providers[1].getClass().equals(UnknownContinuousIntegrationProvider.class) + } + + def 'get Jenkins provider if running on Jenkins'() { + when: + def onJenkins = System.getenv('BUILD_NUMBER') && System.getenv('JOB_NAME') + def resolver = new ContinuousIntegrationInfoProviderResolver() + + then: + def provider = resolver.findProvider(project) + if(onJenkins) { + provider.getClass().equals(JenkinsProvider.class) + } else { + provider.getClass().equals(UnknownContinuousIntegrationProvider.class) + } + } +}