Hoe maak je een CI/CD-pijplijn voor CircleCI Docker-images

Als je op zoek bent naar een manier om je CircleCI Docker-images te testen en implementeren, kan het opzetten van een CI/CD-pijplijn je aanzienlijk helpen bij het verbeteren van de softwarelevering.

In deze tutorial leer je hoe je potentieel een CI/CD-pijplijn kunt ontwikkelen voor je Docker-image met behulp van CircleCI.

Lees verder en implementeer je Docker-images alleen als ze de test doorstaan!

Vereisten

Deze tutorial zal een praktische demonstratie zijn. Zorg ervoor dat je de volgende zaken hebt als je wilt meedoen:

Het maken van een Docker-image van een op Python gebaseerde applicatie

Voordat je aan de slag gaat met het maken van een CI/CD-pijplijn, bouw je eerst een Docker-image op basis van een Python-applicatie die tekst weergeeft in een webbrowser. Je gaat kort door hoe de applicatie wordt gebouwd, schrijft de testgevallen voor de applicatie en containeriseert vervolgens de applicatie.

1. Open uw terminal en voer de volgende opdracht uit om Flask en Pytest te installeren. Flask is een framework dat wordt gebruikt om webapplicaties in Python te bouwen, terwijl Pytest wordt gebruikt om tests te schrijven voor Python-code.

pip install flask pytest

2. Maak vervolgens een projectdirectory met de door u gewenste naam, maar de projectdirectory wordt in deze demo flask-circleci genoemd. In deze directory slaat u uw bronnen op voor deze zelfstudie.

mkdir flask-circleci

3. Maak een bestand genaamd flask-circleci/main.py en voeg de volgende code toe.

De onderstaande code geeft de tekst “Welkom bij mijn Flask App” weer op een startpagina in een browser.

from flask import Flask

app = Flask(__name__) # maak een instantie van de zojuist geïmporteerde Flask-klasse

@app.route('/')
def main():
    # geef een string weer op de startpagina
    return "Welcome to my Flask App"

4. Maak nu een ander bestand genaamd flask-circleci/test_main.py en kopieer/plak de volgende code.

De onderstaande code maakt een testclient voor uw toepassing.

Pytest vereist dat de naam van uw testbestand begint met test_, zoals hieronder gedemonstreerd.

from main import app

def test_main():
		# Creëert een testclient voor deze toepassing.
    response = app.test_client().get('/') 

		# controleer of de statuscode van de pagina('/') 200 is
    assert response.status_code == 200 
		# controleer de return statement naar de pagina
    assert response.data == b'Welcome to my Flask App' 

5. Voer de volgende commando’s uit om naar uw projectdirectory te navigeren (flask-circleci), voer de test voor uw project uit.

cd flask-circleci
pytest

Als de test slaagt, krijgt u 100% voortgang, zoals hieronder weergegeven.

Running Test for the Project

6. Maak vervolgens een tekstbestand (requirements.txt) aan om uw afhankelijkheden in de hoofdmap te documenteren en vul de onderstaande tekst in. Dit bestand is essentieel bij het bouwen van uw Docker-image, zodat het correct werkt.

Flask==2.0.3
pytest==6.2.5

7. Maak tot slot een nieuw bestand (flask-circleci/Dockerfile) aan en schrijf de onderstaande instructies naar het Dockerfile om uw Docker-image te bouwen.

De instructies in het Dockerfile voeren het volgende uit:

  • Maak een bestand aan in uw image.
  • Kopieert alle bestanden in de huidige directory (flask-circleci).
  • Voer uw code uit.
# stel de basisafbeelding in waarop je afbeelding zal worden gebouwd
FROM python:3.8 
# maak een map genaamd flask-circleci in de hoofdmap.
# Deze map bevat de code die momenteel in de
RUN mkdir /flask-circleci

# maak /flask-circleci de werkmap
WORKDIR /flask-circleci

# kopieer uw vereistenbestand naar de zojuist gemaakte map
COPY requirements.txt /flask-circleci 

RUN pip install -r requirements.txt

# kopieer de huidige map op uw lokale machine naar /flask-circleci in uw afbeelding
ADD . /flask-circleci

EXPOSE 5000

CMD python main.py

Creëren van een CircleCI CI/CD-pijplijn

Nu heb je je Docker-afbeelding klaar, je zult een CI/CD-pijplijn creëren om je code te testen, en als alle tests slagen, wordt de Docker-afbeelding naar Docker Hub gepusht. Docker Hub is een dienst zoals GitHub, maar voor Docker-afbeeldingen, die je helpt containerafbeeldingen te vinden en te delen met je team of andere ontwikkelaars.

Om de CI/CD-pijplijn te maken, volg je de onderstaande stappen:

1. Open je favoriete webbrowser en log in op je Docker Hub-account.

2. Op de startpagina van Docker Hub klik je op de optie Repository maken om een repository op Docker Hub te maken.

Creating a Repository

3. Stel een unieke naam in voor je repository. Deze tutorial maakt gebruik van een repository genaamd circleci-tutorial, zoals hieronder wordt weergegeven.

Naming and Creating the Docker Hub Repository

4. Maak een nieuw bestand (flask-circleci/config.yml) aan in de hoofdmap van je project, en kopieer/plak de onderstaande code naar het bestand config.yml.

De onderstaande code haalt een kant-en-klare Python-image op en gebruikt het om de afhankelijkheden te installeren en de unit tests uit te voeren om je Docker-image te bouwen en naar je repository Docker Hub te pushen.

Voor een live project wil je normaal gesproken je gebruikersnaam en wachtwoord beveiligd binnen CircleCI plaatsen of misschien in een .env-bestand.

version: 2  # Versie van CircleCI
jobs:
  build:
    docker:
      - image: python:3.8
    steps:
      - checkout

      - run:
        # creëert een virtuele omgeving voor je project, 
				# installeert afhankelijkheden erin en voert tests uit
          name: Run unit tests
          command: |
            python3 -m venv venv
            . venv/bin/activate
            pip install -r requirements.txt
            pytest
			# Maakt een externe Docker-omgeving aan geconfigureerd om Docker-opdrachten uit te voeren.
      - setup_remote_docker 
       
      - run:
        # installeert een Docker-client die wordt gebruikt om de Docker-opdrachten uit te voeren
          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:
         # Bouwt een Docker-image om naar Docker Hub te pushen
				 # Tag (-t) patroon is hieronder, waarbij CircleCI 
				 # om het Docker-bestand uit de huidige directory te halen.
         # <docker_hub_gebruikersnaam/docker-hub-wachtwoord:versie>.
          name: Build Docker image
          command: docker build -t khabdrick/circleci-tutorial:v1 .

      - run:
        # Duwt de Docker-image die je hebt gemaakt naar Docker Hub.
        # Vervang khabdrick/circleci-tutorial:v1 door de 
				# <docker_hub_gebruikersnaam/docker-hub-wachtwoord:versie> die je hebt gebruikt om de bovenstaande image te bouwen
          name: Push to Docker Hub
          command: |
            docker login -u username -p password
            docker push khabdrick/circleci-tutorial:v1

5. Voer tot slot de volgende opdrachten uit in de hoofdmap van je project om de code (flask-circleci/config.yml) naar je GitHub-repository te commit en pushen.

git add . # voegt wijzigingen toe aan de staging area
git commit -m "update" # commit uw wijzigingen
git push # Push naar GitHub

Activating the CircleCI CI/CD Pipeline

Je hebt zojuist je CircleCI CI/CD-pijplijn gemaakt, maar op dit moment staat deze gewoon stil en doet niet veel. Je moet je pijplijn activeren door een project in te stellen in je CircleCI-account.

1. Log in op je CircleCI-account met je GitHub-account op je webbrowser.

2. Klik vervolgens op het tabblad Projecten aan de linkerkant en klik op de knop Project instellen aan de rechterkant van je project om de CircleCI-pijplijn voor het project te activeren.

Omdat je hebt ingelogd op CircleCI met je GitHub-account, synchroniseren je projecten met CircleCI, zoals te zien is in de onderstaande afbeelding.

Setting up a Project

3. Ga terug naar het tabblad Dashboard en je ziet de status Succes. De status Succes geeft aan dat alles zoals verwacht is verlopen en de afbeelding is naar je Docker Hub-repository gepusht.

Klik op build om alle stappen te zien die zijn uitgevoerd in de pijplijn.

Viewing Project Status

Hieronder zie je de lijst met stappen die CircleCI heeft genomen om de pijplijn uit te voeren.

Viewing Steps that Ran the Pipeline

4. Schakel ten slotte terug naar je Docker Hub-repository, en je ziet de afbeelding die je via de CircleCI-pijplijn naar Docker Hub hebt gepusht.

Viewing Pushed circleci docker images in Docker Hub Repository

Wijzigingen pushen naar GitHub om de CircleCI-pijplijn te activeren

By now heb je al een werkende CircleCI-pijplijn. Maar misschien heb je wijzigingen aangebracht aan je project. Zo ja, hoe weet je dan of de pijplijn nog steeds werkt? Je kunt CircleCI activeren door wijzigingen naar je GitHub-repository te pushen en zien of de test slaagt.

1. Vervang op je lokale machine de code die je hebt in test_main.py met de onderstaande code. De onderstaande code zorgt er opzettelijk voor dat de test mislukt omdat de statuscode is gewijzigd van 200 naar 400.

from main import app

def test_main():
		# Maakt een testclient voor deze toepassing.
    response = app.test_client().get('/') 

		# Verifieer dat de statuscode van de pagina('/') 400 is wanneer dat niet het geval is, 
		# waardoor de test mislukt.
    assert response.status_code == 400 
		# Verifieer de return statement op de pagina
    assert response.data == b'Flask App' 

2. Vervang vervolgens de steps in het config.yml die de Docker-image bouwt en deze naar Docker Hub pusht met de onderstaande code.

In de onderstaande code verander je alleen de versie om ervoor te zorgen dat alleen nieuwe wijzigingen naar je GitHub-repository worden gepusht.

      - 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. Voer de volgende commando’s uit op de hoofdmap van je project om de code naar je GitHub-repository te commit en push.

git add . # Voegt wijzigingen toe aan het stagingsgebied
git commit -m "v2" # Commit je wijzigingen
git push # Push naar GitHub

4. Ga nu naar je CircleCI-dashboard, en je zult zien dat de build Failed is, zoals hieronder getoond.

Klik op bouwen om de stappen te zien die zijn genomen om de wijzigingen door te voeren en bevestig wat de oorzaak was van het mislukken van de bouw.

Viewing Project Status (Failed)
Showing Failed Tests

5. Navigeer ten slotte naar uw Docker Hub-repository en bevestig dat de wijzigingen niet zijn doorgevoerd.

Zoals u kunt zien in de onderstaande afbeelding, werd v2 niet geüpload omdat de test is mislukt.

Viewing Repository in Docker Hub

Conclusie

Gedurende deze tutorial hebt u geleerd hoe u tests kunt schrijven en uw Python-toepassing kunt dockeriseren. U hebt een CI/CD-pijplijn gemaakt met CircleCI die de test voor uw toepassing uitvoert en uw Docker-image naar Docker Hub pusht.

Op dit punt hebt u al een fundamentele kennis van het ontwikkelen van een CI/CD-pijplijn met CircleCI. Hoe van plan bent u deze nieuwe kennis te gebruiken? Misschien door een CI/CD-pijplijn te maken die uw Docker-image implementeert naar Heroku?

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