Автор оригинала: James Holmes.
Проблема
Один из ключевых методов для быстрого перемещения в разработке программного обеспечения является Непрерывная доставка Отказ Тем не менее, заглядывая после сборки агентов – это рута. Докер Помогает с этим, сохраняя агент построения простым и помещать всю инструмент сборки внутри образа докера. Однако это приносит с собой новую проблему – скорость. Строительные зависимости от нового агента по сборке могут занять некоторое время, особенно в Java. Эта статья показывает, как ускорить сборки с некоторыми функциями докера.
Что отличается от такого подхода?
Используя систему слоя в Docker, мы можем разделить зависимости для нашего кода в другую часть образа докера, чем слой, в котором находится код. Мы также можем использовать новую функцию в Docker, которая позволяет нам использовать ранее сохраненное изображение в качестве кэша слоя текущего изображения. Таким образом, мы ускоряем сборку, когда только код (и не зависимости) изменились.
Tech Stack
Мы накроем примеры в
- Рубин
- Питон
- Ява
- Javascript
Все будут использовать Docker, и мы добавим услуги AWS, как Кодовая обработка , CodeBuild и Эластичный реестр контейнера (ECR) Как простой пример того, как запустить построенный трубопровод.
Nitty Gritty
Различные языки программирования имеют разные системы управления зависимостями пакета:
- У Java есть Maven или посадка
- У Ruby есть драгоценные камни и БУНДЛЕР
- JavaScript имеет NPM или пряжа
- Python имеет пипс
Для целей установки зависимостей они все делают примерно то же самое:
- Посмотрите в файл конфигурации для зависимостей, которые вы объявили
- Идите и найдите пакеты для этих зависимостей в официальном хранилище
- Скачайте их в свою локальную систему
- сделать их доступными для вашего кода
Например, если я хочу использовать Redux в моем приложении JS RACT, я могу пряжа добавьте React-redux
И я в конечном итоге с Package.json
Файл, содержащий ссылку на React-redux (а также локальную установку в моем Node_Modules). Поскольку я не хочу полагаться на людей, вспомнив, что они правильно устанавливаются при развертывании на серверы, я не храним все зависимости в Git; Я просто магазин Package.json
файл. Если кто-то еще получает свой код из GitHub, они могут Пряжа устанавливает
И они получат Redux (наряду со всеми другими вещами в файле package.json
).
Вот вопрос; Загрузка и создание этих зависимостей на сервере сборки часто занимают много времени. Даже если у меня есть их установленные из предыдущей сборки, общим масштабированием пострадавших агентов во времена спроса, а затем уничтожать их позже для экономической эффективности. Это означает, что мои агенты по сборке всегда новы и должны делать новые сборки.
Докер к спасению
У докера есть две особенности, которые помогают:
- Слои изображения
-
--cache-от
Опция В команде сборки
Если мы принимаем Java в качестве примера, мы можем использовать следующие Dockerfile.tests
Чтобы запустить наши тесты:
FROM openjdk:8-jdk-alpine RUN apk update RUN apk add maven WORKDIR /opt/code COPY ./pom.xml . RUN mvn dependency:go-offline COPY . .
Это означает, что зависимости приходят с Запустить MVN Зависимость: Go-Offline
Но остальная часть нашего кода приходит с Копировать. Отказ
(Так что зависимости остаются в предыдущем слое).
Затем мы можем предоставить CI Config, которая использует Docker Build
с --cache-от
Чтобы гарантировать, что мы только должны запускать слой зависимости при изменении зависимостей.
В качестве примера давайте опишем пару конфигураций CodeBuild. Если мы предполагаем, что у нас есть ECR REPO на 9999999999.dkr.ecr.ap-southeast-2.amazonaws.com/some-img
Мы можем настроить несколько шагов в CodePipipeline:
- Шаг 1: Получите источник от контроля источника (например, github)
- Шаг 2: Используйте стандартный контейнер CodeBuild для создания образца Docker Image
- Шаг 3: Используйте новый тестовый образ непосредственно в CodeBuild, чтобы запустить тесты
Шаг 1
Создайте GitHub WebHook через CodePipipeline. Это можно сделать в консоли, через CLI или с Облачность
Шаг 2
Это пример buildspec Это входит в ECR, вытаскивает последний тестовый образ, создает новый тестовый образ, используя последний в качестве кэша и нажимает новый на ECR:
phases: pre_build: commands: - $(aws ecr get-login --no-include-email --region ap-southeast-2) - docker pull 999999999.dkr.ecr.ap-southeast-2.amazonaws.com/some-img:latest build: commands: - docker build --tag 999999999.dkr.ecr.ap-southeast-2.amazonaws.com/some-img:latest --file Dockerfile-tests --cache-from 999999999.dkr.ecr.ap-southeast-2.amazonaws.com/some-img:latest . post_build: commands: - docker push 999999999.dkr.ecr.ap-southeast-2.amazonaws.com/some-img:latest
Шаг 3
BuildSpec для запуска тестов на следующем шаге CodePipipeline просто, если шаг настроен на использование 9999999999.dkr.ecr.ap-southeast-2.amazonaws.com/some-img:latest
Изображение мы только что создали:
phases: build: commands: - mvn test
Весь процесс аналогичен другим языкам и системам управления пакетами. Просто поместите файл пакета и установите команды перед остальной частью кода.
Рубин:
COPY ./Gemfile . RUN bundle install COPY . .
Python:
COPY ./requirements.txt . RUN pip install -r requirements.txt COPY . .
JavaScript:
COPY ./package.json . RUN yarn install COPY . .
и т.п.
Окончательные мысли и следующие шаги
Делая это экономит много поддержания построенных агентов и много времени в сборках. Он работает одинаково хорошо с любой другой системой сборки, которая может запустить контейнеры Docker, такие как Buildkite Отказ Если вам нужна помощь с вашей настройкой, нажмите на связь.
Обо мне
Я главный инженер, с опытом программирования в Java, Python, Ruby, JavaScript и C #, с ржавым воспоминанием о LabView, C ++, VisualBasic и ColdFusion. Я устал в Haskell.
У меня глубокий опыт AWS и некоторые знания в Azure и GCP.
Приложение – Tech, упомянутые в этом посте
Докер
Docker – это способ упаковки приложений в Контейнер Это включает в себя все файлы, необходимые для запуска приложения, включая файлы операционной системы, но не ядро операционной системы. Напротив, виртуальная машина (VM) содержит ядро и виртуализированные аппаратные интерфейсы.
Amazon Web Services.
AWS – это Облачные услуги Поставщик, где вычислительная мощность, сеть и другие услуги предоставляются по требованию. Это позволяет для инфраструктуры в качестве кода и помогает командам проводить время по решению проблем с клиентами, а не присматривать за Datacentres.