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
0
790
Nebula: Netflix's OSS Gradle Plugins
A survey of our open source gradle plugins.
Rob Spieldenner
July 31, 2015
Tweet
Share
More Decks by Rob Spieldenner
See All by Rob Spieldenner
Migrating Nebula Plugins to the New Model and TestKit
rspieldenner
1
150
Nebula: Netflix's OSS Gradle Plugins (Bay Area Gradle Users Meetup)
rspieldenner
0
120
Continuous Delivery at Netflix: Uberconf
rspieldenner
0
220
Continuous Delivery at Netflix
rspieldenner
3
260
Other Decks in Programming
See All in Programming
Oxlintはいいぞ
yug1224
5
1.3k
生成AIを使ったコードレビューで定性的に品質カバー
chiilog
1
270
AI & Enginnering
codelynx
0
110
AIと一緒にレガシーに向き合ってみた
nyafunta9858
0
240
フロントエンド開発の勘所 -複数事業を経験して見えた判断軸の違い-
heimusu
7
2.8k
Architectural Extensions
denyspoltorak
0
290
Fluid Templating in TYPO3 14
s2b
0
130
CSC307 Lecture 02
javiergs
PRO
1
780
AI時代の認知負荷との向き合い方
optfit
0
160
余白を設計しフロントエンド開発を 加速させる
tsukuha
7
2.1k
AIによるイベントストーミング図からのコード生成 / AI-powered code generation from Event Storming diagrams
nrslib
2
1.9k
副作用をどこに置くか問題:オブジェクト指向で整理する設計判断ツリー
koxya
1
610
Featured
See All Featured
The Spectacular Lies of Maps
axbom
PRO
1
520
Agile that works and the tools we love
rasmusluckow
331
21k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
0
150
The World Runs on Bad Software
bkeepers
PRO
72
12k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
330
The browser strikes back
jonoalderson
0
390
Art, The Web, and Tiny UX
lynnandtonic
304
21k
[SF Ruby Conf 2025] Rails X
palkan
1
760
Building a Modern Day E-commerce SEO Strategy
aleyda
45
8.7k
Done Done
chrislema
186
16k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
110
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
78
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/