Создание пользовательских образов виртуальных машин с помощью GitHub Actions и Azure
Приступите к работе с GitHub Actions, создав рабочий процесс для построения образа виртуальной машины.
С помощью GitHub Actions можно ускорить процесс CI/CD, создав пользовательские образы виртуальных машин с артефактами из рабочих процессов. Вы можете создавать образы и распространять их в Общей коллекции образов.
Затем эти образы можно использовать для создания виртуальных машин и масштабируемых наборов виртуальных машин.
При создании образа виртуальной машины используется служба Конструктор образов Azure.
Необходимые компоненты
- Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно .
- Учетная запись GitHub с активным репозиторием. Если у вас ее нет, зарегистрируйтесь бесплатно.
- В этом примере используется пример приложения Java Spring PetClinic.
- Коллекция вычислений Azure с изображением.
- Создайте коллекцию вычислений Azure.
- Создать образ.
Общие сведения о файле рабочего процесса
Рабочий процесс определяется файлом YAML (.yml) по пути /.github/workflows/
в вашем репозитории. Это определение содержит разные шаги и параметры рабочего процесса.
Этот файл содержит три раздела:
Раздел | Задачи |
---|---|
Аутентификация | 1. Добавление удостоверения, управляемого пользователем. 2. Настройте субъект-службу или open ID Подключение. 3. Создание секрета GitHub. |
Сборка | 1. Настройка окружения. 2. Создание приложения. |
Изображение | 1. Создание образа виртуальной машины. 2. Создание виртуальной машины. |
Создание удостоверения, управляемого пользователем
Вам потребуется удостоверение, управляемое пользователем, для Конструктора образов Azure, чтобы распределить образы. Управляемое удостоверение Azure, назначаемое пользователем, будет использоваться во время создания образа для чтения и записи образов в Общей коллекции образов.
Создайте удостоверение, управляемое пользователем, с помощью Azure CLI или портала Azure. Запишите имя управляемого удостоверения.
Настройте указанный ниже код 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": [] } ] } }
Используйте этот код JSON для создания новой настраиваемой роли с помощью JSON.
В портал Azure откройте коллекцию вычислений Azure и перейдите к элементу управления доступом (IAM).
Выберите "Добавить назначение ролей" и назначьте роль создания образа управляемому пользователем удостоверению.
Создание учетных данных для развертывания.
Создайте субъект-службу с помощью команды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
В GitHub перейдите в репозиторий.
Перейдите к Параметры в меню навигации.
Выберите "Секреты безопасности>" и "Действия переменных>".
Нажмите Создать секрет репозитория.
Вставьте все выходные данные JSON, полученные из команды Azure CLI, в поле значения секрета. Присвойте секрету имя
AZURE_CREDENTIALS
.Выберите Добавить секрет.
Использование действия входа в 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 ). |
Создание виртуальной машины
На последнем этапе создайте виртуальную машину на основе образа.
Замените заполнители
{rgName}
именем созданной группы ресурсов.Добавьте секрет 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 }}"
Следующие шаги
- Узнайте, как выполнить развертывание в Azure.