Freigeben über


Erstellen von benutzerdefinierten Images für virtuelle Computer mit GitHub-Aktionen und Azure

Erste Schritte mit GitHub Actions, indem Sie einen Workflow erstellen, um ein Image einer virtuellen Maschine zu erstellen.

Mit GitHub-Aktionen können Sie Ihren CI/CD-Prozess beschleunigen, indem Sie benutzerdefinierte Bilder virtueller Computer mit Artefakten aus Ihren Workflows erstellen. Sie können bilder erstellen und an eine freigegebene Bildergalerie verteilen.

Anschließend können Sie diese Images verwenden, um virtuelle Computer und Skalierungsgruppen für virtuelle Computer zu erstellen.

Die Imageaktion "Virtuelle Computer erstellen" verwendet den Azure Image Builder-Dienst.

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 enthält drei Abschnitte:

`Section` Aufgaben
Authentifizierung 1. Fügen Sie eine vom Benutzer verwaltete Identität hinzu.
2. Richten Sie ein Service Principal oder Open ID Connect ein.
3. Erstellen Sie einen GitHub-Geheimschlüssel.
Bauen 1. Einrichten der Umgebung.
2. Erstellen Sie die App.
Bild 1. Erstellen Sie ein VM-Image.
2. Erstellen Sie einen virtuellen Computer.

Erstellen einer vom Benutzer verwalteten Identität

Sie benötigen eine vom Benutzer verwaltete Identität für Azure Image Builder(AIB), um Bilder zu verteilen. Ihre vom Azure-Benutzer zugewiesene verwaltete Identität wird während der Imageerstellung verwendet, um Bilder in eine Shared Image Gallery zu lesen und zu schreiben.

  1. Erstellen Sie eine vom Benutzer verwaltete Identität mit Azure CLI oder dem Azure-Portal. Notieren Sie sich den Namen Ihrer verwalteten Identität.

  2. Passen Sie diesen JSON-Code an. Ersetzen Sie die Platzhalter für {subscriptionID} mit Ihrer Abonnement-ID und für {rgName} mit dem 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 im Azure-Portal Ihre Azure Compute-Galerie und wechseln Sie zu Zugriffssteuerung (IAM).

  5. Wählen Sie "Rollenzuweisung hinzufügen" aus und weisen Sie Ihrer vom Benutzer verwalteten Identität die Rolle für die Bilderstellung zu.

Generieren von Anmeldeinformationen für die Bereitstellung

Um die Aktion „Azure-Anmeldung“ mit OIDC zu verwenden, müssen Sie Anmeldeinformationen für eine Verbundidentität in einer Microsoft Entra-Anwendung oder eine benutzerseitig zugewiesene verwaltete Identität konfigurieren.

Option 1: Microsoft Entra-Anwendung

Option 2: Benutzerseitig zugewiesene verwaltete Identität

Erstellen von GitHub-Geheimnissen

Sie müssen die Client-ID, die Verzeichnis-ID (Mandant) ihrer Anwendung und die Abonnement-ID für die Anmeldeaktion angeben. Diese Werte können entweder direkt im Workflow bereitgestellt werden oder in GitHub-Geheimnissen gespeichert und darauf in Ihrem Workflow verwiesen werden. Das Speichern der Werte als GitHub-Geheimnisse ist die sicherere Option.

  1. Wechseln Sie in GitHub zu Ihrem Repository.

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

    Screenshot des Hinzufügens eines Geheimnisses

  3. Wählen Sie "Neuer Repositoryschlüssel" aus.

    Hinweis

    Um die Sicherheit von Workflows in öffentlichen Repositorys zu verbessern, verwenden Sie Umgebungsgeheimnisse anstelle von Repositorygeheimnissen. Wenn die Umgebung Genehmigung erfordert, kann ein Auftrag nicht auf Umgebungsschlüssel zugreifen, bis einer der erforderlichen Prüfer es genehmigt.

  4. Erstellen Sie Geheimnisse für AZURE_CLIENT_ID, AZURE_TENANT_ID und AZURE_SUBSCRIPTION_ID. Kopieren Sie diese Werte aus Ihrer Microsoft Entra-Anwendung oder der vom Benutzer zugewiesenen verwalteten Identität für Ihre GitHub-Geheimnisse:

    GitHub-Geheimnis Microsoft Entra-Anwendung oder vom Benutzer zugewiesene verwaltete Identität
    AZURE_CLIENT_ID Kunden-ID
    AZURE_SUBSCRIPTION_ID Abonnement-ID
    AZURE_TENANT_ID (Azure-Mandanten-ID) Verzeichnis-ID (Mandant)

    Hinweis

    Aus Sicherheitsgründen empfehlen wir die Verwendung von GitHub Secrets, anstatt Werte direkt an den Workflow zu übergeben.

Verwenden Sie die Azure-Anmeldeaktion

Verwenden Sie Ihren GitHub-Geheimschlüssel mit der Azure-Anmeldeaktion , um sich bei Azure zu authentifizieren.

Für Open ID Connect verwenden Sie eine Verbundanmeldeinformation, die Ihrer Active Directory-App zugeordnet ist.

Weitere Informationen zum Verweisen auf GitHub-Geheimnisse in einer Workflowdatei finden Sie unter Verwenden verschlüsselter Geheimschlüssel in einem Workflow in GitHub-Dokumenten.

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

Konfigurieren von Java

Richten Sie die Java-Umgebung mit der Java Setup SDK-Aktion ein. In diesem Beispiel richten Sie die Umgebung ein, erstellen sie mit Maven und geben dann ein Artefakt aus.

GitHub-Artefakte sind eine Möglichkeit, Dateien in einem Workflow zwischen Aufträgen freizugeben. Sie erstellen ein Artefakt zum Speichern der JAR-Datei und fügen sie dann dem Image des virtuellen Computers hinzu.

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

Erstellen Ihres Images

Verwenden Sie die Aktion "Azure Virtual Machine Image erstellen", um ein benutzerdefiniertes Image für virtuelle Maschinen zu erstellen.

Ersetzen Sie die Platzhalter für {subscriptionID} Ihre Abonnement-ID, {rgName} den Ressourcengruppennamen und {Identity} den verwalteten Identitätsnamen. Ersetzen Sie die Werte von {galleryName} und {imageName} durch den Namen Ihrer Bildergalerie und den Namen Ihres Bildes.

Hinweis

Wenn die Aktion "App Baked Image erstellen" mit einem Berechtigungsfehler fehlschlägt, vergewissern Sie sich, dass Sie der vom Benutzer verwalteten Identität die Rolle zur Bilderstellung 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'

Aktionsargumente für virtuelle Computer

Input Erforderlich Description
resource-group-name Yes Die Ressourcengruppe, die während des Buildprozesses zum Speichern von Artefakten verwendet wird.
image-builder-template-name Nein Der Name der verwendeten Image Builder-Vorlagenressource.
location Yes Der Speicherort, an dem Azure Image Builder ausgeführt wird. Siehe unterstützte Speicherorte.
build-timeout-in-minutes Nein Zeit, nach der der Build abgebrochen wird. Der Standardwert beträgt 240.
vm-size Wahlfrei Standard_D1_v2 Standardmäßig wird verwendet. Siehe Größen virtueller Maschinen.
managed-identity Yes Die zuvor erstellte vom Benutzer verwaltete Identität. Verwenden Sie den vollständigen Bezeichner, wenn sich Ihre Identität in einer anderen Ressourcengruppe befindet. Verwenden Sie den Namen, wenn er sich in derselben Ressourcengruppe befindet.
source-os Yes Der Betriebssystemtyp des Basisimages (Linux oder Windows)
source-image-type Yes Der Basisbildtyp, der zum Erstellen des benutzerdefinierten Bilds verwendet wird.
source-image Yes Der Ressourcenbezeichner für das Basisbild. Ein Quellbild sollte in derselben Azure-Region vorhanden sein, die im Eingabewert des Speicherorts festgelegt ist.
customizer-source Nein Das Verzeichnis, in dem Sie alle Artefakte beibehalten können, die dem Basisimage für die Anpassung hinzugefügt werden müssen. Standardmäßig ist der Wert ${{ GITHUB.WORKSPACE }}/workflow-artifacts.
customizer-destination Nein Dies ist das Verzeichnis im angepassten Bild, in das Artefakte kopiert werden.
customizer-windows-update Nein Nur für Windows. Boolescher Wert. Wenn true, wird Windows Update am Ende der Anpassungen durch den Image Builder ausgeführt.
dist-location Nein Für SharedImageGallery ist dies die dist-type.
dist-image-tags Nein Hierbei handelt es sich um benutzerdefinierte Tags, die dem erstellten benutzerdefinierten Bild hinzugefügt werden (Beispiel: version:beta).

Erstellen Ihres virtuellen Computers

Erstellen Sie als letzten Schritt einen virtuellen Computer aus Ihrem Image.

  1. Ersetzen Sie die Platzhalter für {rgName}ihren Ressourcengruppennamen.

  2. Fügen Sie einen GitHub-Geheimschlüssel mit dem Kennwort des virtuellen Computers (VM_PWD) hinzu. Notieren Sie sich das Kennwort unbedingt, da Sie es nicht wieder sehen können. 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ändige YAML-Datei

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

Nächste Schritte