Упражнение. Публикация модуля в реестре

Завершено

В вашей компании вы публикуете модули Bicep в реестре. Процесс публикации выполняется вручную с собственного компьютера. Теперь необходимо создать рабочий процесс для выполнения процесса публикации.

В этом упражнении вы выполните следующие действия.

  • Создайте реестр контейнеров для модулей Bicep.
  • Добавьте задание lint в рабочий процесс.
  • Добавьте задание рабочего процесса для публикации модуля в реестре.
  • Убедитесь, что рабочий процесс успешно запущен.
  • Проверьте опубликованный модуль в реестре.

Создание реестра контейнеров

Перед публикацией модулей необходимо создать используемый реестр для организации. В данном случае реестр создается на портале Azure.

  1. В браузере создайте реестр контейнеров на портале Azure.

  2. На вкладке Основные сведения выберите целевую подписку и созданную ранее группу ресурсов ToyReusable.

  3. Введите имя реестра и расположение, ближайшее к вам.

    Внимание

    Имя реестра должно быть уникальным в пределах Azure и содержать от 5 до 50 буквенно-цифровых символов. Флажок рядом с именем реестра указывает, что выбранное имя доступно.

  4. Для плана ценообразования выберите "Базовый".

    Оставьте значения по умолчанию для других параметров конфигурации.

  5. Выберите Review + create (Просмотреть и создать).

    Снимок экрана: портал Azure, на котором показана страница создания реестра контейнеров.

  6. Когда отобразится сообщение Проверка пройдена, выберите Создать.

    Дождитесь завершения развертывания, которое обычно занимает 1–2 минуты.

  7. Когда появится сообщение Развертывание выполнено успешно, выберите Перейти к ресурсу, чтобы открыть реестр контейнеров.

    Снимок экрана: портал Azure, на котором показано развертывание реестра контейнеров, с кнопкой для выбора выделенного ресурса.

  8. В области Обзор реестра контейнеров обратите внимание на значение параметра Сервер входа. Имя напоминает yourregistryname.azurecr.io.

    Снимок экрана: портал Azure, на котором показаны сведения о реестре контейнеров с выделенным сервером входа.

    Это значение скоро вам потребуется.

Добавление файла метаданных модуля

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

  1. В Visual Studio Code разверните папку modules/storage-account в корне репозитория.

  2. Создайте файл с именем metadata.json.

    Снимок экрана: Visual Studio Code с расположением точки метаданных JSON-файла.

  3. Добавьте в этот файл приведенное ниже содержимое.

    {
      "version": {
        "major": 1,
        "minor": 2
      }
    }
    

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

  4. Сохраните внесенные в файл изменения.

Обновление определение рабочего процесса и добавление задания lint

Репозиторий содержит черновик рабочего процесса, который можно использовать в качестве отправной точки.

  1. В Visual Studio Code разверните папку .github/workflows в корне репозитория.

  2. Откройте файл module-storage-account.yml.

    Снимок экрана: Visual Studio Code с расположением файла определения рабочего процесса.

  3. Обновите значение переменной MODULE_REGISTRY_SERVER среды до имени сервера реестра контейнеров. Вы скопировали это имя ранее в этом упражнении.

    Например, если сервер входа в реестр yourregistryname.azurecr.io, код выглядит следующим образом:

    env:
      MODULE_NAME: storage-account
      MODULE_REGISTRY_SERVER: yourregistryname.azurecr.io
      MODULE_FILE_PATH: modules/storage-account/main.bicep
      MODULE_METADATA_FILE_PATH: modules/storage-account/metadata.json
    
  4. В нижней части файла # To be added добавьте следующее определение задания lint:

    jobs:
      lint:
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v3
        - name: Run Bicep linter
          run: az bicep build --file ${{ env.MODULE_FILE_PATH }}
    

Добавление задания publish в рабочий процесс

Теперь можно добавить второе задание для публикации модуля в реестре контейнеров.

  1. В нижней части файла module-storage-account.yml добавьте первую часть определения задания публикации.

    publish:
      runs-on: ubuntu-latest
      needs: [ lint ]
      steps:
      - uses: actions/checkout@v3
      - uses: azure/login@v1
        name: Sign in to Azure
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
    

    Первые два шага в этом определении — извлечь код из репозитория и войти в Azure.

  2. Под добавленным кодом добавьте еще один шаг, который считывает номер версии из файла metadata.json модуля и задает его в качестве переменной среды.

    - name: Get module version number
      run: |
        majorMinorVersionNumber=$(jq '(.version.major | tostring) + "." + (.version.minor | tostring)' ${{ env.MODULE_METADATA_FILE_PATH }} -r )
        versionNumber="$majorMinorVersionNumber.${{ github.run_number }}"
        echo "MODULE_VERSION=$versionNumber" >> $GITHUB_ENV
    

    На шаге выполняется скрипт, использующий jq приложение командной строки для анализа JSON-файла.

  3. После созданного шага добавьте последний шаг для публикации модуля в реестр.

    - uses: azure/cli@v1
      name: Publish module
      with:
        inlineScript: |
          az bicep publish \
            --target 'br:${{ env.MODULE_REGISTRY_SERVER }}/${{ env.MODULE_NAME }}:${{ env.MODULE_VERSION }}' \
            --file ${{ env.MODULE_FILE_PATH }}
    

    Этот шаг создает значение аргумента --target динамически. Значение сервера реестра объединяется с именем модуля и номером версии.

  4. Сохраните внесенные в файл изменения.

Проверка и фиксация определения рабочего процесса

  1. Убедитесь, что файл module-storage-account.yml выглядит следующим образом:

    name: module-storage-account
    concurrency: module-storage-account
    
    on:
      workflow_dispatch:
      push:
        branches:
          - main
        paths:
          - 'modules/storage-account/**'
    
    permissions:
      id-token: write
      contents: read
    
    env:
      MODULE_NAME: storage-account
      MODULE_REGISTRY_SERVER: yourregistryname.azurecr.io
      MODULE_FILE_PATH: modules/storage-account/main.bicep
      MODULE_METADATA_FILE_PATH: modules/storage-account/metadata.json
    
    jobs:
      lint:
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v3
        - name: Run Bicep linter
          run: az bicep build --file ${{ env.MODULE_FILE_PATH }}
    
      publish:
        runs-on: ubuntu-latest
        needs: [ lint ]
        steps:
        - uses: actions/checkout@v3
        - uses: azure/login@v1
          name: Sign in to Azure
          with:
            client-id: ${{ secrets.AZURE_CLIENT_ID }}
            tenant-id: ${{ secrets.AZURE_TENANT_ID }}
            subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
        - name: Get module version number
          run: |
            majorMinorVersionNumber=$(jq '(.version.major | tostring) + "." + (.version.minor | tostring)' ${{ env.MODULE_METADATA_FILE_PATH }} -r )
            versionNumber="$majorMinorVersionNumber.${{ github.run_number }}"
            echo "MODULE_VERSION=$versionNumber" >> $GITHUB_ENV
        - uses: azure/cli@v1
          name: Publish module
          with:
            inlineScript: |
              az bicep publish \
                --target 'br:${{ env.MODULE_REGISTRY_SERVER }}/${{ env.MODULE_NAME }}:${{ env.MODULE_VERSION }}' \
                --file ${{ env.MODULE_FILE_PATH }}
    

    Если содержимое файла отличается, обновите его в соответствии с этим примером, а затем сохраните файл.

  2. Зафиксируйте и отправьте изменения в репозиторий Git, выполнив следующие команды в терминале Visual Studio Code:

    git add .
    git commit -m "Add lint and publish jobs to storage account module workflow"
    git push
    

Активация рабочего процесса

  1. В браузере перейдите в репозиторий GitHub и откройте вкладку Действия.

  2. Выберите рабочий процесс module-storage-account.

    Обратите внимание, что рабочий процесс уже выполняется. Извещающий триггер сработал, так как вы изменили файл metadata.json в папке модуля.

  3. Выберите последнее выполнение из списка.

    Снимок экрана: GitHub, который выделяет последний запуск рабочего процесса модуля.

    Дождитесь завершения рабочего процесса. Модуль Bicep публикуется в реестре контейнеров.

    Обратите внимание на номер выполнения рабочего процесса, который, вероятно, равен 3.

Проверка модуля в реестре

Вы также можете просмотреть опубликованный модуль на портале Azure.

  1. В браузере перейдите на портал Azure.

  2. Перейдите в группу ресурсов ToyReusable.

  3. В разделе "Ресурсы" выберите созданный ранее реестр контейнеров.

  4. Выберите репозитории служб>в меню. Затем выберите репозиторий modules\storage-account, который представляет модуль, опубликованный рабочим процессом.

    Снимок экрана: портал Azure, на котором показан модуль Bicep в реестре контейнеров.

    Обратите внимание, что существует один тег, соответствующий номеру версии модуля, опубликованного рабочим процессом. Основная версия (1) и дополнительная версия (2) соответствуют номерам версий, определенным в файле metadata.json. Номер редакции (3) соответствует номеру выполнения рабочего процесса.

Очистка ресурсов

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

В окне терминала Visual Studio Code выполните следующую команду:

az group delete --resource-group ToyReusable --yes --no-wait

Группа ресурсов удалится в фоновом режиме.

Remove-AzResourceGroup -Name ToyReusable -Force

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

  • Секреты в GitHub

    1. В репозитории GitHub перейдите к разделу "Параметры секретов>и переменных>Действия".
    2. Для каждого сохраненного секрета GitHub выберите значок "Удалить <имя> секрета" и следуйте инструкциям.
  • репозиторий GitHub

    1. Перейдите к разделу "Общие параметры>".
    2. Выберите "Удалить этот репозиторий " и следуйте инструкциям.
  • приложение Azure федеративные учетные данные регистрации и субъект-служба.

    1. На домашней странице портала найдите идентификатор Microsoft Entra и выберите его в списке служб.
    2. Перейдите к разделу "Управление> Регистрация приложений".
    3. На вкладке " Принадлежащие приложения " выберите toy-reusable.
    4. Нажмите кнопку "Удалить " и следуйте инструкциям.
    5. Перейдите на вкладку "Удаленные приложения ".
    6. Выберите toy-reusable, выберите "Удалить окончательно", а затем нажмите кнопку "Да ", чтобы окончательно удалить регистрацию приложения.

    Внимание

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