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 skalningsuppsättningar för virtuella datorer.

Åtgärden för att bygga virtuell maskinbild 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:

Section Tasks
autentisering 1. Lägg till en användarhanterad identitet.
2. Konfigurera tjänstens huvudnamn eller Öppna ID Connect.
3. Skapa en GitHub-hemlighet.
Bygge 1. Konfigurera miljön.
2. Skapa appen.
Image 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 avbildningsprocessen 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

Om du vill använda Azure Login-åtgärden med OIDC måste du konfigurera en federerad identitetsautentiseringsuppgift i ett Microsoft Entra-program eller en användartilldelad hanterad identitet.

Alternativ 1: Microsoft Entra-program

Alternativ 2: Användartilldelad hanterad identitet

Skapa GitHub-hemligheter

Du måste ange programmets klient-ID, katalog (tenant)-ID och prenumerations-ID för inloggningsåtgärden. Dessa värden kan antingen anges direkt i arbetsflödet eller lagras i GitHub-hemligheter och refereras till i arbetsflödet. Att spara värdena som GitHub-hemligheter är det säkrare alternativet.

  1. Gå till din lagringsplats i GitHub.

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

    Skärmbild av att lägga till hemlig information

  3. Välj Ny lagringsplatshemlighet.

    Anmärkning

    Om du vill förbättra arbetsflödets säkerhet på offentliga lagringsplatser använder du miljöhemligheter i stället för lagringsplatshemligheter. Om miljön kräver godkännande kan ett jobb inte komma åt miljöhemligheter förrän en av de nödvändiga granskarna godkänner det.

  4. Skapa hemligheter för AZURE_CLIENT_ID, AZURE_TENANT_IDoch AZURE_SUBSCRIPTION_ID. Kopiera dessa värden från ditt Microsoft Entra-program eller användartilldelade hanterade identiteter för dina GitHub-hemligheter:

    GitHub-hemlighet Microsoft Entra-program eller användartilldelad hanterad identitet
    AZURE_CLIENT_ID Klient-ID
    AZURE_SUBSCRIPTION_ID Prenumerations-ID
    AZURE_TENANT_ID Katalog-ID (hyresgäst)

    Anmärkning

    Av säkerhetsskäl rekommenderar vi att du använder GitHub Secrets i stället för att skicka värden direkt till arbetsflödet.

Använda Azure-inloggningsåtgärden

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

För Open ID Connect använder du en federerad autentiseringsuppgift som är associerad med din Active Directory-app.

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@v2
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

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

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.

Anmärkning

Om åtgärden Skapa app-bakad bild misslyckas med ett behörighetsfel, kontrollera att du har tilldelat rollen för bildskapande 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 Krävs Description
resource-group-name Yes 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 Yes Platsen där Azure Image Builder ska köras. Se platser som stöds.
build-timeout-in-minutes Nej Tid efter vilken bygget avbryts. Standardinställning är 240.
vm-size Valfritt Som standard Standard_D1_v2 används. Se storlekar för virtuella datorer.
managed-identity Yes 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 Yes Operativsystemtypen för basavbildningen (Linux eller Windows)
source-image-type Yes Den basavbildningstyp som ska användas för att skapa den anpassade avbildningen.
source-image Yes 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 detta dist-type.
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@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ästa steg