Как создать конвейер CI/CD для образов Docker в CircleCI

Если вы ищете способ тестировать и развертывать ваши образы Docker в CircleCI, создание конвейера CI/CD может значительно улучшить доставку программного обеспечения.

В этом руководстве вы узнаете, как потенциально разработать конвейер CI/CD для вашего образа Docker, используя CircleCI.

Продолжайте чтение и развертывайте свои образы Docker только в том случае, если они проходят тестирование!

Предварительные требования

Этот учебник будет практическим демонстрационным. Если вы хотите следовать за нами, убедитесь, что у вас есть следующее:

Создание образа Docker приложения на основе Python

Прежде чем приступить к созданию конвейера CI/CD, вы сначала создадите образ Docker на основе Python приложения, которое отображает тексты в веб-браузере. Вы кратко пройдете через то, как создается приложение, напишете тестовые случаи для приложения, а затем контейниризуете его.

1. Откройте ваш терминал и выполните следующую команду для установки Flask и Pytest. Flask – это фреймворк, используемый для создания веб-приложений на Python, а Pytest используется для написания тестового кода на Python.

pip install flask pytest

2. Затем создайте каталог проекта с выбранным вами именем, но в этом демонстрационном проекте каталог проекта называется flask-circleci. Этот каталог предназначен для хранения ресурсов, необходимых для этого урока.

mkdir flask-circleci

3. Создайте файл с именем flask-circleci/main.py и заполните следующий код.

Приведенный ниже код отображает текст “Добро пожаловать в мое Flask-приложение” на домашней странице в браузере.

from flask import Flask

app = Flask(__name__) # создаем экземпляр класса Flask, который вы только что импортировали

@app.route('/')
def main():
    # отображаем строку на домашней странице
    return "Welcome to my Flask App"

4. Теперь создайте еще один файл с именем flask-circleci/test_main.py и скопируйте/вставьте следующий код.

Приведенный ниже код создает тестовый клиент для вашего приложения.

Pytest требует, чтобы имя вашего тестового файла начиналось с test_, как показано ниже.

from main import app

def test_main():
		# Создает тестовый клиент для этого приложения.
    response = app.test_client().get('/') 

		# утверждает, что код страницы ('/') равен 200
    assert response.status_code == 200 
		# утверждает возврат к странице
    assert response.data == b'Welcome to my Flask App' 

5. Выполните следующие команды, чтобы перейти в каталог вашего проекта (flask-circleci), выполните тест для вашего проекта.

cd flask-circleci
pytest

Если тест успешен, вы получите 100% прогресса, как показано ниже.

Running Test for the Project

6. Затем создайте текстовый файл (requirements.txt) для документации ваших зависимостей в корневом каталоге и заполните текст ниже. Этот файл необходим при построении вашего образа Docker, чтобы он работал правильно.

Flask==2.0.3
pytest==6.2.5

7. Наконец, создайте новый файл (flask-circleci/Dockerfile), и напишите инструкции ниже в Dockerfile, чтобы построить ваш образ Docker.

Инструкции в Dockerfile выполняют следующее:

  • Создайте файл в вашем образе.
  • Копирует все файлы в текущем каталоге (flask-circleci).
  • Запустите ваш код
# установите базовый образ, на основе которого будет создаваться ваш образ
FROM python:3.8 
# создайте каталог с именем flask-circleci в корневом каталоге.
# Этот каталог будет содержать код, который в настоящее время находится в
RUN mkdir /flask-circleci

# сделайте /flask-circleci рабочим каталогом
WORKDIR /flask-circleci

# скопируйте свой файл с требованиями в только что созданный каталог
COPY requirements.txt /flask-circleci 

RUN pip install -r requirements.txt

# скопируйте текущий каталог на вашем локальном компьютере в /flask-circleci на вашем образе
ADD . /flask-circleci

EXPOSE 5000

CMD python main.py

Создание конвейера CI/CD CircleCI

Теперь у вас есть готовый образ Docker, вы создадите конвейер CI/CD для тестирования вашего кода, и если все тесты пройдут успешно, образ Docker будет отправлен на Docker Hub. Docker Hub – это сервис, подобный GitHub, но для образов Docker, который помогает вам находить и обмениваться контейнерными образами со своей командой или другими разработчиками.

Для создания конвейера CI/CD выполните следующие шаги:

1. Откройте ваш любимый веб-браузер и войдите в свой аккаунт Docker Hub.

2. На домашней странице Docker Hub нажмите на опцию Создать репозиторий для создания репозитория на Docker Hub.

Creating a Repository

3. Установите уникальное имя для вашего репозитория. В этом руководстве используется репозиторий под названием circleci-tutorial, как показано ниже.

Naming and Creating the Docker Hub Repository

4. Создайте новый файл (flask-circleci/config.yml) в корне вашего проекта и скопируйте/вставьте код ниже в файл config.yml.

Нижеприведенный код получает готовый образ Python и использует его для установки зависимостей и запуска модульных тестов для сборки и отправки вашего Docker-образа в ваш репозиторий Docker Hub.

Обычно, для живого проекта вы захотите поместить свое имя пользователя и пароль, защищенные в CircleCI, или, возможно, в файл .env.

version: 2  # Версия CircleCI
jobs:
  build:
    docker:
      - image: python:3.8
    steps:
      - checkout

      - run:
        # создает виртуальное окружение для вашего проекта,
				# устанавливает зависимости в нем и запускает тесты
          name: Run unit tests
          command: |
            python3 -m venv venv
            . venv/bin/activate
            pip install -r requirements.txt
            pytest
			# Создает удаленное Docker-окружение, настроенное для выполнения команд Docker.
      - setup_remote_docker 
       
      - run:
        # устанавливает клиент Docker, который будет использоваться для выполнения команд Docker
          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:
         # Создает образ Docker для загрузки на Docker Hub
				 # Тег (-t) имеет следующий шаблон, где CircleCI 
				 # получает Dockerfile из текущего каталога.
         # <docker_hub_username/docker-hub-password:version>.
          name: Build Docker image
          command: docker build -t khabdrick/circleci-tutorial:v1 .

      - run:
        # Загружает созданный вами образ Docker на Docker Hub.
        # Замените khabdrick/circleci-tutorial:v1 на 
				# <docker_hub_username/docker-hub-password:version>, которые вы использовали для создания образа выше
          name: Push to Docker Hub
          command: |
            docker login -u username -p password
            docker push khabdrick/circleci-tutorial:v1

5. Наконец, выполните следующие команды в корне вашего проекта, чтобы зафиксировать и отправить код (flask-circleci/config.yml) в ваш репозиторий GitHub.

git add . # добавляет изменения в область подготовленных файлов
git commit -m "update" # фиксирует ваши изменения
git push # Отправка в GitHub

Активация CircleCI CI/CD Pipeline

Вы только что создали свой конвейер CircleCI CI/CD, но в данный момент он просто простаивает и ничего не делает. Вам нужно активировать свой конвейер, настроив проект в вашей учетной записи CircleCI.

1. Войдите в свою учетную запись CircleCI с помощью вашей учетной записи GitHub в вашем веб-браузере.

2. Затем нажмите вкладку Проекты в левой панели и нажмите кнопку Настроить проект справа от вашего проекта, чтобы активировать конвейер CircleCI в проекте.

Поскольку вы вошли в CircleCI с помощью вашей учетной записи GitHub, ваши проекты синхронизируются с CircleCI, как на изображении ниже.

Setting up a Project

3. Вернитесь на вкладку Панель управления и вы увидите статус Успешно. Статус Успешно указывает на то, что все прошло ожидаемо, и образ был отправлен в ваш репозиторий Docker Hub.

Щелкните сборку, чтобы увидеть все шаги, выполненные в конвейере.

Viewing Project Status

Ниже вы можете увидеть список шагов, которые CircleCI выполнил для запуска конвейера.

Viewing Steps that Ran the Pipeline

4. Наконец, переключитесь обратно в ваш репозиторий Docker Hub, и вы увидите изображение, которое вы загрузили в Docker Hub через конвейер CircleCI.

Viewing Pushed circleci docker images in Docker Hub Repository

Отправка изменений в GitHub для запуска конвейера CircleCI

До этого момента у вас уже есть работающий конвейер CircleCI. Но возможно, вы внесли изменения в свой проект. Если это так, как вы узнаете, что конвейер все еще работает? Вы можете запустить CircleCI, отправив изменения в свой репозиторий GitHub, и посмотреть, пройдет ли тест.

1. На вашем локальном компьютере замените код в файле test_main.py на следующий код. Этот код специально обеспечивает сбой теста, потому что код состояния изменился с 200 на 400.

from main import app

def test_main():
		# Создает тестового клиента для этого приложения.
    response = app.test_client().get('/') 

		# утверждает, что код состояния страницы('/') равен 400, когда это не так,
		# вызывая сбой теста.
    assert response.status_code == 400 
		# утверждает возвращаемое значение на странице
    assert response.data == b'Flask App' 

2. Затем замените steps в файле config.yml, который создает образ Docker и отправляет его в Docker Hub, следующим кодом.

В этом коде вы просто изменяете версию, чтобы убедиться, что в ваш репозиторий GitHub отправляются только новые изменения.

      - 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. Выполните следующие команды в корневом каталоге вашего проекта, чтобы commit и push кода в ваш репозиторий GitHub.

git add . # добавляет изменения в область подготовки
git commit -m "v2" # фиксирует ваши изменения
git push # Пуш в GitHub

4. Теперь перейдите на вашу панель управления CircleCI, и вы увидите, что сборка Failed, как показано ниже.

Щелкните на сборку, чтобы увидеть шаги, выполненные для отправки изменений, и подтвердите, что вызвало сбой сборки.

Viewing Project Status (Failed)
Showing Failed Tests

В конечном итоге перейдите в свой репозиторий Docker Hub и убедитесь, что изменения не были отправлены.

Как видно на изображении ниже, v2 не был загружен, потому что тест не прошел.

Viewing Repository in Docker Hub

Заключение

В течение этого руководства вы узнали, как писать тесты и создавать Docker-образ для вашего приложения на Python. Вы создали конвейер CI/CD с помощью CircleCI, который выполняет тест для вашего приложения и загружает ваш Docker-образ на Docker Hub.

На данный момент у вас уже есть базовые знания разработки конвейера CI/CD с помощью CircleCI. Теперь, как вы намереваетесь использовать эти новые знания? Возможно, создать конвейер CI/CD, который разворачивает ваш Docker-образ на Heroku?

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