Skip to content

Schritt 5

Ziel

Meistens gibt es nicht nur einen Produktivserver, sondern zusätzlich noch einen Staging- und evtl. weitere Server zum Testen. Auf einem Staging-Server kann die Software unter Produktionsbedingungen ausgeführt werden ohne die Produktionsversion zu verändern. Dies dient dazu, Kunden eine Möglichkeit der Überprüfung und endgültigen Freigabe zur Übernahme in Produktion zu ermöglichen. Dabei können beispielsweise Mitarbeiter des Kunden involviert werden, die nicht Mitglied im Projektteam sind (z. B. Geschäftsleitung).

Es sollen jetzt zwei Nginx-Container auf dem Entwicklungsrechner betrieben werden. Einer enthält die aktuelle Entwicklungsversion, der andere die Staging-Version. Das Deployment auf die beiden Server wird über den Branch gesteuert: wenn es sich um den Branch staging handelt, wird auf Staging deployed, sonst auf Development.

Da alle Server nach wie vor auf derselben Maschine (Entwicklungsrechner) laufen, muss der Zugriff auf die beiden Server über einen Reverse Proxy gesteuert werden um Zugriffskonflikte zu vermeiden. Wir verwenden dafür den Reverse Proxy træfik, der ebenfalls als Docker-Container gestartet wird.

Außerdem sollen die beiden Server über GitLab-Environments ansprechbar sein.

Aufgabe

Ihnen ist beim Befolgen des GitLab-Flow sicherlich aufgefallen, dass sowohl die Pipelines des Main-Branches als auch der Feature-Branches die eine Beispieldatei aus den vorhergehenden Schritten überschreiben. Ändern Sie Ihre Pipeline so ab, dass verschiedene Nginx-Container genutzt werden, die über verschiedene URLs erreichbar und unter Operate > Environments im GitLab-Projekt einsehbar sind.

Nutzen Sie dafür das gegebene docker-compose.yml File. Hier wird mittels træfik und nip.io eine Umgebung aus zwei verschiedenen Nginx-Containern geschaffen. Für eine Erfolgreiche Bearbeitung der Aufgabe ist ein tieferes Verständnis dieser beiden Dienste nicht zwingend erforderlich. Wir empfehlen aber, dass Sie sich auch mit diesen Diensten auseinandersetzen und versuchen die Funktionsweise nachzuvollziehen.

# docker-compose.yml

services:
  traefik:
    container_name: traefik
    image: traefik:v2.0
    restart: always
    command:
      --api.insecure
      --entrypoints.http.address=:80
      --providers.docker
      --providers.docker.exposedbydefault=false
    network_mode: host
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
  staging:
    container_name: nginx_staging
    image: nginx
    restart: always
    labels:
      traefik.enable: true
      traefik.http.routers.staging.rule: Host(`staging.XXX.XXX.XXX.XXX.nip.io`)
  dev:
    container_name: nginx_dev
    image: nginx
    restart: always
    labels:
      traefik.enable: true
      traefik.http.routers.dev.rule: Host(`dev.XXX.XXX.XXX.XXX.nip.io`)

Ersetzen Sie im oben stehenden Beispiel XXX.XXX.XXX.XXX durch die IP-Adresse des localhost.

Nutzen Sie in Ihrer erweiterten Pipeline die Keywords rules oder only/except.

Sollten Sie keine Verbindung über die Routen herstellen können, beachten sie den Hinweis auf nip.io:

DNS Rebinding Protection

Some DNS resolvers, forwarders and routers have DNS rebinding protection which may result in failure to resolve local and private IP addresses. This service won't work in those situations.

Informieren Sie sich über mögliche Lösungsansätze, für eine FRITZ!Box kann z.B. dieser Workaround funktionieren.