Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Gradle – Build Happiness (German)

Gradle – Build Happiness (German)

Introduction to the Gradle Build Tool, Build Scans and the Build Cache

Marc Philipp

January 28, 2019
Tweet

More Decks by Marc Philipp

Other Decks in Programming

Transcript

  1. GRADLE – BUILD HAPPINESS
    MARC PHILIPP, GRADLE INC.

    View Slide

  2. MARC PHILIPP
    So ware Engineer bei Gradle, Inc.
    JUnit Maintainer seit 2012
    Twi er:
    Web:
    @marcphilipp
    marcphilipp.de

    View Slide


  3. SHOW OF HANDS

    View Slide

  4. WAS IST GRADLE?

    View Slide

  5. WAS IST GRADLE?
    Basiert auf der Java Virtual Machine (JVM)
    Implemen ert in Java
    100% Open Source (Apache 2.0) und kostenlos
    Gradle ist ein Build‑ und
    Automa sierungswerkzeug.

    View Slide

  6. VIELSEITIG EINSETZBAR
    Java‑Ökosystem: Java, Groovy, Kotlin, Scala, …
    Na ve Projekte: C, C++, Swi , …
    Android
    Sons ges: Go, Asciidoctor, …

    View Slide

  7. GRADLE IN ZAHLEN
    Mehr als 7M Downloads/Monat
    OSS‑Projekt #17 weltweit
    35+ Gradle Engineers
    300K Builds/Woche @ LinkedIn

    View Slide

  8. GRADLE INC.
    Vision: Build Happiness
    Mission: Accelerate Developer Produc vity
    Produkte: Build Scans and Enterprise Build Cache
    [Consul ng, Support, Development Services etc.]
    [Training: online, öffentlich und in‑house]

    View Slide

  9. AGENDA
    Kurze Einführung in Gradle
    Gradle Plugins
    Inkrementelle Builds
    Build Scans
    Build Cache

    View Slide

  10. KURZE
    EINFÜHRUNG IN
    GRADLE

    View Slide

  11. HELLO WORLD
    tasks.register("helloWorld") { // in build.gradle
    doLast {
    println("Hello World!")
    }
    }
    $ gradle helloWorld
    > Task :helloWorld
    Hello World!
    BUILD SUCCESSFUL in 0s
    1 actionable task: 1 executed

    View Slide

  12. TASKS
    Ein Gradle‑Build führt einen/mehrere Tasks aus.
    Tasks können von anderen Tasks abhängen.
    Tasks haben Inputs und Outputs.

    View Slide

  13. BUILDSCRIPTS
    Ein Gradle‑Projekt wird mi els Buildscripts
    konfiguriert:
    settings.gradle[.kts] : Konfiguriert, welche
    Subprojekte Teile des Builds sind.
    build.gradle[.kts] : Konfiguriert Plugins und
    Tasks, die im Build verwendet werden.

    View Slide

  14. GRADLE WRAPPER
    ./gradlew sta gradle
    Ermöglicht Ausführung des Builds ohne vorherige
    Installa on von Gradle: Lädt ggfs. die benö gte
    Version herunter.
    Entwickler und Build‑Server verwenden immer
    diesselbe Version.

    View Slide

  15. DATEISTRUKTUR
    $ gradle init --dsl=kotlin --type=java-application \
    --test-framework=junit --package=com.example \
    --project-name=new-project
    BUILD SUCCESSFUL in 0s
    2 actionable tasks: 2 executed
    ├── build.gradle.kts // Buildscript
    ├── gradle/wrapper // Wrapper JAR und Konfiguration
    ├── gradlew // Wrapper script für Linux/macOS
    ├── gradlew.bat // Wrapper script für Windows
    ├── settings.gradle.kts // Settings
    └── src // Java source tree
    ├── main
    │ ├── java
    │ └── resources
    └── test
    ├── java
    └── resources

    View Slide

  16. SETTINGS.GRADLE.KTS
    rootProject.name = "new-project"

    View Slide

  17. BUILD.GRADLE.KTS
    plugins {
    java // zum Kompilieren von Java-Quellcode
    application // zum Generieren von Startup-Scripts
    }
    repositories {
    jcenter() // zum Auffinden von Dependencies
    }
    dependencies {
    implementation("com.google.guava:guava:26.0-jre")
    testImplementation("junit:junit:4.12")
    }
    application { // Extension des 'application'-Plugins
    mainClassName = "com.example.App"
    }

    View Slide

  18. GROOVY VS. KOTLIN DSL
    Buildscript verwenden eine Domain‑Specific‑
    Language (DSL).
    Ursprünglich wurde dazu Groovy verwendet.
    Groovy: Dynamisch typisiert, IDE‑Support
    schwierig
    Seit Gradle 5.0 gibt es eine stabile DSL in Kotlin.

    View Slide

  19. GRADLE PLUGINS

    View Slide

  20. PLUGINS
    Definieren Tasks, z.B. compileJava
    Stellen Möglichkeiten zur Konfigura on bereit,
    z.B. die application ‑Extension
    Wenden andere Plugins an
    plugins {
    java // zum Kompilieren von Java-Quellcode
    application // zum Generieren von Startup-Scripts
    }

    View Slide

  21. EIGENE PLUGINS
    Ziel: Vereinheitlichung der Build‑Logik über Projekt‑
    Grenzen hinweg
    plugins {
    id("com.example.myplugin") version "1.0"
    }
    public class MyPlugin implements Plugin {
    @Override public void apply(Project project) {
    project.getPluginManager().apply(JavaPlugin.class);
    project.getTasks().register("myTask", task -> ...);
    // ...
    }
    }

    View Slide

  22. PLUGIN PORTAL
    Über 3000 Community‑Plugins

    View Slide

  23. INKREMENTELLE
    BUILDS

    View Slide

  24. INKREMENTELLE BUILDS
    Führe nur Tasks aus, die von Änderungen
    zwischen zwei Builds betroffen sind.
    Behalte die Ergebnisdateien aller Tasks die up‑to‑
    date sind.

    View Slide

  25. ERSTER BUILD
    $ ./gradlew --console=plain build
    > Task :compileJava
    > Task :processResources NO-SOURCE
    > Task :classes
    > Task :jar
    [...]
    > Task :compileTestJava
    > Task :testClasses
    > Task :test
    > Task :check
    > Task :build
    BUILD SUCCESSFUL in 5s
    7 actionable tasks: 7 executed

    View Slide

  26. INKREMENTELLER BUILD
    $ ./gradlew --console=plain build
    > Task :compileJava UP-TO-DATE
    > Task :processResources NO-SOURCE
    > Task :classes UP-TO-DATE
    > Task :jar UP-TO-DATE
    [...]
    > Task :compileTestJava UP-TO-DATE
    > Task :testClasses UP-TO-DATE
    > Task :test UP-TO-DATE
    > Task :check UP-TO-DATE
    > Task :build UP-TO-DATE
    BUILD SUCCESSFUL in 0s
    7 actionable tasks: 7 up-to-date

    View Slide

  27. WENN WIR ZEIT HÄTTEN…
    Compile avoidance & incremental compiler
    Gradle Daemon
    Con nuous Builds
    Composite Builds
    Tooling API / IDE integra on
    Worker API

    View Slide

  28. BUILD SCANS

    View Slide

  29. BUILD SCAN: AKTIVIERUNG

    $ ./gradlew build --scan
    BUILD SUCCESSFUL in 1s
    7 actionable tasks: 5 executed, 2 up-to-date
    Publishing build scan...
    https://gradle.com/s/lu7dxy7quyoju
    h ps:/
    /gradle.com/s/lu7dxy7quyoju

    View Slide

  30. BUILD SCAN: TIMELINE

    View Slide

  31. BUILD SCAN: DEPENDENCIES

    View Slide

  32. BUILD SCANS (KOSTENLOS)
    Beschleunigen die Lösung von Build‑Problemen
    Einfach mit Kollegen teilbarer Link
    Kostenlose Nutzung auf scans.gradle.com

    View Slide

  33. ENTERPRISE BUILD SCANS
    Gradle Enterprise bietet zusätzliche Features:
    Hos ng auf eigenem Server
    Vergleich zweier Build Scans
    Entwicklung von Build‑Metriken über die Zeit

    View Slide

  34. BUILDS ÜBER DIE ZEIT

    View Slide

  35. VERGLEICH ZWEIER BUILDS

    View Slide

  36. BUILD CACHE

    View Slide

  37. MORGENS HALB 10 IN
    DEUTSCHLAND…
    Give every developer back one hour a day!
    $ git pull
    [...]
    185 files changed, 4320 insertions(+), 1755 deletions(-)
    $ ./gradlew --build-cache sanityCheck
    BUILD SUCCESSFUL in 1m 11s
    1338 actionable tasks: 238 executed, 1100 from cache

    View Slide

  38. BUILD CACHE
    Verwende Ergebnisse aller vorherigen Builds

    View Slide

  39. INPUTS → TASK → OUTPUTS
    Berechne cacheKey eines Tasks aus dessen Inputs:
    cacheKey(javaCompile) = hash(sourceFiles, …)
    Verwende Ergebnisdateien als cacheEntry:
    cacheEntry(javaCompile) = fileTree(classFiles)

    View Slide

  40. REMOTE BUILD CACHE

    View Slide

  41. LOKAL UND REMOTE
    CI‑Server speichern Task‑Ergebnisse im Remote
    Build Cache
    Lokale Builds verwenden Ergebnisse aus dem
    Remote Build Cache
    Ergebnisse werden für zukün ige Builds im
    lokalen Build Cache gespeichert

    View Slide

  42. GRADLE ENTERPRISE

    View Slide

  43. NEU: JETZT AUCH FÜR
    APACHE MAVEN™

    0:00 / 0:34
    h ps:/
    /gradle.com/blog/maven/

    View Slide

  44. GRADLE ENTERPRISE KUNDEN
    › gradle.com

    View Slide

  45. Q & A

    View Slide