Непрерывная интеграция и непрерывная доставка/Непрерывное развертывание, так называемые 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 настолько прост, почему бы не начать использовать его сегодня и повысить свою производительность?
Присоединяйтесь ко мне как к моему последователю, и давайте учиться вместе!