Creating Gradle Plugins - GR8Conf US

Annyce Davis
Annyce DavisAndroid Google Developer Expert, Online Instructor, Conference Speaker at Off Grid Electric
Gradle Plugin Goodness
@BRWNGRLDEV
@BRWNGRLDEV
apply plugin: 'checkstyle'

apply plugin: 'findbugs'

apply plugin: 'pmd'



task checkstyle(type: Checkstyle) {

description 'Checks if the code is somewhat acceptable'

group 'verification'



configFile file('./qa-check/checkstyle.xml')

source 'src'

include '**/*.java'

exclude '**/gen/**'



classpath = files()

ignoreFailures = false

}



task findbugs(type: FindBugs) {

apply plugin: 'checkstyle'

apply plugin: 'findbugs'

apply plugin: 'pmd'



task checkstyle(type: Checkstyle) {

description 'Checks if the code is somewhat acceptable'

group 'verification'



configFile file('./qa-check/checkstyle.xml')

source 'src'

include '**/*.java'

exclude '**/gen/**'



classpath = files()

ignoreFailures = false

}



task findbugs(type: FindBugs) {

description 'Run findbugs'

group 'verification'



classes = files("$project.buildDir/intermediates/classes")

source 'src'

classpath = files()



effort 'max'

excludeFilter file('./qa-check/findbugs-exclude.xml')



reports {

xml.enabled = true

html.enabled = false

}



ignoreFailures = true

}



task pmd(type: Pmd) {

description 'Run PMD'

group 'verification'



ruleSetFiles = files("./qa-check/pmd-ruleset.xml")

ruleSets = []



source 'src'

include '**/*.java'

exclude '**/gen/**'



reports {

xml.enabled = false

html.enabled = true

}



ignoreFailures = true

}
apply plugin: 'info.adavis.qualitychecks'
OVERVIEW
▸Plugin Skeleton
▸Dependencies
▸Plugin.groovy
▸CustomTask.groovy
▸Publishing
@BRWNGRLDEV
PLUGIN SKELETON
@BRWNGRLDEV
PLUGIN SKELETON
@BRWNGRLDEV
PLUGIN SKELETON
@BRWNGRLDEV
PLUGIN SKELETON
How Gradle finds the Plugin Implementation
@BRWNGRLDEV
PLUGIN SKELETON
implementation-class=info.adavis.qualitychecks.QualityChecksPlugin
@BRWNGRLDEV
DEPENDENCIES
@BRWNGRLDEV
DEPENDENCIES
apply plugin: ‘groovy'
dependencies {
compile gradleApi()
compile localGroovy()
}
@BRWNGRLDEV
DEPENDENCIES
dependencies {
…
testCompile 'junit:junit:4.12'

testCompile ('org.spockframework:spock-core:1.0-groovy-2.4') {

exclude module: 'groovy-all'

}
}
@BRWNGRLDEV
THE CODE
@BRWNGRLDEV
BUT FIRST…
@BRWNGRLDEV
GRADLE BUILD
@BRWNGRLDEV
PROJECT
TASK TASK TASK
BUILD
GRADLE BUILD
@BRWNGRLDEV
PROJECT
TASK TASK TASK
BUILD
PROJECT
TASK TASK TASK
PLUGIN.GROOVY
class CustomPlugin implements Plugin<Project> {
}
@BRWNGRLDEV
PLUGIN.GROOVY
class CustomPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
}
}
@BRWNGRLDEV
QUALITYCHECKSPLUGIN.GROOVY
@BRWNGRLDEV
APPLY METHOD
@BRWNGRLDEV
void apply(Project project) {

this.project = project



}
APPLY METHOD
@BRWNGRLDEV
void apply(Project project) {

this.project = project



project.extensions.create('qualityChecks', QualityChecksExtension)



}
APPLY METHOD
@BRWNGRLDEV
void apply(Project project) {

this.project = project



project.extensions.create('qualityChecks', QualityChecksExtension)



createConfigFilesIfNeeded()

createConfigFileTasks()

createQualityChecksTasks()

}
PROJECT EXTENSION
@BRWNGRLDEV
class QualityChecksExtension {



String pmdConfigFile = 'quality-checks/pmd-ruleset.xml'



String checkstyleConfigFile = 'quality-checks/checkstyle.xml'



String findBugsExclusionFile = 'quality-checks/findbugs-exclude.xml'



}
PROJECT EXTENSION
@BRWNGRLDEV
class QualityChecksExtension {



String pmdConfigFile = 'quality-checks/pmd-ruleset.xml'



String checkstyleConfigFile = 'quality-checks/checkstyle.xml'



String findBugsExclusionFile = 'quality-checks/findbugs-exclude.xml'



}
PROJECT EXTENSION
Back in the application’s build.gradle file…
@BRWNGRLDEV
qualityChecks {

pmdConfigFile = ‘checks/pmd.xml’
checkstyleConfigFile = ‘checks/checkstyle.xml’

}
PROJECT EXTENSION
Back in the application’s build.gradle file…
@BRWNGRLDEV
qualityChecks {

pmdConfigFile = ‘checks/pmd.xml’
checkstyleConfigFile = ‘checks/checkstyle.xml’

}
TASKS
@BRWNGRLDEV
CREATING TASKS
Give it a name and a type
@BRWNGRLDEV
CREATING TASKS
@BRWNGRLDEV
▸Build on existing task
▸Extend the DefaultTask
BUILD ON EXISTING TASK
@BRWNGRLDEV
BUILD ON EXISTING
@BRWNGRLDEV
EXTEND DEFAULT TASK
@BRWNGRLDEV
CUSTOMTASK.GROOVY
class CustomTask extends DefaultTask {
CustomTask() {
group: ‘verification’
}
}
@BRWNGRLDEV
CUSTOMTASK.GROOVY
class CustomTask extends DefaultTask {
CustomTask() {
group: ‘verification’
}
}
@BRWNGRLDEV
CUSTOMTASK.GROOVY
CustomTask() {
group: ‘verification’
onlyIf {
// skip under certain conditions
}
}
@BRWNGRLDEV
CUSTOMTASK.GROOVY
@TaskAction
def defaultAction() {
description: ‘What my task does’
}
@BRWNGRLDEV
CUSTOMTASK.GROOVY
@BRWNGRLDEV
@TaskAction
def defaultAction() {
description: ‘What my task does’
<do your cool stuff here>
}
GRADLE TASK DOCUMENTATION
@BRWNGRLDEV
SO FAR…
▸Plugin Skeleton
▸Dependencies
▸Plugin.groovy
▸CustomTask.groovy
@BRWNGRLDEV
PUBLISHING
@BRWNGRLDEV
PUBLISHING
@BRWNGRLDEV
PUBLISHING
buildscript {
…
dependencies {
classpath "com.gradle.publish:plugin-publish-plugin:0.9.4"
}
}
apply plugin: 'com.gradle.plugin-publish'
@BRWNGRLDEV
PUBLISHING
version = "0.1.3"
group = "info.adavis"
@BRWNGRLDEV
PUBLISHING
pluginBundle {
website = 'https://github.com/adavis/quality-checks'
vcsUrl = 'https://github.com/adavis/quality-checks.git'
description = 'Gradle Plugin for…’
tags = ['Checkstyle', 'FindBugs', 'PMD']
}
@BRWNGRLDEV
PUBLISHING
pluginBundle {
…
plugins {
qualityChecksPlugin {
id = 'info.adavis.qualitychecks'
displayName = 'Quality Checks Plugin'
}
}
@BRWNGRLDEV
@BRWNGRLDEV
@BRWNGRLDEV
WE’RE DONE…
WRONG!
@BRWNGRLDEV
WE’RE DONE…
TESTS
@BRWNGRLDEV
TESTING - WITH JUNIT
@Before

void setUp() {

projectDir = temporaryFolder.root

projectDir.mkdirs()





}
@BRWNGRLDEV
TESTING - WITH JUNIT
@Before

void setUp() {

projectDir = temporaryFolder.root

projectDir.mkdirs()



project = ProjectBuilder.builder().withProjectDir(projectDir).build()

task = project.tasks.create('writeConfigFile', WriteConfigFileTask)

}
@BRWNGRLDEV
TESTING - WITH JUNIT
@Test
void shouldBeAbleToCreateTask() {
assertTrue(task instanceof WriteConfigFileTask)
}
@BRWNGRLDEV
TESTING - WITH JUNIT
@Test
void pluginShouldBeApplied() {
project.apply(plugin: QualityChecksPlugin)
assertNotNull(project.tasks.findByName(‘mytask’))
}
@BRWNGRLDEV
SPOCK
@BRWNGRLDEV
TESTING - WITH SPOCK
def createCheckstyleTask() {

given: "we have a project"

def project = ProjectBuilder.builder().build()


}
TESTING - WITH SPOCK
def createCheckstyleTask() {



and: "we apply the extension"

project.extensions.create('qualityChecks', QualityChecksExtension)



and: "we supply an existing checkstyle config file"

project.qualityChecks.checkstyleConfigFile = File.createTempFile('temp', '.xml').path

}
TESTING - WITH SPOCK
def createCheckstyleTask() {



when: "we create a checkstyle task"

def checkstyleTask = project.tasks.create('checkstyle', CheckstyleTask)





}
TESTING - WITH SPOCK
def createCheckstyleTask() {



then: "it should not replace our previous file"

checkstyleTask.configFile.name.startsWith('temp')

}
TESTING - WITH SPOCK
@BRWNGRLDEV
TESTING - REPORT
@BRWNGRLDEV
TESTING - SPOCK-REPORT
dependencies {
…
testCompile( 'com.athaydes:spock-reports:1.2.12' ) {

transitive = false
}
}
@BRWNGRLDEV
TESTING - SPOCK-REPORT
@BRWNGRLDEV
@BRWNGRLDEV
BONUS: README
@BRWNGRLDEV
BONUS: README
@BRWNGRLDEV
BONUS: README
@BRWNGRLDEV
SUMMARY
▸Helps avoid copy/paste horror
▸Simple project structure
▸Extending DefaultTask
▸Testing techniques
▸Easy to publish
@BRWNGRLDEV
THANKS!
@brwngrldev
+AnnyceDavis
www.adavis.info
@BRWNGRLDEV
1 of 70

Recommended

Creating Gradle Plugins - Oredev by
Creating Gradle Plugins - OredevCreating Gradle Plugins - Oredev
Creating Gradle Plugins - OredevAnnyce Davis
587 views77 slides
BDD Testing and Automating from the trenches - Presented at Into The Box June... by
BDD Testing and Automating from the trenches - Presented at Into The Box June...BDD Testing and Automating from the trenches - Presented at Into The Box June...
BDD Testing and Automating from the trenches - Presented at Into The Box June...Gavin Pickin
344 views57 slides
Intro to Unit Testing in AngularJS by
Intro to Unit Testing in AngularJSIntro to Unit Testing in AngularJS
Intro to Unit Testing in AngularJSJim Lynch
934 views53 slides
AngularJS Unit Testing w/Karma and Jasmine by
AngularJS Unit Testing w/Karma and JasmineAngularJS Unit Testing w/Karma and Jasmine
AngularJS Unit Testing w/Karma and Jasminefoxp2code
1.7K views18 slides
3 Ways to test your ColdFusion API - 2017 Adobe CF Summit by
3 Ways to test your ColdFusion API - 2017 Adobe CF Summit3 Ways to test your ColdFusion API - 2017 Adobe CF Summit
3 Ways to test your ColdFusion API - 2017 Adobe CF SummitOrtus Solutions, Corp
745 views87 slides
TDD & BDD by
TDD & BDDTDD & BDD
TDD & BDDArvind Vyas
1.2K views29 slides

More Related Content

What's hot

Angular testing by
Angular testingAngular testing
Angular testingRaissa Ferreira
2.3K views47 slides
Testing Javascript with Jasmine by
Testing Javascript with JasmineTesting Javascript with Jasmine
Testing Javascript with JasmineTim Tyrrell
5.1K views88 slides
How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016 by
How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016
How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016Gavin Pickin
427 views69 slides
JavaScript Test-Driven Development with Jasmine 2.0 and Karma by
JavaScript Test-Driven Development with Jasmine 2.0 and Karma JavaScript Test-Driven Development with Jasmine 2.0 and Karma
JavaScript Test-Driven Development with Jasmine 2.0 and Karma Christopher Bartling
9.9K views40 slides
Jasmine BDD for Javascript by
Jasmine BDD for JavascriptJasmine BDD for Javascript
Jasmine BDD for JavascriptLuis Alfredo Porras Páez
9.9K views31 slides
Testing javascript in the frontend by
Testing javascript in the frontendTesting javascript in the frontend
Testing javascript in the frontendFrederic CABASSUT
939 views57 slides

What's hot(19)

Testing Javascript with Jasmine by Tim Tyrrell
Testing Javascript with JasmineTesting Javascript with Jasmine
Testing Javascript with Jasmine
Tim Tyrrell5.1K views
How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016 by Gavin Pickin
How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016
How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016
Gavin Pickin427 views
JavaScript Test-Driven Development with Jasmine 2.0 and Karma by Christopher Bartling
JavaScript Test-Driven Development with Jasmine 2.0 and Karma JavaScript Test-Driven Development with Jasmine 2.0 and Karma
JavaScript Test-Driven Development with Jasmine 2.0 and Karma
AngularJS Testing Strategies by njpst8
AngularJS Testing StrategiesAngularJS Testing Strategies
AngularJS Testing Strategies
njpst82.1K views
ruby on rails pitfalls by Robbin Fan
ruby on rails pitfallsruby on rails pitfalls
ruby on rails pitfalls
Robbin Fan1.1K views
Gradle - time for another build by Igor Khotin
Gradle - time for another buildGradle - time for another build
Gradle - time for another build
Igor Khotin2.4K views
Jasmine - why JS tests don't smell fishy by Igor Napierala
Jasmine - why JS tests don't smell fishyJasmine - why JS tests don't smell fishy
Jasmine - why JS tests don't smell fishy
Igor Napierala4.7K views
Adventures In JavaScript Testing by Thomas Fuchs
Adventures In JavaScript TestingAdventures In JavaScript Testing
Adventures In JavaScript Testing
Thomas Fuchs1.5K views
Test-Driven Development of AngularJS Applications by FITC
Test-Driven Development of AngularJS ApplicationsTest-Driven Development of AngularJS Applications
Test-Driven Development of AngularJS Applications
FITC9.3K views
Developer Test - Things to Know by vilniusjug
Developer Test - Things to KnowDeveloper Test - Things to Know
Developer Test - Things to Know
vilniusjug781 views
Javascript Testing with Jasmine 101 by Roy Yu
Javascript Testing with Jasmine 101Javascript Testing with Jasmine 101
Javascript Testing with Jasmine 101
Roy Yu1.6K views

Similar to Creating Gradle Plugins - GR8Conf US

Improving your Gradle builds by
Improving your Gradle buildsImproving your Gradle builds
Improving your Gradle buildsPeter Ledbrook
1.1K views41 slides
20160905 - BrisJS - nightwatch testing by
20160905 - BrisJS - nightwatch testing20160905 - BrisJS - nightwatch testing
20160905 - BrisJS - nightwatch testingVladimir Roudakov
756 views52 slides
Gradle in 45min by
Gradle in 45minGradle in 45min
Gradle in 45minSchalk Cronjé
1.6K views49 slides
Enter the gradle by
Enter the gradleEnter the gradle
Enter the gradleParameswari Ettiappan
305 views56 slides
Reliable Javascript by
Reliable Javascript Reliable Javascript
Reliable Javascript Glenn Stovall
1K views76 slides
GradleFX by
GradleFXGradleFX
GradleFXChristophe Herreman
3K views35 slides

Similar to Creating Gradle Plugins - GR8Conf US(20)

Improving your Gradle builds by Peter Ledbrook
Improving your Gradle buildsImproving your Gradle builds
Improving your Gradle builds
Peter Ledbrook1.1K views
Grails 1.2 探検隊 -新たな聖杯をもとめて・・・- by Tsuyoshi Yamamoto
Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-
Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-
Tsuyoshi Yamamoto1.4K views
Jeroen Vloothuis Bend Kss To Your Will by Vincenzo Barone
Jeroen Vloothuis   Bend Kss To Your WillJeroen Vloothuis   Bend Kss To Your Will
Jeroen Vloothuis Bend Kss To Your Will
Vincenzo Barone949 views
Idiomatic Gradle Plugin Writing by Schalk Cronjé
Idiomatic Gradle Plugin WritingIdiomatic Gradle Plugin Writing
Idiomatic Gradle Plugin Writing
Schalk Cronjé1.3K views
Grailsでドメイン駆動設計を実践する時の勘所 by Takuma Watabiki
Grailsでドメイン駆動設計を実践する時の勘所Grailsでドメイン駆動設計を実践する時の勘所
Grailsでドメイン駆動設計を実践する時の勘所
Takuma Watabiki8.7K views
Static Code Analysis by Annyce Davis
Static Code AnalysisStatic Code Analysis
Static Code Analysis
Annyce Davis3.4K views
Javascript unit testing, yes we can e big by Andy Peterson
Javascript unit testing, yes we can   e bigJavascript unit testing, yes we can   e big
Javascript unit testing, yes we can e big
Andy Peterson1.1K views
Extend GraphQL with directives by Greg Bergé
Extend GraphQL with directivesExtend GraphQL with directives
Extend GraphQL with directives
Greg Bergé1.6K views
Continuous Integration for front-end JavaScript by Lars Thorup
Continuous Integration for front-end JavaScriptContinuous Integration for front-end JavaScript
Continuous Integration for front-end JavaScript
Lars Thorup6.4K views
Idiomatic Gradle Plugin Writing by Schalk Cronjé
Idiomatic Gradle Plugin WritingIdiomatic Gradle Plugin Writing
Idiomatic Gradle Plugin Writing
Schalk Cronjé940 views
stateDatabuild.xml Builds, tests, and runs the project.docx by whitneyleman54422
stateDatabuild.xml      Builds, tests, and runs the project.docxstateDatabuild.xml      Builds, tests, and runs the project.docx
stateDatabuild.xml Builds, tests, and runs the project.docx
Guide to Node.js: Basic to Advanced by Espeo Software
Guide to Node.js: Basic to AdvancedGuide to Node.js: Basic to Advanced
Guide to Node.js: Basic to Advanced
Espeo Software833 views
Gradle: The Build system you have been waiting for by Corneil du Plessis
Gradle: The Build system you have been waiting forGradle: The Build system you have been waiting for
Gradle: The Build system you have been waiting for

More from Annyce Davis

Getting a Grip on GraphQL by
Getting a Grip on GraphQLGetting a Grip on GraphQL
Getting a Grip on GraphQLAnnyce Davis
302 views131 slides
RxJava In Baby Steps by
RxJava In Baby StepsRxJava In Baby Steps
RxJava In Baby StepsAnnyce Davis
9.8K views159 slides
No internet? No Problem! by
No internet? No Problem!No internet? No Problem!
No internet? No Problem!Annyce Davis
1.3K views83 slides
First Do No Harm - 360|AnDev by
First Do No Harm - 360|AnDevFirst Do No Harm - 360|AnDev
First Do No Harm - 360|AnDevAnnyce Davis
525 views97 slides
First Do No Harm - Droidcon Boston by
First Do No Harm - Droidcon BostonFirst Do No Harm - Droidcon Boston
First Do No Harm - Droidcon BostonAnnyce Davis
5.7K views110 slides
Developing Apps for Emerging Markets by
Developing Apps for Emerging MarketsDeveloping Apps for Emerging Markets
Developing Apps for Emerging MarketsAnnyce Davis
1.6K views66 slides

More from Annyce Davis(16)

Getting a Grip on GraphQL by Annyce Davis
Getting a Grip on GraphQLGetting a Grip on GraphQL
Getting a Grip on GraphQL
Annyce Davis302 views
RxJava In Baby Steps by Annyce Davis
RxJava In Baby StepsRxJava In Baby Steps
RxJava In Baby Steps
Annyce Davis9.8K views
No internet? No Problem! by Annyce Davis
No internet? No Problem!No internet? No Problem!
No internet? No Problem!
Annyce Davis1.3K views
First Do No Harm - 360|AnDev by Annyce Davis
First Do No Harm - 360|AnDevFirst Do No Harm - 360|AnDev
First Do No Harm - 360|AnDev
Annyce Davis525 views
First Do No Harm - Droidcon Boston by Annyce Davis
First Do No Harm - Droidcon BostonFirst Do No Harm - Droidcon Boston
First Do No Harm - Droidcon Boston
Annyce Davis5.7K views
Developing Apps for Emerging Markets by Annyce Davis
Developing Apps for Emerging MarketsDeveloping Apps for Emerging Markets
Developing Apps for Emerging Markets
Annyce Davis1.6K views
Develop Maintainable Apps - edUiConf by Annyce Davis
Develop Maintainable Apps - edUiConfDevelop Maintainable Apps - edUiConf
Develop Maintainable Apps - edUiConf
Annyce Davis539 views
From Grails to Android: A Simple Journey by Annyce Davis
From Grails to Android: A Simple JourneyFrom Grails to Android: A Simple Journey
From Grails to Android: A Simple Journey
Annyce Davis776 views
Google I/O 2016 Recap by Annyce Davis
Google I/O 2016 RecapGoogle I/O 2016 Recap
Google I/O 2016 Recap
Annyce Davis292 views
Screen Robots: UI Tests in Espresso by Annyce Davis
Screen Robots: UI Tests in EspressoScreen Robots: UI Tests in Espresso
Screen Robots: UI Tests in Espresso
Annyce Davis619 views
Creating Gradle Plugins by Annyce Davis
Creating Gradle PluginsCreating Gradle Plugins
Creating Gradle Plugins
Annyce Davis1.2K views
Develop Maintainable Apps by Annyce Davis
Develop Maintainable AppsDevelop Maintainable Apps
Develop Maintainable Apps
Annyce Davis9.4K views
Android Testing, Why So Hard?! by Annyce Davis
Android Testing, Why So Hard?!Android Testing, Why So Hard?!
Android Testing, Why So Hard?!
Annyce Davis2K views
Measuring Audience Engagement through Analytics by Annyce Davis
Measuring Audience Engagement through AnalyticsMeasuring Audience Engagement through Analytics
Measuring Audience Engagement through Analytics
Annyce Davis635 views
DC Media Innovations Kick-Off Meetup by Annyce Davis
DC Media Innovations Kick-Off MeetupDC Media Innovations Kick-Off Meetup
DC Media Innovations Kick-Off Meetup
Annyce Davis449 views

Recently uploaded

predicting-m3-devopsconMunich-2023-v2.pptx by
predicting-m3-devopsconMunich-2023-v2.pptxpredicting-m3-devopsconMunich-2023-v2.pptx
predicting-m3-devopsconMunich-2023-v2.pptxTier1 app
12 views33 slides
FOSSLight Community Day 2023-11-30 by
FOSSLight Community Day 2023-11-30FOSSLight Community Day 2023-11-30
FOSSLight Community Day 2023-11-30Shane Coughlan
7 views18 slides
Automated Testing of Microsoft Power BI Reports by
Automated Testing of Microsoft Power BI ReportsAutomated Testing of Microsoft Power BI Reports
Automated Testing of Microsoft Power BI ReportsRTTS
10 views20 slides
How to build dyanmic dashboards and ensure they always work by
How to build dyanmic dashboards and ensure they always workHow to build dyanmic dashboards and ensure they always work
How to build dyanmic dashboards and ensure they always workWiiisdom
14 views13 slides
Navigating container technology for enhanced security by Niklas Saari by
Navigating container technology for enhanced security by Niklas SaariNavigating container technology for enhanced security by Niklas Saari
Navigating container technology for enhanced security by Niklas SaariMetosin Oy
15 views34 slides
Transport Management System - Shipment & Container Tracking by
Transport Management System - Shipment & Container TrackingTransport Management System - Shipment & Container Tracking
Transport Management System - Shipment & Container TrackingFreightoscope
5 views3 slides

Recently uploaded(20)

predicting-m3-devopsconMunich-2023-v2.pptx by Tier1 app
predicting-m3-devopsconMunich-2023-v2.pptxpredicting-m3-devopsconMunich-2023-v2.pptx
predicting-m3-devopsconMunich-2023-v2.pptx
Tier1 app12 views
FOSSLight Community Day 2023-11-30 by Shane Coughlan
FOSSLight Community Day 2023-11-30FOSSLight Community Day 2023-11-30
FOSSLight Community Day 2023-11-30
Shane Coughlan7 views
Automated Testing of Microsoft Power BI Reports by RTTS
Automated Testing of Microsoft Power BI ReportsAutomated Testing of Microsoft Power BI Reports
Automated Testing of Microsoft Power BI Reports
RTTS10 views
How to build dyanmic dashboards and ensure they always work by Wiiisdom
How to build dyanmic dashboards and ensure they always workHow to build dyanmic dashboards and ensure they always work
How to build dyanmic dashboards and ensure they always work
Wiiisdom14 views
Navigating container technology for enhanced security by Niklas Saari by Metosin Oy
Navigating container technology for enhanced security by Niklas SaariNavigating container technology for enhanced security by Niklas Saari
Navigating container technology for enhanced security by Niklas Saari
Metosin Oy15 views
Transport Management System - Shipment & Container Tracking by Freightoscope
Transport Management System - Shipment & Container TrackingTransport Management System - Shipment & Container Tracking
Transport Management System - Shipment & Container Tracking
Freightoscope 5 views
aATP - New Correlation Confirmation Feature.pptx by EsatEsenek1
aATP - New Correlation Confirmation Feature.pptxaATP - New Correlation Confirmation Feature.pptx
aATP - New Correlation Confirmation Feature.pptx
EsatEsenek1205 views
Dapr Unleashed: Accelerating Microservice Development by Miroslav Janeski
Dapr Unleashed: Accelerating Microservice DevelopmentDapr Unleashed: Accelerating Microservice Development
Dapr Unleashed: Accelerating Microservice Development
Miroslav Janeski15 views
Understanding HTML terminology by artembondar5
Understanding HTML terminologyUnderstanding HTML terminology
Understanding HTML terminology
artembondar57 views
predicting-m3-devopsconMunich-2023.pptx by Tier1 app
predicting-m3-devopsconMunich-2023.pptxpredicting-m3-devopsconMunich-2023.pptx
predicting-m3-devopsconMunich-2023.pptx
Tier1 app8 views
AI and Ml presentation .pptx by FayazAli87
AI and Ml presentation .pptxAI and Ml presentation .pptx
AI and Ml presentation .pptx
FayazAli8714 views
Top-5-production-devconMunich-2023.pptx by Tier1 app
Top-5-production-devconMunich-2023.pptxTop-5-production-devconMunich-2023.pptx
Top-5-production-devconMunich-2023.pptx
Tier1 app9 views

Creating Gradle Plugins - GR8Conf US