Slide 1

Slide 1 text

Build & Deployment von Microservices mit GitLab CI Christine Koppelt [email protected] Philipp Haußleiter [email protected] Code Days München, 08.02.2018

Slide 2

Slide 2 text

Continuous Integration (CI) & Microservices

Slide 3

Slide 3 text

Continuous Integration (CI) Source Repository CI Server Server mit Anwendung Entwicklungsteam Sourcecode Deploybare Anwendung Feedback

Slide 4

Slide 4 text

Microservices ● Mehrere eigenständige Services bilden ein Gesamtsystem ○ Unterteilt nach Bounded Contexts (Domain Driven Design) ○ Eigenständige Anwendungen (Frontend, Backend, Datenhaltung) ○ Eigenständig deploybare Einheiten ● Eigenständige Entwicklungsteams ○ Komplette Verantwortung für einen Service ○ Extremfall: “You build it you run it” ○ Freiheiten bei technischen und organisatorischen Entscheidungen

Slide 5

Slide 5 text

Microservices & CI Branches Datenbanken Messaging Testinfrastruktur Mehrere Services Unterschiedliche Buildtools Mehrere Plattformen Mehrere Versionen Deployment- reihenfolge Docker-basierte Deployments A/B Testing Unterschiedliche Entwicklungs- prozesse Microservices

Slide 6

Slide 6 text

Microservices & Infrastruktur DO Entkopplung Infra-Team und Entwicklung Eigenständige Konfiguration von Build, Test und Deployment Kapselung der Buildumgebung Eigenständige Konfiguration der Projektmanagement-Tools Eigenständige Konfiguration von Staging Umgebungen

Slide 7

Slide 7 text

DON’T Modifikation der Konfiguration des CI Servers für einzelne Projekte Adminrechte für Entwickler Langwierige Abstimmungen zwischen Infra-Team und Entwicklung Globale Workflow-Definitionen im Issue Tracker Microservices & Infrastruktur

Slide 8

Slide 8 text

Self Service

Slide 9

Slide 9 text

Jenkins

Slide 10

Slide 10 text

Jenkins ● Verschiedene Wege Jobs zu erstellen: GUI, Job DSL, Pipeline ● Viele Plugins ● Groovy ● Bauen von Merge Requests und Branches? ● Bauen mit Docker? => möglich, aber manuelle Anpassung notwendig ● Issue Tracker?

Slide 11

Slide 11 text

GitLab

Slide 12

Slide 12 text

GitLab Features ● Issue Tracker integriert ● Bauen von Merge Requests und Branches integriert ● Anlegen von Jobs über eine deklarative Konfiguration mittels Yaml ● Builds innerhalb Docker => Sinnvolle Konventionen, modularer Ansatz

Slide 13

Slide 13 text

GitLab Übersicht ● Gestartet als webbasierter Git Repository Manager ● CI Pipelines seit 2016 ● Mittlerweile: Umfangreiche Softwareentwicklungssuite ○ Epics bis Deployment ● On Premise Edition ○ Libre (ehemals Community Edition CE) ○ Starter ○ Premium (ehemals Enterprise Edition EE) ○ Ultimate ● Cloud Version: gitlab.com

Slide 14

Slide 14 text

Setup

Slide 15

Slide 15 text

Komponenten Entwicklung Ticket erstellen Entwickeln Einchecken Build prüfen Merge Request erstellen Review & Merge Ticket schließen Feature Static Page Hosting Boards Issue Tracker Git Repository Chat (Mattermost) Wiki Automatisches Bauen von Branches Automatisches Prüfen & Bauen von Merge Requests Merge schließt Ticket automatisch Feature Branch

Slide 16

Slide 16 text

Komponenten CI Sourcecode auschecken Kompilieren Testen Metriken Erfassen Reports & Doku generieren Paketieren Docker Registry Artifakt Archivierung Buildumgebung als Docker Image Services & Infrastruktur als Docker Container einbinden Docker-in-Docker Unterstützung Bauen von Branches & Merge Requests Zeitgesteuertes Starten von Builds

Slide 17

Slide 17 text

Komponenten Deployment Übertragen & Installieren Abnahme Prometheus Integration Kubernetes Integration Metriken erfassen Manuelle Freigabe

Slide 18

Slide 18 text

Beispiel

Slide 19

Slide 19 text

Ziel GitLab Git Repository GitLab CI AWS Beanstalk Entwicklungsteam Sourcecode Deploybare Anwendung Feedback

Slide 20

Slide 20 text

Struktur .gitlab-ci.yml Deklaration der Stages (optional) Deklaration von Umgebungsvariablen (optional) Job-Deklaration1 (Stage, Image, Services, Script, Artifacts) Job-Deklaration2 Job-Deklaration3 . . .

Slide 21

Slide 21 text

CI Pipeline build_jar build build_docker_image package deploy_staging deploy Job Stage Sourcecode auschecken Kompilieren Testen Paketieren Deployen test int_test1 int_test2

Slide 22

Slide 22 text

Bau eines Java Projektes stages: - build build_jar: stage: build image: maven:3-jdk-8 script: - mvn install artifacts: paths: - target/*.jar build test deploy package

Slide 23

Slide 23 text

Caching stages: - build variables: MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository" cache: paths: - .m2/repository build_jar: ... build test deploy package

Slide 24

Slide 24 text

Services einbinden am Beispiel PostgreSQL ... variables: POSTGRES_DB: enco POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres int_test1: stage: test image: maven:3-jdk-8 services: - postgres:9.6 script: - mvn install -P integration-test1 artifacts: paths: - target/reports/* build test deploy package

Slide 25

Slide 25 text

Docker Image bauen & pushen stages: - build - test - package ... build_docker_image: stage: package image: docker:latest services: - docker:dind script: - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY - docker build -t $CI_REGISTRY_IMAGE:latest . - docker push $CI_REGISTRY_IMAGE:latest build test deploy package

Slide 26

Slide 26 text

Branch-Spezifische Jobs stages: - build - test - package ... build_docker_image: stage: package image: docker:latest services: - docker:dind script: - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY - docker build -t $CI_REGISTRY_IMAGE:latest . - docker push $CI_REGISTRY_IMAGE:latest only: - master build test deploy package

Slide 27

Slide 27 text

Deployment bei AWS Beanstalk deploy_staging: ... script: - aws elasticbeanstalk create-application-version \ --application-name "$EB_APP_NAME" \ --version-label "$CI_COMMIT_SHA" \ --description "$CI_COMMIT_SHA" \ --source-bundle S3Bucket="$S3_BUCKET", \ S3Key="$CI_COMMIT_SHA.zip" - aws elasticbeanstalk update-environment \ --application-name "$EB_APP_NAME" \ --environment-name $EB_ENVIRONMENT \ --version-label "$CI_COMMIT_SHA" environment: name: staging url: $DEPLOYMENT_URL build test deploy package

Slide 28

Slide 28 text

Demo

Slide 29

Slide 29 text

Fragen?