Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Nebula: Netflix's OSS Gradle Plugins
Search
Rob Spieldenner
July 31, 2015
Programming
800
0
Share
Nebula: Netflix's OSS Gradle Plugins
A survey of our open source gradle plugins.
Rob Spieldenner
July 31, 2015
More Decks by Rob Spieldenner
See All by Rob Spieldenner
Migrating Nebula Plugins to the New Model and TestKit
rspieldenner
1
160
Nebula: Netflix's OSS Gradle Plugins (Bay Area Gradle Users Meetup)
rspieldenner
0
130
Continuous Delivery at Netflix: Uberconf
rspieldenner
0
230
Continuous Delivery at Netflix
rspieldenner
3
270
Other Decks in Programming
See All in Programming
Symfony AI in Action - SymfonyLive Berlin 2026
chr_hertel
1
120
Programming with a DJ Controller — not vibe coding
m_seki
3
790
GoogleCloudとterraform完全に理解した
terisuke
1
190
WebAssembly を読み込むベストプラクティス 2026年春版 / Best Practices for Loading WebAssembly (Spring 2026)
petamoriken
5
1.1k
PHPでローカル環境用のSSL/TLS証明書を発行することはできるのか? #phpconkagawa
akase244
0
350
AlarmKitで明後日起きれるアラームアプリを作る
trickart
0
110
Firefoxにコントリビューションして得られた学び
ken7253
2
160
tRPCの概要と少しだけパフォーマンス
misoton665
2
260
ソースコード→AST→オペコード、の旅を覗いてみる
o0h
PRO
1
130
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
180
Spec Driven Development | AI Summit Vilnius
danielsogl
PRO
1
140
Agentic Elixir
whatyouhide
0
440
Featured
See All Featured
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.2k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
160
Leo the Paperboy
mayatellez
7
1.7k
[SF Ruby Conf 2025] Rails X
palkan
2
1k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
55k
Documentation Writing (for coders)
carmenintech
77
5.3k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
340
Practical Orchestrator
shlominoach
191
11k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
340
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
160
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
330
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Transcript
Nebula:(Ne)lix's(OSS(Gradle( Plugins Rob$Spieldenner$@robspieldenner
h"p:/ /ne(lix.github.io/ h"ps:/ /github.com/nebula4plugins
Why$Open$Source • Help&out&other&teams&using&gradle • Contribu5ons • Hiring
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
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
Support,(Issues,(etc. • Github(issues • We(love(pull(requests • or(breaking(tests • gi6er.im
Naming'Scheme • nebula():)indicates)a)highly)opinionated)plugin • gradle():)indicates)we)believe)everyone)would) benefit)from)the)func;onality
nebula'plugin'plugin h"ps:/ /github.com/nebula4plugins/nebula4plugin4 plugin
nebula'plugin'plugin • Opinions(for(publishing(other(plugins • Eliminate(boiler(plate(configura7on • Use(nebula(plugins(to(build(themselves
nebula'test h"ps:/ /github.com/nebula4plugins/nebula4test
nebula'test will$be$replaced$by$Gradle$TestKit • ProjectSpec • PluginProjectSpec • Integra2onSpec • Dependency6Genera2on
PluginProjectSpec import nebula.test.PluginProjectSpec class 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' } }
Integra(onSpec import nebula.test.IntegrationSpec class 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') } }
Dependency(Genera,on import nebula.test.dependencies.DependencyGraphBuilder import 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 }
nebula'core h"ps:/ /github.com/nebula4plugins/nebula4core
nebula'core U"lity'tasks'for'other'plugins • Download • Unzip • Untar
nebula'project'plugin h"ps:/ /github.com/nebula4plugins/nebula4project4 plugin
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
gradle'ne)lixoss'project' plugin h"ps:/ /github.com/nebula4plugins/gradle4ne7lixoss4 project4plugin
gradle'ne)lixoss'project'plugin • Provide)release)process • Configure)publishing • Recommend)license)headers • Add)some)error)handling)for)javadoc)in)jdk8
gradle'ospackage'plugin h"ps:/ /github.com/nebula4plugins/gradle4ospackage4 plugin
gradle'ospackage'plugin apply plugin: 'nebula.os-package' 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') }
nebula'ospackage'plugin h"ps:/ /github.com/nebula4plugins/nebula4ospackage4 plugin
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
gradle'dependency'lock' plugin h"ps:/ /github.com/nebula4plugins/gradle4 dependency4lock4plugin
gradle'dependency'lock'plugin plugins { id 'nebula.dependency-lock' version '2.2.3' 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)' }
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.+" } }
gradle'dependency'lock'plugin plugins { id 'nebula.dependency-lock' version '2.2.3' 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)' }
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" ] } }
gradle'extra'configura/ons' plugin h"ps:/ /github.com/nebula4plugins/gradle4extra4 configura9ons4plugin
gradle'extra'configura/ons'plugin apply plugin: 'nebula.provided-base' dependencies { provided 'example:providedlib:42.1.2' } //
------------------ apply plugin: 'nebula.optional-base' dependencies { compile 'example:optionallib:2.3.4', optional }
nebula'publishing'plugin h"ps:/ /github.com/nebula4plugins/nebula4publishing4 plugin
nebula'publishing'plugin • nebula.javadoc.jar • nebula.source.jar • nebula.test.jar
nebula'publishing'plugin • nebula.apache,license,pom.proper2es • nebula.manifest,pom.proper2es • nebula.maven,base,publishing.proper2es • nebula.maven,java,publishing.proper2es •
nebula.resolved,pom.proper2es • nebula.scm,pom.proper2es
nebula'publishing'plugin nebula.maven*publishing/nebula.ivy*publishing • resolve(dynamic(versions(to(specific • dependencies(for(war • add(licenses • add(manifest/informa6onal(proper6es
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>
gradle'metrics'plugin h"ps:/ /github.com/nebula4plugins/gradle4metrics4 plugin
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
gradle'override'plugin h"ps:/ /github.com/nebula4plugins/gradle4override4 plugin
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>
Other&Plugins • nebula(clojure(plugin • nebula(bintray(plugin • gradle(stash(plugin • gradle(contacts(plugin •
gradle(scm(plugin • gradle(git(scm(plugin
Ques%ons
Ne#lix'is'Hiring • Build'Tools'+'Full'Stack'Engineer • h8ps:/ /jobs.ne?lix.com/