Поделиться через


Создание пользовательских образов виртуальных машин с помощью GitHub Actions и Azure

Начните работу с GitHub Actions , создав рабочий процесс для создания образа виртуальной машины.

С помощью GitHub Actions можно ускорить процесс CI/CD, создав пользовательские образы виртуальных машин с артефактами из рабочих процессов. Вы можете создавать образы и распространять их в общую коллекцию образов.

Затем эти образы можно использовать для создания виртуальных машин и масштабируемых наборов виртуальных машин.

Действие по созданию образа виртуальной машины использует службу Azure Image Builder.

Предпосылки

Общие сведения о файле рабочего процесса

Рабочий процесс определяется файлом YAML (.yml) по пути /.github/workflows/ в вашем репозитории. Это определение содержит разные шаги и параметры рабочего процесса.

Файл содержит три раздела:

Секция Tasks
Аутентификация 1. Добавьте управляемый пользователем идентификатор.
2. Настройте субъект-службы OpenID Connect.
3. Создайте секрет GitHub.
Сборка 1. Настройка среды.
2. Создание приложения.
Изображение 1. Создание образа виртуальной машины.
2. Создание виртуальной машины.

Создание управляемой пользователем идентификации

Для распространения образов вам потребуется управляемое пользователем удостоверение для Azure Image Builder(AIB). Пользовательское управляемое удостоверение Azure будет использоваться во время сборки образа для чтения и записи изображений в Shared Image Gallery.

  1. Создайте управляемое пользователем удостоверение с помощью Azure CLI или портала Azure. Запишите имя управляемого удостоверения.

  2. Настройте этот код JSON. Замените заполнители {subscriptionID} и {rgName} на идентификатор вашей подписки и имя вашей группы ресурсов.

    {
    "properties": {
        "roleName": "Image Creation Role",
        "IsCustom": true,
        "description": "Azure Image Builder access to create resources for the image build",
        "assignableScopes": [
          "/subscriptions/{subscriptionID}/resourceGroups/{rgName}"
        ],
        "permissions": [
            {
                "actions": [
                    "Microsoft.Compute/galleries/read",
                    "Microsoft.Compute/galleries/images/read",
                    "Microsoft.Compute/galleries/images/versions/read",
                    "Microsoft.Compute/galleries/images/versions/write",
                    "Microsoft.Compute/images/write",
                    "Microsoft.Compute/images/read",
                    "Microsoft.Compute/images/delete"
                ],
                "notActions": [],
                "dataActions": [],
                "notDataActions": []
            }
        ]
        } 
    } 
    
  3. Используйте этот код JSON для создания новой настраиваемой роли с помощью JSON.

  4. На портале Azure откройте Галерею вычислительных ресурсов Azure и перейдите в раздел Управление доступом (IAM).

  5. Выберите "Добавить назначение ролей " и назначьте роль создания образа управляемому пользователем удостоверению.

Создание учетных данных для развертывания.

Чтобы использовать действие входа Azure с OIDC, необходимо настроить федеративные учетные данные удостоверения в приложении Microsoft Entra или управляемом удостоверении, назначаемом пользователем.

Вариант 1. Приложение Microsoft Entra

Вариант 2. Управляемое удостоверение, назначаемое пользователем

Создавайте секреты GitHub

Необходимо указать идентификатор клиента приложения, идентификатор каталога (клиента) и идентификатор подписки для действия входа. Эти значения могут быть указаны непосредственно в рабочем процессе или храниться в секретах GitHub с указанием ссылок на них в рабочем процессе. Сохранение значений в виде секретов GitHub является более безопасным вариантом.

  1. В GitHub перейдите в репозиторий.

  2. Выберите > переменных>".

    Снимок экрана: добавление секрета

  3. Нажмите Создать секрет репозитория.

    Замечание

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

  4. Создайте секреты для AZURE_CLIENT_ID, AZURE_TENANT_ID и AZURE_SUBSCRIPTION_ID. Скопируйте эти значения из приложения Microsoft Entra или назначенного пользователем управляемого удостоверения для секретов GitHub.

    Секрет GitHub Приложение Microsoft Entra или назначенное пользователем управляемое удостоверение
    AZURE_CLIENT_ID Идентификатор клиента
    AZURE_SUBSCRIPTION_ID ID подписки
    AZURE_TENANT_ID (идентификатор арендатора Azure) Идентификатор каталога (арендатора)

    Замечание

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

Используйте действие входа в Azure

Используйте секрет GitHub с действием входа Azure для проверки подлинности в Azure.

Для Open ID Connect вы будете использовать федеративные учетные данные, связанные с приложением Active Directory.

Дополнительные сведения о ссылке на секреты GitHub в файле рабочего процесса см. в статье "Использование зашифрованных секретов в рабочем процессе в документации GitHub".

on: [push]

name: Create Custom VM Image

jobs:
  build-image:
    runs-on: ubuntu-latest
    steps:
      - name: Log in with Azure
        uses: azure/login@v2
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

Настройка Java

Настройте среду Java с помощью действия пакета SDK для установки Java. В этом примере вы настроите среду, создадите с помощью Maven и выведете артефакт.

Артефакты GitHub — это способ совместного использования файлов в рабочем процессе между заданиями. Вы создадите артефакт для хранения JAR-файла, а затем добавьте его в образ виртуальной машины.

on: [push]

name: Create Custom VM Image

jobs:
  build-image:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        java: [ '17' ]

    steps:
    - name: Checkout
      uses: actions/checkout@v3    

    - name: Login via Az module
      uses: azure/login@v2
      with:
        creds: ${{secrets.AZURE_CREDENTIALS}}

    - name: Set up JDK ${{matrix.java}}
      uses: actions/setup-java@v2
      with:
        java-version: ${{matrix.java}}
        distribution: 'adopt'
        cache: maven
    - name: Build with Maven Wrapper
      run: ./mvnw -B package
        
    - name: Build Java
      run: mvn --batch-mode --update-snapshots verify

    - run: mkdir staging && cp target/*.jar staging
    - uses: actions/upload-artifact@v2
      with:
        name: Package
        path: staging

Сборка образа

Используйте действие "Сборка образа виртуальной машины Azure " для создания пользовательского образа виртуальной машины.

Замените заполнители {subscriptionID}, {rgName} и {Identity} на ваш идентификатор подписки, имя группы ресурсов и имя управляемого удостоверения. Замените значения {galleryName} и {imageName} вашим именем галереи изображений и именем изображения.

Замечание

Если действие Create App Baked Image завершается ошибкой прав доступа, убедитесь, что роль Image Creation назначена на управляемое пользователем удостоверение.

    - name: Create App Baked Image
      id: imageBuilder
      uses: azure/build-vm-image@v0
      with:
        location: 'eastus2'
        resource-group-name: '{rgName}'
        managed-identity: '{Identity}' # Managed identity
        source-os-type: 'windows'
        source-image-type: 'platformImage'
        source-image: MicrosoftWindowsServer:WindowsServer:2019-Datacenter:latest #unique identifier of source image
        dist-type: 'SharedImageGallery'
        dist-resource-id: '/subscriptions/{subscriptionID}/resourceGroups/{rgName}/providers/Microsoft.Compute/galleries/{galleryName}/images/{imageName}/versions/0.1.${{ GITHUB.RUN_ID }}' #Replace with the resource id of your shared image  gallery's image definition
        dist-location: 'eastus2'

Аргументы действий виртуальной машины

Ввод Обязательно Description
resource-group-name Да Группа ресурсов, используемая для хранения и сохранения артефактов во время процесса сборки.
image-builder-template-name нет Имя используемого ресурса шаблона построителя образов.
location Да Расположение, в котором будет выполняться построитель образов Azure. См. поддерживаемые расположения.
build-timeout-in-minutes нет Время, после которого сборка отменяется. Значение по умолчанию — 240.
vm-size Необязательно По умолчанию Standard_D1_v2 будет использоваться. См. размеры виртуальных машин.
managed-identity Да Управляемая пользователем идентификация, которую вы создали ранее. Используйте полный идентификатор, если он находится в другой группе ресурсов. Используйте имя, если оно находится в той же группе ресурсов.
source-os Да Тип ОС базового образа (Linux или Windows)
source-image-type Да Базовый тип образа, который будет использоваться для создания пользовательского образа.
source-image Да Идентификатор ресурса для базового образа. Исходный образ должен присутствовать в одном регионе Azure, заданном в входном значении расположения.
customizer-source нет Каталог, в котором можно сохранить все артефакты, которые необходимо добавить в базовый образ для настройки. По умолчанию значение равно ${{ GITHUB.WORKSPACE }}/workflow-artifacts.
customizer-destination нет Это каталог в настраиваемом изображении, в который копируются файлы.
customizer-windows-update нет Только для Windows. Логическое значение. Если true, построитель образов выполнит обновление Windows после завершения кастомизации.
dist-location нет Для SharedImageGallery это dist-type.
dist-image-tags нет Это пользовательские теги, добавляемые в созданный пользовательский образ (например: version:beta).

Создание виртуальной машины

На последнем шаге создайте виртуальную машину из образа.

  1. Замените заполнители {rgName}именем группы ресурсов.

  2. Добавьте секрет GitHub с паролем виртуальной машины (VM_PWD). Не забудьте записать пароль, так как вы не сможете увидеть его снова. Имя пользователя равно myuser.

    - name: CREATE VM
      uses: azure/CLI@v1
      with:
        azcliversion: 2.0.72
        inlineScript: |
        az vm create --resource-group ghactions-vMimage  --name "app-vm-${{ GITHUB.RUN_NUMBER }}"  --admin-username myuser --admin-password "${{ secrets.VM_PWD }}" --location  eastus2 \
            --image "${{ steps.imageBuilder.outputs.custom-image-uri }}"              

Полный YAML

  on: [push]

  name: Create Custom VM Image

  jobs:
    build-image:
      runs-on: ubuntu-latest    
      steps:
      - name: Checkout
        uses: actions/checkout@v2    

      - name: Login via Az module
        uses: azure/login@v2
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

      - name: Setup Java 1.8.x
        uses: actions/setup-java@v1
        with:
          java-version: '1.8.x'
          
      - name: Build Java
        run: mvn --batch-mode --update-snapshots verify

      - run: mkdir staging && cp target/*.jar staging
      - uses: actions/upload-artifact@v2
        with:
          name: Package
          path: staging

      - name: Create App Baked Image
        id: imageBuilder
        uses: azure/build-vm-image@v0
        with:
          location: 'eastus2'
          resource-group-name: '{rgName}'
          managed-identity: '{Identity}' # Managed identity
          source-os-type: 'windows'
          source-image-type: 'platformImage'
          source-image: MicrosoftWindowsServer:WindowsServer:2019-Datacenter:latest #unique identifier of source image
          dist-type: 'SharedImageGallery'
          dist-resource-id: '/subscriptions/{subscriptionID}/resourceGroups/{rgName}/providers/Microsoft.Compute/galleries/{galleryName}/images/{imageName}/versions/0.1.${{ GITHUB.RUN_ID }}' #Replace with the resource id of your shared image  gallery's image definition
          dist-location: 'eastus2'

      - name: CREATE VM
        uses: azure/CLI@v1
        with:
          azcliversion: 2.0.72
          inlineScript: |
          az vm create --resource-group ghactions-vMimage  --name "app-vm-${{ GITHUB.RUN_NUMBER }}"  --admin-username myuser --admin-password "${{ secrets.VM_PWD }}" --location  eastus2 \
              --image "${{ steps.imageBuilder.outputs.custom-image-uri }}"              

Дальнейшие шаги