Everything-as-code. Ein polyglottes Abenteuer

QAware GmbH
QAware GmbHQAware GmbH
Everything-as-code.
Ein polyglottes Abenteuer.
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 1
#whoami
Mario-Leander Reimer
Cheftechnologe, QAware GmbH
• Vollblut Entwickler &&
Architekt
• #CloudNativeNerd
• Open Source Enthusiast
mario-leander.reimer@qaware.de
http://github.com/lreimer
http://speakerdeck.com/lreimer
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 2
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 3
Welche Sprache
verwenden echte
Programmierer?
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 4
Meine #FirstSevenLanguages
• Pascal
• Basic
• C / C++
• Assembler
• PHP
• Java
• C#
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 5
Meine #LastSevenLanguages
• Java
• Groovy
• TypeScript
• Ruby
• Kotlin
• Scala
• Go
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 6
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 7
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 8
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 9
Es gibt keine einstimmige
Meinung ...
• http://spectrum.ieee.org/computing/software/
the-2016-top-programming-languages
• https://www.sitepoint.com/whats-best-
programming-language-learn-2015/
• https://jaxenter.de/programmiersprachen-
rankings-q1-2017-54308
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 10
Die beste Programmiersprache gibt es nicht!
Auf den Kontext kommt es an.
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 11
Die IDE ist unsere Werkbank.
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 12
Unsere Definition von Software Industrialisierung
• Hat nichts mit billiger Arbeitskraft zu tun!
• Hoher Automatisiersgrad von arbeitsintensiven und
wiederkehrenden Arbeitsschritten
• Höhere Software-Qualität durch abgestimmte Tool-
Chain
• Mehr Produktivität und Zufriedenheit der Teams
• Bessere Kosten-Effizienz und Wettbewerbsfähigkeit
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 13
Wäre es nicht cool wenn ...
open fun everythingAsCode() : Boolean {
everytingIsMadeFromCode() && everythingIsMadeByCode()
}
val softwareIndustrialization = everythingAsCode()
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 14
The Quest for an ideal Polyglot Project Archetype
• Welche Sprachen werden in unseren Projekten verwendet?
• Welche Tools verwenden wir für Setup, Build, Code,
Test, CI, Infrastructure und Dokumentation?
• Was davon hat sich bewährt und was eher nicht?
• Gibt es bereits Best Practices für den Einsatz in der
Praxis?
+ Wishful Greenfield Thinking!
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 15
SEU-as-code
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 16
Lightweight Developer Provisioning mit Gradle
• [ SEU ] -> Software Entwicklungs Umgebung
• Nutzung von Gradle als Build-Tool für das Setup und
die Aktualisierung unserer Entwicklungsumgebungen
• Software-Pakete werden als Dependencies ausgedrückt
• Gradle Tasks and Groovy Skripte statt Shell-
Scripting
• Versionskontrolle der SEU Definition und Skripte
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 17
plugins { id 'de.qaware.seu.as.code.base' version '2.4.0' }
import static de.qaware.seu.as.code.plugins.base.Platform.isMac
seuAsCode {
seuHome = { if (isMac()) '/Volumes/Everything-as-code' else 'Y:' }
projectName = 'Everything-as-code'
}
dependencies {
// list of software dependencies ...
software 'org.groovy-lang:groovy:2.4.7'
software 'org.scala-lang:scala:2.11.8'
software 'org.jruby:jruby:9.1.4.0'
}
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 18
Build-as-code
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 19
Maven ist gut. Gradle ist besser.
• Sehr flexibel und vielseitig einsetzbar.
• Einfache Unterstützung für Polyglotte Projekte.
• Build Skripte sind maximal kurz und prägnant.
• Drastisch reduzierte Build-Zeiten durch Incremental
Builds.
• Zahlreiche neue Features: Composite Builds, Kotlin-
basierte Build-Skripte, Performance Verbesserungen, ...
• Regelmäßige Releases. Stabil und ausgereift.
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 20
apply plugin: 'application'
apply plugin: 'war'
apply plugin: 'kotlin'
apply plugin: 'groovy'
repositories { jcenter() }
dependencies {
providedCompile 'fish.payara.extras:payara-micro:4.1.1.164'
// and many more ...
}
task everythingAsCode() << {
println 'Everything-as-code @ JAX 2017.'
}
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 21
Main-as-code
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 22
Java ist nach wie vor die
primäre Implementierungssprache!
Und das ist gut so!
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 23
Für die Mutigen:
Kotlin als ernsthafte
Alternative zu Java.
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 24
Warum Kotlin? Und nicht Scala, Clojure, ...
• Für Java Entwickler sehr schnell zu erlernen.
• Sehr ausgewogene Universalsprache.
• Null Safety + Synatctic Sugar + jede Menge
andere nützliche Features.
• JDK6 kompatibel. Kleine Library-Größe.
• Sehr guter IDE und Tool Support.
• Wishful Greenfield Thinking.
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 25
@JsonIgnoreProperties(ignoreUnknown = true)
data class Book(val title: String, val isbn: String, val author: String)
@ApplicationScoped
open class Bookshelf {
private val books = listOf(Book("The Hitchhiker's Guide to the Galaxy", "0345391802"))
open fun byIsbn(isbn: String): Book? = books.find { it.isbn == isbn }
}
@Path("books")
@Produces(MediaType.APPLICATION_JSON)
open class BookResource @Inject constructor(private val bookshelf: Bookshelf) {
@GET @Path("/{isbn}")
open fun byIsbn(@PathParam("isbn") isbn: String): Response {
val book = bookshelf.byIsbn(isbn)
return if (book != null) Response.ok(book).build() else Response.status(Status.NOT_FOUND).build()
}
}
@ApplicationPath("api")
class BookstoreAPI : Application() {
override fun getClasses() = hashSetOf(JacksonFeature::class.java, BookResource::class.java)
}
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 26
Frontend-as-code
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 27
Willkommen in der JavaScript Wunderwelt.
• Ein Universum für sich!
• Klarer Trend: Single Page Webapplikationen.
• HTML5 + CSS3 + ?
• ? = TypeScript oder
• ? = ECMAScript2015 + Babel
• Rückgrat des Builds: node + npm + webpack
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 28
Test-as-code
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 29
Groovy und Spock für Unit & Integration Tests
class BookshelfSpec extends Specification {
@Subject
def bookshelf = new Bookshelf()
@Unroll
def "Find book #title by ISBN #isbn"() {
when: 'we search a book by ISBN'
def book = bookshelf.byIsbn(isbn)
then: 'the title and author are correct'
book?.title == title
book?.author == author
where:
isbn || title | author
"0345391802" || "The Hitchhiker's Guide to the Galaxy" | "Douglas Adams"
"0345391829" || "Life, the Universe and Everything" | "Douglas Adams"
}
}
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 30
Scala und Gatling für Last-Tests
class BooksPerformanceTest extends Simulation {
val conf = http.baseURL("http://localhost:18080").acceptHeader("application/json")
val feeder = csv("books.csv").random
val scn = scenario("Book Search")
.exec(http("Get all books").get("/api/books"))
.during(30 seconds) {
feed(feeder)
.exec(http("Get book by title ${Title}").get("/api/books?title=${Title}"))
.pause(1 second)
.exec(http("Get book with ISBN ${ISBN}").get("/api/books/${ISBN}"))
}
setUp(scn.inject(atOnceUsers(10), rampUsers(50) over (30 seconds)))
.assertions(global.responseTime.max.lessThan(5000))
.protocols(conf)
}
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 31
Pipeline-as-code
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 32
Definition der Build-Pipeline per Jenkinsfile
#!/usr/bin/env groovy
node {
stage 'Checkout SCM'
checkout scm
stage 'Build/Analyse/Test'
sh './gradlew clean build'
archiveUnitTestResults()
archiveDistributions()
stage 'Dockerize'
sh './gradlew buildDockerImage'
stage 'Generate Documentation'
sh './gradlew asciidoctor'
}
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 33
Infrastructure-as-code
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 34
Docker, Docker, Docker, ...
FROM qaware-oss-docker-registry.bintray.io/base/alpine-k8s-openjdk8:8u121
MAINTAINER M.-Leander Reimer <mario-leander.reimer@qaware.de>
RUN mkdir -p /app
ADD build/distributions/everything-as-code-1.2.1.tar /app
WORKDIR /app/everything-as-code-1.2.1
RUN chmod 755 bin/everything-as-code
EXPOSE 18080
CMD ./bin/everything-as-code
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 35
Vagrant und Ruby zum Setup lokaler VMs
require 'yaml'
$setup = <<SCRIPT
sudo apt-add-repository ppa:ansible/ansible
sudo apt-get update
sudo apt-get install -y ansible sshpass
SCRIPT
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/trusty32"
settings = YAML.load_file 'src/vagrant/vagrant.yml'
config.vm.provider "virtualbox" do |vb|
vb.name = settings['vm']['name']
vb.gui = false
vb.memory = "512"
end
config.vm.provision "shell", inline: $setup
end
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 36
Provisionierung mit Ansible (und Python)
---
# file: jenkinsci.yml
- hosts: jenkinsci
remote_user: root
tasks:
- debug: msg="Creating a Jenkins pipeline job on {{ inventory_hostname }}"
- jenkins_job:
name: Everything-as-code Pipeline
config: "{{ lookup('file', 'templates/pipeline-job.xml') }}"
url: "http://{{ inventory_hostname }}"
user: admin
password: admin
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 37
Cluster Orchestration mit Kubernetes
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: everything-as-code
spec:
replicas: 3
template:
metadata:
labels:
tier: backend
spec:
containers:
- name: everything-as-code
image: "qaware-oss-docker-registry.bintray.io/lreimer/everything-as-code:1.2.1"
ports:
- containerPort: 18080
env:
- name: PORT
value: 18080
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 38
Documentation-as-code
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 39
Ja, wir brauchen Dokumentation!
• Und nein. Der Quellcode ist nicht genug!
• Technische Dokumente mit Word sind ! " #
• Dokumentation sollte neben dem Quellcode
liegen: change code, change docs.
• Schnell und einfach zu schreiben.
• Unterstützung für Code, Bilder, Diagramme
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 40
// Beispiel Architektur-Dokumentation mit arc42 (https://arc42.github.io)
:imagesdir: ./images
= image:qaware-logo.png[QAware GmbH,2016] Everything-as-code
:toc-title: Table of Contents
:toc:
[[section-introduction-and-goals]]
== Introduction and Goals
The introduction to the architecture documentation should list the driving forces
that software architects must consider in their decisions.
=== Requirements Overview
=== Quality Goals
=== Stakeholders
<<<<
include::02_architecture_constraints.adoc[]
// further includes for the remaining sections
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 41
AsciidoctorJ und Gradle to the Rescue
plugins { id "org.asciidoctor.convert" version "1.5.3" }
asciidoctorj { version = '1.5.4.1' }
asciidoctor {
sourceDir 'src/docs/architecture'
resources {
from('src/docs/architecture') {
include 'images/**/*.png'
include 'images/**/*.jpg'
}
}
backends 'html5'
options doctype: 'article'
attributes 'source-highlighter': 'coderay'
}
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 42
Presentation-as-code
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 43
These slides were written in Markdown.
---
## [fit] These slides were written in Markdown.
- This is for real programmers! :smiley:
- Several open source projects available
- Use HTML and JavaScript alternatively.
---
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 44
Heutige Projekte
sind polyglot.
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 45
Use the right tool
for the job!
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 46
Wir alle müssen unsere Hausaufgaben machen.
• Entwickler: Be polyglot, keep learning!
• Architekten: Choose wisely! Die richtige
Sprache ist stark abhängig vom jeweiligen
Projekt-Kontext, Kundenumfeld und Team.
• Project Managers: Give your techies freedom!
• Universities: Unterrichtet vielsprachig!
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 47
Fork me on GitHub.
https://github.com/lreimer/everything-as-code
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 48
Cloud Native Night Meetup Termine
[{
topic: 'Wolkenschieber - Operations in der Cloud',
speakers: ['Timo Derstappen, Giant Swarm'],
datum: 'Dienstag, 16. Mai 2017 um 18:30',
wo: 'QAware Office Mainz',
url: 'https://www.meetup.com/de-DE/Cloud-Native-Night/events/238824503/'
},
{
topic: 'Tracing and Monitoring of Cloud-Native Applications',
speakers: ['Juraci Paixão Kröhling, Red Hat', 'Alois Mayr, Dynatrace'],
datum: 'Dienstag, 25. Mai 2017 um 18:30',
wo: 'QAware Office München',
url: 'https://www.meetup.com/de-DE/cloud-native-muc/events/239505785/'
}]
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 49
We are hiring.
http://www.qaware.de/karriere/#jobs
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 50
Thanks! Questions?
// JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 51
1 von 51

Recomendados

Everything-as-code - Polyglotte Softwareentwicklung von
Everything-as-code - Polyglotte SoftwareentwicklungEverything-as-code - Polyglotte Softwareentwicklung
Everything-as-code - Polyglotte SoftwareentwicklungQAware GmbH
656 views50 Folien
Everything-as-code. A polyglot adventure. #DevoxxPL von
Everything-as-code. A polyglot adventure. #DevoxxPLEverything-as-code. A polyglot adventure. #DevoxxPL
Everything-as-code. A polyglot adventure. #DevoxxPLMario-Leander Reimer
203 views55 Folien
Cloud-native .NET Microservices mit Kubernetes von
Cloud-native .NET Microservices mit KubernetesCloud-native .NET Microservices mit Kubernetes
Cloud-native .NET Microservices mit KubernetesQAware GmbH
1.1K views45 Folien
A Hitchhiker’s Guide to the Cloud Native Stack. #CDS17 von
A Hitchhiker’s Guide to the Cloud Native Stack. #CDS17A Hitchhiker’s Guide to the Cloud Native Stack. #CDS17
A Hitchhiker’s Guide to the Cloud Native Stack. #CDS17Mario-Leander Reimer
563 views52 Folien
Polyglot Adventures for the Modern Java Developer von
Polyglot Adventures for the Modern Java DeveloperPolyglot Adventures for the Modern Java Developer
Polyglot Adventures for the Modern Java DeveloperQAware GmbH
390 views56 Folien
Secure Architecture and Programming 101 von
Secure Architecture and Programming 101Secure Architecture and Programming 101
Secure Architecture and Programming 101Mario-Leander Reimer
384 views55 Folien

Más contenido relacionado

Was ist angesagt?

WWCode Dallas - Kubernetes: Learning from Zero to Production von
WWCode Dallas - Kubernetes: Learning from Zero to ProductionWWCode Dallas - Kubernetes: Learning from Zero to Production
WWCode Dallas - Kubernetes: Learning from Zero to ProductionRosemary Wang
356 views96 Folien
betterCode Workshop: Effizientes DevOps-Tooling mit Go von
betterCode Workshop:  Effizientes DevOps-Tooling mit GobetterCode Workshop:  Effizientes DevOps-Tooling mit Go
betterCode Workshop: Effizientes DevOps-Tooling mit GoQAware GmbH
692 views29 Folien
Fabric8: Better Software Faster with Docker, Kubernetes, Jenkins von
Fabric8: Better Software Faster with Docker, Kubernetes, JenkinsFabric8: Better Software Faster with Docker, Kubernetes, Jenkins
Fabric8: Better Software Faster with Docker, Kubernetes, JenkinsBurr Sutter
1.9K views55 Folien
Kubernetes: Learning from Zero to Production von
Kubernetes: Learning from Zero to ProductionKubernetes: Learning from Zero to Production
Kubernetes: Learning from Zero to ProductionRosemary Wang
393 views100 Folien
Rancher 2.0 Technical Deep Dive von
Rancher 2.0 Technical Deep DiveRancher 2.0 Technical Deep Dive
Rancher 2.0 Technical Deep DiveLINE Corporation
7.6K views52 Folien
Clean Infrastructure as Code von
Clean Infrastructure as CodeClean Infrastructure as Code
Clean Infrastructure as CodeQAware GmbH
311 views19 Folien

Was ist angesagt?(20)

WWCode Dallas - Kubernetes: Learning from Zero to Production von Rosemary Wang
WWCode Dallas - Kubernetes: Learning from Zero to ProductionWWCode Dallas - Kubernetes: Learning from Zero to Production
WWCode Dallas - Kubernetes: Learning from Zero to Production
Rosemary Wang356 views
betterCode Workshop: Effizientes DevOps-Tooling mit Go von QAware GmbH
betterCode Workshop:  Effizientes DevOps-Tooling mit GobetterCode Workshop:  Effizientes DevOps-Tooling mit Go
betterCode Workshop: Effizientes DevOps-Tooling mit Go
QAware GmbH692 views
Fabric8: Better Software Faster with Docker, Kubernetes, Jenkins von Burr Sutter
Fabric8: Better Software Faster with Docker, Kubernetes, JenkinsFabric8: Better Software Faster with Docker, Kubernetes, Jenkins
Fabric8: Better Software Faster with Docker, Kubernetes, Jenkins
Burr Sutter1.9K views
Kubernetes: Learning from Zero to Production von Rosemary Wang
Kubernetes: Learning from Zero to ProductionKubernetes: Learning from Zero to Production
Kubernetes: Learning from Zero to Production
Rosemary Wang393 views
Clean Infrastructure as Code von QAware GmbH
Clean Infrastructure as CodeClean Infrastructure as Code
Clean Infrastructure as Code
QAware GmbH311 views
All Things Open 2017: How to Treat a Network as a Container von Rosemary Wang
All Things Open 2017: How to Treat a Network as a ContainerAll Things Open 2017: How to Treat a Network as a Container
All Things Open 2017: How to Treat a Network as a Container
Rosemary Wang507 views
An Introduction to Rancher von Conner Swann
An Introduction to RancherAn Introduction to Rancher
An Introduction to Rancher
Conner Swann1.1K views
A Hitchhiker’s Guide to the Cloud Native Stack. #DevoxxPL von Mario-Leander Reimer
A Hitchhiker’s Guide to the Cloud Native Stack. #DevoxxPLA Hitchhiker’s Guide to the Cloud Native Stack. #DevoxxPL
A Hitchhiker’s Guide to the Cloud Native Stack. #DevoxxPL
How to build an event-driven, polyglot serverless microservices framework on ... von Animesh Singh
How to build an event-driven, polyglot serverless microservices framework on ...How to build an event-driven, polyglot serverless microservices framework on ...
How to build an event-driven, polyglot serverless microservices framework on ...
Animesh Singh2.7K views
Introduction to Containers and Docker von Fayçal Bziou
Introduction to Containers and DockerIntroduction to Containers and Docker
Introduction to Containers and Docker
Fayçal Bziou236 views
Clocker - How to Train your Docker Cloud von Andrew Kennedy
Clocker - How to Train your Docker CloudClocker - How to Train your Docker Cloud
Clocker - How to Train your Docker Cloud
Andrew Kennedy693 views
Cloud Native Unleashed von QAware GmbH
Cloud Native UnleashedCloud Native Unleashed
Cloud Native Unleashed
QAware GmbH398 views
Hands-on with Rancher 2.0 and Kubernetes - October 2017 Rancher Online Meetup von Shannon Williams
Hands-on with Rancher 2.0 and Kubernetes - October 2017 Rancher Online MeetupHands-on with Rancher 2.0 and Kubernetes - October 2017 Rancher Online Meetup
Hands-on with Rancher 2.0 and Kubernetes - October 2017 Rancher Online Meetup
Shannon Williams3.7K views
Machine Learning Platform in LINE Fukuoka von LINE Corporation
Machine Learning Platform in LINE FukuokaMachine Learning Platform in LINE Fukuoka
Machine Learning Platform in LINE Fukuoka
LINE Corporation60.5K views
Cloud hybridation leveraging on Docker 1.12 von Ludovic Piot
Cloud hybridation leveraging on Docker 1.12Cloud hybridation leveraging on Docker 1.12
Cloud hybridation leveraging on Docker 1.12
Ludovic Piot439 views

Similar a Everything-as-code. Ein polyglottes Abenteuer

Everything-as-code. Eine vielsprachige Reise. #javaland von
Everything-as-code. Eine vielsprachige Reise. #javalandEverything-as-code. Eine vielsprachige Reise. #javaland
Everything-as-code. Eine vielsprachige Reise. #javalandMario-Leander Reimer
101 views50 Folien
Everything as-code. Polyglotte Entwicklung in der Praxis. #oop2017 von
Everything as-code. Polyglotte Entwicklung in der Praxis. #oop2017Everything as-code. Polyglotte Entwicklung in der Praxis. #oop2017
Everything as-code. Polyglotte Entwicklung in der Praxis. #oop2017Mario-Leander Reimer
173 views51 Folien
Everything-as-code. Polyglotte Software-Entwicklung in der Praxis. von
Everything-as-code. Polyglotte Software-Entwicklung in der Praxis.Everything-as-code. Polyglotte Software-Entwicklung in der Praxis.
Everything-as-code. Polyglotte Software-Entwicklung in der Praxis.QAware GmbH
1.3K views51 Folien
Polyglot Adventures for the Modern Java Developer #javaone2017 von
Polyglot Adventures for the Modern Java Developer #javaone2017Polyglot Adventures for the Modern Java Developer #javaone2017
Polyglot Adventures for the Modern Java Developer #javaone2017Mario-Leander Reimer
80 views56 Folien
Everything-as-code: DevOps und Continuous Delivery aus Sicht des Entwicklers.... von
Everything-as-code: DevOps und Continuous Delivery aus Sicht des Entwicklers....Everything-as-code: DevOps und Continuous Delivery aus Sicht des Entwicklers....
Everything-as-code: DevOps und Continuous Delivery aus Sicht des Entwicklers....Mario-Leander Reimer
214 views60 Folien
Everything-as-code: DevOps und Continuous Delivery aus Sicht des Entwicklers. von
Everything-as-code: DevOps und Continuous Delivery aus Sicht des Entwicklers.Everything-as-code: DevOps und Continuous Delivery aus Sicht des Entwicklers.
Everything-as-code: DevOps und Continuous Delivery aus Sicht des Entwicklers.QAware GmbH
1.1K views60 Folien

Similar a Everything-as-code. Ein polyglottes Abenteuer(20)

Everything-as-code. Eine vielsprachige Reise. #javaland von Mario-Leander Reimer
Everything-as-code. Eine vielsprachige Reise. #javalandEverything-as-code. Eine vielsprachige Reise. #javaland
Everything-as-code. Eine vielsprachige Reise. #javaland
Everything as-code. Polyglotte Entwicklung in der Praxis. #oop2017 von Mario-Leander Reimer
Everything as-code. Polyglotte Entwicklung in der Praxis. #oop2017Everything as-code. Polyglotte Entwicklung in der Praxis. #oop2017
Everything as-code. Polyglotte Entwicklung in der Praxis. #oop2017
Everything-as-code. Polyglotte Software-Entwicklung in der Praxis. von QAware GmbH
Everything-as-code. Polyglotte Software-Entwicklung in der Praxis.Everything-as-code. Polyglotte Software-Entwicklung in der Praxis.
Everything-as-code. Polyglotte Software-Entwicklung in der Praxis.
QAware GmbH1.3K views
Polyglot Adventures for the Modern Java Developer #javaone2017 von Mario-Leander Reimer
Polyglot Adventures for the Modern Java Developer #javaone2017Polyglot Adventures for the Modern Java Developer #javaone2017
Polyglot Adventures for the Modern Java Developer #javaone2017
Everything-as-code: DevOps und Continuous Delivery aus Sicht des Entwicklers.... von Mario-Leander Reimer
Everything-as-code: DevOps und Continuous Delivery aus Sicht des Entwicklers....Everything-as-code: DevOps und Continuous Delivery aus Sicht des Entwicklers....
Everything-as-code: DevOps und Continuous Delivery aus Sicht des Entwicklers....
Everything-as-code: DevOps und Continuous Delivery aus Sicht des Entwicklers. von QAware GmbH
Everything-as-code: DevOps und Continuous Delivery aus Sicht des Entwicklers.Everything-as-code: DevOps und Continuous Delivery aus Sicht des Entwicklers.
Everything-as-code: DevOps und Continuous Delivery aus Sicht des Entwicklers.
QAware GmbH1.1K views
Everything-as-code – Polyglotte Entwicklung in der Praxis von QAware GmbH
Everything-as-code – Polyglotte Entwicklung in der PraxisEverything-as-code – Polyglotte Entwicklung in der Praxis
Everything-as-code – Polyglotte Entwicklung in der Praxis
QAware GmbH384 views
Everything-as-code - a polyglot journey. von QAware GmbH
Everything-as-code - a polyglot journey.Everything-as-code - a polyglot journey.
Everything-as-code - a polyglot journey.
QAware GmbH500 views
Everything-as-code - A polyglot adventure von QAware GmbH
Everything-as-code - A polyglot adventureEverything-as-code - A polyglot adventure
Everything-as-code - A polyglot adventure
QAware GmbH922 views
Parse cloud code von 維佋 唐
Parse cloud codeParse cloud code
Parse cloud code
維佋 唐13.6K views
"Xapi-lang For declarative code generation" By James Nelson von GWTcon
"Xapi-lang For declarative code generation" By James Nelson"Xapi-lang For declarative code generation" By James Nelson
"Xapi-lang For declarative code generation" By James Nelson
GWTcon 833 views
Enterprise JavaScript ... what the heck? von Nedelcho Delchev
Enterprise JavaScript ... what the heck?Enterprise JavaScript ... what the heck?
Enterprise JavaScript ... what the heck?
Nedelcho Delchev476 views
Spark zeppelin-cassandra at synchrotron von Duyhai Doan
Spark zeppelin-cassandra at synchrotronSpark zeppelin-cassandra at synchrotron
Spark zeppelin-cassandra at synchrotron
Duyhai Doan1.1K views
TypeScript - Silver Bullet for the Full-stack Developers von Rutenis Turcinas
TypeScript - Silver Bullet for the Full-stack DevelopersTypeScript - Silver Bullet for the Full-stack Developers
TypeScript - Silver Bullet for the Full-stack Developers
Rutenis Turcinas20.3K views
13 practical tips for writing secure golang applications von Karthik Gaekwad
13 practical tips for writing secure golang applications13 practical tips for writing secure golang applications
13 practical tips for writing secure golang applications
Karthik Gaekwad9.5K views
I Just Want to Run My Code: Waypoint, Nomad, and Other Things von Michael Lange
I Just Want to Run My Code: Waypoint, Nomad, and Other ThingsI Just Want to Run My Code: Waypoint, Nomad, and Other Things
I Just Want to Run My Code: Waypoint, Nomad, and Other Things
Michael Lange35 views
JUG Münster 2014 - Code Recommenders & Codetrails - Wissenstransfer 2.0 von Marcel Bruch
JUG Münster 2014 - Code Recommenders & Codetrails - Wissenstransfer 2.0JUG Münster 2014 - Code Recommenders & Codetrails - Wissenstransfer 2.0
JUG Münster 2014 - Code Recommenders & Codetrails - Wissenstransfer 2.0
Marcel Bruch824 views

Más de QAware GmbH

Der Tod der Testpyramide? – Frontend-Testing mit Playwright von
Der Tod der Testpyramide? – Frontend-Testing mit PlaywrightDer Tod der Testpyramide? – Frontend-Testing mit Playwright
Der Tod der Testpyramide? – Frontend-Testing mit PlaywrightQAware GmbH
7 views34 Folien
Was kommt nach den SPAs von
Was kommt nach den SPAsWas kommt nach den SPAs
Was kommt nach den SPAsQAware GmbH
5 views47 Folien
Cloud Migration mit KI: der Turbo von
Cloud Migration mit KI: der Turbo Cloud Migration mit KI: der Turbo
Cloud Migration mit KI: der Turbo QAware GmbH
18 views23 Folien
Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See... von
 Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See... Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...QAware GmbH
16 views13 Folien
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster von
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster QAware GmbH
16 views31 Folien
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before. von
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.QAware GmbH
20 views57 Folien

Más de QAware GmbH(20)

Der Tod der Testpyramide? – Frontend-Testing mit Playwright von QAware GmbH
Der Tod der Testpyramide? – Frontend-Testing mit PlaywrightDer Tod der Testpyramide? – Frontend-Testing mit Playwright
Der Tod der Testpyramide? – Frontend-Testing mit Playwright
QAware GmbH7 views
Cloud Migration mit KI: der Turbo von QAware GmbH
Cloud Migration mit KI: der Turbo Cloud Migration mit KI: der Turbo
Cloud Migration mit KI: der Turbo
QAware GmbH18 views
Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See... von QAware GmbH
 Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See... Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
QAware GmbH16 views
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster von QAware GmbH
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
QAware GmbH16 views
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before. von QAware GmbH
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.
QAware GmbH20 views
Kubernetes with Cilium in AWS - Experience Report! von QAware GmbH
Kubernetes with Cilium in AWS - Experience Report!Kubernetes with Cilium in AWS - Experience Report!
Kubernetes with Cilium in AWS - Experience Report!
QAware GmbH45 views
Kontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAP von QAware GmbH
Kontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAPKontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAP
Kontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAP
QAware GmbH20 views
Blue turns green! Approaches and technologies for sustainable K8s clusters. von QAware GmbH
Blue turns green! Approaches and technologies for sustainable K8s clusters.Blue turns green! Approaches and technologies for sustainable K8s clusters.
Blue turns green! Approaches and technologies for sustainable K8s clusters.
QAware GmbH32 views
Per Anhalter zu Cloud Nativen API Gateways von QAware GmbH
Per Anhalter zu Cloud Nativen API GatewaysPer Anhalter zu Cloud Nativen API Gateways
Per Anhalter zu Cloud Nativen API Gateways
QAware GmbH30 views
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster von QAware GmbH
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
QAware GmbH22 views
How to speed up Spring Integration Tests von QAware GmbH
How to speed up Spring Integration TestsHow to speed up Spring Integration Tests
How to speed up Spring Integration Tests
QAware GmbH21 views
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster von QAware GmbH
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-ClusterAus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
QAware GmbH42 views
Cloud Migration – Eine Strategie die funktioniert von QAware GmbH
Cloud Migration – Eine Strategie die funktioniertCloud Migration – Eine Strategie die funktioniert
Cloud Migration – Eine Strategie die funktioniert
QAware GmbH27 views
Policy Driven Microservices mit Open Policy Agent von QAware GmbH
Policy Driven Microservices mit Open Policy AgentPolicy Driven Microservices mit Open Policy Agent
Policy Driven Microservices mit Open Policy Agent
QAware GmbH15 views
Make Developers Fly: Principles for Platform Engineering von QAware GmbH
Make Developers Fly: Principles for Platform EngineeringMake Developers Fly: Principles for Platform Engineering
Make Developers Fly: Principles for Platform Engineering
QAware GmbH58 views
Security Lab: OIDC in der Praxis von QAware GmbH
Security Lab: OIDC in der PraxisSecurity Lab: OIDC in der Praxis
Security Lab: OIDC in der Praxis
QAware GmbH19 views
Die nächsten 100 Microservices von QAware GmbH
Die nächsten 100 MicroservicesDie nächsten 100 Microservices
Die nächsten 100 Microservices
QAware GmbH14 views
Enterprise-level Kubernetes Security mit Open Source Tools - geht das? von QAware GmbH
Enterprise-level Kubernetes Security mit Open Source Tools - geht das?Enterprise-level Kubernetes Security mit Open Source Tools - geht das?
Enterprise-level Kubernetes Security mit Open Source Tools - geht das?
QAware GmbH33 views
Put the ‘Auto’ in Autoscaling – Make Kubernetes VPA and HPA work together for... von QAware GmbH
Put the ‘Auto’ in Autoscaling – Make Kubernetes VPA and HPA work together for...Put the ‘Auto’ in Autoscaling – Make Kubernetes VPA and HPA work together for...
Put the ‘Auto’ in Autoscaling – Make Kubernetes VPA and HPA work together for...
QAware GmbH19 views

Último

PRODUCT PRESENTATION.pptx von
PRODUCT PRESENTATION.pptxPRODUCT PRESENTATION.pptx
PRODUCT PRESENTATION.pptxangelicacueva6
14 views1 Folie
Attacking IoT Devices from a Web Perspective - Linux Day von
Attacking IoT Devices from a Web Perspective - Linux Day Attacking IoT Devices from a Web Perspective - Linux Day
Attacking IoT Devices from a Web Perspective - Linux Day Simone Onofri
16 views68 Folien
Serverless computing with Google Cloud (2023-24) von
Serverless computing with Google Cloud (2023-24)Serverless computing with Google Cloud (2023-24)
Serverless computing with Google Cloud (2023-24)wesley chun
11 views33 Folien
Unit 1_Lecture 2_Physical Design of IoT.pdf von
Unit 1_Lecture 2_Physical Design of IoT.pdfUnit 1_Lecture 2_Physical Design of IoT.pdf
Unit 1_Lecture 2_Physical Design of IoT.pdfStephenTec
12 views36 Folien
Info Session November 2023.pdf von
Info Session November 2023.pdfInfo Session November 2023.pdf
Info Session November 2023.pdfAleksandraKoprivica4
12 views15 Folien
Melek BEN MAHMOUD.pdf von
Melek BEN MAHMOUD.pdfMelek BEN MAHMOUD.pdf
Melek BEN MAHMOUD.pdfMelekBenMahmoud
14 views1 Folie

Último(20)

Attacking IoT Devices from a Web Perspective - Linux Day von Simone Onofri
Attacking IoT Devices from a Web Perspective - Linux Day Attacking IoT Devices from a Web Perspective - Linux Day
Attacking IoT Devices from a Web Perspective - Linux Day
Simone Onofri16 views
Serverless computing with Google Cloud (2023-24) von wesley chun
Serverless computing with Google Cloud (2023-24)Serverless computing with Google Cloud (2023-24)
Serverless computing with Google Cloud (2023-24)
wesley chun11 views
Unit 1_Lecture 2_Physical Design of IoT.pdf von StephenTec
Unit 1_Lecture 2_Physical Design of IoT.pdfUnit 1_Lecture 2_Physical Design of IoT.pdf
Unit 1_Lecture 2_Physical Design of IoT.pdf
StephenTec12 views
Empathic Computing: Delivering the Potential of the Metaverse von Mark Billinghurst
Empathic Computing: Delivering  the Potential of the MetaverseEmpathic Computing: Delivering  the Potential of the Metaverse
Empathic Computing: Delivering the Potential of the Metaverse
Mark Billinghurst478 views
Voice Logger - Telephony Integration Solution at Aegis von Nirmal Sharma
Voice Logger - Telephony Integration Solution at AegisVoice Logger - Telephony Integration Solution at Aegis
Voice Logger - Telephony Integration Solution at Aegis
Nirmal Sharma39 views
Data Integrity for Banking and Financial Services von Precisely
Data Integrity for Banking and Financial ServicesData Integrity for Banking and Financial Services
Data Integrity for Banking and Financial Services
Precisely21 views
handbook for web 3 adoption.pdf von Liveplex
handbook for web 3 adoption.pdfhandbook for web 3 adoption.pdf
handbook for web 3 adoption.pdf
Liveplex22 views
Automating a World-Class Technology Conference; Behind the Scenes of CiscoLive von Network Automation Forum
Automating a World-Class Technology Conference; Behind the Scenes of CiscoLiveAutomating a World-Class Technology Conference; Behind the Scenes of CiscoLive
Automating a World-Class Technology Conference; Behind the Scenes of CiscoLive

Everything-as-code. Ein polyglottes Abenteuer

  • 1. Everything-as-code. Ein polyglottes Abenteuer. // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 1
  • 2. #whoami Mario-Leander Reimer Cheftechnologe, QAware GmbH • Vollblut Entwickler && Architekt • #CloudNativeNerd • Open Source Enthusiast mario-leander.reimer@qaware.de http://github.com/lreimer http://speakerdeck.com/lreimer // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 2
  • 3. // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 3
  • 4. Welche Sprache verwenden echte Programmierer? // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 4
  • 5. Meine #FirstSevenLanguages • Pascal • Basic • C / C++ • Assembler • PHP • Java • C# // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 5
  • 6. Meine #LastSevenLanguages • Java • Groovy • TypeScript • Ruby • Kotlin • Scala • Go // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 6
  • 7. // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 7
  • 8. // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 8
  • 9. // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 9
  • 10. Es gibt keine einstimmige Meinung ... • http://spectrum.ieee.org/computing/software/ the-2016-top-programming-languages • https://www.sitepoint.com/whats-best- programming-language-learn-2015/ • https://jaxenter.de/programmiersprachen- rankings-q1-2017-54308 // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 10
  • 11. Die beste Programmiersprache gibt es nicht! Auf den Kontext kommt es an. // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 11
  • 12. Die IDE ist unsere Werkbank. // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 12
  • 13. Unsere Definition von Software Industrialisierung • Hat nichts mit billiger Arbeitskraft zu tun! • Hoher Automatisiersgrad von arbeitsintensiven und wiederkehrenden Arbeitsschritten • Höhere Software-Qualität durch abgestimmte Tool- Chain • Mehr Produktivität und Zufriedenheit der Teams • Bessere Kosten-Effizienz und Wettbewerbsfähigkeit // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 13
  • 14. Wäre es nicht cool wenn ... open fun everythingAsCode() : Boolean { everytingIsMadeFromCode() && everythingIsMadeByCode() } val softwareIndustrialization = everythingAsCode() // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 14
  • 15. The Quest for an ideal Polyglot Project Archetype • Welche Sprachen werden in unseren Projekten verwendet? • Welche Tools verwenden wir für Setup, Build, Code, Test, CI, Infrastructure und Dokumentation? • Was davon hat sich bewährt und was eher nicht? • Gibt es bereits Best Practices für den Einsatz in der Praxis? + Wishful Greenfield Thinking! // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 15
  • 16. SEU-as-code // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 16
  • 17. Lightweight Developer Provisioning mit Gradle • [ SEU ] -> Software Entwicklungs Umgebung • Nutzung von Gradle als Build-Tool für das Setup und die Aktualisierung unserer Entwicklungsumgebungen • Software-Pakete werden als Dependencies ausgedrückt • Gradle Tasks and Groovy Skripte statt Shell- Scripting • Versionskontrolle der SEU Definition und Skripte // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 17
  • 18. plugins { id 'de.qaware.seu.as.code.base' version '2.4.0' } import static de.qaware.seu.as.code.plugins.base.Platform.isMac seuAsCode { seuHome = { if (isMac()) '/Volumes/Everything-as-code' else 'Y:' } projectName = 'Everything-as-code' } dependencies { // list of software dependencies ... software 'org.groovy-lang:groovy:2.4.7' software 'org.scala-lang:scala:2.11.8' software 'org.jruby:jruby:9.1.4.0' } // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 18
  • 19. Build-as-code // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 19
  • 20. Maven ist gut. Gradle ist besser. • Sehr flexibel und vielseitig einsetzbar. • Einfache Unterstützung für Polyglotte Projekte. • Build Skripte sind maximal kurz und prägnant. • Drastisch reduzierte Build-Zeiten durch Incremental Builds. • Zahlreiche neue Features: Composite Builds, Kotlin- basierte Build-Skripte, Performance Verbesserungen, ... • Regelmäßige Releases. Stabil und ausgereift. // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 20
  • 21. apply plugin: 'application' apply plugin: 'war' apply plugin: 'kotlin' apply plugin: 'groovy' repositories { jcenter() } dependencies { providedCompile 'fish.payara.extras:payara-micro:4.1.1.164' // and many more ... } task everythingAsCode() << { println 'Everything-as-code @ JAX 2017.' } // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 21
  • 22. Main-as-code // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 22
  • 23. Java ist nach wie vor die primäre Implementierungssprache! Und das ist gut so! // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 23
  • 24. Für die Mutigen: Kotlin als ernsthafte Alternative zu Java. // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 24
  • 25. Warum Kotlin? Und nicht Scala, Clojure, ... • Für Java Entwickler sehr schnell zu erlernen. • Sehr ausgewogene Universalsprache. • Null Safety + Synatctic Sugar + jede Menge andere nützliche Features. • JDK6 kompatibel. Kleine Library-Größe. • Sehr guter IDE und Tool Support. • Wishful Greenfield Thinking. // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 25
  • 26. @JsonIgnoreProperties(ignoreUnknown = true) data class Book(val title: String, val isbn: String, val author: String) @ApplicationScoped open class Bookshelf { private val books = listOf(Book("The Hitchhiker's Guide to the Galaxy", "0345391802")) open fun byIsbn(isbn: String): Book? = books.find { it.isbn == isbn } } @Path("books") @Produces(MediaType.APPLICATION_JSON) open class BookResource @Inject constructor(private val bookshelf: Bookshelf) { @GET @Path("/{isbn}") open fun byIsbn(@PathParam("isbn") isbn: String): Response { val book = bookshelf.byIsbn(isbn) return if (book != null) Response.ok(book).build() else Response.status(Status.NOT_FOUND).build() } } @ApplicationPath("api") class BookstoreAPI : Application() { override fun getClasses() = hashSetOf(JacksonFeature::class.java, BookResource::class.java) } // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 26
  • 27. Frontend-as-code // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 27
  • 28. Willkommen in der JavaScript Wunderwelt. • Ein Universum für sich! • Klarer Trend: Single Page Webapplikationen. • HTML5 + CSS3 + ? • ? = TypeScript oder • ? = ECMAScript2015 + Babel • Rückgrat des Builds: node + npm + webpack // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 28
  • 29. Test-as-code // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 29
  • 30. Groovy und Spock für Unit & Integration Tests class BookshelfSpec extends Specification { @Subject def bookshelf = new Bookshelf() @Unroll def "Find book #title by ISBN #isbn"() { when: 'we search a book by ISBN' def book = bookshelf.byIsbn(isbn) then: 'the title and author are correct' book?.title == title book?.author == author where: isbn || title | author "0345391802" || "The Hitchhiker's Guide to the Galaxy" | "Douglas Adams" "0345391829" || "Life, the Universe and Everything" | "Douglas Adams" } } // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 30
  • 31. Scala und Gatling für Last-Tests class BooksPerformanceTest extends Simulation { val conf = http.baseURL("http://localhost:18080").acceptHeader("application/json") val feeder = csv("books.csv").random val scn = scenario("Book Search") .exec(http("Get all books").get("/api/books")) .during(30 seconds) { feed(feeder) .exec(http("Get book by title ${Title}").get("/api/books?title=${Title}")) .pause(1 second) .exec(http("Get book with ISBN ${ISBN}").get("/api/books/${ISBN}")) } setUp(scn.inject(atOnceUsers(10), rampUsers(50) over (30 seconds))) .assertions(global.responseTime.max.lessThan(5000)) .protocols(conf) } // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 31
  • 32. Pipeline-as-code // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 32
  • 33. Definition der Build-Pipeline per Jenkinsfile #!/usr/bin/env groovy node { stage 'Checkout SCM' checkout scm stage 'Build/Analyse/Test' sh './gradlew clean build' archiveUnitTestResults() archiveDistributions() stage 'Dockerize' sh './gradlew buildDockerImage' stage 'Generate Documentation' sh './gradlew asciidoctor' } // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 33
  • 34. Infrastructure-as-code // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 34
  • 35. Docker, Docker, Docker, ... FROM qaware-oss-docker-registry.bintray.io/base/alpine-k8s-openjdk8:8u121 MAINTAINER M.-Leander Reimer <mario-leander.reimer@qaware.de> RUN mkdir -p /app ADD build/distributions/everything-as-code-1.2.1.tar /app WORKDIR /app/everything-as-code-1.2.1 RUN chmod 755 bin/everything-as-code EXPOSE 18080 CMD ./bin/everything-as-code // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 35
  • 36. Vagrant und Ruby zum Setup lokaler VMs require 'yaml' $setup = <<SCRIPT sudo apt-add-repository ppa:ansible/ansible sudo apt-get update sudo apt-get install -y ansible sshpass SCRIPT Vagrant.configure("2") do |config| config.vm.box = "ubuntu/trusty32" settings = YAML.load_file 'src/vagrant/vagrant.yml' config.vm.provider "virtualbox" do |vb| vb.name = settings['vm']['name'] vb.gui = false vb.memory = "512" end config.vm.provision "shell", inline: $setup end // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 36
  • 37. Provisionierung mit Ansible (und Python) --- # file: jenkinsci.yml - hosts: jenkinsci remote_user: root tasks: - debug: msg="Creating a Jenkins pipeline job on {{ inventory_hostname }}" - jenkins_job: name: Everything-as-code Pipeline config: "{{ lookup('file', 'templates/pipeline-job.xml') }}" url: "http://{{ inventory_hostname }}" user: admin password: admin // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 37
  • 38. Cluster Orchestration mit Kubernetes --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: everything-as-code spec: replicas: 3 template: metadata: labels: tier: backend spec: containers: - name: everything-as-code image: "qaware-oss-docker-registry.bintray.io/lreimer/everything-as-code:1.2.1" ports: - containerPort: 18080 env: - name: PORT value: 18080 // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 38
  • 39. Documentation-as-code // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 39
  • 40. Ja, wir brauchen Dokumentation! • Und nein. Der Quellcode ist nicht genug! • Technische Dokumente mit Word sind ! " # • Dokumentation sollte neben dem Quellcode liegen: change code, change docs. • Schnell und einfach zu schreiben. • Unterstützung für Code, Bilder, Diagramme // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 40
  • 41. // Beispiel Architektur-Dokumentation mit arc42 (https://arc42.github.io) :imagesdir: ./images = image:qaware-logo.png[QAware GmbH,2016] Everything-as-code :toc-title: Table of Contents :toc: [[section-introduction-and-goals]] == Introduction and Goals The introduction to the architecture documentation should list the driving forces that software architects must consider in their decisions. === Requirements Overview === Quality Goals === Stakeholders <<<< include::02_architecture_constraints.adoc[] // further includes for the remaining sections // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 41
  • 42. AsciidoctorJ und Gradle to the Rescue plugins { id "org.asciidoctor.convert" version "1.5.3" } asciidoctorj { version = '1.5.4.1' } asciidoctor { sourceDir 'src/docs/architecture' resources { from('src/docs/architecture') { include 'images/**/*.png' include 'images/**/*.jpg' } } backends 'html5' options doctype: 'article' attributes 'source-highlighter': 'coderay' } // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 42
  • 43. Presentation-as-code // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 43
  • 44. These slides were written in Markdown. --- ## [fit] These slides were written in Markdown. - This is for real programmers! :smiley: - Several open source projects available - Use HTML and JavaScript alternatively. --- // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 44
  • 45. Heutige Projekte sind polyglot. // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 45
  • 46. Use the right tool for the job! // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 46
  • 47. Wir alle müssen unsere Hausaufgaben machen. • Entwickler: Be polyglot, keep learning! • Architekten: Choose wisely! Die richtige Sprache ist stark abhängig vom jeweiligen Projekt-Kontext, Kundenumfeld und Team. • Project Managers: Give your techies freedom! • Universities: Unterrichtet vielsprachig! // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 47
  • 48. Fork me on GitHub. https://github.com/lreimer/everything-as-code // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 48
  • 49. Cloud Native Night Meetup Termine [{ topic: 'Wolkenschieber - Operations in der Cloud', speakers: ['Timo Derstappen, Giant Swarm'], datum: 'Dienstag, 16. Mai 2017 um 18:30', wo: 'QAware Office Mainz', url: 'https://www.meetup.com/de-DE/Cloud-Native-Night/events/238824503/' }, { topic: 'Tracing and Monitoring of Cloud-Native Applications', speakers: ['Juraci Paixão Kröhling, Red Hat', 'Alois Mayr, Dynatrace'], datum: 'Dienstag, 25. Mai 2017 um 18:30', wo: 'QAware Office München', url: 'https://www.meetup.com/de-DE/cloud-native-muc/events/239505785/' }] // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 49
  • 50. We are hiring. http://www.qaware.de/karriere/#jobs // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 50
  • 51. Thanks! Questions? // JAX 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 51