Ce tutoriel explique comment utiliser un workflow GitHub Actions, pour déployer une application Web ASP.NET Model-View-Controller (MVC) qui utilise .NET Framework sur Google Kubernetes Engine (GKE).
Ce tutoriel est destiné aux développeurs et aux ingénieurs DevOps qui possèdent des connaissances de base sur Microsoft .NET, GitHub Actions et GKE. Vous devez également disposer d'un compte GitHub pour suivre ce tutoriel.
Objectifs
Déployer une application Web ASP.NET MVC qui utilise .NET Framework 4 et s'exécute sous Windows sur Google Kubernetes Engine.
Le schéma suivant illustre le workflow GitHub Actions permettant de déployer une application Web ASP.NET MVC sur Google Kubernetes Engine (GKE).

Ce tutoriel vous explique comment effectuer les tâches suivantes, en vue d'atteindre votre objectif :
- Créer un dépôt GitHub
- Configurer l'authentification
- Déployer un cluster GKE et un dépôt Artifact Registry
- Créer un workflow GitHub Actions
Coûts
Dans ce tutoriel, vous utilisez les composants facturables de suivants Google Cloud:
Obtenez une estimation des coûts en fonction de votre utilisation prévue,
utilisez le simulateur de coût.
Une fois que vous avez terminé les tâches décrites dans ce document, supprimez les ressources que vous avez créées pour éviter que des frais vous soient facturés. Pour en savoir plus, consultez la section Effectuer un nettoyage.
Avant de commencer
- Connectez-vous à votre Google Cloud compte. Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $de crédits sans frais pour exécuter, tester et déployer des charges de travail.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Artifact Registry and Google Kubernetes Engine APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Artifact Registry and Google Kubernetes Engine APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.
Créer un dépôt GitHub
Créez un fork du dépôt dotnet-docs-samples dans votre compte GitHub.
Cette étape est nécessaire, car nous allons effectuer la compilation avec GitHub Actions.
- Accédez au
dotnet-docs-samplesdépôt GitHub. - Cliquez sur Fork (Dupliquer).
Sur la page Create a new fork (Créer un fork), définissez les éléments suivants :
- Owner (Propriétaire) : votre compte GitHub
- Repository name (Nom du dépôt) :
dotnet-docs-samples
Cliquez sur Create fork (Créer un fork).
Configurer l'authentification
Préparez votre Google Cloud projet afin que GitHub Actions puisse s'authentifier et accéder aux ressources du Google Cloud projet.
Créer un pool d'identité de charge de travail et un fournisseur
Pour autoriser GitHub Actions à s'authentifier Google Cloud et à effectuer un déploiement sur GKE, utilisez la fédération d'identité de charge de travail. L'utilisation de la fédération d'identité de charge de travail vous évite d'avoir à stocker et gérer des clés de compte de service pour votre charge de travail GitHub Actions.
L'utilisation de la fédération d'identité de charge de travail nécessite un pool d'identité de charge de travail et un fournisseur. Nous vous recommandons d'utiliser un projet dédié pour gérer les pools d'identité de charge de travail et les fournisseurs. Dans ce tutoriel, par souci de simplicité, créez le pool et le fournisseur dans le même projet que votre cluster GKE :
Ouvrez la Google Cloud console.
-
Dans la Google Cloud console, activez Cloud Shell.
En bas de la fenêtre de la console, une session Cloud Shell démarre et affiche une invite de ligne de commande. Google Cloud Cloud Shell est un environnement shell dans lequel Google Cloud CLI est déjà installé, et dans lequel des valeurs sont déjà définies pour votre projet actuel. L'initialisation de la session peut prendre quelques secondes.
Créez un pool d'identité de charge de travail :
gcloud iam workload-identity-pools create github-actions \ --location="global" \ --description="GitHub Actions tutorial" \ --display-name="GitHub Actions"Ajoutez GitHub Actions en tant que fournisseur de pool d'identité de charge de travail :
gcloud iam workload-identity-pools providers create-oidc github-actions-oidc \ --location="global" \ --workload-identity-pool=github-actions \ --issuer-uri="https://token.actions.githubusercontent.com/" \ --attribute-mapping="google.subject=assertion.sub" \ --attribute-condition="assertion.repository_owner=='ORGANIZATION'"Remplacez
ORGANIZATIONpar le nom de votre organisation GitHub.
Créer un compte de service
Dans Cloud Shell, créez un compte de service que GitHub Actions peut utiliser pour publier des images Docker et effectuer un déploiement sur GKE :
SERVICE_ACCOUNT=$(gcloud iam service-accounts create github-actions-workflow \ --display-name "GitHub Actions workflow" \ --format "value(email)")
Attribuez le rôle de rédacteur Artifact Registry (
roles/artifactregistry.writer) au compte de service pour autoriser les actions GitHub à effectuer un push vers Artifact Registry :gcloud projects add-iam-policy-binding $(gcloud config get-value core/project) \ --member serviceAccount:$SERVICE_ACCOUNT \ --role roles/artifactregistry.writer
Attribuez le rôle de développeur Google Kubernetes Engine (
roles/container.developer) au compte de service pour autoriser les actions GitHub à effectuer un push vers Artifact Registry :gcloud projects add-iam-policy-binding $(gcloud config get-value core/project) \ --member serviceAccount:$SERVICE_ACCOUNT \ --role roles/container.developer
Autoriser le workflow GitHub Actions à utiliser le compte de service
Autorisez le workflow GitHub Actions à emprunter l'identité du compte de service et à l'utiliser :
Initialisez une variable d'environnement contenant le sujet utilisé par le workflow GitHub Actions. Un sujet est semblable à un nom d'utilisateur qui identifie de manière unique le dépôt et la branche GitHub :
SUBJECT=repo:
OWNER/dotnet-docs-samples:ref:refs/heads/mainRemplacez
OWNERpar votre nom d'utilisateur GitHub.Accordez au sujet l'autorisation d'emprunter l'identité du compte de service :
PROJECT_NUMBER=$(gcloud projects describe $(gcloud config get-value core/project) --format='value(projectNumber)') gcloud iam service-accounts add-iam-policy-binding $SERVICE_ACCOUNT \ --role=roles/iam.workloadIdentityUser \ --member="principal://iam.googleapis.com/projects/$PROJECT_NUMBER/locations/global/workloadIdentityPools/github-actions/subject/$SUBJECT"
Déployer un cluster GKE et un dépôt Artifact Registry
Créez un dépôt pour les images Docker :
gcloud artifacts repositories create clouddemo \ --repository-format=docker \ --location=us-central1
Autorisez le compte de service Compute Engine par défaut à accéder au dépôt :
gcloud projects add-iam-policy-binding $(gcloud config get-value core/project) \ --member=serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/artifactregistry.reader
Créez le cluster :
gcloud container clusters create clouddemo-windows \ --enable-ip-alias \ --zone us-central1-a gcloud container node-pools create clouddemo-windows-pool \ --cluster=clouddemo-windows \ --image-type=WINDOWS_LTSC_CONTAINERD \ --no-enable-autoupgrade \ --machine-type=n1-standard-2 \ --zone us-central1-a
Cette commande peut prendre plusieurs minutes.
Obtenez le nom et le numéro du projet du cluster :
echo "Project ID: $(gcloud config get-value core/project)" echo "Project Number: $(gcloud projects describe $(gcloud config get-value core/project) --format=value\(projectNumber\))"
Vous aurez besoin de ces valeurs ultérieurement.
Créer un workflow GitHub Actions
Vous pouvez maintenant utiliser GitHub Actions pour configurer une intégration continue. Pour chaque commit envoyé dans le dépôt Git, un workflow GitHub Actions compile le code et crée un package des artefacts de la compilation dans un conteneur Docker. Le conteneur est ensuite publié dans Artifact Registry.
Le dépôt contient déjà le fichier Dockerfile suivant :
Le dépôt contient également un fichier manifeste Kubernetes :
Créez un workflow GitHub Actions qui effectue les opérations suivantes :
- Authentifiez-vous à l'aide de la fédération d'identité de charge de travail et du compte de service que vous avez créé précédemment. Google Cloud
- Compilez une image Docker et déployez-la sur Artifact Registry.
- Déployez l'image Docker sur GKE.
Pour créer le workflow GitHub Actions, procédez comme suit :
- Sur GitHub, accédez à votre fork du
dotnet-docs-samplesdépôt. - Cliquez sur Add file (Ajouter un fichier) > Create new file (Créer un fichier).
Dans le champ de texte Name your file (Nommer votre fichier), saisissez le nom suivant :
.github/workflows/deploy-gke.yaml
Copiez le code suivant dans le fichier :
name: Build and Deploy to GKE on: push: branches: - main env: PROJECT_ID:PROJECT_IDPROJECT_NUMBER:PROJECT_NUMBERCLUSTER: clouddemo-windows CLUSTER_ZONE: us-central1-a REPOSITORY: clouddemo REPOSITORY_REGION: us-central1 IMAGE: clouddemo jobs: build: runs-on: windows-2019 # Matches WINDOWS_LTSC in GKE permissions: id-token: write contents: read steps: - name: Checkout uses: actions/checkout@v3 # # Authenticate to Google Cloud using workload identity federation # - id: 'auth' name: 'Obtain access token by using workload identity federation' uses: 'google-github-actions/auth@v0' with: create_credentials_file: true token_format: access_token workload_identity_provider: projects/${{ env.PROJECT_NUMBER }}/locations/global/workloadIdentityPools/github-actions/providers/github-actions-oidc service_account: github-actions-workflow@${{ env.PROJECT_ID }}.iam.gserviceaccount.com - name: Connect to Artifact Registry run: |- echo ${{ steps.auth.outputs.access_token }} | docker login -u oauth2accesstoken --password-stdin https://${{ env.REPOSITORY_REGION }}-docker.pkg.dev - name: Connect to GKE uses: google-github-actions/get-gke-credentials@v0 with: cluster_name: ${{ env.CLUSTER }} location: ${{ env.CLUSTER_ZONE }} # # Build the .NET code # - name: Setup MSBuild uses: microsoft/setup-msbuild@v1 - name: Setup NuGet uses: NuGet/setup-nuget@v1 - name: Restore NuGet packages run: nuget restore applications/clouddemo/net4/CloudDemo.Mvc.sln - name: Build solution run: msbuild /t:Rebuild /p:Configuration=Release /p:DeployOnBuild=true /p:PublishProfile=FolderProfile /nologo applications/clouddemo/net4/CloudDemo.Mvc.sln # # Build the Docker image and push it to Artifact Registry # - name: Create image tag run: echo "IMAGE_TAG=${{ env.REPOSITORY_REGION }}-docker.pkg.dev/${{ env.PROJECT_ID }}/${{ env.REPOSITORY }}/${{ env.IMAGE }}:$env:GITHUB_SHA" >> $env:GITHUB_ENV - name: Lock image version in deployment.yaml shell: pwsh run: (Get-Content applications\clouddemo\net4\deployment.yaml) -replace "CLOUDDEMO_IMAGE","${{ env.IMAGE_TAG }}" | Out-File -Encoding ASCII applications\clouddemo\net4\deployment.yaml - name: Build Docker image run: docker build --tag "${{ env.IMAGE_TAG }}" applications/clouddemo/net4 - name: Publish Docker image to Google Artifact Registry run: docker push "${{ env.IMAGE_TAG }" # # Deploy to GKE # - name: Deploy to GKE run: kubectl apply -f applications/clouddemo/net4/deployment.yamlRemplacez les valeurs suivantes :
PROJECT_ID: ID de projet du projet contenant le cluster GKE.PROJECT_NUMBER: numéro de projet du projet contenant le cluster GKE.
Dans la section Commit new file (Valider le nouveau fichier), saisissez un message de commit, par exemple
Add workflow, puis cliquez sur Commit new file (Valider le nouveau fichier).Dans le menu, cliquez sur Actions et attendez la fin du workflow.
Le workflow peut prendre plusieurs minutes.
Dans la Google Cloud console, actualisez la page Services & Ingress.
Accédez à l'onglet Ingress (Entrée).
Recherchez le service d'Ingress pour le cluster clouddemo et attendez que son état bascule sur Ok. Cela peut prendre quelques minutes.
Ouvrez le lien dans la colonne Frontends (Interfaces) de la même ligne. L'équilibreur de charge a besoin de quelques minutes pour devenir disponible. Il est donc possible que l'application CloudDemo ne se charge pas au début. Lorsque l'équilibreur de charge est prêt, l'application CloudDemo s'affiche avec le titre personnalisé, qui s'exécute cette fois-ci dans le cluster de production.
Effectuer un nettoyage
Une fois le tutoriel terminé, vous pouvez procéder au nettoyage des ressources que vous avez créées afin qu'elles ne soient plus comptabilisées dans votre quota et qu'elles ne vous soient plus facturées. Dans les sections suivantes, nous allons voir comment supprimer ou désactiver ces ressources.
Supprimer le dépôt GitHub
Pour supprimer le dépôt GitHub, consultez Supprimer un dépôt. La suppression du dépôt entraîne la perte de toutes les modifications du code source.
Supprimer le projet
Le moyen le plus simple d’éliminer la facturation consiste à supprimer le projet que vous avez créé pour ce tutoriel.
Supprimer un Google Cloud projet :
gcloud projects delete PROJECT_ID
Étape suivante
- Déployez, gérez et faites évoluer des applications conteneurisées sur Kubernetes.
- Consultez les bonnes pratiques dans le Google Cloud framework d'architecture.
- Découvrez des architectures de référence, des schémas et des bonnes pratiques concernant Google Cloud. Consultez notre Cloud Architecture Center.