Si está buscando una manera de probar e implementar sus imágenes de Docker de CircleCI, la creación de una canalización de CI/CD puede ayudarlo mucho a mejorar la entrega de software.
En este tutorial, aprenderá cómo puede desarrollar potencialmente una canalización de CI/CD para su imagen de Docker usando CircleCI.
Siga leyendo e implemente sus imágenes de Docker, ¡solo si pasan la prueba!
Requisitos
Este tutorial será una demostración práctica. Si desea seguirnos, asegúrese de tener lo siguiente:
- Un GitHub cuenta y repositorio de GitHub eso ya está configurado.
- Una cuenta de CircleCI vinculada a su cuenta de GitHub.
- Una cuenta de Docker Hub.
- Docker instalado.
- Una máquina Linux:este tutorial usa Ubuntu 20.04.3 LTS.
Creación de una imagen Docker de una aplicación basada en Python
Antes de saltar a la creación de una canalización de CI/CD, primero creará una imagen de Docker basada en una aplicación de Python que muestra textos en un navegador web. Explicará brevemente cómo se crea la aplicación, escribirá los casos de prueba para la aplicación y luego la colocará en un contenedor.
1. Abra su terminal y ejecute el siguiente comando para install
Matraz y Pytest. Flask es un marco utilizado para crear aplicaciones web en Python, mientras que Pytest se utiliza para escribir pruebas de código Python.
pip install flask pytest
2. A continuación, cree un directorio del proyecto con su nombre preferido, pero el directorio del proyecto se llama flask-circleci
en esta demostración. Este directorio es donde almacenará sus recursos para este tutorial.
mkdir flask-circleci
3. Cree un archivo llamado flask-circleci/main.py y llene el siguiente código.
El siguiente código muestra el texto "Bienvenido a mi aplicación Flask" en una página de inicio en un navegador.
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. Ahora, crea otro archivo llamado flask-circleci/test_main.py y copia/pega el siguiente código.
El siguiente código crea un cliente de prueba para su aplicación.
Pytest requiere que el nombre de su archivo de prueba comience con test_ como se muestra a continuación.
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. Ejecute los siguientes comandos para navegar al directorio de su proyecto (flask-circleci
), ejecute la prueba para su proyecto.
cd flask-circleci
pytest
Si la prueba tiene éxito, obtendrá un 100 % de progreso, como se muestra a continuación.
6. A continuación, cree un archivo de texto (requirements.txt ) para documentar sus dependencias en el directorio raíz y completar el texto a continuación. Este archivo es esencial al construir su imagen de Docker para que funcione correctamente.
Flask==2.0.3
pytest==6.2.5
7. Por último, cree un nuevo archivo (flask-circleci/Dockerfile) y escriba las instrucciones a continuación en el Dockerfile para construir su imagen de Docker.
Las instrucciones en el Dockerfile realice lo siguiente:
- Cree un archivo en su imagen.
- Copia todos los archivos en los archivos del directorio actual (flask-circleci ).
- Ejecute su código
# 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
Creación de una canalización CI/CD de CircleCI
Ahora que tiene lista su imagen de Docker, creará una canalización de CI/CD para probar su código, y si todas las pruebas pasan la imagen de Docker y se envían a Docker Hub. Docker Hub es un servicio como GitHub, pero para imágenes de Docker, que lo ayuda a encontrar y compartir imágenes de contenedores con su equipo u otros desarrolladores.
Para crear la canalización de CI/CD, siga los pasos a continuación:
1. Abra su navegador web favorito e inicie sesión en su cuenta de Docker Hub.
2. En la página de inicio de Docker Hub, haga clic en Crear repositorio opción para crear un repositorio en Docker Hub.
3. Establezca un nombre único para su repositorio. Este tutorial utiliza un repositorio llamado circleci-tutorial , Como se muestra abajo.
4. Cree un nuevo archivo (flask-circleci/config.yml) en la raíz de su proyecto, y copie/pegue el siguiente código en config.yml expediente.
El siguiente código obtiene una imagen de Python lista para usar y la usa para instalar las dependencias y ejecutar las pruebas unitarias para compilar y enviar su imagen de Docker a su repositorio Docker Hub.
Normalmente, para un proyecto en vivo, querrá poner su nombre de usuario y contraseña protegidos dentro de CircleCI o tal vez en un archivo .env.
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. Finalmente, ejecute los siguientes comandos en la raíz de su proyecto para commit
y push
el código (flask-circleci/config.yml ) a su repositorio de GitHub.
git add . # adds changes to staging area
git commit -m "update" # commits your changes
git push # Push to GitHub
Activación de la canalización CI/CD de CircleCI
Acaba de crear su Pipeline de CI/CD de CircleCI, pero en este momento, está sentado allí y no está haciendo mucho. Tendrá que activar su embudo configurando un proyecto en su cuenta de CircleCI.
1. Inicie sesión en su cuenta de CircleCI con su cuenta de GitHub en su navegador web.
2. A continuación, haga clic en Proyectos en el panel izquierdo y haz clic en Configurar proyecto en el lado derecho de su proyecto para activar la canalización de CircleCI en el proyecto.
Desde que inició sesión en CircleCI con su cuenta de GitHub, sus proyectos se sincronizan con CircleCI, como en la imagen a continuación.
3. Vuelve al Panel de control. y verás el mensaje Success estado. El éxito el estado indica que todo se ejecutó como se esperaba y que la imagen se envió a su repositorio de Docker Hub.
Haga clic en construir para ver todos los pasos que se ejecutaron en la canalización.
A continuación, puede ver la lista de pasos que tomó CircleCI para ejecutar la canalización.
4. Finalmente, vuelva a su repositorio de Docker Hub y verá la imagen que envió a Docker Hub a través de la canalización de CircleCI.
Enviar cambios a GitHub para activar la canalización de CircleCI
A estas alturas, ya tiene una canalización de CircleCI en funcionamiento. Pero tal vez hiciste cambios en tu proyecto. Si es así, ¿cómo sabría que la tubería aún funciona? Puede activar CircleCI enviando cambios a su repositorio de GitHub y ver si la prueba tiene éxito.
1. En su máquina local, reemplace el código que tiene en test_main.py con el código de abajo. El siguiente código asegura deliberadamente que la prueba falle porque el código de estado cambió de 200
a 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. A continuación, reemplace los steps
en el config.yml que crea la imagen de Docker y la envía a Docker Hub con el siguiente código.
En el código a continuación, solo está cambiando la versión para asegurarse de que solo los cambios nuevos se envíen a su repositorio de GitHub.
- 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. Ejecute los siguientes comandos en la raíz de su proyecto para commit
y push
el código a su repositorio de GitHub.
git add . # adds changes to staging area
git commit -m "v2" # commits your changes
git push # Push to GitHub
4. Ahora, vaya a su panel de control de CircleCI y verá que la compilación Error , Como se muestra abajo.
Haga clic en construir para ver los pasos tomados para impulsar los cambios y confirmar qué causó que la construcción fallara.
5. Por último, navegue a su repositorio de Docker Hub y confirme que los cambios no se enviaron.
Como puede ver en la imagen a continuación, la versión 2 no se cargó porque la prueba falló.
Conclusión
A lo largo de este tutorial, ha aprendido a escribir pruebas y Dockerize su aplicación de Python. Ha creado una canalización de CI/CD con CircleCI que ejecuta la prueba para su aplicación y envía su imagen de Docker a Docker Hub.
En este punto, ya tiene un conocimiento básico sobre el desarrollo de una canalización de CI/CD con CircleCI. Ahora, ¿cómo pretende utilizar este nuevo conocimiento? ¿Quizás crear una canalización de CI/CD que implemente su imagen de Docker en Heroku?