Tutoriel : Utiliser GitHub Actions pour déployer sur un conteneur personnalisé App Service et se connecter à une base de données

Ce tutoriel vous guidera tout au long du processus de configuration d'un workflow GitHub Actions visant à déployer une application ASP.NET Core conteneurisée avec un back-end Azure SQL Database . Quand vous avez terminé, vous disposez d’une application ASP.NET s’exécutant dans Azure et connectée à SQL Database. Vous allez d'abord créer des ressources Azure à l'aide d'un workflow GitHub Actions de modèle ARM.

Dans ce tutoriel, vous allez apprendre à :

  • Utiliser un workflow GitHub Actions pour ajouter des ressources à Azure à l'aide d'un modèle Azure Resource Manager (modèle ARM)
  • Utiliser un workflow GitHub Actions pour créer un conteneur à l'aide des dernières modifications apportées à l'application web

Si vous n’avez pas d’abonnement Azure, créez un compte gratuit Azure avant de commencer.

Prérequis

Pour suivre ce didacticiel, vous aurez besoin des éléments suivants :

Télécharger l’exemple

Dupliquez (fork) l'exemple de projet dans le référentiel Exemples Azure.

https://github.com/Azure-Samples/dotnetcore-containerized-sqldb-ghactions/

Créer le groupe de ressources

Ouvrez Azure Cloud Shell sur https://shell.azure.com. Vous pouvez également utiliser l'interface de ligne de commande Azure si vous l'avez installée localement. (Pour plus d'informations sur Cloud Shell, consultez Présentation de Cloud Shell).

    az group create --name {resource-group-name} --location {resource-group-location}

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

OpenID Connect est une méthode d’authentification qui utilise des jetons de courte durée. La configuration d’OpenID Connect avec GitHub Actions est un processus plus complexe qui offre une sécurité renforcée.

  1. Si vous n’avez aucune application existante, inscrivez une nouvelle application Microsoft Entra ID et un principal de service pouvant accéder aux ressources.

    az ad app create --display-name myApp
    

    Cette commande affiche une sortie JSON avec un appId qui est votre client-id. Le id est APPLICATION-OBJECT-ID et il sera utilisé pour créer des informations d’identification fédérées avec des appels d’API Graph. Enregistrez la valeur à utiliser comme secret GitHub AZURE_CLIENT_ID ultérieurement.

  2. Créer un principal de service. Remplacez le $appID par l’appID de votre sortie JSON.

    Cette commande génère une sortie JSON avec un principal de service id. Le principal de service id est utilisé comme valeur de l’argument --assignee-object-id de la commande az role assignment create à l’étape suivante.

    Copiez le appOwnerOrganizationId depuis la sortie JSON à utiliser ultérieurement comme secret GitHub pour AZURE_TENANT_ID.

     az ad sp create --id $appId
    
  3. Créez une attribution de rôle pour votre principal de service. Par défaut, l’attribution de rôle est liée à votre abonnement par défaut. Remplacez $subscriptionId par votre ID d’abonnement, $resourceGroupName par le nom de votre groupe de ressources et $servicePrincipalId par l’ID du principal de service créé.

    az role assignment create --role contributor --subscription $subscriptionId --assignee-object-id  $servicePrincipalId --assignee-principal-type ServicePrincipal --scope /subscriptions/$subscriptionId/resourceGroups/$resourceGroupName
    
  4. Exécutez la commande suivante pour créer des informations d’identification à l’identité fédérée pour votre application Microsoft Entra ID.

    • Remplacez APPLICATION-OBJECT-ID par l’objectId (généré lors de la création de l’application) pour votre application Microsoft Entra ID.
    • Définissez une valeur pour CREDENTIAL-NAME que vous référencerez ultérieurement.
    • Définissez subject. Cette valeur est définie par GitHub en fonction de votre workflow :
      • Travaux dans votre environnement GitHub Actions : repo:< Organization/Repository >:environment:< Name >
      • Pour les tâches non liées à un environnement, incluez le chemin de référence (ref path) de la branche/étiquette en fonction du chemin de référence utilisé pour déclencher le workflow : repo:< Organization/Repository >:ref:< ref path>. Par exemple, repo:n-username/ node_express:ref:refs/heads/my-branch ou repo:n-username/ node_express:ref:refs/tags/my-tag.
      • Pour les workflows déclenchés par un événement de demande de tirage (pull request) : repo:< Organization/Repository >:pull_request.
    az ad app federated-credential create --id <APPLICATION-OBJECT-ID> --parameters credential.json
    ("credential.json" contains the following content)
    {
        "name": "<CREDENTIAL-NAME>",
        "issuer": "https://token.actions.githubusercontent.com",
        "subject": "repo:octo-org/octo-repo:environment:Production",
        "description": "Testing",
        "audiences": [
            "api://AzureADTokenExchange"
        ]
    }
    

Pour savoir comment créer une application Active Directory, un principal de service et des informations d’identification fédérées dans le portail Azure, consultez Connecter GitHub et Azure.

Configurer le secret GitHub pour l’authentification

Vous devez fournir l’ID de client, l’ID de locataire 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 Paramètres dans le volet de navigation.

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

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

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

  5. Créez des secrets pour AZURE_CLIENT_ID, AZURE_TENANT_ID et AZURE_SUBSCRIPTION_ID. Utilisez ces valeurs à partir de votre application Microsoft Entra pour vos secrets GitHub :

    Secret GitHub Application Microsoft Entra
    AZURE_CLIENT_ID ID d’application (client)
    AZURE_TENANT_ID ID de l’annuaire (locataire)
    AZURE_SUBSCRIPTION_ID Identifiant d’abonnement
  6. Enregistrez chaque secret en sélectionnant Ajouter un secret.

Ajouter un secret SQL Server

Dans votre référentiel, créez un secret pour SQL_SERVER_ADMIN_PASSWORD. Il peut s'agir de n'importe quel mot de passe conforme aux normes Azure en matière de sécurité des mots de passe. Enregistrez ce mot de passe séparément car vous n'y aurez plus accès ensuite.

Créer des ressources Azure

Le workflow de création de ressources Azure exécute un modèle ARM pour déployer les ressources vers Azure. Le workflow :

Pour exécuter le workflow de création de ressources Azure :

  1. Ouvrez le fichier azuredeploy.yaml dans .github/workflows au sein de votre référentiel.

  2. Remplacez la valeur de AZURE_RESOURCE_GROUP par le nom de votre groupe de ressources.

  3. Mettez à jour les valeurs de WEB_APP_NAME et de SQL_SERVER_NAME sur votre nom d’application web et sur le nom de serveur SQL.

  4. Accédez à Actions et sélectionnez Exécuter le workflow.

    Exécutez le workflow GitHub Actions permettant d'ajouter les ressources.

  5. Vérifiez qu'une coche verte apparaît sur la page Actions pour vous assurer que votre action a bien été exécutée.

    Exécution réussie de la création des ressources.

Ajouter un registre de conteneurs et des secrets SQL

  1. Sur le portail Azure, ouvrez l'instance d'Azure Container Registry que vous venez de créer dans votre groupe de ressources.

  2. Accédez à Clés d'accès et copiez le nom d'utilisateur et le mot de passe.

  3. Dans votre référentiel, créez de nouveaux secrets GitHub pour ACR_USERNAME et ACR_PASSWORD.

  4. Sur le portail Azure, ouvrez votre base de données Azure SQL. Ouvrez Chaînes de connexion et copiez la valeur.

  5. Créez un secret pour SQL_CONNECTION_STRING. Remplacez la valeur {your_password} par vôtre valeur SQL_SERVER_ADMIN_PASSWORD.

Créer, envoyer et déployer votre image

Le workflow de création, d'envoi et de déploiement génère un conteneur qui intègre les dernières modifications apportées à l'application, envoie le conteneur à Azure Container Registry et met à jour l'emplacement de préproduction de l'application web pour qu'il pointe vers le dernier conteneur envoyé. Le workflow contient un travail de création et de déploiement :

  • Le travail de création extrait le code source à l'aide de l'action d'extraction. Le travail utilise ensuite l'action de connexion à Docker et un script personnalisé pour s'authentifier auprès d'Azure Container Registry, générer une image conteneur et la déployer sur Azure Container Registry.
  • Le travail de déploiement se connecte à Azure à l'aide de l'action de connexion à Azure et recueille des informations sur l'environnement et les ressources Azure. Le travail procède ensuite à la mise à jour des paramètres de l'application web à l'aide de l'action des paramètres Azure App Service, et lance le déploiement sur un emplacement de préproduction App Service à l'aide de l'action Azure Web Deploy. Enfin, le travail exécute un script personnalisé pour mettre à jour la base de données SQL et bascule l'emplacement de préproduction vers la production.

Pour exécuter le workflow de création, d'envoi et de déploiement :

  1. Ouvrez votre fichier build-deploy.yaml dans .github/workflows au sein de votre référentiel.

  2. Vérifiez que les variables d'environnement de AZURE_RESOURCE_GROUP et WEB_APP_NAME correspondent à celles du fichier azuredeploy.yaml.

  3. Mettez à jour la valeur ACR_LOGIN_SERVER de votre serveur de connexion Azure Container Registry.

Étapes suivantes