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

Ü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.

  1. 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.

  2. 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": []
            }
        ]
        } 
    } 
    
  3. Verwenden Sie diesen JSON-Code, um eine neue benutzerdefinierte Rolle mit JSON zu erstellen.

  4. Öffnen Sie in Azure-Portal Ihren Azure Compute Gallery, und wechseln Sie zu Access Control (IAM).

  5. 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

  1. Wechseln Sie in GitHub zu Ihrem Repository.

  2. Gehen Sie im Navigationsmenü auf Einstellungen.

  3. Wählen Sie Security > Secrets and variables > Actions (Sicherheit > Geheimnisse und Variablen > Aktionen) aus.

    Screenshot of adding a secret

  4. Wählen Sie New repository secret (Neues Repositorygeheimnis) aus.

  5. 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.

  6. 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.

  1. Ersetzen Sie die Platzhalter für {rgName} durch den Namen Ihrer Ressourcengruppe.

  2. 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 lautet 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 }}"              

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

Nächste Schritte