Delen via


Aangepaste installatiekopieën voor virtuele machines bouwen met GitHub Actions en Azure

Ga aan de slag met de GitHub Actions door een workflow te maken om een virtuele machine image te maken.

Met GitHub Actions kunt u uw CI/CD-proces versnellen door aangepaste installatiekopieën van virtuele machines te maken met artefacten uit uw werkstromen. U kunt zowel afbeeldingen maken als ze distribueren naar een Shared Image Gallery.

Vervolgens kunt u deze installatiekopieën gebruiken om virtuele machines en virtuele-machineschaalsets te maken.

De actie voor het bouwen van een virtuele machine-installatiekopie maakt gebruik van de Azure Image Builder-service.

Voorwaarden

Overzicht van werkstroombestand

Een werkstroom wordt gedefinieerd door een YAML-bestand (.yml) in het /.github/workflows/ pad in uw opslagplaats. Deze definitie bevat de verschillende stappen en parameters waaruit de werkstroom bestaat.

Het bestand heeft drie secties:

Afdeling Taken
verificatie 1. Een door de gebruiker beheerde identiteit toevoegen.
Stel een service-principal of Open ID Connect in.
3. Maak een GitHub-geheim.
bouw- 1. Stel de omgeving in.
2. Bouw de app.
afbeelding 1. Maak een VM-afbeelding.
2. Maak een virtuele machine.

Een door de gebruiker beheerde identiteit maken

U hebt een door de gebruiker beheerde identiteit nodig voor Azure Image Builder (AIB) om afbeeldingen te distribueren. Uw door de gebruiker toegewezen beheerde Identiteit van Azure wordt gebruikt tijdens de build van de installatiekopieën om afbeeldingen te lezen en te schrijven naar een Shared Image Gallery.

  1. Maak een door een gebruiker beheerde identiteit met Azure CLI- of de Azure Portal-. Noteer de naam van uw beheerde identiteit.

  2. Pas deze JSON-code aan. Vervang de tijdelijke aanduidingen voor {subscriptionID} en {rgName}met uw abonnements-ID en de naam van uw resourcegroep.

    {
    "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. Gebruik deze JSON-code om een nieuwe aangepaste rol te maken met JSON.

  4. Open uw Azure Compute Gallery in Azure Portal en ga naar IAM-(Access Control).

  5. Selecteer Roltoewijzing toevoegen en wijs de afbeeldingscreatierol toe aan uw door de gebruiker beheerde identiteit.

Implementatiereferenties genereren

Als u Azure-aanmeldingsactie met OIDC wilt gebruiken, moet u een federatieve identiteitsreferentie configureren in een Microsoft Entra-toepassing of een door de gebruiker toegewezen beheerde identiteit.

optie 1: Microsoft Entra-toepassing

optie 2: door de gebruiker toegewezen beheerde identiteit

GitHub-geheimen maken

U moet de client-id van uw toepassing opgeven, directory-id (tenant)en abonnements-id aan de aanmeldingsactie. Deze waarden kunnen rechtstreeks in de werkstroom worden opgegeven of kunnen worden opgeslagen in GitHub-geheimen en waarnaar wordt verwezen in uw werkstroom. Het opslaan van de waarden als GitHub-geheimen is de veiligere optie.

  1. Ga in GitHubnaar uw opslagplaats.

  2. Selecteer Beveiliging > Secrets en variabelen > Acties.

    schermopname van het toevoegen van een geheim

  3. Selecteer Nieuwe opslagplaatsgeheim.

    Notitie

    Als u de werkstroombeveiliging in openbare opslagplaatsen wilt verbeteren, gebruikt u omgevingsgeheimen in plaats van opslagplaatsgeheimen. Als voor de omgeving goedkeuring is vereist, heeft een taak geen toegang tot omgevingsgeheimen totdat een van de vereiste revisoren deze goedkeurt.

  4. Geheimen maken voor AZURE_CLIENT_ID, AZURE_TENANT_IDen AZURE_SUBSCRIPTION_ID. Kopieer deze waarden uit uw Microsoft Entra-toepassing of door de gebruiker toegewezen beheerde identiteit voor uw GitHub-geheimen:

    GitHub-geheim Microsoft Entra-toepassing of door de gebruiker toegewezen beheerde identiteit
    AZURE_CLIENT_ID Klant-ID
    AZURE_SUBSCRIPTION_ID Abonnements-id
    AZURE_TENANT_ID Directory-id (huurder)

    Notitie

    Om veiligheidsredenen raden we u aan GitHub Secrets te gebruiken in plaats van waarden rechtstreeks door te geven aan de werkstroom.

De azure-aanmeldingsactie gebruiken

Gebruik uw GitHub-geheim met de Azure-aanmeldingsactie om te verifiëren bij Azure.

In deze werkstroom authenticeert u zich met behulp van de Azure-aanmeldingsactie met de gegevens van de service-principal die zijn opgeslagen in secrets.AZURE_CREDENTIALS. Vervolgens voert u een Azure CLI-actie uit. Zie Versleutelde geheimen gebruiken in een werkstroombestand in GitHub Docs voor meer informatie over het verwijzen naar GitHub-geheimen in een werkstroombestand.

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

Java configureren

Stel de Java-omgeving in met de Java Setup SDK-actie. In dit voorbeeld stelt u de omgeving in, bouwt u met Maven en voert u vervolgens een artefact uit.

GitHub-artefacten zijn een manier om bestanden te delen in een werkstroom tussen taken. Je maakt een artefact aan om het JAR-bestand op te slaan en voegt het vervolgens toe aan de virtuele machine-image.

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

Bouw uw imago

Gebruik de actie Build Azure Virtual Machine Image om een aangepaste installatiekopie voor virtuele machines te maken.

Vervang de tijdelijke aanduidingen voor {subscriptionID}, {rgName}en {Identity} door jouw abonnements-id, de naam van de resourcegroep en de naam van de beheerde identiteit. Vervang de waarden van {galleryName} en {imageName} door de naam van je afbeeldingengalerij en je afbeeldingsnaam.

Notitie

Als de actie 'App Gebakken Afbeelding maken' mislukt met een machtigingsfout, controleer dan of u de rol 'Afbeelding Aanmaak' hebt toegewezen aan uw door de gebruiker beheerde identiteit.

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

Actieargumenten voor virtuele machines

Invoer Vereist Beschrijving
resource-group-name Ja De resourcegroep die wordt gebruikt voor opslag en het opslaan van artefacten tijdens het buildproces.
image-builder-template-name Nee De naam van de sjabloonresource voor de opbouwfunctie voor afbeeldingen.
location Ja De locatie waar Azure Image Builder wordt uitgevoerd. Zie ondersteunde locaties.
build-timeout-in-minutes Nee Tijd waarna de build wordt geannuleerd. De standaardwaarde is 240.
vm-size Facultatief Standaard wordt Standard_D1_v2 gebruikt. Zie grootten van virtuele machines.
managed-identity Ja De door de gebruiker beheerde identiteit die u eerder hebt gemaakt. Gebruik de volledige identifier als uw identiteit zich in een andere resources-groep bevindt. Gebruik de naam als deze zich in dezelfde resourcegroep bevindt.
source-os Ja Het type besturingssysteem van de basisinstallatiekopie (Linux of Windows)
source-image-type Ja Het basisimage-type dat zal worden gebruikt voor het maken van de aangepaste image.
source-image Ja De resource-identificatie voor de basisafbeelding. Een bronafbeelding moet aanwezig zijn in dezelfde Azure-regio die is ingesteld in de invoerwaarde van de locatie.
customizer-source Nee De map waarin u alle artefacten kunt bewaren die moeten worden toegevoegd aan de basisimage voor personalisatie. De waarde is standaard ${{ GITHUB.WORKSPACE }}/workflow-artifacts.
customizer-destination Nee Dit is de map in de aangepaste afbeelding waarnaar artefacten worden gekopieerd.
customizer-windows-update Nee Alleen voor Windows. Booleaanse waarde. Als truewaar is, voert de image builder Windows Update uit aan het einde van de customisaties.
dist-location Nee Voor SharedImageGallery is dit de dist-type.
dist-image-tags Nee Dit zijn door de gebruiker gedefinieerde tags die worden toegevoegd aan de aangepaste afbeeldingen die zijn gemaakt (bijvoorbeeld: version:beta).

Uw virtuele machine maken

Als laatste stap maakt u een virtuele machine op basis van uw image.

  1. Vervang de tijdelijke aanduidingen voor {rgName}door de naam van de resourcegroep.

  2. Voeg een GitHub-geheim toe met het wachtwoord van de virtuele machine (VM_PWD). Noteer het wachtwoord omdat u het niet meer kunt zien. De gebruikersnaam is 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 }}"              

YAML voltooien

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

Volgende stappen