Непрерывная интеграция и непрерывная доставка/Непрерывное развертывание, так называемые CI/CD, требуют автоматизированного конвейера. Всякий раз, когда какой-либо новый код помещается в хранилище, конвейер запускается и начинает модульное тестирование кода, создание образа и отправку образа в реестр контейнеров. Это огромная экономия времени и обязательное условие для современной разработки программного обеспечения.е
И GitHub, и BitBucket предоставляют нам CI / CD. Но когда я попробовал это на BitBucket, я споткнулся в течение часа, прежде чем мне это удалось. И меня удивляет, что в Интернете не было ни одного полного описания. Поэтому я описываю здесь шаги для тех, кто хочет плавной работы.
Для выполнения этого руководства вам понадобится одна учетная запись в BitBucket и одна в Docker Hub. Бесплатные аккаунты подойдут. Код этого проекта размещен в BitBucket.
Сначала создайте репозиторий BitBucket. Затем нам понадобится проект Python на основе тестовой разработки (TDD) в качестве нашей базы кода. Создайте, зафиксируйте и отправьте эти четыре файла в репозиторий::
, test_app.py
, app.py
и requirement.txt
. Их содержание следующее:Dockerfile
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()
import numpy as np
def add_one(x):
return x + 1
if __name__ == '__main__':
print (add_one(np.array([20, 23, 50])))
numpy==1.21.0
# 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
. И разработка кода становится практикой стрельбы по мишеням. Это и есть суть TDD.app.py
Нам лучше протестировать наш код локально, прежде чем мы зафиксируем и отправим код в BitBucket. Но можно включить автоматический модульный тест на 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
BitBucket создаст для вас предварительно заполненный файл bitbucket-pipelines.yml
. Однако нам нужно добавить step
в его ветвь master
, чтобы обеспечить выполнение модульного теста. Кроме того, вы также можете внести некоторые изменения в некоторые имена. branches
в моем 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
.
Как только вы нажмете кнопку Commit file
, BitBucket немедленно начнет первый запуск. Если все работает нормально, вы должны увидеть зеленые галочки рядом с нашими тремя шагами на панели Pipeline
:
Перейдите в свой Docker Hub. Bitbucket создаст для вас репозиторий изображений, если он не существует, а затем поместит новое изображение внутрь (рисунок 5. По номеру моей версии вы можете видеть, что я провел несколько экспериментов 😉).
Вы также можете развернуть образ на своем локальном компьютере.
(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 настолько прост, почему бы не начать использовать его сегодня и повысить свою производительность?
Присоединяйтесь ко мне как к моему последователю, и давайте учиться вместе!