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 full-size slide

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

    View full-size slide


  3. SHOW OF HANDS

    View full-size slide

  4. WAS IST GRADLE?

    View full-size 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 full-size slide

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

    View full-size slide

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

    View full-size 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 full-size slide

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

    View full-size slide

  10. KURZE
    EINFÜHRUNG IN
    GRADLE

    View full-size 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 full-size 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 full-size 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 full-size 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 full-size 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 full-size slide

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

    View full-size 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 full-size 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 full-size slide

  19. GRADLE PLUGINS

    View full-size 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 full-size 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 full-size slide

  22. PLUGIN PORTAL
    Über 3000 Community‑Plugins

    View full-size slide

  23. INKREMENTELLE
    BUILDS

    View full-size 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 full-size 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 full-size 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 full-size 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 full-size slide

  28. 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 full-size slide

  29. BUILD SCAN: TIMELINE

    View full-size slide

  30. BUILD SCAN: DEPENDENCIES

    View full-size slide

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

    View full-size slide

  32. 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 full-size slide

  33. BUILDS ÜBER DIE ZEIT

    View full-size slide

  34. VERGLEICH ZWEIER BUILDS

    View full-size slide

  35. 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 full-size slide

  36. BUILD CACHE
    Verwende Ergebnisse aller vorherigen Builds

    View full-size slide

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

    View full-size slide

  38. REMOTE BUILD CACHE

    View full-size slide

  39. 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 full-size slide

  40. GRADLE ENTERPRISE

    View full-size slide

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

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

    View full-size slide

  42. GRADLE ENTERPRISE KUNDEN
    › gradle.com

    View full-size slide