Erstellen benutzerdefinierter VM-Images mit GitHub Actions und Azure
Beginnen Sie mit GitHub Actions, indem Sie einen Workflow zum Erstellen eines VM-Images erstellen.
Mit GitHub Actions können Sie den CI/CD-Prozess beschleunigen, indem Sie benutzerdefinierte VM-Images mit Artefakten aus Ihren Workflows erstellen. Sie können Images erstellen und in Shared Image Gallery bereitstellen.
Diese Images können Sie anschließend verwenden, um virtuelle Computer und VM-Skalierungsgruppen zu erstellen.
Bei der Aktion zum Erstellen von VM-Images wird der Azure Image Builder-Dienst verwendet.
Voraussetzungen
- Ein Azure-Konto mit einem aktiven Abonnement. Sie können kostenlos ein Konto erstellen.
- Ein GitHub-Konto mit einem aktiven Repository. Falls Sie noch nicht über ein Konto verfügen, können Sie sich kostenlos registrieren.
- In diesem Beispiel wird die Java-Beispielanwendung „Spring PetClinic“ verwendet.
- Ein Azure Compute Gallery mit einem Bild.
Übersicht über die Workflowdatei
Ein Workflow wird durch eine YAML-Datei im Pfad /.github/workflows/
in Ihrem Repository definiert. Diese Definition enthält die verschiedenen Schritte und Parameter, die den Workflow bilden.
Die Datei besteht aus drei Abschnitten:
`Section` | Aufgaben |
---|---|
Authentifizierung | 1. Hinzufügen einer vom Benutzer verwalteten Identität 2. Richten Sie einen Dienstprinzipal oder eine Open ID-Verbinden ein. 3. Erstellen eines GitHub-Geheimnisses |
Build | 1. Einrichten der Umgebung 2. Erstellen der App |
Image | 1. Erstellen eines VM-Images 2. Erstellen eines virtuellen Computers |
Erstellen einer vom Benutzer verwalteten Identität
Zum Verteilen von Images wird eine vom Benutzer verwaltete Identität für Azure Image Builder (AIB) benötigt. Die von Ihrem Azure-Benutzer zugewiesene verwaltete Identität wird im Rahmen der Imageerstellung verwendet, um Images zu lesen und in eine Shared Image Gallery-Instanz zu schreiben.
Erstellen Sie eine vom Benutzer verwaltete Identität über die Azure CLI oder über das Azure-Portal. Notieren Sie sich den Namen Ihrer verwalteten Identität.
Passen Sie den folgenden JSON-Code an. Ersetzen Sie die Platzhalter für
{subscriptionID}
und{rgName}
durch Ihre Abonnement-ID und Ihren Ressourcengruppennamen.{ "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": [] } ] } }
Verwenden Sie diesen JSON-Code, um eine neue benutzerdefinierte Rolle mit JSON zu erstellen.
Öffnen Sie in Azure-Portal Ihren Azure Compute Gallery, und wechseln Sie zu Access Control (IAM).
Wählen Sie "Rollenzuweisung hinzufügen" aus, und weisen Sie Ihrer vom Benutzer verwalteten Identität die Bilderstellungsrolle zu.
Generieren von Anmeldeinformationen für die Bereitstellung
Generieren Sie in der Azure CLI mit dem Befehl az ad sp create-for-rbac einen Dienstprinzipal. Führen Sie diesen Befehl mit Azure Cloud Shell im Azure-Portal oder durch Auswählen der Schaltfläche Ausprobieren aus.
az ad sp create-for-rbac --name "myML" --role contributor \
--scopes /subscriptions/<subscription-id>/resourceGroups/<group-name> \
--json-auth
Der Parameter --json-auth
ist in Azure CLI-Versionen >= 2.51.0 verfügbar. Frühere Versionen nutzen --sdk-auth
mit einer Einstellungswarnung.
Ersetzen Sie im obigen Beispiel die Platzhalter durch Ihre Abonnement-ID, den Ressourcengruppennamen und den App-Namen. Die Ausgabe ist ein JSON-Objekt mit den Anmeldeinformationen für die Rollenzuweisung, die ähnlich wie unten Zugriff auf Ihre App Service-App gewähren. Kopieren Sie dieses JSON-Objekt zur späteren Verwendung.
{
"clientId": "<GUID>",
"clientSecret": "<GUID>",
"subscriptionId": "<GUID>",
"tenantId": "<GUID>",
(...)
}
Erstellen von GitHub-Geheimnissen
Wechseln Sie in GitHub zu Ihrem Repository.
Gehen Sie im Navigationsmenü auf Einstellungen.
Wählen Sie Security > Secrets and variables > Actions (Sicherheit > Geheimnisse und Variablen > Aktionen) aus.
Wählen Sie New repository secret (Neues Repositorygeheimnis) aus.
Fügen Sie die gesamte JSON-Ausgabe aus dem Azure CLI-Befehl in das Wertfeld des Geheimnisses ein. Geben Sie dem Geheimnis den Namen
AZURE_CREDENTIALS
.Klicken Sie auf Add secret (Geheimnis hinzufügen).
Verwenden der Aktion „Azure-Anmeldung“
Verwenden Sie Ihren GitHub-Geheimschlüssel mit der Azure-Anmeldeaktion , um sich bei Azure zu authentifizieren.
In diesem Workflow authentifizieren Sie sich mit der Aktion „Azure-Anmeldung“ und den Dienstprinzipaldetails, die in secrets.AZURE_CREDENTIALS
gespeichert sind. Anschließend führen Sie eine Azure CLI-Aktion aus. Weitere Informationen zum Verweisen auf GitHub-Geheimnisse in einer Workflowdatei finden Sie in den GitHub-Dokumentationen unter Verwenden verschlüsselter Geheimnisse in einem Workflow.
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 }}'
Konfigurieren von Java
Richten Sie mithilfe der Aktion zum Einrichten des Java JDK die Java-Umgebung ein. In diesem Beispiel wird die Umgebung eingerichtet, mit Maven erstellt und anschließend ein Artefakt ausgegeben.
GitHub-Artefakte ermöglichen die Weitergabe von Dateien in einem Workflow zwischen Aufträgen. Hier wird ein Artefakt für die JAR-Datei erstellt und anschließend dem VM-Image hinzugefügt.
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
Erstellen Ihres Images
Verwenden Sie die Aktion zum Erstellen eines Azure-VM-Images, um ein benutzerdefiniertes VM-Image zu erstellen.
Ersetzen Sie die Platzhalter für {subscriptionID}
, {rgName}
und {Identity}
durch Ihre Abonnement-ID, Ihren Ressourcengruppennamen und den Namen der verwalteten Identität. Ersetzen Sie die Werte von {galleryName}
und {imageName}
durch den Namen Ihres Imagekatalogs und Ihres Images.
Hinweis
Wenn die Aktion "App backte Bilder erstellen" mit einem Berechtigungsfehler fehlschlägt, vergewissern Sie sich, dass Sie der vom Benutzer verwalteten Identität die Bilderstellungsrolle zugewiesen haben.
- 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'
VM-Aktionsargumente
Eingabe | Erforderlich | Beschreibung |
---|---|---|
resource-group-name |
Ja | Die Ressourcengruppe zum Speichern von Artefakten während des Buildprozesses. |
image-builder-template-name |
Nein | Der Name der verwendeten Image Builder-Vorlagenressource. |
location |
Ja | Der Standort, an dem Image Builder ausgeführt wird. Informationen zu den unterstützten Standorten finden Sie hier. |
build-timeout-in-minutes |
Nein | Zeit, nach der der Buildvorgang abgebrochen wird. Standardwert: 240. |
vm-size |
Optional | Standardmäßig wird Standard_D1_v2 verwendet. Siehe Größen für virtuelle Computer in Azure. |
managed-identity |
Ja | Die vom Benutzer verwaltete Identität, die Sie zuvor erstellt haben. Verwenden Sie den vollständigen Bezeichner, wenn sich Ihre Identität in einer anderen Ressourcengruppe befindet. Verwenden Sie den Namen, wenn sie sich in der gleichen Ressourcengruppe befindet. |
source-os |
Ja | Der Betriebssystemtyp des Basisimages (Linux oder Windows). |
source-image-type |
Ja | Der Basisimagetyp, der zum Erstellen des benutzerdefinierten Images verwendet wird. |
source-image |
Ja | Der Ressourcenbezeichner für das Basisimage. Ein Quellimage muss in der Azure-Region vorhanden sein, die im Eingabewert für den Standort festgelegt ist. |
customizer-source |
Nein | Das Verzeichnis, in dem Sie alle Artefakte platzieren können, die dem Basisimage zur Anpassung hinzugefügt werden müssen. Standardwert: ${{ GITHUB.WORKSPACE }}/workflow-artifacts. . |
customizer-destination |
Nein | Das Verzeichnis im angepassten Image, in das Artefakte kopiert werden. |
customizer-windows-update |
Nein | Nur für Windows. an. Bei true wird von Image Builder am Ende der Anpassungen Windows Update ausgeführt. |
dist-location |
Nein | Für Shared Image Gallery ist dies dist-type . |
dist-image-tags |
Nein | Hierbei handelt es sich um benutzerdefinierte Tags, die dem erstellten benutzerdefinierten Image hinzugefügt werden (Beispiel: version:beta ). |
Erstellen Ihres virtuellen Computers
Erstellen Sie als letzten Schritt einen virtuellen Computer auf der Grundlage Ihres Images.
Ersetzen Sie die Platzhalter für
{rgName}
durch den Namen Ihrer Ressourcengruppe.Fügen Sie ein GitHub-Geheimnis mit dem Kennwort des virtuellen Computers (
VM_PWD
) hinzu. Notieren Sie sich das Kennwort, da es nicht erneut angezeigt werden kann. Der Benutzername lautetmyuser
.
- 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 }}"
Vollständiger YAML-Code
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 }}"