Рубрики
Uncategorized

Контейнер изображения Продвижение в средах — Ямл

Когда вы используете контейнеры для вашего приложения, одна из вещей, которые вам нужно подумать, — это то, как двигаться … Теги с AzuredevOps, контейнерами, CICD, развертыванием.

Контейнерные среды Продвижение (4 части серии)

Когда вы используете контейнеры для вашего приложения, одна из вещей, которые вам нужно подумать о том, как двигаться (AKA Proomote) Контейнерные изображения вы генерируете в разных средах.

В этой серии я исследую разные способы сделать это … с помощью Azure DevOps

вступление

В первой статье серии мы исследовали подход «базовый реестр» для продвижения контейнеровоза в различных средах. Во второй части мы избавились от дополнительного реестра, и мы использовали артефакт сборки.

В этой третьей и окончательной части мы будем использовать тот же подход, что и второй, но используя 100% ЯМЛ трубопроводы (или, более надлежащим образом, многоступенчатые трубопроводы ).

До начала

В то время как редактор многоступенчатой трубопровода должен быть уже опытом по умолчанию на момент написания, если вы не можете видеть, что он должен включить его в функции предварительного просмотра.

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

Хорошо, давайте начнем

Структура трубопровода

Как я уже упоминал, мы собираемся использовать многоступенчатый трубопровод, на основе YAML. Как называется, мы можем иметь несколько Этапы внутри одного определения трубопровода. Каждый этап будет делегирован до конкретной функции.

В этом примере, езда на предыдущих статьях, я собираюсь создать приложение и изображение, и развернуть до 3 среды (DEV, UAT и PROD). Поэтому мы собираемся использовать 4 этапы Отказ

 stages:

   - stage: CI
     displayName: 'CI stage'
     jobs:
     #JOBS HERE

  - stage: CDDev
     displayName: 'CD stage for DEV'
     jobs:
     #JOBS HERE

  - stage: CDUat
     displayName: 'CD stage for UAT'
     jobs:
     #JOBS HERE

  - stage: CDProd
     displayName: 'CD stage for PROD'
     jobs:
     #JOBS HERE

Я собираюсь объяснить позже, почему я решил использовать разные этапы для различных сред вместо одного «CD» стадии и нескольких заданий для различных сред.

CI — aka, строительство изображения

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

Мы снова будем использовать «Артефактный путь» опубликовать наш образ.

Для этого мы начинаем в том числе в CI Stage Все задачи отвечают за строительство/компиляция/публикацию нашего приложения:

- stage: CI
     displayName: 'CI stage'
     jobs:
     - job: Build
       displayName: 'Build for MyProject'
       steps:
        # Add all the tasks you need to build your project
       - task: WhateverTask@1
         displayName: 'Build MyProject'
         # all the parameters you need

Когда у нас есть это, нам нужно создать изображение контейнера и, как мы проводили в прошлый раз, экспортируйте это в формате TAR:

   - task: Docker@2
     displayName: 'Build MyProject image'
     inputs:
       repository: '$(ImageName)'
       command: build
       Dockerfile: MyProject/Dockerfile
       tags: $(Build.BuildId)

   - task: Docker@2
     displayName: 'Save image to TAR'
     inputs:
       repository: '$(ImageName)'
       command: save
       arguments: '--output $(build.artifactstagingdirectory)/$(ImageName).image.tar $(ImageName):$(Build.BuildId)'
       addPipelineData: false

Эти команды точно такие как те, которые мы использовали в предыдущей статье, но в своем представлении YAML.

«Сохранить изображение на смолу» Шаг использует Докер Сохранить Команда для экспорта изображения контейнера Мы только что создали в файл .tar.

Я определил переменные для имен, чтобы я мог повторно использовать их в разных средах.

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

   variables:
     ImageName: 'myprojectreportexecutor'

Кроме того, обратите внимание, что я должен указать вывод для команды, и я использую $ (build.artifactstagingDirectory) Системная переменная для хранения экспортированного изображения в папке Azure DEVOPS SERVICE использует в качестве базового пути.

Как только у меня есть изображение, сохраненное в «нормальном файле», я могу использовать его как артефакт. В предыдущей статье мы использовали Построить артефакт Объект, в этом примере мы будем вместо этого использовать новые Трубопровод артефакт Объект (который доступен только в трубопроводах YAML, а не в классических). Для этого я должен добавить Опубликовать трубопровод артефакт шаг:

  - task: PublishPipelineArtifact@1
    displayName: 'Publishing Image as Pipeline Artifact'
    inputs:
      path: $(build.artifactstagingdirectory)
      artifact: 'ContainerImage'

Трубопроводные артефакты хранятся в Azure Devops Services напрямую. По-разному из Построить артефакты На момент написания невозможно выбрать свой собственный FileShare для их сохранения. Больше информации о разнице между трубопроводом и сборки артефактов здесь

Ничего не слишком сложно здесь. Этот шаг просто принимает содержание $ (build.artifactstagingDirectory) Папка, зацикливается и делает ее доступной для последующих шагов/рабочих мест/этапов.

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

А затем CD — aka развертывает время

Хорошо, теперь у нас есть наш контейнер, и мы создали с ним артефакт трубопровода. Пришло время заполнить другие этапы.

Перед началом важно понимать несколько вещей здесь.

Работа в развертывании

В части CI нашего трубопровода мы использовали один (или более) работа . Работа — это общая «сбор задач», и обычно она связана с непрерывной интеграцией. Почему? Поскольку каждая работа автоматически загружает исходный код из репо, связанного с трубопроводом.

Мы не хотим, чтобы наш код повторно доставлял до каждого развертывания, мы? По этой причине лазурные трубопроводы предоставляют доступ к другому типу работы, специализируясь в операциях развертывания: Работа в развертывании Отказ

Эта конкретная работа не только не загружает код из репо, но он автоматически загружает любой артефакт трубопровода, опубликованный на любом предыдущем этапе!

Стратегии

Еще одна особенность заданий развертывания состоит в том, что они поддерживают разные Стратегии развертывания . На момент написания они Runonce , прокат и канарейка .

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

Крючки жизненного цикла

Каждая стратегия развертывания имеет некоторые «крючки жизненного цикла», которые в основном организуют операции развертывания: предраспределение , Развертывание и т.д. (подробнее здесь ).

Опять же, я не собираюсь покрывать их деталями в этом посте. Я буду использовать Развертывание Крюк, потому что это единственный, который фактически загружает автоматически артефакты.

Шаги развертывания

Хорошо, теперь, когда у нас есть гораздо яснее (надеюсь) идея о тех темах, давайте посмотрим на вершину этапа развертывания.

Я сосредоточусь на среде Dev, потому что другие будут в значительной степени одинаковыми.

   - stage: CDDev
     displayName: 'CD stage for DEV'
     jobs:
     - deployment: Dev
       displayName: 'Deploy to DEV'
       environment: MyProject-DEV
       strategy:
         runOnce:
           deploy:
             steps:

Как вы можете видеть, и как я упоминаю раньше, здесь я использую Runonce Стратегия с Развертывание крюк.

По умолчанию этот этап будет выполнен Только Если предыдущий этап (CI) был успешным.

Подождите минуту. Что такое «окружающая среда»? Среды Еще одна новая концепция доступна только в трубопроводах ЯМЛ. Они позволяют вам определить и отображать какую-то реальную среду для использования их в качестве целей развертывания.

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

Кроме того, теперь вы можете потребовать Одобрения для развертывания в определенной среде, и что одобрения должны быть определены в объекте окружающей среды.

Теперь, как в предыдущем примере у нас есть три разных среды: Dev, test и prod. Во-первых, что нужно сделать, это создать их в Azure DEVOPS.

Если вы не вручную создаете среду в Azure DEVOPS UI, они будут созданы автоматически в первый раз, когда выполняется трубопровод.

Теперь, когда у нас есть среда готова, мы можем продолжить.

Первый шаг: нам нужно Восстановите изображение из .tar Файл, который мы создали в сборке.

  - task: Docker@2
    displayName: 'Load Image from Tar'
    inputs:
      command: load
      arguments: '--input $(Pipeline.Workspace)/ContainerImage/$(ImageName).image.tar'

Обратите внимание, что входной путь использует $ (Трубопровод. Рабочая область) Системная переменная: она представляет папку, в которой загружаются артефакты трубопровода. Полный путь состоит из базового каталога, название артефакта, которое мы выбрали в ARTIFACT ARTIFACT CI) и, наконец, имя файла. Еще раз я определил переменные для имен, чтобы я мог повторно использовать их в разных средах.

Далее нам нужно Тег изображение по-разному, добавить имя реестра. Это потому, что если вы должны нажать изображение в определенный реестр, вам нужно изображение полное имя как « Registryname/imageName », где Регистрация Полный квалифицированный домен в случае чего-либо отличается от Docker Hub (для реестра Azure Container, это было бы что-то вроде myregistryname.azurecr.io ).

  - task: Docker@2
    displayName: 'ReTag Image with ACR Name - BuildId'
    inputs:
      containerRegistry: MyProjectACRdev # This comes from the Service Connections
      repository: '$(ImageName)'
      command: tag
      arguments: '$(ImageName):$(Build.BuildId) $(ContainerRegistryNameDev)/$(ImageName):$(Build.BuildId)'

Использование переменных является необязательным, но еще раз порекомендуем его, он просто облегчает автоматист и темплатизировать.

Контейнерорегистрация Значение параметра необходимо соответствовать имени сервисной связи, который вы определены в настройках, которые отображают реестр вашего Azure Container (или любой другой реестр Docker)

Последний шаг, нам нужно Нажмите на изображение в новый реестр.

  - task: Docker@2
    displayName: 'Push Image to ACR'
    inputs:
      containerRegistry: MyProjectACRdev
      repository: '$(ImageName)'
      command: push
      tags: $(Build.BuildId)

Что касается предыдущего шага, также здесь мы можем ссылаться на некоторые переменные сборки.

И мы сделали для Dev!

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

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

Последнее, как я упоминаю, прежде чем вы, вероятно, захотите настроить некоторые Одобрения для развертывания UAT и PROD. Это можно сделать в разделе среды.

Многочисленные этапы против одного этапа для развертывания

Как я уже упоминал ранее, я решил создать 4 этапа (1 для CI и 3 для CD). Это было необходимо, потому что я хочу использовать Одобрения Отказ

На самом деле, одобрения применяются на Окружающая среда Уровень, а двигатель одобрения Azure трубопроводы требует, чтобы « выполнение прогона паузы перед входом в стадию, которая использует среду. Пользователи, настроенные в качестве утверждения, должны просмотреть и утверждать или отклонить развертывание. «(Из официальной документации здесь )

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

Поэтому это также означает, что если у вас есть несколько рабочих мест развертывания на этапе, с каждой работой, связанной с другой средой, и каждая среда, имеющая свое собственное одобрение, то вам нужно будет одобрить все развертывание для проведения сцены, что делает его бесполезный.

Если вместо этого у вас есть несколько этапов, по одному на каждой среде, все отлично работает.

Давайте запустим это

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

Это главный экран:

Это вместо этого является экран журнала выполнения:

Я добавил запрос одобрения как для UAT, так и для Prod, так что это то, что происходит, когда развертывание для Dev успешно:

И это внутри журналов:

Это то, что вы видите, нажав на кнопку «Обзор»:

Вы, очевидно, есть возможность утверждать или отклонить развертывание. Если вы отклоните, ничто не будет развернуто в эту среду, и весь процесс трубопровода остановится.

Утверждение настраивается в моем случае, я указывал, что по крайней мере один из необходимых утверждений должен утверждать, чтобы продолжить.

Последнее, но не менее важное, среда Вид:

Это довольно полезно, потому что у вас может быть непосредственное изображение того, что развернуто в любой среде в любой момент времени.

Заключение

Этот процесс не используется широко распространен, в основном, потому что люди не знают об этом, но это определенно мой любимый:

  • У вас есть 1: 1 отображение между сборкой и выпуском

    • Это означает, что Изображение, которое вы создаете, и тот, который вы развертываете, наверняка то же самое Отказ
  • Вы может напрямую ссылаться на номер сборки или любой другой параметр, который поступает из сборки, поскольку вы CI и ваши трубопроводы CD напрямую связаны.
  • У вас есть полная прослеживаемость

В этой статье мы достигли всего, используя новые многоступенчатые трубопроводы, которые позволяют версию и защищать файлы yaml (например, настройку политики филиала).

Конечно, если вы посмотрите на полный файл YAML, он довольно долго и не очень читается. На самом деле, одна из вещей, которые мы обычно рекомендуем использовать Шаблоны и связать их вместо того, чтобы все в одном файле.

Я покрою это новым постом иногда скоро, но если вы хотите взглянуть на это Вот документация

Вроде, поделиться и следуй за мной 🚀 Для получения дополнительной информации:

📽 YouTube ☕. Купи мне кофе 💖 Парреон 🌐 Веб-сайт CODERDAVE.IO 👕 Merch 👦🏻 Страница в Facebook 🐱💻 Github 👲🏻 Twitter 👴🏻 LinkedIn 🔉 Подкас

Контейнерные среды Продвижение (4 части серии)

Оригинал: «https://dev.to/n3wt0n/container-image-promotion-across-environments-yaml-1ca6»