Condividi tramite


Creare immagini di macchine virtuali personalizzate con GitHub Actions e Azure

Per iniziare a usare GitHub Actions , creare un flusso di lavoro per creare un'immagine di macchina virtuale.

Con GitHub Actions è possibile velocizzare il processo CI/CD creando immagini di macchine virtuali personalizzate con artefatti dai flussi di lavoro. È possibile creare immagini e distribuirle in una raccolta immagini condivise.

È quindi possibile usare queste immagini per creare macchine virtuali e set di scalabilità di macchine virtuali.

L'azione di creazione dell'immagine per la macchina virtuale utilizza il servizio Azure Image Builder.

Prerequisiti

Panoramica dei file del flusso di lavoro

Un flusso di lavoro viene definito da un file YAML (con estensione yml) nel percorso /.github/workflows/ del repository. Questa definizione contiene i vari passaggi e i parametri che costituiscono il flusso di lavoro.

Il file include tre sezioni:

Sezione Tasks
Autenticazione 1. Aggiungere un'identità gestita dall'utente.
2. Configurare un Principale del Servizio oppure Open ID Connect.
3. Creare un segreto GitHub.
Costruire 1. Configurare l'ambiente.
2. Compilare l'app.
Image 1. Creare un'immagine di macchina virtuale.
2. Creare una macchina virtuale.

Creare un'identità gestita dall'utente

Per distribuire le immagini, è necessaria un'identità gestita dall'utente per Azure Image Builder (AIB). L'identità gestita assegnata dall'utente di Azure verrà usata durante la creazione dell'immagine per leggere e scrivere immagini in una Raccolta Immagini Condivise.

  1. Creare identità gestita dall'utente con Azure CLI o il portale di Azure. Annotare il nome dell'identità gestita.

  2. Personalizzare questo codice JSON. Sostituire i segnaposto {subscriptionID} e {rgName} con l'ID della sottoscrizione e il nome del gruppo di risorse.

    {
    "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. Usare questo codice JSON per creare un nuovo ruolo personalizzato con JSON.

  4. Nel portale di Azure, apri la raccolta di calcolo di Azure e vai a Controllo di accesso (IAM).

  5. Selezionare Aggiungi assegnazione di ruolo e assegnare il ruolo di creazione dell'immagine all'identità gestita dall'utente.

Generare le credenziali per la distribuzione

Per usare l'azione di accesso di Azure con OIDC, è necessario configurare una credenziale di identità federata in un'applicazione Microsoft Entra o in un'identità gestita assegnata dall'utente.

Opzione 1: applicazione Microsoft Entra

Opzione 2: identità gestita assegnata dall'utente

Creare segreti di GitHub

È necessario specificare l'ID client, l'ID directory (tenant) e l'ID della sottoscrizione della tua applicazione nell'azione di accesso. Questi valori possono essere forniti direttamente nel flusso di lavoro oppure possono essere archiviati nei segreti gitHub e riportati nel flusso di lavoro. Salvare i valori come segreti GitHub è l'opzione più sicura.

  1. In GitHub, andare al proprio repository.

  2. Selezionare Sicurezza > Segreti e variabili > Azioni.

    Screenshot dell'aggiunta di un segreto

  3. Selezionare Nuovo segreto del repository.

    Annotazioni

    Per migliorare la sicurezza del flusso di lavoro nei repository pubblici, usare i segreti dell'ambiente anziché i segreti del repository. Se l'ambiente richiede l'approvazione, un processo non può accedere ai segreti dell'ambiente finché uno dei revisori necessari non lo approva.

  4. Creare segreti per AZURE_CLIENT_ID, AZURE_TENANT_IDe AZURE_SUBSCRIPTION_ID. Copiare questi valori dall'applicazione Microsoft Entra o dall'identità gestita assegnata dall'utente per i segreti GitHub:

    Segreto GitHub Applicazione Microsoft Entra o identità gestita assegnata dall'utente
    AZURE_CLIENT_ID ID cliente
    AZURE_SUBSCRIPTION_ID ID sottoscrizione
    AZURE_TENANT_ID ID della directory (cliente)

    Annotazioni

    Per motivi di sicurezza, è consigliabile usare i segreti di GitHub anziché passare i valori direttamente al flusso di lavoro.

Usare l'azione di accesso di Azure

Usare il segreto GitHub con Azione di accesso ad Azure per autenticarsi su Azure.

Per Open ID Connect si userà una credenziale federata associata all'app Active Directory.

Per altre informazioni sul riferimento ai segreti GitHub in un file del flusso di lavoro, vedere Uso di segreti crittografati in un flusso di lavoro in 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 }}

Configurare Java

Configurare l'ambiente Java con l'azione Java Setup SDK. Per questo esempio si configurerà l'ambiente, si compilerà con Maven e quindi si restituirà un artefatto.

Gli artefatti di GitHub sono un modo per condividere i file in un flusso di lavoro tra processi. Si creerà un artefatto per contenere il file JAR e quindi aggiungerlo all'immagine della macchina virtuale.

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

Creare l'immagine

Usare l'azione Compila immagine macchina virtuale di Azure per creare un'immagine di macchina virtuale personalizzata.

Sostituire i segnaposto per {subscriptionID}, {rgName} e {Identity} con l'ID sottoscrizione, il nome del gruppo di risorse e il nome dell'identità gestita. Sostituire i valori di {galleryName} e {imageName} con il nome della galleria di immagini e il nome dell'immagine.

Annotazioni

Se l'azione Crea immagine baked dell'app ha esito negativo con un errore di permessi, verificare di aver assegnato il Ruolo di creazione dell'immagine all'identità gestita dall'utente.

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

Argomenti delle azioni delle macchine virtuali

Input Obbligatorio Description
resource-group-name Yes Gruppo di risorse usato per l'archiviazione e il salvataggio degli artefatti durante il processo di compilazione.
image-builder-template-name NO Nome della risorsa modello del generatore di immagini usata.
location Yes La posizione in cui verrà eseguito Azure Image Builder. Vedere i percorsi supportati.
build-timeout-in-minutes NO Tempo di annullamento del build. Il valore predefinito è 240.
vm-size Opzionale Per impostazione predefinita, Standard_D1_v2 verrà usato . Vedere Dimensioni delle macchine virtuali.
managed-identity Yes Identità gestita dall'utente creata in precedenza. Utilizzare l'identificatore completo se l'identità si trova in un gruppo di risorse diverso. Utilizzare il nome se si trova nello stesso gruppo di risorse.
source-os Yes Tipo di sistema operativo dell'immagine di base (Linux o Windows)
source-image-type Yes Tipo di immagine di base che verrà usato per la creazione dell'immagine personalizzata.
source-image Yes Identificatore della risorsa per l'immagine di base. Un'immagine di origine deve essere presente nella stessa area di Azure impostata nel valore di input della posizione.
customizer-source NO Directory in cui è possibile mantenere tutti gli artefatti che devono essere aggiunti all'immagine di base per la personalizzazione. Per impostazione predefinita, il valore è ${{ GITHUB.WORKSPACE }}/workflow-artifacts.
customizer-destination NO Si tratta della directory nell'immagine personalizzata in cui vengono copiati gli artefatti.
customizer-windows-update NO Solo per Windows. Valore booleano. Se true, il generatore di immagini eseguirà l'aggiornamento di Windows alla fine delle personalizzazioni.
dist-location NO Per SharedImageGallery, si tratta di dist-type.
dist-image-tags NO Si tratta di tag definiti dall'utente che vengono aggiunti all'immagine personalizzata creata (ad esempio: version:beta).

Creare la macchina virtuale

Come ultimo passaggio, creare una macchina virtuale dall'immagine.

  1. Sostituire i segnaposto per {rgName}con il nome del gruppo di risorse.

  2. Aggiungere un segreto GitHub con la password della macchina virtuale (VM_PWD). Assicurarsi di annotare la password perché non sarà possibile visualizzarla di nuovo. Il nome utente è 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 }}"              

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

Passaggi successivi