Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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
- Un compte Azure avec un abonnement actif. Créez un compte gratuitement.
- Un compte GitHub avec un dépôt 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.
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.
Créez une identité managé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 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": [] } ] } }Utilisez ce code JSON pour créer un rôle personnalisé avec JSON.
Dans le 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
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
- Créez une application Microsoft Entra avec un principal de service par Portail Azure, Azure CLI ou PowerShell.
- Copiez les valeurs pour ID client et ID d’abonnement et ID d’annuaire (locataire). Vous en aurez besoin dans votre workflow GitHub Actions.
- Attribuez un rôle approprié à votre principal de service par le portail Azure, Azure CLI ou Azure PowerShell.
- Configurez des informations d’identification fédérées sur une application Microsoft Entra pour approuver les jetons émis par GitHub Actions pour votre référentiel GitHub.
Option 2 : identité managée affectée par l’utilisateur
- Créer une identité managée attribuée par l’utilisateur.
- Copiez les valeurs pour ID client et ID d’abonnement et ID d’annuaire (locataire). Vous en aurez besoin dans votre workflow GitHub Actions.
- Attribuez un rôle approprié à votre identité managée affectée par l’utilisateur.
- Configurez des informations d’identification fédérées sur une identité managée affectée par l’utilisateur pour approuver les jetons émis par GitHub Actions pour votre référentiel GitHub.
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.
Dans GitHub, accédez à votre dépôt.
Sélectionnez Sécurité > Secrets et variables > Actions.
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.
Créez des secrets pour
AZURE_CLIENT_ID,AZURE_TENANT_IDetAZURE_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.
Remplacez les espaces réservés
{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 à écrire le mot de passe, car vous ne pourrez pas le voir à nouveau. 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 }}"
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
- Découvrez comment déployer sur Azure.