Comment utiliser GitHub Actions pour effectuer un déploiement sur Azure ?
Cette leçon traite de l’utilisation de GitHub Actions pour déployer une application web basée sur un conteneur sur Microsoft Azure Web Apps. Il couvre certaines options pour déclencher un workflow. Découvrez ensuite comment utiliser des conditionnels dans le workflow. Découvrez enfin comment créer et supprimer des ressources Azure à l’aide de GitHub Actions.
Options de déclenchement d’un workflow CD
Il existe plusieurs options pour démarrer un workflow CD. Dans le module précédent sur CI avec GitHub Actions, vous avez appris à déclencher un workflow à partir d’un push vers le dépôt GitHub. Toutefois, pour le déploiement continu, vous pouvez souhaiter déclencher un workflow de déploiement sur un autre événement.
Une option consiste à déclencher le workflow avec ChatOps. ChatOps utilise des clients de conversation, des chatbots et des outils de communication en temps réel pour exécuter des tâches. Par exemple, vous pouvez indiquer un commentaire spécifique dans une demande de tirage (pull request) pour lancer un bot. Ce bot peut répondre avec des statistiques ou exécuter un workflow.
Une autre option, qui est celle illustrée dans notre exemple, consiste à utiliser des étiquettes dans votre demande de tirage. Il est possible de démarrer différents workflows avec différentes étiquettes. Par exemple, ajoutez une étiquette d’index pour démarrer un workflow de déploiement à votre environnement intermédiaire. Vous pouvez également ajouter une étiquette d’environnement de rotation pour exécuter le workflow qui crée les ressources Microsoft Azure que vous déployez. Pour utiliser des étiquettes, voici à quoi doit ressembler votre workflow :
on:
pull_request:
types: [labeled]
Contrôler l’exécution avec une condition de travail
Souvent, vous souhaitez uniquement exécuter un workflow si une condition est vraie.
Les workflows GitHub fournissent la conditionnelle if
pour ce scénario. La condition utilise une expression qui est évaluée au moment du runtime. Par exemple, vous voulez exécuter ce workflow si une étiquette index est ajoutée à la demande de tirage.
if: contains(github.event.pull_request.labels.*.name, 'stage')
Stocker des informations d’identification avec GitHub Secrets
Vous ne souhaitez jamais exposer des informations sensibles dans le fichier de workflow. GitHub Secrets est un emplacement sécurisé pour stocker des informations sensibles nécessaires à votre workflow. Prenons un exemple.
Pour pouvoir effectuer un déploiement sur une ressource Azure, l’action GitHub doit avoir l’autorisation d’accéder à la ressource. Ne stockez pas vos informations d’identification Azure en clair dans le fichier de workflow. Au lieu de cela, vous pouvez stocker vos informations d’identification dans GitHub Secrets.
Pour stocker des informations dans GitHub Secrets, créez un secret dans le portail.
Ensuite, utilisez le nom du secret créé dans votre workflow, chaque fois que vous avez besoin de ces informations. Par exemple, utilisez les informations d’identification Azure stockées dans GitHub Secrets dans l’attribut creds:
d’une action Azure login
.
steps:
- name: "Login via Azure CLI"
uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
Déployer sur Microsoft Azure à l’aide de GitHub Actions
GitHub Marketplace comprend plusieurs actions pour vous aider à automatiser des tâches liées à Azure.
Vous pouvez également rechercher et parcourir dans GitHub Actions directement dans l’éditeur de workflow d’un référentiel. Dans la barre latérale, vous pouvez rechercher une action spécifique, afficher les actions proposées et parcourir les catégories proposées.
Pour rechercher une action :
- Dans votre référentiel, accédez au fichier de workflow que vous souhaitez modifier.
- Sélectionnez l’icône Modification située dans l’angle supérieur droit de l’affichage du fichier.
- Utilisez la barre latérale de Place de marché GitHub à droite de l’éditeur pour parcourir les actions.
Supposons que vous souhaitiez déployer une application web basée sur un conteneur dans Azure Web Apps. Si vous lancez une recherche dans la Place de marché GitHub, vous trouvez les actions suivantes :
- azure/webapps-deploy@v1
- azure/login@v1 que nous avons vu précédemment
- azure/docker-login@v1
Si vous ajoutez ces actions au travail Deploy-to-Azure
, votre workflow ressemble à ceci :
Deploy-to-Azure:
runs-on: ubuntu-latest
needs: Build-Docker-Image
name: Deploy app container to Azure
steps:
- name: "Login via Azure CLI"
uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
- uses: azure/docker-login@v1
with:
login-server: ${{env.IMAGE_REGISTRY_URL}}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Deploy web app container
uses: azure/webapps-deploy@v1
with:
app-name: ${{env.AZURE_WEBAPP_NAME}}
images: ${{env.IMAGE_REGISTRY_URL}}/${{ github.repository }}/${{env.DOCKER_IMAGE_NAME}}:${{ github.sha }}
- name: Azure logout
run: |
az logout
Notez que ce travail dépend d’un travail précédent, Build-Docker-Image
. Le travail précédent crée l’artefact qui est déployé.
L’action azure/login@v1 a besoin d’informations d’identification pour se connecter à votre compte Azure et accéder aux ressources Azure sur lesquelles vous souhaitez effectuer le déploiement. Utilisez ici les informations d’identification que nous avons stockées dans GitHub Secrets.
Il en va de même pour l’action azure/docker-login@v1. Étant donné que vous déployez une image conteneur, vous devez vous connecter à votre registre de conteneurs privé.
L’action azure/webapps-deploy@v1 effectue le déploiement. Elles dépendent des deux actions précédentes.
Créer et supprimer des ressources Azure à l’aide de GitHub Actions
Étant donné que le déploiement continu est un processus automatisé, vous avez déjà décidé d’utiliser une IaC (infrastructure as code) pour créer et supprimer les environnements dans lesquels vous déployez. GitHub Actions peut automatiser ces tâches sur Azure, et vous pouvez inclure ces actions dans votre workflow.
Notes
Rappelez-vous qu’il est important de supprimer les ressources dont vous n’avez plus besoin le plus rapidement possible pour éviter les frais inutiles.
Une option est de créer un workflow avec deux travaux : une qui démarre les ressources et une qui les supprime. Ensuite, utilisez une condition pour exécuter uniquement le travail de votre choix. Dans cet exemple, la condition recherche une étiquette dans la demande de tirage et exécute le travail set-up-azure-resources
si l’étiquette est spin up environment et le travail destroy-azure-resources
si l’étiquette est destroy environment.
jobs:
set-up-azure-resources:
runs-on: ubuntu-latest
if: contains(github.event.pull_request.labels.*.name, 'spin up environment')
...
destroy-azure-resources:
runs-on: ubuntu-latest
if: contains(github.event.pull_request.labels.*.name, 'destroy environment')
...
Les travaux utilisent l’interface de ligne de commande Azure (Azure CLI) pour créer et détruire les ressources Azure. Pour plus d’informations sur l’interface Azure CLI, consultez Présentation d’Azure CLI.
Voici un exemple des étapes dans le travail set-up-azure-resources
:
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Azure login
uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
- name: Create Azure resource group
if: success()
run: |
az group create --location ${{env.AZURE_LOCATION}} --name ${{env.AZURE_RESOURCE_GROUP}} --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}
- name: Create Azure app service plan
if: success()
run: |
az appservice plan create --resource-group ${{env.AZURE_RESOURCE_GROUP}} --name ${{env.AZURE_APP_PLAN}} --is-linux --sku F1 --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}
- name: Create webapp resource
if: success()
run: |
az webapp create --resource-group ${{ env.AZURE_RESOURCE_GROUP }} --plan ${{ env.AZURE_APP_PLAN }} --name ${{ env.AZURE_WEBAPP_NAME }} --deployment-container-image-name nginx --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}
- name: Configure webapp to use GitHub Packages
if: success()
run: |
az webapp config container set --docker-custom-image-name nginx --docker-registry-server-password ${{secrets.GITHUB_TOKEN}} --docker-registry-server-url https://docker.pkg.github.com --docker-registry-server-user ${{github.actor}} --name ${{ env.AZURE_WEBAPP_NAME }} --resource-group ${{ env.AZURE_RESOURCE_GROUP }} --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}
Notez que vous utilisez des actions GitHub pour extraire le dépôt et vous connecter à Azure. Après cela, vous créez les ressources dont vous avez besoin et déployez le conteneur à l’aide d’Azure CLI.