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
770
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
140
Nebula: Netflix's OSS Gradle Plugins (Bay Area Gradle Users Meetup)
rspieldenner
0
110
Continuous Delivery at Netflix: Uberconf
rspieldenner
0
210
Continuous Delivery at Netflix
rspieldenner
3
250
Other Decks in Programming
See All in Programming
AkarengaLT vol.38
hashimoto_kei
1
120
One Enishi After Another
snoozer05
PRO
0
150
Things You Thought You Didn’t Need To Care About That Have a Big Impact On Your Job
hollycummins
0
250
React Nativeならぬ"Vue Native"が実現するかも?_新世代マルチプラットフォーム開発フレームワークのLynxとLynxのVue.js対応を追ってみよう_Vue Lynx
yut0naga1_fa
1
290
PHPに関数型の魂を宿す〜PHP 8.5 で実現する堅牢なコードとは〜 #phpcon_hiroshima / phpcon-hiroshima-2025
shogogg
1
330
pnpm に provenance のダウングレード を検出する PR を出してみた
ryo_manba
1
150
AI Agent 時代的開發者生存指南
eddie
4
2.1k
monorepo の Go テストをはやくした〜い!~最小の依存解決への道のり~ / faster-testing-of-monorepos
convto
2
530
Go言語はstack overflowの夢を見るか?
logica0419
0
520
Cursorハンズオン実践!
eltociear
2
1.2k
CSC509 Lecture 05
javiergs
PRO
0
310
登壇は dynamic! な営みである / speech is dynamic
da1chi
0
360
Featured
See All Featured
Writing Fast Ruby
sferik
629
62k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.5k
Practical Orchestrator
shlominoach
190
11k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.2k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
253
22k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
359
30k
jQuery: Nuts, Bolts and Bling
dougneiner
65
7.9k
The World Runs on Bad Software
bkeepers
PRO
72
11k
Building a Scalable Design System with Sketch
lauravandoore
463
33k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4k
Music & Morning Musume
bryan
46
6.9k
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/