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
理論と実務のギャップを超える
eycjur
0
120
iOSエンジニア向けの英語学習アプリを作る!
yukawashouhei
0
190
Goで実践するドメイン駆動開発 AIと歩み始めた新規プロダクト開発の現在地
imkaoru
4
790
dynamic!
moro
10
7.1k
Devvox Belgium - Agentic AI Patterns
kdubois
1
100
バッチ処理を「状態の記録」から「事実の記録」へ
panda728
PRO
0
140
Catch Up: Go Style Guide Update
andpad
0
210
なぜGoのジェネリクスはこの形なのか? Featherweight Goが明かす設計の核心
ryotaros
7
1.1k
Devoxx BE - Local Development in the AI Era
kdubois
0
120
CSC509 Lecture 05
javiergs
PRO
0
300
Pull-Requestの内容を1クリックで動作確認可能にするワークフロー
natmark
2
480
育てるアーキテクチャ:戦い抜くPythonマイクロサービスの設計と進化戦略
fujidomoe
1
170
Featured
See All Featured
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Designing for humans not robots
tammielis
254
26k
Music & Morning Musume
bryan
46
6.8k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Making the Leap to Tech Lead
cromwellryan
135
9.6k
How STYLIGHT went responsive
nonsquared
100
5.8k
Making Projects Easy
brettharned
119
6.4k
How GitHub (no longer) Works
holman
315
140k
Reflections from 52 weeks, 52 projects
jeffersonlam
352
21k
Raft: Consensus for Rubyists
vanstee
139
7.1k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
15k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
657
61k
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/