Partager via


Créer des images de machine virtuelle personnalisées avec GitHub Actions et Azure

Commencez avec GitHub Actions en créant un flux de travail pour créer une image de machine virtuelle.

Avec GitHub Actions, vous pouvez accélérer votre processus CI/CD en créant des images de machine virtuelle personnalisées avec des artefacts à partir de vos flux de travail. Vous pouvez créer des images et les distribuer à une galerie d’images partagées.

Vous pouvez ensuite utiliser ces images pour créer des machines virtuelles et des groupes de machines virtuelles identiques.

L’action de création d'image de machine virtuelle utilise le service Azure Image Builder.

Prerequisites

Vue d’ensemble du fichier de workflow

Un workflow est défini par un fichier YAML (.yml) situé dans le chemin /.github/workflows/ de votre dépôt. Cette définition contient les étapes et les paramètres qui composent le workflow.

Le fichier comporte trois sections :

Section Tasks
Authentification 1. Ajoutez une identité managée par l’utilisateur.
2. Configurez un principal de service ou Open ID Connect.
3. Créez un secret GitHub.
Construire 1. Configurez l’environnement.
2. Générez l’application.
Image 1. Créez une image de machine virtuelle.
2. Créez une machine virtuelle.

Créer une identité managée par l’utilisateur

Vous aurez besoin d’une identité managée par l’utilisateur pour Azure Image Builder(AIB) pour distribuer des images. Votre identité managée assignée par l’utilisateur Azure sera utilisée pendant la construction de l’image pour lire et écrire des images dans une galerie d’images partagées Azure.

  1. Créez une identité managée par l’utilisateur avec Azure CLI ou le portail Azure. Notez le nom de votre identité managée.

  2. Personnalisez ce code JSON. Remplacez les espaces réservés pour {subscriptionID} et {rgName}par votre ID d’abonnement et le nom du groupe de ressources.

    {
    "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. Utilisez ce code JSON pour créer un rôle personnalisé avec JSON.

  4. Dans le portail Azure, ouvrez votre galerie de calcul Azure et accédez au contrôle d’accès (IAM).

  5. Sélectionnez Ajouter une attribution de rôle et attribuez le rôle de création d’image à votre identité managée par l’utilisateur.

Générer les informations d’identification du déploiement

Pour utiliser l’action de connexion Azure avec OIDC, vous devez configurer des informations d’identification d’identité fédérée sur une application Microsoft Entra ou une identité managée affectée par l’utilisateur.

Option 1 : application Microsoft Entra

Option 2 : identité managée affectée par l’utilisateur

Créer des secrets GitHub

Vous devez fournir l’ID client, l’ID d’annuaire (tenant), et l’ID d’abonnement de votre application à l’action de connexion. Vous pouvez fournir ces valeurs directement dans le workflow ou les stocker dans des secrets GitHub et les référencer dans votre workflow. L’enregistrement des valeurs en tant que secrets GitHub est l’option la plus sécurisée.

  1. Dans GitHub, accédez à votre dépôt.

  2. Sélectionnez Sécurité > Secrets et variables > Actions.

    Capture d’écran de l’ajout d’un secret

  3. Sélectionnez New repository secret (Nouveau secret de dépôt).

    Note

    Pour améliorer la sécurité des flux de travail dans des référentiels publics, utilisez des secrets d’environnement plutôt que des secrets de référentiel. Si l’environnement nécessite une approbation, un travail ne peut pas accéder aux secrets d’environnement tant que l’un des réviseurs requis ne l’approuve pas.

  4. Créez des secrets pour AZURE_CLIENT_ID, AZURE_TENANT_ID et AZURE_SUBSCRIPTION_ID. Copiez ces valeurs à partir de votre application Microsoft Entra ou de l’identité managée affectée par l’utilisateur pour vos secrets GitHub :

    Secret GitHub Application Microsoft Entra ou identité managée attribuée par l’utilisateur
    AZURE_CLIENT_ID ID de client
    AZURE_SUBSCRIPTION_ID Identifiant d’abonnement
    AZURE_TENANT_ID ID de l’annuaire (locataire)

    Note

    Pour des raisons de sécurité, nous vous recommandons d’utiliser des secrets GitHub plutôt que de passer des valeurs directement au flux de travail.

Utiliser l’action d'authentification Azure

Utilisez votre secret GitHub avec l’action de connexion Azure pour vous authentifier auprès d’Azure.

Pour Open ID Connect, vous allez utiliser des informations d’identification fédérées associées à votre application Active Directory.

Pour plus d’informations sur le référencement des secrets GitHub dans un fichier de flux de travail, consultez Utilisation de secrets chiffrés dans un flux de travail dans 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 }}

Configurer Java

Configurez l’environnement Java avec l’action du Kit de développement logiciel (SDK) d’installation Java. Pour cet exemple, vous allez configurer l’environnement, générer avec Maven, puis générer un artefact.

Les artefacts GitHub permettent de partager des fichiers dans un flux de travail entre les travaux. Vous allez créer un artefact pour contenir le fichier JAR, puis l’ajouter à l’image de machine virtuelle.

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

Créer votre image

Utilisez l’action Générer une image de machine virtuelle Azure pour créer une image de machine virtuelle personnalisée.

Remplacez les espaces réservés pour {subscriptionID}, {rgName} et {Identity} par votre ID d’abonnement, le nom du groupe de ressources et le nom de l’identité managée. Remplacez les valeurs de {galleryName} et {imageName} par le nom de votre galerie d’images et le nom de votre image.

Note

Si l’action Créer une image préconstruite d’application échoue avec une erreur d’autorisation, assurez-vous d'avoir attribué le rôle de création d'image à votre identité gérée par l'utilisateur.

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

Arguments d’action de machine virtuelle

Input Obligatoire Descriptif
resource-group-name Oui Groupe de ressources utilisé pour le stockage et l’enregistrement d’artefacts pendant le processus de construction.
image-builder-template-name Non Nom de la ressource de modèle de générateur d’images utilisée.
location Oui Emplacement où Azure Image Builder s’exécutera. Consultez les emplacements pris en charge.
build-timeout-in-minutes Non Heure après laquelle la build est annulée. La valeur par défaut est 240.
vm-size Optional Par défaut, Standard_D1_v2 sera utilisé. Consultez les tailles de machine virtuelle.
managed-identity Oui Identité managée par l’utilisateur que vous avez créée précédemment. Utilisez l’identificateur complet si votre identité se trouve dans un autre groupe de ressources. Utilisez le nom s’il se trouve dans le même groupe de ressources.
source-os Oui Type de système d’exploitation de l’image de base (Linux ou Windows)
source-image-type Oui Type d’image de base qui sera utilisé pour créer l’image personnalisée.
source-image Oui Identificateur de ressource pour l’image de base. Une image source doit être présente dans la même région Azure définie dans la valeur d’entrée de l’emplacement.
customizer-source Non Répertoire dans lequel vous pouvez conserver tous les artefacts qui doivent être ajoutés à l’image de base pour la personnalisation. Par défaut, la valeur est ${{ GITHUB.WORKSPACE }}/workflow-artifacts.
customizer-destination Non Il s’agit du répertoire de l’image personnalisée où les artefacts sont copiés.
customizer-windows-update Non Pour Windows uniquement. Valeur booléenne. Si true, le générateur d’images exécute windows update à la fin des personnalisations.
dist-location Non Pour SharedImageGallery, il s’agit du dist-type.
dist-image-tags Non Il s’agit de balises définies par l’utilisateur qui sont ajoutées à l’image personnalisée créée (exemple : version:beta).

Créer votre machine virtuelle

En dernière étape, créez une machine virtuelle à partir de votre image.

  1. Remplacez les espaces réservés {rgName} par le nom de votre groupe de ressources.

  2. Ajoutez un secret GitHub avec le mot de passe de la machine virtuelle (VM_PWD). Veillez à écrire le mot de passe, car vous ne pourrez pas le voir à nouveau. Le nom d’utilisateur est 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 }}"              

Compléter 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 }}"              

Étapes suivantes