Gradle – Build Happiness (German)

Gradle – Build Happiness (German)

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

956c7d246841e8507a1e1b96842994db?s=128

Marc Philipp

January 28, 2019
Tweet

Transcript

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

  2. MARC PHILIPP So ware Engineer bei Gradle, Inc. JUnit Maintainer

    seit 2012 Twi er: Web: @marcphilipp marcphilipp.de
  3. ✋ SHOW OF HANDS

  4. WAS IST GRADLE?

  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.
  6. VIELSEITIG EINSETZBAR Java‑Ökosystem: Java, Groovy, Kotlin, Scala, … Na ve

    Projekte: C, C++, Swi , … Android Sons ges: Go, Asciidoctor, …
  7. GRADLE IN ZAHLEN Mehr als 7M Downloads/Monat OSS‑Projekt #17 weltweit

    35+ Gradle Engineers 300K Builds/Woche @ LinkedIn
  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]
  9. AGENDA Kurze Einführung in Gradle Gradle Plugins Inkrementelle Builds Build

    Scans Build Cache
  10. KURZE EINFÜHRUNG IN GRADLE

  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
  12. TASKS Ein Gradle‑Build führt einen/mehrere Tasks aus. Tasks können von

    anderen Tasks abhängen. Tasks haben Inputs und Outputs.
  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.
  14. GRADLE WRAPPER ./gradlew <tasks> sta gradle <tasks> 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.
  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
  16. SETTINGS.GRADLE.KTS rootProject.name = "new-project"

  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" }
  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.
  19. GRADLE PLUGINS

  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 }
  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<Project> { @Override public void apply(Project project) { project.getPluginManager().apply(JavaPlugin.class); project.getTasks().register("myTask", task -> ...); // ... } }
  22. PLUGIN PORTAL Über 3000 Community‑Plugins

  23. INKREMENTELLE BUILDS

  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.
  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
  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
  27. WENN WIR ZEIT HÄTTEN… Compile avoidance & incremental compiler Gradle

    Daemon Con nuous Builds Composite Builds Tooling API / IDE integra on Worker API
  28. BUILD SCANS

  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
  30. BUILD SCAN: TIMELINE

  31. BUILD SCAN: DEPENDENCIES

  32. BUILD SCANS (KOSTENLOS) Beschleunigen die Lösung von Build‑Problemen Einfach mit

    Kollegen teilbarer Link Kostenlose Nutzung auf scans.gradle.com
  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
  34. BUILDS ÜBER DIE ZEIT

  35. VERGLEICH ZWEIER BUILDS

  36. BUILD CACHE

  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
  38. BUILD CACHE Verwende Ergebnisse aller vorherigen Builds

  39. INPUTS → TASK → OUTPUTS Berechne cacheKey eines Tasks aus

    dessen Inputs: cacheKey(javaCompile) = hash(sourceFiles, …) Verwende Ergebnisdateien als cacheEntry: cacheEntry(javaCompile) = fileTree(classFiles)
  40. REMOTE BUILD CACHE

  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
  42. GRADLE ENTERPRISE

  43. NEU: JETZT AUCH FÜR APACHE MAVEN™ › 0:00 / 0:34

    h ps:/ /gradle.com/blog/maven/
  44. GRADLE ENTERPRISE KUNDEN › gradle.com

  45. Q & A