Wie man eine CI/CD-Pipeline für CircleCI Docker-Images erstellt

Wenn Sie nach einer Möglichkeit suchen, Ihre CircleCI Docker-Images zu testen und bereitzustellen, kann die Erstellung einer CI/CD-Pipeline einen langen Weg zur Verbesserung der Softwareauslieferung bedeuten.

In diesem Tutorial erfahren Sie, wie Sie potenziell eine CI/CD-Pipeline für Ihr Docker-Image mit CircleCI entwickeln können.

Lesen Sie weiter und stellen Sie Ihre Docker-Images bereit, nur wenn sie den Test bestehen!

Voraussetzungen

In diesem Tutorial wird eine praktische Demonstration durchgeführt. Wenn Sie mitmachen möchten, stellen Sie bitte sicher, dass Sie Folgendes haben:

Erstellen eines Docker-Images einer Python-basierten Anwendung

Bevor Sie mit der Erstellung einer CI/CD-Pipeline beginnen, erstellen Sie zunächst ein Docker-Image, das auf einer Python-Anwendung basiert, die Texte in einem Webbrowser anzeigt. Sie gehen kurz darauf ein, wie die Anwendung erstellt wird, schreiben die Testfälle für die Anwendung und containerisieren dann die Anwendung.

1. Öffnen Sie Ihr Terminal und führen Sie den folgenden Befehl aus, um Flask und Pytest zu installieren. Flask ist ein Framework, das zur Entwicklung von Webanwendungen in Python verwendet wird, während Pytest zum Schreiben von Tests für Python-Code verwendet wird.

pip install flask pytest

2. Erstellen Sie als nächstes ein Projektverzeichnis mit Ihrem bevorzugten Namen, das Projektverzeichnis heißt jedoch in diesem Beispiel flask-circleci. In diesem Verzeichnis werden die Ressourcen für dieses Tutorial gespeichert.

mkdir flask-circleci

3. Erstellen Sie eine Datei namens flask-circleci/main.py und füllen Sie den folgenden Code ein.

Der untenstehende Code zeigt den Text „Willkommen auf meiner Flask-App“ auf einer Startseite im Browser an.

from flask import Flask

app = Flask(__name__) # Erstellen einer Instanz der gerade importierten Flask-Klasse

@app.route('/')
def main():
    # Zeigen Sie einen String auf der Startseite an
    return "Welcome to my Flask App"

4. Erstellen Sie nun eine weitere Datei namens flask-circleci/test_main.py und kopieren/Einfügen Sie den folgenden Code.

Der untenstehende Code erstellt einen Testclient für Ihre Anwendung.

Pytest erfordert, dass der Name Ihrer Testdatei mit test_ beginnt, wie unten gezeigt.

from main import app

def test_main():
		# Erstellt einen Testclient für diese Anwendung.
    response = app.test_client().get('/') 

		# Überprüft den Statuscode der Seite ('/') auf 200.
    assert response.status_code == 200 
		# Überprüft die Rückgabeanweisung zur Seite.
    assert response.data == b'Welcome to my Flask App' 

5. Führen Sie die folgenden Befehle aus, um zu Ihrem Projektverzeichnis (flask-circleci) zu navigieren und den Test für Ihr Projekt auszuführen.

cd flask-circleci
pytest

Wenn der Test erfolgreich ist, erhalten Sie 100% Fortschritt, wie unten gezeigt.

Running Test for the Project

6. Erstellen Sie als nächstes eine Textdatei (requirements.txt), um Ihre Abhängigkeiten im Stammverzeichnis zu dokumentieren, und füllen Sie den untenstehenden Text aus. Diese Datei ist wichtig beim Erstellen Ihres Docker-Images, damit es ordnungsgemäß funktioniert.

Flask==2.0.3
pytest==6.2.5

7. Erstellen Sie zuletzt eine neue Datei (flask-circleci/Dockerfile) und schreiben Sie die Anweisungen unten in die Dockerfile, um Ihr Docker-Image zu erstellen.

Die Anweisungen in der Dockerfile führen folgendes aus:

  • Erstellen Sie eine Datei in Ihrem Image.
  • Kopieren Sie alle Dateien im aktuellen Verzeichnis (flask-circleci).
  • Führen Sie Ihren Code aus.
# Setzen Sie das Basisbild, auf dem Ihr Bild aufgebaut wird
FROM python:3.8 
# Erstellen Sie ein Verzeichnis namens flask-circleci im Stammverzeichnis.
# Dieses Verzeichnis wird den Code enthalten, der sich derzeit befindet
RUN mkdir /flask-circleci

# /flask-circleci zum Arbeitsverzeichnis machen
WORKDIR /flask-circleci

# Kopieren Sie Ihre Anforderungsdatei in das gerade erstellte Verzeichnis
COPY requirements.txt /flask-circleci 

RUN pip install -r requirements.txt

# Kopieren Sie das aktuelle Verzeichnis auf Ihrem lokalen Rechner nach /flask-circleci in Ihrem Bild
ADD . /flask-circleci

EXPOSE 5000

CMD python main.py

Erstellen einer CircleCI CI/CD-Pipeline

Jetzt haben Sie Ihr Docker-Image bereit, Sie werden eine CI/CD-Pipeline erstellen, um Ihren Code zu testen, und wenn alle Tests bestanden sind, wird das Docker-Image auf Docker Hub hochgeladen. Docker Hub ist ein Dienst ähnlich wie GitHub, jedoch für Docker-Images, der Ihnen dabei hilft, Container-Images mit Ihrem Team oder anderen Entwicklern zu finden und zu teilen.

Um die CI/CD-Pipeline zu erstellen, befolgen Sie die folgenden Schritte:

1. Öffnen Sie Ihren bevorzugten Webbrowser und melden Sie sich bei Ihrem Docker Hub-Konto an.

2. Klicken Sie auf der Startseite von Docker Hub auf die Option Repository erstellen, um ein Repository auf Docker Hub zu erstellen.

Creating a Repository

3. Legen Sie einen eindeutigen Namen für Ihr Repository fest. In diesem Tutorial wird ein Repository namens circleci-tutorial verwendet, wie unten gezeigt.

Naming and Creating the Docker Hub Repository

4. Erstellen Sie eine neue Datei (flask-circleci/config.yml) im Stammverzeichnis Ihres Projekts und kopieren Sie den unten stehenden Code in die Datei config.yml.

Der folgende Code verwendet ein fertiges Python-Image, um die Abhängigkeiten zu installieren und die Unittests auszuführen, um Ihr Docker-Image zu erstellen und in Ihr Repository Docker Hub hochzuladen.

Für ein Live-Projekt möchten Sie normalerweise Ihren Benutzernamen und Ihr Passwort innerhalb von CircleCI schützen oder vielleicht in einer .env-Datei speichern.

version: 2  # Version von CircleCI
jobs:
  build:
    docker:
      - image: python:3.8
    steps:
      - checkout

      - run:
        # erstellt eine virtuelle Umgebung für Ihr Projekt, 
				# installiert Abhängigkeiten darin und führt Tests aus
          name: Run unit tests
          command: |
            python3 -m venv venv
            . venv/bin/activate
            pip install -r requirements.txt
            pytest
			# Erstellt eine entfernte Docker-Umgebung, die für Docker-Befehle konfiguriert ist.
      - setup_remote_docker 
       
      - run:
        # installiert einen Docker-Client, der zum Ausführen der Docker-Befehle verwendet wird
          name: Install Docker client
          command: |
            set -x
            VER="17.03.0-ce"
            curl -L -o /tmp/docker-$VER.tgz https://get.docker.com/builds/Linux/x86_64/docker-$VER.tgz
            tar -xz -C /tmp -f /tmp/docker-$VER.tgz
            mv /tmp/docker/* /usr/bin
      - run:
         # Erstellt ein Docker-Image zum Hochladen auf Docker Hub
				 # Das Tag (-t) Muster lautet wie folgt, wobei CircleCI 
				 # das Dockerfile aus dem aktuellen Verzeichnis bezieht.
         # <docker_hub_username/docker-hub-password:version>.
          name: Build Docker image
          command: docker build -t khabdrick/circleci-tutorial:v1 .

      - run:
        # Lädt das von Ihnen erstellte Docker-Image auf Docker Hub hoch.
        # Ersetzen Sie khabdrick/circleci-tutorial:v1 durch den 
				# <docker_hub_username/docker-hub-password:version>, den Sie oben zum Erstellen des Images verwendet haben
          name: Push to Docker Hub
          command: |
            docker login -u username -p password
            docker push khabdrick/circleci-tutorial:v1

5. Führen Sie abschließend die folgenden Befehle im Stammverzeichnis Ihres Projekts aus, um den Code mit commit und push in Ihr GitHub-Repository hochzuladen (flask-circleci/config.yml).

git add . # Fügt Änderungen dem Staging-Bereich hinzu
git commit -m "update" # Committet Ihre Änderungen
git push # Push zu GitHub

Aktivieren der CircleCI CI/CD-Pipeline

Sie haben gerade Ihre CircleCI CI/CD-Pipeline erstellt, aber im Moment tut sie nicht viel. Sie müssen Ihre Pipeline aktivieren, indem Sie ein Projekt in Ihrem CircleCI-Konto einrichten.

1. Melden Sie sich mit Ihrem GitHub-Konto in Ihrem CircleCI-Konto in Ihrem Webbrowser an.

2. Klicken Sie anschließend auf die Registerkarte Projekte in der linken Seitenleiste und klicken Sie auf die Schaltfläche Projekt einrichten auf der rechten Seite Ihres Projekts, um die CircleCI-Pipeline für das Projekt zu aktivieren.

Da Sie sich bei CircleCI mit Ihrem GitHub-Konto angemeldet haben, werden Ihre Projekte mit CircleCI synchronisiert, wie im Bild unten dargestellt.

Setting up a Project

3. Navigieren Sie zurück zur Registerkarte Dashboard und Sie sehen den Status Erfolg. Der Status Erfolg zeigt an, dass alles wie erwartet ausgeführt wurde und das Bild in Ihr Docker Hub-Repository hochgeladen wurde.

Klicken Sie auf „Build“, um alle Schritte anzuzeigen, die in der Pipeline ausgeführt wurden.

Viewing Project Status

Unten sehen Sie die Liste der Schritte, die CircleCI ausgeführt hat, um die Pipeline auszuführen.

Viewing Steps that Ran the Pipeline

4. Wechseln Sie schließlich zu Ihrem Docker Hub-Repository zurück und Sie sehen das Bild, das Sie über die CircleCI-Pipeline auf Docker Hub hochgeladen haben.

Viewing Pushed circleci docker images in Docker Hub Repository

Änderungen in GitHub hochladen, um die CircleCI-Pipeline auszulösen.

1. Derzeit haben Sie bereits eine funktionierende CircleCI-Pipeline. Aber vielleicht haben Sie Änderungen an Ihrem Projekt vorgenommen. Wenn ja, wie würden Sie wissen, ob die Pipeline noch funktioniert? Sie können CircleCI auslösen, indem Sie Änderungen an Ihrem GitHub-Repository hochladen und sehen, ob der Test erfolgreich ist.

1. Ersetzen Sie auf Ihrem lokalen Computer den Code, den Sie in test_main.py haben, durch den untenstehenden Code. Der folgende Code stellt absichtlich sicher, dass der Test fehlschlägt, weil sich der Statuscode von 200 auf 400 geändert hat.

from main import app

def test_main():
		
# Erstellt einen Testclient für diese Anwendung.

    response = app.test_client().get('/') 

		
# Überprüfen Sie den Statuscode der Seite ('/') darauf, dass er 400 ist, wenn er es nicht ist,

		
# was dazu führt, dass der Test fehlschlägt.

    assert response.status_code == 400 
		
# Überprüfen Sie die Rückgabeanweisung auf der Seite

    assert response.data == b'Flask App' 

2. Ersetzen Sie als nächstes die Schritte in der config.yml, die das Docker-Image erstellen und es in Docker Hub hochladen, durch den untenstehenden Code.

Im folgenden Code ändern Sie nur die Version, um sicherzustellen, dass nur neue Änderungen in Ihr GitHub-Repository hochgeladen werden.

      - run:
          name: Build Docker image
          command: docker build -t khabdrick/circleci-tutorial:v2 .

      - run:
          name: Push to DockerHub
          command: |
            docker login -u username -p password
            docker push khabdrick/circleci-tutorial:v2

3. Führen Sie die folgenden Befehle im Stammverzeichnis Ihres Projekts aus, um den Code in Ihr GitHub-Repository zu übernehmen und zu hochladen.

git add . 
# Fügt Änderungen dem Staging-Bereich hinzu

git commit -m "v2" 
# Übernimmt Ihre Änderungen

git push 
# Auf GitHub hochladen

4. Navigieren Sie nun zu Ihrem CircleCI-Dashboard, und Sie werden feststellen, dass der Build fehlgeschlagen ist, wie unten gezeigt.

Klicken Sie auf „Build“, um die Schritte zu sehen, die unternommen wurden, um die Änderungen zu überprüfen, und bestätigen Sie, was den Build-Fehler verursacht hat.

Viewing Project Status (Failed)
Showing Failed Tests

5. Navigieren Sie schließlich zu Ihrem Docker Hub-Repository und bestätigen Sie, dass die Änderungen nicht übertragen wurden.

Wie Sie im Bild unten sehen können, wurde v2 nicht hochgeladen, weil der Test fehlgeschlagen ist.

Viewing Repository in Docker Hub

Schlussfolgerung

In diesem Tutorial haben Sie gelernt, wie Sie Tests schreiben und Ihre Python-Anwendung dockerisieren können. Sie haben eine CI/CD-Pipeline mit CircleCI erstellt, die den Test für Ihre Anwendung ausführt und Ihr Docker-Image in Docker Hub hochlädt.

Zu diesem Zeitpunkt haben Sie bereits ein grundlegendes Verständnis dafür, wie man eine CI/CD-Pipeline mit CircleCI entwickelt. Wie beabsichtigen Sie, dieses neu gewonnene Wissen zu nutzen? Vielleicht indem Sie eine CI/CD-Pipeline erstellen, die Ihr Docker-Image auf Heroku bereitstellt?

Source:
https://adamtheautomator.com/circleci-docker-images/