Авторизоваться
Аким Солянкин 30.11.2021 Опубликована

Как выполнить CI / CD в BitBucket Pipeline 

Непрерывная интеграция и непрерывная доставка/Непрерывное развертывание, так называемые CI/CD, требуют автоматизированного конвейера. Всякий раз, когда какой-либо новый код помещается в хранилище, конвейер запускается и начинает модульное тестирование кода, создание образа и отправку образа в реестр контейнеров. Это огромная экономия времени и обязательное условие для современной разработки программного обеспечения.е

Рисунок 1. Сравнение традиционной интеграции / доставки и CI / CD.И
Рисунок 1. Сравнение традиционной интеграции / доставки и CI / CD.И

И GitHub, и BitBucket предоставляют нам CI / CD. Но когда я попробовал это на BitBucket, я споткнулся в течение часа, прежде чем мне это удалось. И меня удивляет, что в Интернете не было ни одного полного описания. Поэтому я описываю здесь шаги для тех, кто хочет плавной работы.

Для выполнения этого руководства вам понадобится одна учетная запись в BitBucket и одна в Docker Hub. Бесплатные аккаунты подойдут. Код этого проекта размещен в BitBucket.

1. Создайте простой проект Python для разработки через тестирование.

Сначала создайте репозиторий BitBucket. Затем нам понадобится проект Python на основе тестовой разработки (TDD) в качестве нашей базы кода. Создайте, зафиксируйте и отправьте эти четыре файла в репозиторий:: test_app.pyapp.pyrequirement.txt и Dockerfile. Их содержание следующее:

Script 1. test_app.py
import unittest
import app
import numpy as np

class TestApp(unittest.TestCase):

    def test_numeric_add_one(self):
        array = np.array([1, 2, 3])
        answer = np.array([2, 3, 4])
        np.testing.assert_array_equal(app.add_one(array), answer)

    def test_nan_add_one(self):
        array = np.array([np.nan, 2, 3])
        answer = np.array([np.nan, 3, 4])
        np.testing.assert_array_equal(app.add_one(array), answer)

if __name__ == '__main__':
    unittest.main()
Script 2. app.py.
import numpy as np

def add_one(x):
    return x + 1

if __name__ == '__main__':
    print (add_one(np.array([20, 23, 50])))
Script 3. requirements.txt
numpy==1.21.0
Script 4. Dockerfile
# syntax=docker/dockerfile:1

FROM python:3.8-slim-buster

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt

COPY . .

CMD [ "python3", "app.py"]

 test_app.py это наш файл модульного теста. Он может апостериорно проверить, может ли готовый основной код возвращать правильные ответы в различных тестовых случаях. Мы также можем взглянуть на это под другим углом: тестовые примеры - это априорные цели, которые мы хотим выполнить один за другим с помощью нашего основного кода. С этой точки зрения мы должны сначала написать test_app.py прежде чем писать код app.py. И разработка кода становится практикой стрельбы по мишеням. Это и есть суть TDD.

Нам лучше протестировать наш код локально, прежде чем мы зафиксируем и отправим код в BitBucket. Но можно включить автоматический модульный тест на BitBucket, чтобы в репозиторий принимались только действительные модификации. И это также то, что мы собираемся настроить на следующем этапе.

2. Настройте конвейер BitBucket.

Теперь мы можем настроить BitBucket. Создайте репозиторий в своем BitBucket. В новой консоли репозитория щелкните Pipeline и  View more в Or choose a template to build and deploy to a cloud service of your choice. Выберите Publish a docker image:

Рисунок 2. Выберите параметры публикации докеров.Изображение автора.
Рисунок 2. Выберите параметры публикации докеров.Изображение автора.

BitBucket создаст для вас предварительно заполненный файл bitbucket-pipelines.yml. Однако нам нужно добавить step в его ветвь master, чтобы обеспечить выполнение модульного теста. Кроме того, вы также можете внести некоторые изменения в некоторые имена. branches в моем bitbucket-pipelines.yml выглядит так:

Рисунок 3. Выдержка из моего файла bitbucket-pipelines.yml.Изображение автора.
Рисунок 3. Выдержка из моего файла bitbucket-pipelines.yml.Изображение автора.

Здесь возникает ловушка. Документация внутри предварительно заполненных bitbucket-pipelines.yml указано, что нам нужны только две переменные развертывания: DOCKERHUB_USERNAME и DOCKERHUB_PASSWORD. Это не совсем точно, потому что доставка завершится неудачно без переменной DOCKER HUB_NAMESPACE. Кроме того, неправильное значение DOCKERHUB_NAMESPACE приведет к ошибке “denied: requested access to the resource is denied” во время отправки. Для меня DOCKERHUB_NAMESPACE также является моим именем пользователя Docker Hub, поэтому оно имеет то же значение, что и DOCKERHUB_USERNAME. Чтобы задать эти переменные, добавьте три пары "ключ-значение" на панели "Add variables". Ключами являются DOCKERHUB_NAMESPACE, DOCKERHUB_USERNAME и DOCKER HUB_PASSWORD соответственно. Убедитесь, что при вводе учетных данных установлен флажок Secured.

Рисунок 4. Добавьте три переменные в конвейер.Изображение автора.
Рисунок 4. Добавьте три переменные в конвейер.Изображение автора.

Как только вы нажмете кнопку Commit file, BitBucket немедленно начнет первый запуск. Если все работает нормально, вы должны увидеть зеленые галочки рядом с нашими тремя шагами на панели Pipeline:

Рисунок 5. Первый запуск CI / CD в репозитории.Изображение автора.
Рисунок 5. Первый запуск CI / CD в репозитории.Изображение автора.

Перейдите в свой Docker Hub. Bitbucket создаст для вас репозиторий изображений, если он не существует, а затем поместит новое изображение внутрь (рисунок 5. По номеру моей версии вы можете видеть, что я провел несколько экспериментов 😉).

Рисунок 6. Успешная доставка образа в Docker Hub.Изображение автора.
Рисунок 6. Успешная доставка образа в Docker Hub.Изображение автора.

Вы также можете развернуть образ на своем локальном компьютере.

Рисунок 7. Успешное развертывание образа на моем локальном компьютере.Изображение автора.
(base) dgg32@x86_64-apple-darwin13 cd-python-demo % docker run dgg32/cd-python-demo:preprod-0.1.20
Unable to find image 'dgg32/cd-python-demo:preprod-0.1.20' locally
preprod-0.1.20: Pulling from dgg32/cd-python-demo
a10c77af2613: Already exists 
811275ca69b8: Already exists 
a6e65fb20e69: Already exists 
fc5582d0981c: Already exists 
9c7a8f0f8e58: Already exists 
a7762cb791d8: Already exists 
2f8d029c83f5: Pull complete 
80599f32c600: Pull complete 
e56de023b904: Pull complete 
Digest: sha256:18d0607a6b80c79833c82d24b63a09a1a285bb37ee2e6ed9cd52d49d5feaf3da
Status: Downloaded newer image for dgg32/cd-python-demo:preprod-0.1.20
[21 24 51]

Заключение

Поздравляю! Каждый раз, когда вы отправляете свой новый код в репозиторий BitBucket, конвейер выполняет модульное тестирование кода, создает новый образ и отправляет его в ваш Docker Hub. Таким образом, BitBucket просто берет на себя повторяющиеся вещи и освобождает вас от ручного труда. С этого момента вам предлагается писать и фиксировать более качественный код.

Вы можете немного поиграть с конвейером. Например, вы можете изменить свой скрипт Python так, чтобы он сознательно не прошел модульный тест. Вы увидите, что конвейер останавливается на шаге Test. BitBucket отправит вам уведомление по электронной почте о сбое. Вы можете попробовать другой язык программирования или отправить изображение в свою личную регистрацию изображений. Поскольку это руководство не демонстрирует непрерывное развертывание, вы также можете реализовать его в качестве домашнего задания.

Поскольку CI / CD настолько прост, почему бы не начать использовать его сегодня и повысить свою производительность?

Присоединяйтесь ко мне как к моему последователю, и давайте учиться вместе!

Коментарии
Авторизоваться что-бы оставить комментарий
Присоединяйся в тусовку
Наш сайт использует файлы cookie для вашего максимального удобства. Пользуясь сайтом, вы даете свое согласие с условиями пользования cookie