Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Build und Deployment von Microservices mit GitLab CI

Build und Deployment von Microservices mit GitLab CI

8dfa4d1af5c7bb536a71e68a749d41ce?s=128

Christine Koppelt

February 08, 2018
Tweet

Transcript

  1. Build & Deployment von Microservices mit GitLab CI Christine Koppelt

    christine.koppelt@innoq.com Philipp Haußleiter philipp.haussleiter@innoq.com Code Days München, 08.02.2018
  2. Continuous Integration (CI) & Microservices

  3. Continuous Integration (CI) Source Repository CI Server Server mit Anwendung

    Entwicklungsteam Sourcecode Deploybare Anwendung Feedback
  4. 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
  5. 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
  6. 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
  7. 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
  8. Self Service

  9. Jenkins

  10. 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?
  11. GitLab

  12. 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
  13. 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
  14. Setup

  15. 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
  16. 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
  17. Komponenten Deployment Übertragen & Installieren Abnahme Prometheus Integration Kubernetes Integration

    Metriken erfassen Manuelle Freigabe
  18. Beispiel

  19. Ziel GitLab Git Repository GitLab CI AWS Beanstalk Entwicklungsteam Sourcecode

    Deploybare Anwendung Feedback
  20. Struktur .gitlab-ci.yml Deklaration der Stages (optional) Deklaration von Umgebungsvariablen (optional)

    Job-Deklaration1 (Stage, Image, Services, Script, Artifacts) Job-Deklaration2 Job-Deklaration3 . . .
  21. 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
  22. 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
  23. Caching stages: - build variables: MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository" cache: paths: -

    .m2/repository build_jar: ... build test deploy package
  24. 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
  25. 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
  26. 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
  27. 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
  28. Demo

  29. Fragen?