Partager via


Créer des images de machines virtuelles personnalisées avec GitHub Actions et Azure

Prise en main de GitHub Actions avec la création d’un workflow pour construire une image de machine virtuelle.

GitHub Actions vous permet d’accélérer votre processus d’intégration continue et de livraison continue (CI/CD) en créant des images de machines virtuelles personnalisées avec des artefacts à partir de vos workflows. 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 Créer une image de machine virtuelle utilise le service Azure Image Builder.

Prérequis

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 Tâches
Authentification 1. Ajoutez une identité managée par l’utilisateur.
2. Configurez un principal de service ou un Connecter Open ID.
3. Créez un secret GitHub.
Créer 1. Configurez l’environnement.
2. Générer 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

Pour distribuer des images, vous aurez besoin d’une identité managée par l’utilisateur pour Azure Image Builder (AIB). Votre identité managée attribuée par l’utilisateur Azure sera utilisée lors de la création de l’image pour lire et écrire des images dans une galerie d’images partagées.

  1. Créez une identité géré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 de votre 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 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

Créez un principal de service à l’aide de la commande az ad sp create-for-rbac dans Azure CLI. Exécutez cette commande en utilisant Azure Cloud Shell dans le portail Azure ou en sélectionnant le bouton Essayer.

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

Le paramètre --json-auth est disponible dans les versions d’Azure CLI >= 2.51.0. Les versions antérieures à celle-ci utilisent --sdk-auth avec un avertissement de dépréciation.

Dans l’exemple ci-dessus, remplacez les espaces réservés par votre ID d’abonnement, le nom de votre groupe de ressources et le nom de votre application. La sortie correspond à un objet JSON avec les informations d’identification de l’attribution de rôle qui fournit l’accès à votre application App Service, similaire à ce qui suit. Copiez cet objet JSON pour une version ultérieure.

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

Créer des secrets GitHub

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

  2. Sélectionnez Paramètres dans le volet de navigation.

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

    Screenshot of adding a secret

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

  5. Collez l’intégralité de la sortie JSON de la commande Azure CLI dans le champ de valeur du secret. Nommez le secret AZURE_CREDENTIALS.

  6. Sélectionnez Ajouter un secret.

Utiliser l’action de connexion Azure

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

Dans ce workflow, vous vous authentifiez à l’aide de l’action Connexion Azure avec les détails du principal de service stockés dans secrets.AZURE_CREDENTIALS. Ensuite, vous exécutez une action Azure CLI. Pour plus d’informations sur le référencement des secrets GitHub dans un fichier de workflow, consultez Utilisation de secrets chiffrés dans un workflow dans les documents GitHub.

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

Configurer Java

Configurez l’environnement Java avec l’action du SDK d’installation Java. Pour cet exemple, vous allez configurer l’environnement, générer avec Maven, puis produire un artefact.

Les artefacts GitHub sont un moyen de partager des fichiers dans un workflow entre des tâches. Vous allez créer un artefact pour stocker 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@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

Créer votre image

Utilisez l’action Créer 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.

Remarque

Si l’action Créer une image baked d’application échoue avec une erreur d’autorisation, vérifiez que vous avez affecté le rôle de création d’image à votre identité managé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 la machine virtuelle

Input Requis Description
resource-group-name Oui Groupe de ressources utilisé pour le stockage et l’enregistrement des artefacts pendant le processus de génération.
image-builder-template-name Non Nom de la ressource du modèle de générateur d’images utilisée.
location Oui L’emplacement est la région dans laquelle Image Builder sera exécuté. Voir 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 Facultatif Standard_D1_v2 est utilisé par défaut. Voir Tailles des machines virtuelles.
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 groupe de ressources différent. 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 pour 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 dans l’image personnalisée dans lequel les artefacts sont copiés.
customizer-windows-update Non Pour Windows uniquement. . Si true, le générateur d’images exécutera Windows Update à la fin des personnalisations.
dist-location Non Pour SharedImageGallery, il s’agit de 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 guise de dernière étape, créez une machine virtuelle à partir de votre image.

  1. Remplacez les espaces réservés pour {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 à noter le mot de passe, car vous ne pourrez plus le voir. 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 }}"              

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

Étapes suivantes