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

Automatisierte Review-Umgebungen mit GitLab-CI ...

Daniel Badura
September 27, 2019

Automatisierte Review-Umgebungen mit GitLab-CI und Rancher

In den meisten Software Projekten werden bereits Continuous Integration (CI) Systeme verwendet, um die Code Qualität zu sichern. Dafür werden Tests und statische Codeanalyse Tools automatisiert bei jedem Commit ausgeführt. So kann sichergestellt werden, dass ein Pull Request nur gemerged wird, wenn die Pipeline “grün” ist und somit alle für das Projekt definierten Qualitätsanforderungen erfüllt sind. Oftmals ist dieser Ansatz aber nicht ausreichend, da der Kunde oder die QA die neue Features einzeln in einer abgeschlossenen Umgebung testen und abnehmen möchten.

In diesem Vortrag geht es darum, wie wir mit der GitLab-CI automatisiert Review-Umgebungen für jeden Branch hochfahren. Daraus resultiert, dass ein Entwickler keine manuellen Review-Umgebungen mehr bereitstellen muss. Wir verwenden dazu die Tools Docker, Rancher und Traefik, um diese Instanzen zu verwalten. Zuerst werden wir es anhand eines Minimal-Beispiels praktisch nachvollziehen. Daraufhin werden wir eine Symfony App als Beispielprojekt nehmen, um einen komplexeren Workflow abzubilden.

Weiterhin werde ich unsere Erfahrungen einbringen, die wir mit unseren Kunden und Product Ownern gemacht haben, seitdem wir dieses Verfahren bei uns eingeführt haben. Zudem gehe ich noch auf ein paar technische Fallstricke ein, auf die wir gestoßen sind.

Daniel Badura

September 27, 2019
Tweet

More Decks by Daniel Badura

Other Decks in Programming

Transcript

  1. Lösung: Staging System Deployment auf Staging nach dem Mergen Abläufe

    können getestet werden Kunde kann Features abnehmen
  2. Problem der Lösung Abnahme erst nach dem Mergen mehrere Features

    nicht isoliert testbar Feature nicht abgenommen?
  3. ... das Gute daran GitLab FREE Docker FREE Rancher 1.6

    FREE Rancher CLI FREE Trae k FREE
  4. .gitlab-ci.yml stages: - task echo: image: debian:latest stage: task only:

    - branches script: -echo 'Hello World!' 1 2 3 4 5 6 7 8 9 10
  5. Docker in .gitlab-ci.yml variables: # image name & tag: registry.gitlab.com/group/project:master

    IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG stages: - build - deploy build: image: docker:18 stage: build only: - branches - tags services: - docker:dind before_script: - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY - docker pull $IMAGE || true script: - docker build --pull -t $IMAGE -f Dockerfile . - docker push $IMAGE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
  6. variables: # review url: master.project.daniel-badura.de DOMAIN: $CI_COMMIT_REF_SLUG.$CI_PROJECT_NAME.daniel-badura.de # image name

    & tag: registry.gitlab.com/group/project:master IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG 1 2 3 4 5
  7. Trae k in docker-compose.yml version: '2' services: app: image: ${IMAGE}

    labels: traefik.frontend.rule: Host:${DOMAIN} traefik.domain: ${DOMAIN} traefik.port: '80' traefik.enable: 'true' io.rancher.container.pull_image: always 1 2 3 4 5 6 7 8 9 10 11
  8. variables: # review url: master.project.daniel-badura.de DOMAIN: $CI_COMMIT_REF_SLUG.$CI_PROJECT_NAME.daniel-badura.de # image name

    & tag: registry.gitlab.com/group/project:master IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG # rancher stack name: project-master STACK: $CI_PROJECT_NAME-$CI_COMMIT_REF_SLUG 1 2 3 4 5 6 7 8
  9. FROM phusion/baseimage:0.11 ARG DEBIAN_FRONTEND=noninteractive # install common tools & tzdata

    RUN apt-get update && \ apt-get install --no-install-recommends -y \ 1 2 3 4 5 6 7
  10. # install & setup nginx RUN apt-get update && \

    apt-get install --no-install-recommends -y \ nginx \ && \ rm -r /var/lib/apt/lists/* 1 2 3 4 5 6
  11. "Symfony" docker-compose.yml version: '2' services: app: image: ${IMAGE} labels: traefik.frontend.rule:

    Host:${DOMAIN} traefik.enable: 'true' traefik.port: '80' traefik.domain: ${DOMAIN} io.rancher.container.pull_image: always links: - database environment: APP_ENV: dev APP_SECRET: 32b55587a39392089e89daa590e20c0b MAILER_URL: null://localhost DATABASE_URL: 'mysql://root:geheim@database:3306/app?charset=utf8mb4&serverVersion=5.7' database: image: mysql:5.7.23 environment: MYSQL_ROOT_HOST: '%' MYSQL_ROOT_PASSWORD: 'geheim' MYSQL_DATABASE: 'app' MYSQL_USER: 'root' MYSQL_PASSWORD: 'geheim' 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
  12. Q&A