Delen via


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

Ga aan de slag met de GitHub Actions door een werkstroom te maken om een installatiekopieën van een virtuele machine 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 installatiekopieën maken als distribueren naar een shared image gallery.

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

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

Vereisten

Overzicht van werkstroom bestand

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

Het bestand heeft drie secties:

Sectie Opdrachten
Verificatie 1. Een door de gebruiker beheerde identiteit toevoegen.
2. Stel een service-principal of Open ID-Verbinding maken in.
3. Maak een GitHub-geheim.
Bouwen 1. Stel de omgeving in.
2. Bouw de app.
Installatiekopie 1. Maak een VM-installatiekopieën.
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 installatiekopieën 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 de gebruiker beheerde identiteit met Azure CLI of Azure Portal. Noteer de naam van uw beheerde identiteit.

  2. Pas deze JSON-code aan. Vervang de tijdelijke aanduidingen voor {subscriptionID} en {rgName}door de naam van uw abonnements-id en 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 Toegangsbeheer (IAM).

  5. Selecteer Roltoewijzing toevoegen en wijs de rol Voor het maken van afbeeldingen toe aan uw door de gebruiker beheerde identiteit.

Genereer implementatiereferenties

Maak een service-principal met de opdracht az ad sp create-for-rbac in de Azure CLI. Voer deze opdracht uit met Azure Cloud Shell in de Azure Portal of door de knop Uitproberen te selecteren.

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

De parameter --json-auth is beschikbaar in Azure CLI-versies >= 2.51.0. Versies vóór dit gebruik --sdk-auth met een afschaffingswaarschuwing.

Vervang in het bovenstaande voorbeeld de tijdelijke aanduidingen door uw abonnements-id, resourcegroepnaam en app-naam. De uitvoer is een JSON-object met de roltoewijzingsreferenties die toegang bieden tot uw App Service-app, vergelijkbaar met hieronder. Kopieer dit JSON-object voor later gebruik.

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

GitHub-geheimen maken

  1. Ga in GitHub naar uw opslagplaats.

  2. Ga naar Instellingen in het navigatiemenu.

  3. Selecteer Acties voor beveiligingsgeheimen > en variabelen>.

    Screenshot of adding a secret

  4. Selecteer Nieuw opslagplaatsgeheim.

  5. Plak de volledige JSON-uitvoer van de Azure CLI-opdracht in het waardeveld van het geheim. Geef het geheim de naam AZURE_CREDENTIALS.

  6. Selecteer Geheim toevoegen.

De azure-aanmeldingsactie gebruiken

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

In deze werkstroom verifieert u met behulp van de azure-aanmeldingsactie met de details 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 werkstroom in GitHub Docs voor meer informatie over het verwijzen naar GitHub-geheimen in een werkstroom .

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. U maakt een artefact om het JAR-bestand op te slaan en vervolgens toe te voegen aan de installatiekopieën van de virtuele machine.

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

Uw installatiekopie bouwen

Gebruik de actie Installatiekopieën voor virtuele Azure-machines bouwen om een aangepaste installatiekopieën voor virtuele machines te maken.

Vervang de tijdelijke aanduidingen voor {subscriptionID}en {rgName}{Identity} door de abonnements-id, de naam van de resourcegroep en de naam van de beheerde identiteit. Vervang de waarden van en {imageName} door de naam van {galleryName} de installatiekopieëngalerie en de naam van uw installatiekopieën.

Notitie

Als de actie App Baked Image maken mislukt met een machtigingsfout, controleert u of u de rol Voor het maken van afbeeldingen 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 Omschrijving
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. Bekijk ondersteunde locaties.
build-timeout-in-minutes Nee Tijd waarna de build wordt geannuleerd. De standaardwaarde is 240.
vm-size Optioneel Standard_D1_v2 Standaard wordt deze gebruikt. Zie de grootten van virtuele machines.
managed-identity Ja De door de gebruiker beheerde identiteit die u eerder hebt gemaakt. Gebruik de volledige id als uw identiteit zich in een andere resourcegroep 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 basisinstallatiekopietype dat wordt gebruikt voor het maken van de aangepaste installatiekopie.
source-image Ja De resource-id voor de basisinstallatiekopieën. 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 basisinstallatiekopieën voor aanpassing. 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 truede opbouwfunctie voor installatiekopieën Windows Update uitvoert aan het einde van de aanpassingen.
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 installatiekopieën die zijn gemaakt (bijvoorbeeld: version:beta).

Uw virtuele machine maken

Als laatste stap maakt u een virtuele machine op basis van uw installatiekopieën.

  1. Vervang de tijdelijke aanduidingen door {rgName}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