Skapa anpassade avbildningar av virtuella datorer med GitHub Actions och Azure

Kom igång med GitHub Actions genom att skapa ett arbetsflöde för att skapa en avbildning av en virtuell dator.

Med GitHub Actions kan du påskynda CI/CD-processen genom att skapa anpassade avbildningar av virtuella datorer med artefakter från dina arbetsflöden. Du kan både skapa avbildningar och distribuera dem till ett delat bildgalleri.

Du kan sedan använda dessa avbildningar för att skapa virtuella datorer och vm-skalningsuppsättningar.

Avbildningsåtgärden skapa virtuell dator använder Azure Image Builder-tjänsten.

Förutsättningar

Översikt över arbetsflödesfil

Ett arbetsflöde definieras av en YAML-fil (.yml) i /.github/workflows/ sökvägen på lagringsplatsen. Den här definitionen innehåller de olika steg och parametrar som utgör arbetsflödet.

Filen har tre avsnitt:

Avsnitt Uppgifter
Autentisering 1. Lägg till en användarhanterad identitet.
2. Konfigurera tjänstens huvudnamn eller Öppna ID Anslut.
3. Skapa en GitHub-hemlighet.
Bygge 1. Konfigurera miljön.
2. Skapa appen.
Bild 1. Skapa en VM-avbildning.
2. Skapa en virtuell dator.

Skapa en användarhanterad identitet

Du behöver en användarhanterad identitet för Azure Image Builder (AIB) för att distribuera avbildningar. Din användartilldelade hanterade Identitet i Azure används under avbildningsversionen för att läsa och skriva bilder till ett delat bildgalleri.

  1. Skapa en användarhanterad identitet med Azure CLI eller Azure-portalen. Skriv ned namnet på din hanterade identitet.

  2. Anpassa den här JSON-koden. Ersätt platshållarna för {subscriptionID} och {rgName}med ditt prenumerations-ID och resursgruppsnamn.

    {
    "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. Använd den här JSON-koden för att skapa en ny anpassad roll med JSON.

  4. Öppna Azure Compute-galleriet i Azure-portalen och gå till Åtkomstkontroll (IAM)..

  5. Välj Lägg till rolltilldelning och tilldela rollen Bildskapande till din användarhanterade identitet.

Generera autentiseringsuppgifter för distribution

Skapa ett huvudnamn för tjänsten med kommandot az ad sp create-for-rbac i Azure CLI. Kör det här kommandot med Azure Cloud Shell i Azure-portalen eller genom att välja knappen Prova .

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

Parametern --json-auth är tillgänglig i Azure CLI-versioner >= 2.51.0. Versioner före den här användningen --sdk-auth med en utfasningsvarning.

I exemplet ovan ersätter du platshållarna med ditt prenumerations-ID, resursgruppsnamn och appnamn. Utdata är ett JSON-objekt med autentiseringsuppgifterna för rolltilldelning som ger åtkomst till din App Service-app på liknande sätt som nedan. Kopiera det här JSON-objektet för senare.

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

Skapa GitHub-hemligheter

  1. Gå till din lagringsplats i GitHub.

  2. Gå till Inställningar i navigeringsmenyn.

  3. Välj Säkerhetshemligheter > och variabler > Åtgärder.

    Screenshot of adding a secret

  4. Välj Ny lagringsplatshemlighet.

  5. Klistra in hela JSON-utdata från Azure CLI-kommandot i hemlighetens värdefält. Ge hemligheten namnet AZURE_CREDENTIALS.

  6. Välj Add secret (Lägg till hemlighet).

Använda Azure-inloggningsåtgärden

Använd din GitHub-hemlighet med azure-inloggningsåtgärden för att autentisera till Azure.

I det här arbetsflödet autentiserar du med hjälp av Azure-inloggningsåtgärden med informationen om tjänstens huvudnamn som lagras i secrets.AZURE_CREDENTIALS. Sedan kör du en Azure CLI-åtgärd. Mer information om hur du refererar till GitHub-hemligheter i en arbetsflödesfil finns i Använda krypterade hemligheter i ett arbetsflöde i 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 }}'

Konfigurera Java

Konfigurera Java-miljön med åtgärden Java Setup SDK. I det här exemplet konfigurerar du miljön, skapar med Maven och matar sedan ut en artefakt.

GitHub-artefakter är ett sätt att dela filer i ett arbetsflöde mellan jobb. Du skapar en artefakt för att lagra JAR-filen och sedan lägga till den i den virtuella datorbilden.

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

Skapa avbildningen

Använd åtgärden Skapa Azure Virtual Machine Image för att skapa en anpassad avbildning av virtuella datorer.

Ersätt platshållarna för {subscriptionID}, {rgName}och {Identity} med ditt prenumerations-ID, resursgruppsnamn och hanterade identitetsnamn. Ersätt värdena {galleryName} för och {imageName} med ditt bildgallerinamn och ditt bildnamn.

Kommentar

Om åtgärden Skapa appbakad avbildning misslyckas med ett behörighetsfel kontrollerar du att du har tilldelat rollen Skapa bild till din användarhanterade identitet.

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

Åtgärdsargument för virtuell dator

Indata Obligatoriskt Beskrivning
resource-group-name Ja Den resursgrupp som används för att lagra och spara artefakter under byggprocessen.
image-builder-template-name Nej Namnet på den mallresurs för avbildningsverktyget som används.
location Ja Platsen där Azure Image Builder ska köras. Se platser som stöds.
build-timeout-in-minutes Nej Tid efter vilken bygget avbryts. Standardvärdet är 240.
vm-size Valfritt Som standard Standard_D1_v2 används. Se storlekar för virtuella datorer.
managed-identity Ja Den användarhanterade identitet som du skapade tidigare. Använd den fullständiga identifieraren om din identitet finns i en annan resursgrupp. Använd namnet om det finns i samma resursgrupp.
source-os Ja Operativsystemtypen för basavbildningen (Linux eller Windows)
source-image-type Ja Den basavbildningstyp som ska användas för att skapa den anpassade avbildningen.
source-image Ja Resursidentifieraren för basavbildningen. En källbild ska finnas i samma Azure-region som anges i indatavärdet för platsen.
customizer-source Nej Katalogen där du kan behålla alla artefakter som behöver läggas till i basavbildningen för anpassning. Som standard är värdet ${{ GITHUB.WORKSPACE }}/workflow-artifacts.
customizer-destination Nej Det här är katalogen i den anpassade avbildningen där artefakter kopieras till.
customizer-windows-update Nej Endast för Windows. Booleskt värde. Om truekör avbildningsverktyget Windows Update i slutet av anpassningarna.
dist-location Nej För SharedImageGallery är dist-typedetta .
dist-image-tags Nej Det här är användardefinierade taggar som läggs till i den anpassade avbildningen som skapats (exempel: version:beta).

Skapa en virtuell dator

Som ett sista steg skapar du en virtuell dator från avbildningen.

  1. Ersätt platshållarna för {rgName}med resursgruppens namn.

  2. Lägg till en GitHub-hemlighet med lösenordet för den virtuella datorn (VM_PWD). Var noga med att skriva ned lösenordet eftersom du inte kommer att kunna se det igen. Användarnamnet är 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 }}"              

Slutför 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 }}"              

Nästa steg