Рубрики
Без рубрики

Быстрее CI / CD трубопроводов с Docker

Ускоряйте свои сборки с Caches Docker Layer

Автор оригинала: James Holmes.

Проблема

Один из ключевых методов для быстрого перемещения в разработке программного обеспечения является Непрерывная доставка Отказ Тем не менее, заглядывая после сборки агентов – это рута. Докер Помогает с этим, сохраняя агент построения простым и помещать всю инструмент сборки внутри образа докера. Однако это приносит с собой новую проблему – скорость. Строительные зависимости от нового агента по сборке могут занять некоторое время, особенно в Java. Эта статья показывает, как ускорить сборки с некоторыми функциями докера.

Что отличается от такого подхода?

Используя систему слоя в Docker, мы можем разделить зависимости для нашего кода в другую часть образа докера, чем слой, в котором находится код. Мы также можем использовать новую функцию в Docker, которая позволяет нам использовать ранее сохраненное изображение в качестве кэша слоя текущего изображения. Таким образом, мы ускоряем сборку, когда только код (и не зависимости) изменились.

Tech Stack

Мы накроем примеры в

  • Рубин
  • Питон
  • Ява
  • Javascript

Все будут использовать Docker, и мы добавим услуги AWS, как Кодовая обработка , CodeBuild и Эластичный реестр контейнера (ECR) Как простой пример того, как запустить построенный трубопровод.

Nitty Gritty

Различные языки программирования имеют разные системы управления зависимостями пакета:

Для целей установки зависимостей они все делают примерно то же самое:

  • Посмотрите в файл конфигурации для зависимостей, которые вы объявили
  • Идите и найдите пакеты для этих зависимостей в официальном хранилище
  • Скачайте их в свою локальную систему
  • сделать их доступными для вашего кода

Например, если я хочу использовать Redux в моем приложении JS RACT, я могу пряжа добавьте React-redux И я в конечном итоге с Package.json Файл, содержащий ссылку на React-redux (а также локальную установку в моем Node_Modules). Поскольку я не хочу полагаться на людей, вспомнив, что они правильно устанавливаются при развертывании на серверы, я не храним все зависимости в Git; Я просто магазин Package.json файл. Если кто-то еще получает свой код из GitHub, они могут Пряжа устанавливает И они получат Redux (наряду со всеми другими вещами в файле package.json ).

Вот вопрос; Загрузка и создание этих зависимостей на сервере сборки часто занимают много времени. Даже если у меня есть их установленные из предыдущей сборки, общим масштабированием пострадавших агентов во времена спроса, а затем уничтожать их позже для экономической эффективности. Это означает, что мои агенты по сборке всегда новы и должны делать новые сборки.

Докер к спасению

У докера есть две особенности, которые помогают:

Если мы принимаем 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.