Nebula: Netflix's OSS Gradle Plugins

43
Nebula: Ne)lix's OSS Gradle Plugins Rob Spieldenner @robspieldenner @NebulaPlugins

Transcript of Nebula: Netflix's OSS Gradle Plugins

Page 1: Nebula: Netflix's OSS Gradle Plugins

Nebula:(Ne)lix's(OSS(Gradle(Plugins

Rob$Spieldenner$@robspieldenner

@NebulaPlugins

Page 2: Nebula: Netflix's OSS Gradle Plugins

h"p://ne(lix.github.io/

h"ps://github.com/nebula4plugins

Page 3: Nebula: Netflix's OSS Gradle Plugins

Why$Open$Source• Help&out&other&teams&using&gradle

• Contribu5ons

• Hiring

Page 4: Nebula: Netflix's OSS Gradle Plugins

Current'Plugin'Build/Publish'Infrastructure

• Github

• branch,per,gradle,release

• version,based,on,gradle,release,2.4.x,for,gradle:2.4

• Cloudbees,(Jenkins),for,CI,and,release:,Job,DSL,to,setup,a,snapshot,and,release,job,per,branch

• Bintray,(jcenter),as,host

Page 5: Nebula: Netflix's OSS Gradle Plugins

New$Plugin$Build/Publish$Infrastructure

• Github

• matrix,tes/ng,for,different,versions,of,gradle

• seman/c,versioning

• Travis,CI,for,CI,,release,on,github,tag

• Bintray,(jcenter),as,host

• Publish,with,gradle,plugin,portal

Page 6: Nebula: Netflix's OSS Gradle Plugins

Support,(Issues,(etc.• Github(issues

• We(love(pull(requests

• or(breaking(tests

• gi6er.im

Page 7: Nebula: Netflix's OSS Gradle Plugins

Naming'Scheme• nebula():)indicates)a)highly)opinionated)plugin

• gradle():)indicates)we)believe)everyone)would)benefit)from)the)func;onality

Page 8: Nebula: Netflix's OSS Gradle Plugins

nebula'testh"ps://github.com/nebula4plugins/nebula4test

Page 9: Nebula: Netflix's OSS Gradle Plugins

nebula'test

will$be$replaced$by$Gradle$TestKit

• ProjectSpec

• PluginProjectSpec

• Integra2onSpec

• Dependency6Genera2on

Page 10: Nebula: Netflix's OSS Gradle Plugins

PluginProjectSpecimport nebula.test.PluginProjectSpecclass PluginExampleSpec extends PluginProjectSpec { @Override String getPluginName() { 'plugin-example' }

def ‘check task is setup’() { when: project.plugins.apply(PluginExample)

then: def exampleTask = project.tasks.get(‘example’) exampleTask.exampleProperty == 'myConfiguredValue' }}

Page 11: Nebula: Netflix's OSS Gradle Plugins

Integra(onSpecimport nebula.test.IntegrationSpecclass MyExampleSpec extends IntegrationSpec { def 'example test'() { buildFile << """\ apply plugin: 'java' ${applyPlugin(MyExamplePlugin)} """.stripIndent()

when: def results = runTasksSuccessfully('exampleTask')

then: results.wasExecuted(':exampleTask') results.wasUpToDate(':dependentTask') results.standardOutput.contains 'Example task output' fileExists('build/example/mycache.tmp') }}

Page 12: Nebula: Netflix's OSS Gradle Plugins

Dependency(Genera,onimport nebula.test.dependencies.DependencyGraphBuilderimport nebula.test.dependencies.ModuleBuilder

// ... def 'generate dependencies'() { given: def graph = new DependencyGraphBuilder().addModule('g0:a0:0.0.1') .addModule('g1', 'a1', '1.0.1') .addModule(new ModuleBuilder('g2:a2:2.0.1').build()) .addModule(new ModuleBuilder('g3:a3:3.0.1') .addDependency('g4:a4:4.0.1') .addDependency('g5', 'a5', '5.0.1').build() ).build() def generator = new GradleDependencyGenerator(graph) def mavenRepo = generator.generateTestMavenRepo() // def ivyRepo = generator.generateTestIvyRepo()

// rest of test }

Page 13: Nebula: Netflix's OSS Gradle Plugins

nebula'coreh"ps://github.com/nebula4plugins/nebula4core

Page 14: Nebula: Netflix's OSS Gradle Plugins

nebula'core

U"lity'tasks'for'other'plugins

• Download

• Unzip

• Untar

Page 15: Nebula: Netflix's OSS Gradle Plugins

nebula'project'pluginh"ps://github.com/nebula4plugins/nebula4project4

plugin

Page 16: Nebula: Netflix's OSS Gradle Plugins

nebula'project'plugin• Opinionated+about+what+a+responsible+project+should+do

• Builds+Javadoc+and+Sources+jars

• Record+informa<on+about+the+build+and+stores+it+in+the+.jar,+via+gradle@info@plugin

• Easy+specifica<on+of+people+involved+in+a+project+via+gradle@contacts@plugin

• facets+to+ease+seDng+up+new+source+sets

Page 17: Nebula: Netflix's OSS Gradle Plugins

gradle'ne)lixoss'project'plugin

h"ps://github.com/nebula4plugins/gradle4ne7lixoss4project4plugin

Page 18: Nebula: Netflix's OSS Gradle Plugins

gradle'ne)lixoss'project'plugin• Provide)release)process

• Configure)publishing

• Recommend)license)headers

• Add)some)error)handling)for)javadoc)in)jdk8

Page 19: Nebula: Netflix's OSS Gradle Plugins

gradle'ospackage'pluginh"ps://github.com/nebula4plugins/gradle4ospackage4

plugin

Page 20: Nebula: Netflix's OSS Gradle Plugins

gradle'ospackage'pluginapply plugin: 'nebula.ospackage'

ospackage { installUtils file('scripts/utils.sh') preInstall file('scripts/preInstall.sh') postInstall file('scripts/postInstall.sh') preUninstall 'touch /tmp/myfile' postUninstall file('scripts/postUninstall.sh')

requires('qux')

into '/' from 'root'}

buildRpm { requires('bar', '2.2', GREATER | EQUAL) requires('baz', '1.0.1', LESS) link('/etc/init.d/foo’, '/opt/foo/bin/foo.init')}

buildDeb { requires('bat', '1.0.1') link('/etc/init.d/foo', '/opt/foo/bin/foo.upstart')}

Page 21: Nebula: Netflix's OSS Gradle Plugins

nebula'ospackage'pluginh"ps://github.com/nebula4plugins/nebula4ospackage4

plugin

Page 22: Nebula: Netflix's OSS Gradle Plugins

nebula'ospackage'plugin

• nebula.nebula-ospackage-daemon"#"Setup"daemontools"in"a"system"package

• nebula.nebula-ospackage-application"#"Put"contents"of"applica7on"zip"into"/opt/$applica7onName

• nebula.nebula-ospackage-application-daemon"#"Combine"the"above,"auto"setup"daemontools"script"for"the"applica7on"plugin"output

Page 23: Nebula: Netflix's OSS Gradle Plugins

gradle'dependency'lock'plugin

h"ps://github.com/nebula4plugins/gradle4dependency4lock4plugin

Page 24: Nebula: Netflix's OSS Gradle Plugins

gradle'dependency'lock'pluginplugins { id 'nebula.dependency-lock' version '3.0.0' id 'groovy'}

repositories { jcenter() }dependencies { compile 'org.codehaus.groovy:groovy-all:2.+' compile 'com.google.guava:guava:latest.release' testCompile 'junit:junit:[4.0, 5.0)'}

Page 25: Nebula: Netflix's OSS Gradle Plugins

gradle'dependency'lock'plugin

./gradlew generateLock saveLock

{ "com.google.guava:guava": { "locked": "19.0-rc1", "requested": "latest.release" }, "junit:junit": { "locked": "4.12", "requested": "[4.0, 5.0)" }, "org.codehaus.groovy:groovy-all": { "locked": "2.4.4", "requested": "2.+" }}

Page 26: Nebula: Netflix's OSS Gradle Plugins

gradle'dependency'lock'pluginplugins { id 'nebula.dependency-lock' version '3.0.0' id 'groovy'}

dependencyLock { includeTransitives = true}

repositories { jcenter() }dependencies { compile 'org.codehaus.groovy:groovy-all:2.+' compile 'com.google.guava:guava:latest.release' testCompile 'junit:junit:[4.0, 5.0)'}

Page 27: Nebula: Netflix's OSS Gradle Plugins

gradle'dependency'lock'plugin

./gradlew generateLock saveLock

{ "com.google.guava:guava": { "locked": "19.0-rc1", "requested": "latest.release" }, "junit:junit": { "locked": "4.12", "requested": "[4.0, 5.0)" }, "org.codehaus.groovy:groovy-all": { "locked": "2.4.4", "requested": "2.+" }, "org.hamcrest:hamcrest-core": { "locked": "1.3", "transitive": [ "junit:junit" ] }}

Page 28: Nebula: Netflix's OSS Gradle Plugins

gradle'extra'configura/ons'plugin

h"ps://github.com/nebula4plugins/gradle4extra4configura9ons4plugin

Page 29: Nebula: Netflix's OSS Gradle Plugins

gradle'extra'configura/ons'pluginapply plugin: 'nebula.provided-base'

dependencies { provided 'example:providedlib:42.1.2'}

// ------------------

apply plugin: 'nebula.optional-base'

dependencies { compile 'example:optionallib:2.3.4', optional}

Page 30: Nebula: Netflix's OSS Gradle Plugins

nebula'publishing'pluginh"ps://github.com/nebula4plugins/nebula4publishing4

plugin

Page 31: Nebula: Netflix's OSS Gradle Plugins

nebula'publishing'plugin• nebula.javadoc.jar

• nebula.source.jar

• nebula.test.jar

Page 32: Nebula: Netflix's OSS Gradle Plugins

nebula'publishing'plugin• nebula.maven+apache+license.proper3es

• nebula.maven+manifest.proper3es

• nebula.maven+base+publish.proper3es

• nebula.maven+dependencies.proper3es

• nebula.maven+resolved.proper3es

• nebula.maven+scm.proper3es

Page 33: Nebula: Netflix's OSS Gradle Plugins

nebula'publishing'plugin

nebula.maven*publishing/nebula.ivy*publishing

• resolve(dynamic(versions(to(specific

• dependencies(for(war

• add(licenses

• add(manifest/informa6onal(proper6es

Page 34: Nebula: Netflix's OSS Gradle Plugins

nebula'publishing'plugin<name>gradle-dependency-lock-plugin</name><description>Gradle plugin to allow locking of dynamic dependency versions</description><properties> <nebula_Manifest_Version>1.0</nebula_Manifest_Version> <nebula_Implementation_Title>com.netflix.nebula#gradle-dependency-lock-plugin;2.2.3</nebula_Implementation_Title> <nebula_Implementation_Version>2.2.3</nebula_Implementation_Version> <nebula_Built_By>jenkins</nebula_Built_By> <nebula_Build_Date>2015-04-02_10:02:13</nebula_Build_Date> <nebula_Gradle_Version>2.2.1</nebula_Gradle_Version> <nebula_Module_Origin>[email protected]:nebula-plugins/gradle-dependency-lock-plugin.git</nebula_Module_Origin> <nebula_Change>f91b5ad</nebula_Change> <nebula_Build_Id>2015-04-02_16-59-13</nebula_Build_Id> <nebula_Created_By>1.7.0_60-b19 (Oracle Corporation)</nebula_Created_By> <nebula_Build_Java_Version>1.7.0_60</nebula_Build_Java_Version> <nebula_X_Compile_Target_JDK>1.7</nebula_X_Compile_Target_JDK> <nebula_X_Compile_Source_JDK>1.7</nebula_X_Compile_Source_JDK></properties><scm> <url>[email protected]:nebula-plugins/gradle-dependency-lock-plugin.git</url> <connection>scm:[email protected]:nebula-plugins/gradle-dependency-lock-plugin.git</connection></scm><developers> <developer> <id>exampleuser</id> <name>Example User</name> <email>[email protected]</email> </developer></developers>

Page 35: Nebula: Netflix's OSS Gradle Plugins

gradle'metrics'pluginh"ps://github.com/nebula4plugins/gradle4metrics4

plugin

Page 36: Nebula: Netflix's OSS Gradle Plugins

gradle'metrics'plugin• Stopped(development(in(favor(of(gradle.com

• Ela5csearch(index(of(each(build

• Info(<(Gradle(start(parameters,(system(proper5es(and(environment(variables.(SCM(and(GIT(informa5on(if(the(gradle<info<plugin(has(been(applied

• Project(<(name(and(version

• Events(<(configura5on,(dependency(resolu5on,(task(execu5on

Page 37: Nebula: Netflix's OSS Gradle Plugins

gradle'override'pluginh"ps://github.com/nebula4plugins/gradle4override4

plugin

Page 38: Nebula: Netflix's OSS Gradle Plugins

gradle'override'plugin

apply plugin: 'nebula.nebula-override'

class MyExtension { String myProp}

example { myProp = 'hello'}

$ ./gradlew -Doverride.example.myProb=newValue <task>$ ./gradlew -Doverride.sourceCompatibility=1.7 <task>

Page 39: Nebula: Netflix's OSS Gradle Plugins

gradle'blacklist'pluginh"ps://github.com/nebula4plugins/gradle4blacklist4

plugin

Page 40: Nebula: Netflix's OSS Gradle Plugins

gradle'blacklist'pluginblacklist { translate { map 'nebula', 'com.netflix.nebula' map 'commons-lang:commons-lang:2.6', 'org.apache.commons:commons-lang3:3.3.2' } flag { block 'org.foo:bar:3.4' warn group: 'com.company', name: 'baz', version: '1.2' }}

Page 41: Nebula: Netflix's OSS Gradle Plugins

Other&Plugins• gradle(dependency(recommender(plugin

• nebula(clojure(plugin

• nebula(bintray(plugin

• gradle(stash(plugin

• gradle(contacts(plugin

• gradle(scm(plugin

• gradle(git(scm(plugin

Page 42: Nebula: Netflix's OSS Gradle Plugins

Ques%ons

Page 43: Nebula: Netflix's OSS Gradle Plugins

Ne#lix'is'Hiring• Build'Tools'+'Full'Stack'Engineer

• h8ps://jobs.ne?lix.com/