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


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

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

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

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

При создании образа виртуальной машины используется служба Конструктор образов Azure.

Необходимые компоненты

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

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

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

Раздел Задачи
Аутентификация 1. Добавление удостоверения, управляемого пользователем.
2. Настройте субъект-службу или open ID Подключение.
3. Создание секрета GitHub.
Сборка 1. Настройка окружения.
2. Создание приложения.
Изображение 1. Создание образа виртуальной машины.
2. Создание виртуальной машины.

Создание удостоверения, управляемого пользователем

Вам потребуется удостоверение, управляемое пользователем, для Конструктора образов Azure, чтобы распределить образы. Управляемое удостоверение Azure, назначаемое пользователем, будет использоваться во время создания образа для чтения и записи образов в Общей коллекции образов.

  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. Выберите "Добавить назначение ролей" и назначьте роль создания образа управляемому пользователем удостоверению.

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

Создайте субъект-службу с помощью командыaz ad sp create-for-rbac в Azure CLI. Чтобы выполнить эту команду, откройте Azure Cloud Shell на портале Azure или нажмите кнопку Попробовать.

az ad sp create-for-rbac --name "myML" --role contributor \
                            --scopes /subscriptions/<subscription-id>/resourceGroups/<group-name> \
                            --json-auth

Параметр --json-auth доступен в версиях >Azure CLI = 2.51.0. Версии до этого использования --sdk-auth с предупреждением об нерекомендуемом.

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

  {
    "clientId": "<GUID>",
    "clientSecret": "<GUID>",
    "subscriptionId": "<GUID>",
    "tenantId": "<GUID>",
    (...)
  }

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

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

  2. Перейдите к Параметры в меню навигации.

  3. Выберите "Секреты безопасности>" и "Действия переменных>".

    Screenshot of adding a secret

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

  5. Вставьте все выходные данные JSON, полученные из команды Azure CLI, в поле значения секрета. Присвойте секрету имя AZURE_CREDENTIALS.

  6. Выберите Добавить секрет.

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

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

В этом рабочем процессе вы выполните аутентификацию с помощью действия входа в Azure с применением сохраненных в secrets.AZURE_CREDENTIALS сведений о субъекте-службе. Затем вы выполните действие Azure CLI. Дополнительные сведения о ссылках на секреты GitHub в файле рабочего процесса см. в статье об использовании зашифрованных секретов в рабочем процессе на портале GitHub Docs.

on: [push]

name: Create Custom VM Image

jobs:
  build-image:
    runs-on: ubuntu-latest
    steps:
      - name: Log in with Azure
        uses: azure/login@v1
        with:
          creds: '${{ secrets.AZURE_CREDENTIALS }}'

Настройка 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@v1
      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 завершается ошибкой разрешения, убедитесь, что роль создания образа назначена управляемому пользователем удостоверению.

    - 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'

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

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

      - 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 }}"              

Следующие шаги