Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
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
780
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
안드로이드 9년차 개발자, 프론트엔드 주니어로 커리어 리셋하기
maryang
1
130
C-Shared Buildで突破するAI Agent バックテストの壁
po3rin
0
410
Deno Tunnel を使ってみた話
kamekyame
0
230
0→1 フロントエンド開発 Tips🚀 #レバテックMeetup
bengo4com
0
330
宅宅自以為的浪漫:跟 AI 一起為自己辦的研討會寫一個售票系統
eddie
0
520
Microservices rules: What good looks like
cer
PRO
0
1.6k
[AtCoder Conference 2025] LLMを使った業務AHCの上⼿な解き⽅
terryu16
3
620
新卒エンジニアのプルリクエスト with AI駆動
fukunaga2025
0
230
マスタデータ問題、マイクロサービスでどう解くか
kts
0
110
Cap'n Webについて
yusukebe
0
150
生成AIを利用するだけでなく、投資できる組織へ
pospome
2
390
tparseでgo testの出力を見やすくする
utgwkk
2
270
Featured
See All Featured
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
65
35k
Principles of Awesome APIs and How to Build Them.
keavy
127
17k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.8k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
100
Test your architecture with Archunit
thirion
1
2.1k
The Pragmatic Product Professional
lauravandoore
37
7.1k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
0
71
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Exploring anti-patterns in Rails
aemeredith
2
200
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
0
3.4k
Technical Leadership for Architectural Decision Making
baasie
0
180
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/