SlideShare une entreprise Scribd logo
1  sur  60
Télécharger pour lire hors ligne
#whoami
Mario-Leander Reimer
Cheftechnologe, QAware GmbH
- Senior Developer && Architect
- 20+ Jahre Erfahrung
- #CloudNativeNerd
- Open Source Enthusiast
mario-leander.reimer@qaware.de
http://github.com/lreimer
http://speakerdeck.com/lreimer
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Software Industrialization
ist eine Schlüsselanforderung
für erfolgreiches DevOps und
Continuous Delivery.
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Ein Software-Fließband produziert
und liefert die fertige Software an.
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Software Industrialisierung bedeutet ...
• Hoher Automatisiersgrad von arbeitsintensiven
und wiederkehrenden Arbeitsschritten
• Bessere Software-Qualität durch eine
abgestimmte Tool-Chain
• Mehr Produktivität und Zufriedenheit der Teams
• Kosten-Effizienz und Wettbewerbsfähigkeit
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Die IDE ist unsere
Werkbank.
val softwareIndustrialization = everythingAsCode()
open fun everythingAsCode() =
everythingIsMadeFromCode()
&& everythingIsMadeByCode()
private fun everythingIsMadeFromCode() = true
private fun everythingIsMadeByCode() = true
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Auf die Domäne kommt es an!
Eine beste Programmiersprache gibt es nicht.
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Die Queste nach dem idealen Polyglot Project Archetype
• Welche Sprachen werden in unseren Projekten in
welchen Domänen verwendet?
• Welche Tools verwenden wir für Setup, Build, Code,
Test, CI, Infrastructure, Documentation?
• Was davon hat sich bewährt und was eher nicht?
• Gibt es bereits Best Practices oder Anti-Patterns?
+ Wishful Greenfield Thinking!
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Eine vielsprachige
Reise beginnt ...
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 definiert
• Gradle Tasks und Groovy Code statt Shell-Scripting
• Versionskontrolle der SEU Definition und Skripte
• Open Source. http://seu-as-code.io
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
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'
}
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
# language: en
Functionality: Authentication and Authorization
Scenario Outline: Check proper login behaviour
Given the username "<USERNAME>"
And the password "<PASSWORD>"
When the user logs into the system
Then the login result is "<RESULT>"
Examples: Login data
| USERNAME | PASSWORD | RESULT |
| mario-leander.reimer | invalidpwd | failure |
| unknown | somepwd | failure |
| mario-leander.reimer | correctpwd | success |
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Maven ist gut. Gradle ist 100x schneller.
• Sehr flexibel und vielseitig einsetzbar.
• Einfache Unterstützung für polyglotte Projekte.
• Build Skripte sind maximal kurz und prägnant.
• Deutlich reduzierte Build-Zeiten durch inkrementelle
Builds und Caching
• Zahlreiche neue Features: Composite Builds, Kotlin-
basierte Build-Skripte, Performance Verbesserungen, ...
• Regelmäßige Releases. Stabil und ausgereift.
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
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 using Gradle @ ContinuousLifecycle 2017.'
}
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Java ist nach wie vor unsere
primäre Implementierungssprache!
Und das ist gut so!
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Aber:
Kotlin als Alternative zu
Java ist einen Blick wert!
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
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.
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
@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)
}
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
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
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Grovy + Spock eignen sich für Unit,
Integration, Acceptance und UI-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"
}
}
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Scala und Gatling für lesbare und
performante 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)
}
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Definition einer Build-Pipeline per
Jenkinsfile und Groovy
#!/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'
}
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Architektur-Definition und Prüfung
mit QAvalidator für wartbaren Code.
architecture(name: "Mail Example", prefix: "tview", reflexMLversion: "1.0") {
excludes "java.lang.*"
api "JavaMail" : "javax.mail.*"
component "Mail" {
api "IMail" : "de.qaware.mail.*"
impl ["de.qaware.mail.impl.*", "de.qaware.mail.impl2.*"]
uses "JavaMail"
component "MailSender" {
api ["de.qaware.mail.sender.*", "javax.mail.*"]
impl "de.qaware.mail.impl.javamail.JavaMailSender"
uses "JavaMail"
}
}
}
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
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.3.tar /app
WORKDIR /app/everything-as-code-1.2.3
RUN chmod 755 bin/everything-as-code
EXPOSE 18080
CMD ./bin/everything-as-code
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Cluster Orchestration mit K8s et.al.
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: everything-as-code
spec:
replicas: 2
template:
metadata:
labels:
tier: backend
spec:
containers:
- name: everything-as-code
image: "qaware-oss-docker-registry.bintray.io/lreimer/everything-as-code:1.2.3"
ports:
- containerPort: 18080
env:
- name: PORT
value: 18080
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Einfache Provisionierung mit Ansible.
---
# 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
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
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
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
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
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
// 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
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Mit AsciidoctorJ und Gradle zum fertigen Dokument.
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', 'pdf']
options doctype: 'article'
attributes 'source-highlighter': 'coderay'
}
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Architectur-Dokumentation mit Structurizr
def workspace = new Workspace("Everything-as-code", "The system context of Everything-as-code.")
def model = workspace.model
// create a model and the software system we want to describe
def bookApp = model.addSoftwareSystem("Book Application", "The best source to get info on books.")
// create the various types of people (roles) that use the software system
def anonymousUser = model.addPerson("Anonymous User", "Anybody on the web.")
anonymousUser.uses(bookApp, "Searches for books and views details.")
def browser = bookApp.addContainer("Web Browser",
"Allows users to view information about books", "Edge, Chrome, Firefox")
anonymousUser.uses(browser, "Views information from and makes requests to")
def webApp = bookApp.addContainer("Web Application",
"Hosts the browser-based web application and services", "Payara Fish")
browser.uses(webApp, "uses [JSON/HTTPS]")
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
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.
---
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Use the right tool
for the job!
Alles mit Augenmaß!
Der richtige Technologie-Stack hängt vom Team,
dem Projekt-Kontext und unseren Kunden ab.
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Fork me on GitHub.
https://github.com/lreimer/everything-as-code
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
// ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Everything-as-code: DevOps und Continuous Delivery aus Sicht des Entwicklers. @ConLifecycle

Contenu connexe

Tendances

Real world serverless - architecture, patterns and lessons learned
Real world serverless - architecture, patterns and lessons learnedReal world serverless - architecture, patterns and lessons learned
Real world serverless - architecture, patterns and lessons learnedDavid Schmitz
 
Fabric8: Better Software Faster with Docker, Kubernetes, Jenkins
Fabric8: Better Software Faster with Docker, Kubernetes, JenkinsFabric8: Better Software Faster with Docker, Kubernetes, Jenkins
Fabric8: Better Software Faster with Docker, Kubernetes, JenkinsBurr Sutter
 
Spring Boot Omakase: A Fast-Paced “Chef’s Choice” Dive into Fun and Useful To...
Spring Boot Omakase: A Fast-Paced “Chef’s Choice” Dive into Fun and Useful To...Spring Boot Omakase: A Fast-Paced “Chef’s Choice” Dive into Fun and Useful To...
Spring Boot Omakase: A Fast-Paced “Chef’s Choice” Dive into Fun and Useful To...VMware Tanzu
 
Web APIs in Node.js Core: Past, Present, and Future (JSConf EU 2019)
Web APIs in Node.js Core: Past, Present, and Future (JSConf EU 2019)Web APIs in Node.js Core: Past, Present, and Future (JSConf EU 2019)
Web APIs in Node.js Core: Past, Present, and Future (JSConf EU 2019)Igalia
 
Developing faster than ever (Liferay DEVCON 2017)
Developing faster than ever (Liferay DEVCON 2017)Developing faster than ever (Liferay DEVCON 2017)
Developing faster than ever (Liferay DEVCON 2017)Sébastien Le Marchand
 
OpenAPI Specification概要
OpenAPI Specification概要OpenAPI Specification概要
OpenAPI Specification概要Kazuchika Sekiya
 
Gradle enabled android project
Gradle enabled android projectGradle enabled android project
Gradle enabled android projectShaka Huang
 
Automate your Development Environment with Vagrant & Chef
Automate your Development Environment with Vagrant & ChefAutomate your Development Environment with Vagrant & Chef
Automate your Development Environment with Vagrant & Chef Michael Lihs
 
Mastering Grails 3 Plugins - Greach 2016
Mastering Grails 3 Plugins - Greach 2016Mastering Grails 3 Plugins - Greach 2016
Mastering Grails 3 Plugins - Greach 2016Alvaro Sanchez-Mariscal
 

Tendances (11)

Real world serverless - architecture, patterns and lessons learned
Real world serverless - architecture, patterns and lessons learnedReal world serverless - architecture, patterns and lessons learned
Real world serverless - architecture, patterns and lessons learned
 
Fabric8: Better Software Faster with Docker, Kubernetes, Jenkins
Fabric8: Better Software Faster with Docker, Kubernetes, JenkinsFabric8: Better Software Faster with Docker, Kubernetes, Jenkins
Fabric8: Better Software Faster with Docker, Kubernetes, Jenkins
 
Spring Boot Omakase: A Fast-Paced “Chef’s Choice” Dive into Fun and Useful To...
Spring Boot Omakase: A Fast-Paced “Chef’s Choice” Dive into Fun and Useful To...Spring Boot Omakase: A Fast-Paced “Chef’s Choice” Dive into Fun and Useful To...
Spring Boot Omakase: A Fast-Paced “Chef’s Choice” Dive into Fun and Useful To...
 
Swagger code motion talk
Swagger code motion talkSwagger code motion talk
Swagger code motion talk
 
Javantura v4 - CroDuke Indy and the Kingdom of Java Skills - Branko Mihaljevi...
Javantura v4 - CroDuke Indy and the Kingdom of Java Skills - Branko Mihaljevi...Javantura v4 - CroDuke Indy and the Kingdom of Java Skills - Branko Mihaljevi...
Javantura v4 - CroDuke Indy and the Kingdom of Java Skills - Branko Mihaljevi...
 
Web APIs in Node.js Core: Past, Present, and Future (JSConf EU 2019)
Web APIs in Node.js Core: Past, Present, and Future (JSConf EU 2019)Web APIs in Node.js Core: Past, Present, and Future (JSConf EU 2019)
Web APIs in Node.js Core: Past, Present, and Future (JSConf EU 2019)
 
Developing faster than ever (Liferay DEVCON 2017)
Developing faster than ever (Liferay DEVCON 2017)Developing faster than ever (Liferay DEVCON 2017)
Developing faster than ever (Liferay DEVCON 2017)
 
OpenAPI Specification概要
OpenAPI Specification概要OpenAPI Specification概要
OpenAPI Specification概要
 
Gradle enabled android project
Gradle enabled android projectGradle enabled android project
Gradle enabled android project
 
Automate your Development Environment with Vagrant & Chef
Automate your Development Environment with Vagrant & ChefAutomate your Development Environment with Vagrant & Chef
Automate your Development Environment with Vagrant & Chef
 
Mastering Grails 3 Plugins - Greach 2016
Mastering Grails 3 Plugins - Greach 2016Mastering Grails 3 Plugins - Greach 2016
Mastering Grails 3 Plugins - Greach 2016
 

Similaire à Everything-as-code: DevOps und Continuous Delivery aus Sicht des Entwicklers. @ConLifecycle

Everything-as-code. Ein polyglottes Abenteuer. #jax2017
Everything-as-code. Ein polyglottes Abenteuer. #jax2017Everything-as-code. Ein polyglottes Abenteuer. #jax2017
Everything-as-code. Ein polyglottes Abenteuer. #jax2017Mario-Leander Reimer
 
Polyglot Adventures for the Modern Java Developer #javaone2017
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
 
Everything as-code. Polyglotte Entwicklung in der Praxis. #oop2017
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
 
Everything-as-code. Eine vielsprachige Reise. #javaland
Everything-as-code. Eine vielsprachige Reise. #javalandEverything-as-code. Eine vielsprachige Reise. #javaland
Everything-as-code. Eine vielsprachige Reise. #javalandMario-Leander Reimer
 
Everything-as-code - a polyglot journey.
Everything-as-code - a polyglot journey.Everything-as-code - a polyglot journey.
Everything-as-code - a polyglot journey.QAware GmbH
 
Everything-as-code. A polyglot adventure. #DevoxxPL
Everything-as-code. A polyglot adventure. #DevoxxPLEverything-as-code. A polyglot adventure. #DevoxxPL
Everything-as-code. A polyglot adventure. #DevoxxPLMario-Leander Reimer
 
Everything-as-code - A polyglot adventure
Everything-as-code - A polyglot adventureEverything-as-code - A polyglot adventure
Everything-as-code - A polyglot adventureQAware GmbH
 
Docker and serverless Randstad Jan 2019: OpenFaaS Serverless: when functions ...
Docker and serverless Randstad Jan 2019: OpenFaaS Serverless: when functions ...Docker and serverless Randstad Jan 2019: OpenFaaS Serverless: when functions ...
Docker and serverless Randstad Jan 2019: OpenFaaS Serverless: when functions ...Edward Wilde
 
Rspec and Capybara Intro Tutorial at RailsConf 2013
Rspec and Capybara Intro Tutorial at RailsConf 2013Rspec and Capybara Intro Tutorial at RailsConf 2013
Rspec and Capybara Intro Tutorial at RailsConf 2013Brian Sam-Bodden
 
Web Development using Ruby on Rails
Web Development using Ruby on RailsWeb Development using Ruby on Rails
Web Development using Ruby on RailsAvi Kedar
 
13 practical tips for writing secure golang applications
13 practical tips for writing secure golang applications13 practical tips for writing secure golang applications
13 practical tips for writing secure golang applicationsKarthik Gaekwad
 
Supercharging CI/CD with GitLab and Rancher - June 2017 Online Meetup
Supercharging CI/CD with GitLab and Rancher - June 2017 Online MeetupSupercharging CI/CD with GitLab and Rancher - June 2017 Online Meetup
Supercharging CI/CD with GitLab and Rancher - June 2017 Online MeetupShannon Williams
 
The "Holy Grail" of Dev/Ops
The "Holy Grail" of Dev/OpsThe "Holy Grail" of Dev/Ops
The "Holy Grail" of Dev/OpsErik Osterman
 
Voxxed Days Vienna - The Why and How of Reactive Web-Applications on the JVM
Voxxed Days Vienna - The Why and How of Reactive Web-Applications on the JVMVoxxed Days Vienna - The Why and How of Reactive Web-Applications on the JVM
Voxxed Days Vienna - The Why and How of Reactive Web-Applications on the JVMManuel Bernhardt
 
Enterprise Data Workflows with Cascading and Windows Azure HDInsight
Enterprise Data Workflows with Cascading and Windows Azure HDInsightEnterprise Data Workflows with Cascading and Windows Azure HDInsight
Enterprise Data Workflows with Cascading and Windows Azure HDInsightPaco Nathan
 
Gapand 2017 - Diseñando Arquitecturas Serverless en Azure
Gapand 2017 - Diseñando Arquitecturas Serverless en AzureGapand 2017 - Diseñando Arquitecturas Serverless en Azure
Gapand 2017 - Diseñando Arquitecturas Serverless en AzureAlberto Diaz Martin
 
NativeScript Developer Day Keynote - Todd Anglin & Burke Holland
NativeScript Developer Day Keynote - Todd Anglin & Burke HollandNativeScript Developer Day Keynote - Todd Anglin & Burke Holland
NativeScript Developer Day Keynote - Todd Anglin & Burke HollandBrian Rinaldi
 
Lightweight Developer Provisioning with Gradle
Lightweight Developer Provisioning with GradleLightweight Developer Provisioning with Gradle
Lightweight Developer Provisioning with GradleMario-Leander Reimer
 
Lightweight developer provisioning with gradle and seu as-code
Lightweight developer provisioning with gradle and seu as-codeLightweight developer provisioning with gradle and seu as-code
Lightweight developer provisioning with gradle and seu as-codeQAware GmbH
 

Similaire à Everything-as-code: DevOps und Continuous Delivery aus Sicht des Entwicklers. @ConLifecycle (20)

Everything-as-code. Ein polyglottes Abenteuer. #jax2017
Everything-as-code. Ein polyglottes Abenteuer. #jax2017Everything-as-code. Ein polyglottes Abenteuer. #jax2017
Everything-as-code. Ein polyglottes Abenteuer. #jax2017
 
Polyglot Adventures for the Modern Java Developer #javaone2017
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. Polyglotte Entwicklung in der Praxis. #oop2017
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. Eine vielsprachige Reise. #javaland
Everything-as-code. Eine vielsprachige Reise. #javalandEverything-as-code. Eine vielsprachige Reise. #javaland
Everything-as-code. Eine vielsprachige Reise. #javaland
 
Everything-as-code - a polyglot journey.
Everything-as-code - a polyglot journey.Everything-as-code - a polyglot journey.
Everything-as-code - a polyglot journey.
 
Everything-as-code. A polyglot adventure. #DevoxxPL
Everything-as-code. A polyglot adventure. #DevoxxPLEverything-as-code. A polyglot adventure. #DevoxxPL
Everything-as-code. A polyglot adventure. #DevoxxPL
 
Everything-as-code - A polyglot adventure
Everything-as-code - A polyglot adventureEverything-as-code - A polyglot adventure
Everything-as-code - A polyglot adventure
 
Docker and serverless Randstad Jan 2019: OpenFaaS Serverless: when functions ...
Docker and serverless Randstad Jan 2019: OpenFaaS Serverless: when functions ...Docker and serverless Randstad Jan 2019: OpenFaaS Serverless: when functions ...
Docker and serverless Randstad Jan 2019: OpenFaaS Serverless: when functions ...
 
Rspec and Capybara Intro Tutorial at RailsConf 2013
Rspec and Capybara Intro Tutorial at RailsConf 2013Rspec and Capybara Intro Tutorial at RailsConf 2013
Rspec and Capybara Intro Tutorial at RailsConf 2013
 
Web Development using Ruby on Rails
Web Development using Ruby on RailsWeb Development using Ruby on Rails
Web Development using Ruby on Rails
 
13 practical tips for writing secure golang applications
13 practical tips for writing secure golang applications13 practical tips for writing secure golang applications
13 practical tips for writing secure golang applications
 
Supercharging CI/CD with GitLab and Rancher - June 2017 Online Meetup
Supercharging CI/CD with GitLab and Rancher - June 2017 Online MeetupSupercharging CI/CD with GitLab and Rancher - June 2017 Online Meetup
Supercharging CI/CD with GitLab and Rancher - June 2017 Online Meetup
 
Ruby On Rails Introduction
Ruby On Rails IntroductionRuby On Rails Introduction
Ruby On Rails Introduction
 
The "Holy Grail" of Dev/Ops
The "Holy Grail" of Dev/OpsThe "Holy Grail" of Dev/Ops
The "Holy Grail" of Dev/Ops
 
Voxxed Days Vienna - The Why and How of Reactive Web-Applications on the JVM
Voxxed Days Vienna - The Why and How of Reactive Web-Applications on the JVMVoxxed Days Vienna - The Why and How of Reactive Web-Applications on the JVM
Voxxed Days Vienna - The Why and How of Reactive Web-Applications on the JVM
 
Enterprise Data Workflows with Cascading and Windows Azure HDInsight
Enterprise Data Workflows with Cascading and Windows Azure HDInsightEnterprise Data Workflows with Cascading and Windows Azure HDInsight
Enterprise Data Workflows with Cascading and Windows Azure HDInsight
 
Gapand 2017 - Diseñando Arquitecturas Serverless en Azure
Gapand 2017 - Diseñando Arquitecturas Serverless en AzureGapand 2017 - Diseñando Arquitecturas Serverless en Azure
Gapand 2017 - Diseñando Arquitecturas Serverless en Azure
 
NativeScript Developer Day Keynote - Todd Anglin & Burke Holland
NativeScript Developer Day Keynote - Todd Anglin & Burke HollandNativeScript Developer Day Keynote - Todd Anglin & Burke Holland
NativeScript Developer Day Keynote - Todd Anglin & Burke Holland
 
Lightweight Developer Provisioning with Gradle
Lightweight Developer Provisioning with GradleLightweight Developer Provisioning with Gradle
Lightweight Developer Provisioning with Gradle
 
Lightweight developer provisioning with gradle and seu as-code
Lightweight developer provisioning with gradle and seu as-codeLightweight developer provisioning with gradle and seu as-code
Lightweight developer provisioning with gradle and seu as-code
 

Plus de Mario-Leander Reimer

Steinzeit war gestern! Vielfältige Wege der Cloud-nativen Evolution.
Steinzeit war gestern! Vielfältige Wege der Cloud-nativen Evolution.Steinzeit war gestern! Vielfältige Wege der Cloud-nativen Evolution.
Steinzeit war gestern! Vielfältige Wege der Cloud-nativen Evolution.Mario-Leander Reimer
 
A Hitchhiker's Guide to Cloud Native Java EE
A Hitchhiker's Guide to Cloud Native Java EEA Hitchhiker's Guide to Cloud Native Java EE
A Hitchhiker's Guide to Cloud Native Java EEMario-Leander Reimer
 
Steinzeit war gestern! Die vielfältigen Wege der Cloud-nativen Evolution
Steinzeit war gestern! Die vielfältigen Wege der Cloud-nativen EvolutionSteinzeit war gestern! Die vielfältigen Wege der Cloud-nativen Evolution
Steinzeit war gestern! Die vielfältigen Wege der Cloud-nativen EvolutionMario-Leander Reimer
 
Das kleine Einmaleins der sicheren Architektur @heise_devSec
Das kleine Einmaleins der sicheren Architektur @heise_devSecDas kleine Einmaleins der sicheren Architektur @heise_devSec
Das kleine Einmaleins der sicheren Architektur @heise_devSecMario-Leander Reimer
 
Elegantes In-Memory Computing mit Apache Ignite und Kubernetes. @data2day
Elegantes In-Memory Computing mit Apache Ignite und Kubernetes. @data2dayElegantes In-Memory Computing mit Apache Ignite und Kubernetes. @data2day
Elegantes In-Memory Computing mit Apache Ignite und Kubernetes. @data2dayMario-Leander Reimer
 
Cloud-native .NET-Microservices mit Kubernetes @BASTAcon
Cloud-native .NET-Microservices mit Kubernetes @BASTAconCloud-native .NET-Microservices mit Kubernetes @BASTAcon
Cloud-native .NET-Microservices mit Kubernetes @BASTAconMario-Leander Reimer
 
A Hitchhiker’s Guide to the Cloud Native Stack. #CDS17
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
 
Per Anhalter durch den Cloud Native Stack. #SEACONHH
Per Anhalter durch den Cloud Native Stack. #SEACONHHPer Anhalter durch den Cloud Native Stack. #SEACONHH
Per Anhalter durch den Cloud Native Stack. #SEACONHHMario-Leander Reimer
 
Per Anhalter durch den Cloud Native Stack (Extended Edition) #oop2017
Per Anhalter durch den Cloud Native Stack (Extended Edition) #oop2017Per Anhalter durch den Cloud Native Stack (Extended Edition) #oop2017
Per Anhalter durch den Cloud Native Stack (Extended Edition) #oop2017Mario-Leander Reimer
 
Der Cloud Native Stack in a Nutshell. #CloudExpoEurope
Der Cloud Native Stack in a Nutshell. #CloudExpoEuropeDer Cloud Native Stack in a Nutshell. #CloudExpoEurope
Der Cloud Native Stack in a Nutshell. #CloudExpoEuropeMario-Leander Reimer
 
A Hitchhiker’s Guide to the Cloud Native Stack. #ContainerConf
A Hitchhiker’s Guide to the Cloud Native Stack. #ContainerConfA Hitchhiker’s Guide to the Cloud Native Stack. #ContainerConf
A Hitchhiker’s Guide to the Cloud Native Stack. #ContainerConfMario-Leander Reimer
 
Secure Architecture and Programming 101
Secure Architecture and Programming 101Secure Architecture and Programming 101
Secure Architecture and Programming 101Mario-Leander Reimer
 
Automotive Information Research driven by Apache Solr
Automotive Information Research driven by Apache SolrAutomotive Information Research driven by Apache Solr
Automotive Information Research driven by Apache SolrMario-Leander Reimer
 
Automotive Information Research driven by Apache Solr
Automotive Information Research driven by Apache SolrAutomotive Information Research driven by Apache Solr
Automotive Information Research driven by Apache SolrMario-Leander Reimer
 
Lightweight Developer Provisioning with Gradle and SEU-as-code
Lightweight Developer Provisioning with Gradle and SEU-as-codeLightweight Developer Provisioning with Gradle and SEU-as-code
Lightweight Developer Provisioning with Gradle and SEU-as-codeMario-Leander Reimer
 
Secure JEE Architecture and Programming 101
Secure JEE Architecture and Programming 101Secure JEE Architecture and Programming 101
Secure JEE Architecture and Programming 101Mario-Leander Reimer
 
Search-based business intelligence and reverse data engineering with Apache Solr
Search-based business intelligence and reverse data engineering with Apache SolrSearch-based business intelligence and reverse data engineering with Apache Solr
Search-based business intelligence and reverse data engineering with Apache SolrMario-Leander Reimer
 
Migrating a JSF-Based Web Application from Spring 3 to Java EE 7 and CDI
Migrating a JSF-Based Web Application from Spring 3 to Java EE 7 and CDIMigrating a JSF-Based Web Application from Spring 3 to Java EE 7 and CDI
Migrating a JSF-Based Web Application from Spring 3 to Java EE 7 and CDIMario-Leander Reimer
 

Plus de Mario-Leander Reimer (19)

Steinzeit war gestern! Vielfältige Wege der Cloud-nativen Evolution.
Steinzeit war gestern! Vielfältige Wege der Cloud-nativen Evolution.Steinzeit war gestern! Vielfältige Wege der Cloud-nativen Evolution.
Steinzeit war gestern! Vielfältige Wege der Cloud-nativen Evolution.
 
A Hitchhiker's Guide to Cloud Native Java EE
A Hitchhiker's Guide to Cloud Native Java EEA Hitchhiker's Guide to Cloud Native Java EE
A Hitchhiker's Guide to Cloud Native Java EE
 
Steinzeit war gestern! Die vielfältigen Wege der Cloud-nativen Evolution
Steinzeit war gestern! Die vielfältigen Wege der Cloud-nativen EvolutionSteinzeit war gestern! Die vielfältigen Wege der Cloud-nativen Evolution
Steinzeit war gestern! Die vielfältigen Wege der Cloud-nativen Evolution
 
Das kleine Einmaleins der sicheren Architektur @heise_devSec
Das kleine Einmaleins der sicheren Architektur @heise_devSecDas kleine Einmaleins der sicheren Architektur @heise_devSec
Das kleine Einmaleins der sicheren Architektur @heise_devSec
 
Elegantes In-Memory Computing mit Apache Ignite und Kubernetes. @data2day
Elegantes In-Memory Computing mit Apache Ignite und Kubernetes. @data2dayElegantes In-Memory Computing mit Apache Ignite und Kubernetes. @data2day
Elegantes In-Memory Computing mit Apache Ignite und Kubernetes. @data2day
 
Cloud-native .NET-Microservices mit Kubernetes @BASTAcon
Cloud-native .NET-Microservices mit Kubernetes @BASTAconCloud-native .NET-Microservices mit Kubernetes @BASTAcon
Cloud-native .NET-Microservices mit Kubernetes @BASTAcon
 
A Hitchhiker’s Guide to the Cloud Native Stack. #CDS17
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. #CDS17
 
Per Anhalter durch den Cloud Native Stack. #SEACONHH
Per Anhalter durch den Cloud Native Stack. #SEACONHHPer Anhalter durch den Cloud Native Stack. #SEACONHH
Per Anhalter durch den Cloud Native Stack. #SEACONHH
 
Per Anhalter durch den Cloud Native Stack (Extended Edition) #oop2017
Per Anhalter durch den Cloud Native Stack (Extended Edition) #oop2017Per Anhalter durch den Cloud Native Stack (Extended Edition) #oop2017
Per Anhalter durch den Cloud Native Stack (Extended Edition) #oop2017
 
Der Cloud Native Stack in a Nutshell. #CloudExpoEurope
Der Cloud Native Stack in a Nutshell. #CloudExpoEuropeDer Cloud Native Stack in a Nutshell. #CloudExpoEurope
Der Cloud Native Stack in a Nutshell. #CloudExpoEurope
 
A Hitchhiker’s Guide to the Cloud Native Stack. #ContainerConf
A Hitchhiker’s Guide to the Cloud Native Stack. #ContainerConfA Hitchhiker’s Guide to the Cloud Native Stack. #ContainerConf
A Hitchhiker’s Guide to the Cloud Native Stack. #ContainerConf
 
Secure Architecture and Programming 101
Secure Architecture and Programming 101Secure Architecture and Programming 101
Secure Architecture and Programming 101
 
Automotive Information Research driven by Apache Solr
Automotive Information Research driven by Apache SolrAutomotive Information Research driven by Apache Solr
Automotive Information Research driven by Apache Solr
 
Automotive Information Research driven by Apache Solr
Automotive Information Research driven by Apache SolrAutomotive Information Research driven by Apache Solr
Automotive Information Research driven by Apache Solr
 
Kubernetes 101 and Fun
Kubernetes 101 and FunKubernetes 101 and Fun
Kubernetes 101 and Fun
 
Lightweight Developer Provisioning with Gradle and SEU-as-code
Lightweight Developer Provisioning with Gradle and SEU-as-codeLightweight Developer Provisioning with Gradle and SEU-as-code
Lightweight Developer Provisioning with Gradle and SEU-as-code
 
Secure JEE Architecture and Programming 101
Secure JEE Architecture and Programming 101Secure JEE Architecture and Programming 101
Secure JEE Architecture and Programming 101
 
Search-based business intelligence and reverse data engineering with Apache Solr
Search-based business intelligence and reverse data engineering with Apache SolrSearch-based business intelligence and reverse data engineering with Apache Solr
Search-based business intelligence and reverse data engineering with Apache Solr
 
Migrating a JSF-Based Web Application from Spring 3 to Java EE 7 and CDI
Migrating a JSF-Based Web Application from Spring 3 to Java EE 7 and CDIMigrating a JSF-Based Web Application from Spring 3 to Java EE 7 and CDI
Migrating a JSF-Based Web Application from Spring 3 to Java EE 7 and CDI
 

Dernier

Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software DevelopersVinodh Ram
 
Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...OnePlan Solutions
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...ICS
 
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️anilsa9823
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...harshavardhanraghave
 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfjoe51371421
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...kellynguyen01
 
Clustering techniques data mining book ....
Clustering techniques data mining book ....Clustering techniques data mining book ....
Clustering techniques data mining book ....ShaimaaMohamedGalal
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providermohitmore19
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfkalichargn70th171
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Modelsaagamshah0812
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantAxelRicardoTrocheRiq
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerThousandEyes
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...panagenda
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...MyIntelliSource, Inc.
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxComplianceQuest1
 

Dernier (20)

Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software Developers
 
Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...
 
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdf
 
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS LiveVip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
 
Clustering techniques data mining book ....
Clustering techniques data mining book ....Clustering techniques data mining book ....
Clustering techniques data mining book ....
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service Consultant
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docx
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 

Everything-as-code: DevOps und Continuous Delivery aus Sicht des Entwicklers. @ConLifecycle

  • 1.
  • 2. #whoami Mario-Leander Reimer Cheftechnologe, QAware GmbH - Senior Developer && Architect - 20+ Jahre Erfahrung - #CloudNativeNerd - Open Source Enthusiast mario-leander.reimer@qaware.de http://github.com/lreimer http://speakerdeck.com/lreimer // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 3.
  • 4. // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 5. // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 6. // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 7.
  • 8. // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 9. Software Industrialization ist eine Schlüsselanforderung für erfolgreiches DevOps und Continuous Delivery. // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 10. Ein Software-Fließband produziert und liefert die fertige Software an. // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 11. Software Industrialisierung bedeutet ... • Hoher Automatisiersgrad von arbeitsintensiven und wiederkehrenden Arbeitsschritten • Bessere Software-Qualität durch eine abgestimmte Tool-Chain • Mehr Produktivität und Zufriedenheit der Teams • Kosten-Effizienz und Wettbewerbsfähigkeit // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 12. Die IDE ist unsere Werkbank.
  • 13. val softwareIndustrialization = everythingAsCode() open fun everythingAsCode() = everythingIsMadeFromCode() && everythingIsMadeByCode() private fun everythingIsMadeFromCode() = true private fun everythingIsMadeByCode() = true // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 14. Auf die Domäne kommt es an! Eine beste Programmiersprache gibt es nicht. // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 15. Die Queste nach dem idealen Polyglot Project Archetype • Welche Sprachen werden in unseren Projekten in welchen Domänen verwendet? • Welche Tools verwenden wir für Setup, Build, Code, Test, CI, Infrastructure, Documentation? • Was davon hat sich bewährt und was eher nicht? • Gibt es bereits Best Practices oder Anti-Patterns? + Wishful Greenfield Thinking! // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 17.
  • 18. 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 definiert • Gradle Tasks und Groovy Code statt Shell-Scripting • Versionskontrolle der SEU Definition und Skripte • Open Source. http://seu-as-code.io // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 19. 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' } // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 20.
  • 21. # language: en Functionality: Authentication and Authorization Scenario Outline: Check proper login behaviour Given the username "<USERNAME>" And the password "<PASSWORD>" When the user logs into the system Then the login result is "<RESULT>" Examples: Login data | USERNAME | PASSWORD | RESULT | | mario-leander.reimer | invalidpwd | failure | | unknown | somepwd | failure | | mario-leander.reimer | correctpwd | success | // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 22. // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 23.
  • 24. Maven ist gut. Gradle ist 100x schneller. • Sehr flexibel und vielseitig einsetzbar. • Einfache Unterstützung für polyglotte Projekte. • Build Skripte sind maximal kurz und prägnant. • Deutlich reduzierte Build-Zeiten durch inkrementelle Builds und Caching • Zahlreiche neue Features: Composite Builds, Kotlin- basierte Build-Skripte, Performance Verbesserungen, ... • Regelmäßige Releases. Stabil und ausgereift. // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 25. 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 using Gradle @ ContinuousLifecycle 2017.' } // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 26.
  • 27. Java ist nach wie vor unsere primäre Implementierungssprache! Und das ist gut so! // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 28. Aber: Kotlin als Alternative zu Java ist einen Blick wert! // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 29. 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. // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 30. @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) } // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 31.
  • 32. 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 // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 33.
  • 34. Grovy + Spock eignen sich für Unit, Integration, Acceptance und UI-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" } } // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 35. Scala und Gatling für lesbare und performante 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) } // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 36.
  • 37. Definition einer Build-Pipeline per Jenkinsfile und Groovy #!/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' } // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 38. // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 39.
  • 40. Architektur-Definition und Prüfung mit QAvalidator für wartbaren Code. architecture(name: "Mail Example", prefix: "tview", reflexMLversion: "1.0") { excludes "java.lang.*" api "JavaMail" : "javax.mail.*" component "Mail" { api "IMail" : "de.qaware.mail.*" impl ["de.qaware.mail.impl.*", "de.qaware.mail.impl2.*"] uses "JavaMail" component "MailSender" { api ["de.qaware.mail.sender.*", "javax.mail.*"] impl "de.qaware.mail.impl.javamail.JavaMailSender" uses "JavaMail" } } } // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 41.
  • 42. 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.3.tar /app WORKDIR /app/everything-as-code-1.2.3 RUN chmod 755 bin/everything-as-code EXPOSE 18080 CMD ./bin/everything-as-code // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 43. Cluster Orchestration mit K8s et.al. --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: everything-as-code spec: replicas: 2 template: metadata: labels: tier: backend spec: containers: - name: everything-as-code image: "qaware-oss-docker-registry.bintray.io/lreimer/everything-as-code:1.2.3" ports: - containerPort: 18080 env: - name: PORT value: 18080 // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 44. Einfache Provisionierung mit Ansible. --- # 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 // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 45. 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 // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 46.
  • 47. 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 // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 48. // 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 // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 49. Mit AsciidoctorJ und Gradle zum fertigen Dokument. 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', 'pdf'] options doctype: 'article' attributes 'source-highlighter': 'coderay' } // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 50. Architectur-Dokumentation mit Structurizr def workspace = new Workspace("Everything-as-code", "The system context of Everything-as-code.") def model = workspace.model // create a model and the software system we want to describe def bookApp = model.addSoftwareSystem("Book Application", "The best source to get info on books.") // create the various types of people (roles) that use the software system def anonymousUser = model.addPerson("Anonymous User", "Anybody on the web.") anonymousUser.uses(bookApp, "Searches for books and views details.") def browser = bookApp.addContainer("Web Browser", "Allows users to view information about books", "Edge, Chrome, Firefox") anonymousUser.uses(browser, "Views information from and makes requests to") def webApp = bookApp.addContainer("Web Application", "Hosts the browser-based web application and services", "Payara Fish") browser.uses(webApp, "uses [JSON/HTTPS]") // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 51. // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 52.
  • 53. 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. --- // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 54.
  • 55. Use the right tool for the job!
  • 56.
  • 57. Alles mit Augenmaß! Der richtige Technologie-Stack hängt vom Team, dem Projekt-Kontext und unseren Kunden ab. // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 58. Fork me on GitHub. https://github.com/lreimer/everything-as-code // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 59. // ContinuousLifecycle 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }