Wenn Sie nach einer Möglichkeit suchen, Ihre CircleCI-Docker-Images zu testen und bereitzustellen, kann die Erstellung einer CI/CD-Pipeline einen großen Beitrag zur Verbesserung der Softwarebereitstellung leisten.
In diesem Tutorial erfahren Sie, wie Sie mit CircleCI potenziell eine CI/CD-Pipeline für Ihr Docker-Image entwickeln können.
Lesen Sie weiter und stellen Sie Ihre Docker-Images nur bereit, wenn sie den Test bestehen!
Voraussetzungen
Dieses Tutorial wird eine praktische Demonstration sein. Wenn Sie mitmachen möchten, stellen Sie sicher, dass Sie Folgendes haben:
- Ein GitHub -Konto und GitHub-Repository das ist bereits eingerichtet.
- Ein CircleCI-Konto, das mit Ihrem GitHub-Konto verknüpft ist.
- Ein Docker-Hub-Konto.
- Docker installiert.
- Ein Linux-Rechner – Dieses Tutorial verwendet Ubuntu 20.04.3 LTS.
Erstellen eines Docker-Images einer Python-basierten Anwendung
Bevor Sie mit dem Erstellen einer CI/CD-Pipeline beginnen, erstellen Sie zunächst ein Docker-Image basierend auf einer Python-Anwendung, die Texte in einem Webbrowser anzeigt. Sie werden kurz durchgehen, wie die Anwendung erstellt wird, die Testfälle für die Anwendung schreiben und die Anwendung dann containerisieren.
1. Öffnen Sie Ihr Terminal und führen Sie den folgenden Befehl zum install
aus Kolben und Pytest. Flask ist ein Framework zum Erstellen von Webanwendungen in Python, während Pytest zum Schreiben von Test-Python-Code verwendet wird.
pip install flask pytest
2. Als nächstes erstellen Sie ein Projektverzeichnis mit Ihrem bevorzugten Namen, aber das Projektverzeichnis heißt flask-circleci
in dieser Demo. In diesem Verzeichnis speichern Sie Ihre Ressourcen für dieses Tutorial.
mkdir flask-circleci
3. Erstellen Sie eine Datei namens flask-circleci/main.py und füllen Sie den folgenden Code aus.
Der folgende Code zeigt den Text „Willkommen in meiner Flask-App“ auf einer Startseite in einem Browser an.
from flask import Flask
app = Flask(__name__) #create an instance of the Flask class you just imported
@app.route('/')
def main():
# display a string in the home page
return "Welcome to my Flask App"
4. Erstellen Sie nun eine weitere Datei namens flask-circleci/test_main.py und kopieren/fügen Sie den folgenden Code ein.
Der folgende 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():
# Creates a test client for this application.
response = app.test_client().get('/')
# assert the stutus code of the page('/') is 200
assert response.status_code == 200
# assert the return statement to the page
assert response.data == b'Welcome to my Flask App'
5. Führen Sie die folgenden Befehle aus, um zu Ihrem Projektverzeichnis zu navigieren (flask-circleci
), führen Sie den Test für Ihr Projekt aus.
cd flask-circleci
pytest
Wenn der Test erfolgreich ist, erhalten Sie 100 % Fortschritt, wie unten gezeigt.
6. Als nächstes erstellen Sie eine Textdatei (requirements.txt ), um Ihre Abhängigkeiten im Stammverzeichnis zu dokumentieren und den Text unten auszufüllen. Diese Datei ist wichtig, wenn Sie Ihr Docker-Image erstellen, damit es ordnungsgemäß funktioniert.
Flask==2.0.3
pytest==6.2.5
7. Zuletzt erstellen Sie eine neue Datei (flask-circleci/Dockerfile) , und schreiben Sie die nachstehenden Anweisungen in die Dockerfile um Ihr Docker-Image zu erstellen.
Die Anweisungen in der Dockerfile Führen Sie Folgendes aus:
- Erstellen Sie eine Datei in Ihrem Bild.
- Kopiert alle Dateien in die Dateien im aktuellen Verzeichnis (flask-circleci ).
- Führen Sie Ihren Code aus
# set the Base Image from which your image will be built on
FROM python:3.8
# create a directory called flask-circleci in root.
# This directory will contain the code which currently resides in
RUN mkdir /flask-circleci
# make /flask-circleci the working directory
WORKDIR /flask-circleci
# copy your requirements file to the directory you just created
COPY requirements.txt /flask-circleci
RUN pip install -r requirements.txt
# copy the current directory in you local machine to /flask-circleci in your image
ADD . /flask-circleci
EXPOSE 5000
CMD python main.py
Erstellen einer CircleCI CI/CD-Pipeline
Nachdem Sie Ihr Docker-Image fertig haben, erstellen Sie eine CI/CD-Pipeline, um Ihren Code zu testen, und wenn alle Tests das Docker-Image bestehen und an Docker Hub übertragen werden. Docker Hub ist ein Dienst wie GitHub, jedoch für Docker-Images, der Ihnen hilft, Container-Images zu finden und mit Ihrem Team oder anderen Entwicklern zu teilen.
Führen Sie die folgenden Schritte aus, um die CI/CD-Pipeline zu erstellen:
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 Repository erstellen Option zum Erstellen eines Repositorys auf Docker Hub.
3. Legen Sie einen eindeutigen Namen für Ihr Repository fest. Dieses Tutorial verwendet ein Repository namens circleci-tutorial , Wie nachfolgend dargestellt.
4. Erstellen Sie eine neue Datei (flask-circleci/config.yml) im Stammverzeichnis Ihres Projekts und kopieren Sie den folgenden Code und fügen Sie ihn in die config.yml ein Datei.
Der folgende Code ruft ein vorgefertigtes Python-Image ab und verwendet es, um die Abhängigkeiten zu installieren und die Komponententests auszuführen, um Ihr Docker-Image zu erstellen und in Ihr Repository Docker Hub zu übertragen.
Normalerweise möchten Sie für ein Live-Projekt Ihren Benutzernamen und Ihr Passwort geschützt in CircleCI oder vielleicht in einer .env-Datei speichern.
version: 2 # Version of CircleCI
jobs:
build:
docker:
- image: python:3.8
steps:
- checkout
- run:
# creates a virtual environment for you project,
# install dependencies in it and run tests
name: Run unit tests
command: |
python3 -m venv venv
. venv/bin/activate
pip install -r requirements.txt
pytest
# Creates a remote Docker environment configured to execute Docker commands.
- setup_remote_docker
- run:
# installs a docker client that will be used to run the docker commands
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:
# Builds a docker image to push to Docker Hub
# Tag (-t) pattern is below, where CircleCI
# to get the Dockerfile from the current directory.
# <docker_hub_username/docker-hub-password:version>.
name: Build Docker image
command: docker build -t khabdrick/circleci-tutorial:v1 .
- run:
# Pushes the Docker image you created to the Docker Hub.
# Replace khabdrick/circleci-tutorial:v1 with the
# <docker_hub_username/docker-hub-password:version> you used to build the image above
name: Push to Docker Hub
command: |
docker login -u unsername -p password
docker push khabdrick/circleci-tutorial:v1
5. Führen Sie abschließend die folgenden Befehle im Stammverzeichnis Ihres Projekts aus, um commit
auszuführen und push
den Code (flask-circleci/config.yml ) in Ihr GitHub-Repository.
git add . # adds changes to staging area
git commit -m "update" # commits your changes
git push # Push to GitHub
Aktivieren der CircleCI CI/CD-Pipeline
Sie haben gerade Ihre CircleCI CI/CD-Pipeline erstellt, aber im Moment sitzt sie nur da und tut 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 Webbrowser bei Ihrem CircleCI-Konto an.
2. Klicken Sie als Nächstes auf Projekte im linken Bereich und klicken Sie auf Projekt einrichten Schaltfläche auf der rechten Seite Ihres Projekts, um die CircleCI-Pipeline für das Projekt zu aktivieren.
Da Sie sich mit Ihrem GitHub-Konto bei CircleCI angemeldet haben, werden Ihre Projekte wie im Bild unten mit CircleCI synchronisiert.
3. Navigieren Sie zurück zum Dashboard und Sie sehen den Erfolg Status. Der Erfolg status zeigt an, dass alles wie erwartet gelaufen ist und das Image in Ihr Docker-Hub-Repository gepusht wurde.
Klicken Sie auf Build, um alle Schritte anzuzeigen, die in der Pipeline ausgeführt wurden.
Unten sehen Sie die Liste der Schritte, die CircleCI unternommen hat, um die Pipeline auszuführen.
4. Wechseln Sie schließlich zurück zu Ihrem Docker Hub-Repository, und Sie sehen das Image, das Sie über die CircleCI-Pipeline an Docker Hub gepusht haben.
Änderungen an GitHub übertragen, um die CircleCI-Pipeline auszulösen
Inzwischen haben Sie bereits eine funktionierende CircleCI-Pipeline. Aber vielleicht haben Sie Änderungen an Ihrem Projekt vorgenommen. Wenn ja, woher wissen Sie, dass die Pipeline noch funktioniert? Sie können CircleCI auslösen, indem Sie Änderungen an Ihr GitHub-Repository übertragen und sehen, ob der Test erfolgreich ist.
1. Ersetzen Sie auf Ihrem lokalen Rechner den Code in test_main.py mit dem Code unten. Der folgende Code stellt absichtlich sicher, dass der Test fehlschlägt, da sich der Statuscode von 200
geändert hat bis 400
.
from main import app
def test_main():
# Creates a test client for this application.
response = app.test_client().get('/')
# assert the status code of the page('/') is 400 when it isn't,
# causing the test to fail.
assert response.status_code == 400
# assert the return statement ton the page
assert response.data == b'Flask App'
2. Ersetzen Sie als Nächstes die steps
in der config.yml das das Docker-Image erstellt und es mit dem folgenden Code an Docker Hub überträgt.
Im folgenden Code ändern Sie nur die Version, um sicherzustellen, dass nur neue Änderungen in Ihr GitHub-Repository übertragen werden.
- run:
name: Build Docker image
command: docker build -t khabdrick/circleci-tutorial:v2 .
- run:
name: Push to DockerHub
command: |
docker login -u khabdrick -p Muhammed-1998
docker push khabdrick/circleci-tutorial:v2
3. Führen Sie die folgenden Befehle im Stammverzeichnis Ihres Projekts zum commit
aus und push
den Code in Ihr GitHub-Repository.
git add . # adds changes to staging area
git commit -m "v2" # commits your changes
git push # Push to GitHub
4. Navigieren Sie nun zu Ihrem CircleCI-Dashboard und Sie werden sehen, dass der Build Fehlgeschlagen ist , Wie nachfolgend dargestellt.
Klicken Sie auf Build, um die Schritte anzuzeigen, die zum Übertragen der Änderungen unternommen wurden, und bestätigen Sie, was dazu geführt hat, dass der Build fehlgeschlagen ist.
5. Navigieren Sie zuletzt 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, da der Test fehlgeschlagen ist.
Schlussfolgerung
In diesem Tutorial haben Sie gelernt, wie Sie Tests schreiben und Ihre Python-Anwendung dockerisieren. Sie haben mit CircleCI eine CI/CD-Pipeline erstellt, die den Test für Ihre Anwendung ausführt und Ihr Docker-Image an Docker Hub überträgt.
Zu diesem Zeitpunkt verfügen Sie bereits über grundlegende Kenntnisse in der Entwicklung einer CI/CD-Pipeline mit CircleCI. Wie beabsichtigen Sie nun, dieses neu gewonnene Wissen zu nutzen? Vielleicht eine CI/CD-Pipeline erstellen, die Ihr Docker-Image für Heroku bereitstellt?