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

Continuous Integration und Delivery von Microse...

Continuous Integration und Delivery von Microservices mit GitLab CI

Frankfurter Entwicklertag, 21.02.2018

Philipp Haussleiter

February 21, 2018
Tweet

More Decks by Philipp Haussleiter

Other Decks in Technology

Transcript

  1. Continuous Integration und Delivery von Microservices mit GitLab CI Christine

    Koppelt, Philipp Haußleiter Frankfurter Entwicklertag, 21.02.2018
  2. Continuous Integration (CI) Source Repository CI Server Bauen Testen Paketieren

    Server mit Anwendung Entwicklungsteam Sourcecode Deploybare Anwendung Feedback
  3. 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
  4. Microservices & CI Branches Datenbanken Messaging Testinfrastruktur Mehrere Services Unterschiedliche

    Buildtools Mehrere Plattformen Mehrere Versionen Docker-basierte Deployments A/B Testing Unterschiedliche Entwicklungs- prozesse Microservices
  5. Microservices & Infrastruktur DO Entkopplung Infra-Team und Entwicklung Entwickler konfigurieren

    CI Jobs und Staging Umgebung selbständig Kapselung der Buildumgebung DON’T Modifikation der Konfiguration des CI Servers für einzelne Projekte Adminrechte für Entwickler Langwierige Abstimmungen zwischen Infra-Team und Entwicklung
  6. GitLab • Gestartet als Web-Basierter Git Repository Manager • Mittlerweile:

    Umfangreiche Softwareentwicklungssuite ◦ Issue Tracker integriert ◦ CI Server integriert ◦ Bauen von Merge Requests und Branches integriert ◦ Anlegen von Jobs über eine deklarative Konfiguration mittels Yaml ◦ Builds innerhalb Docker => Sinnvolle Konventionen, modularer Ansatz • Open Source, kommerzielle und Cloud Versionen
  7. 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
  8. 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 Wiki Automatisches Bauen von Branches Automatisches Prüfen & Bauen von Merge Requests Merge schließt Ticket automatisch Feature Branch
  9. 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
  10. Struktur .gitlab-ci.yml Deklaration der Stages (optional) Deklaration von Umgebungsvariablen (optional)

    Job-Deklaration1 (Stage, Image, Services, Script, Artifacts) Job-Deklaration2 Job-Deklaration3 . . .
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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