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
- Compte Azure avec un abonnement actif. Créez un compte gratuitement.
- Compte GitHub avec un référentiel actif. Si vous n’en avez pas, inscrivez-vous gratuitement.
- Cet exemple utilise l’exemple d’application Java Spring PetClinic.
- Galerie de calcul Azure avec une image.
- Créez une galerie de calcul Azure.
- Créer une image.
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.
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.
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": [] } ] } }
Utilisez ce code JSON pour créer un rôle personnalisé avec JSON.
Dans Portail Azure, ouvrez votre galerie de calcul Azure et accédez au contrôle d’accès (IAM).
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
Dans GitHub, accédez à votre dépôt.
Sélectionnez Paramètres dans le volet de navigation.
Sélectionnez Sécurité > Secrets et variables > Actions.
Sélectionnez New repository secret (Nouveau secret de dépôt).
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
.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.
Remplacez les espaces réservés pour
{rgName}
par le nom de votre groupe de ressources.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 estmyuser
.
- 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
- Découvrez comment déployer dans Azure.