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

Christine Koppelt

February 08, 2018
Tweet

More Decks by Christine Koppelt

Other Decks in Technology

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?