Démarrage rapide : Utiliser GitHub Actions pour envoyer (push) vers Azure Artifacts

Azure DevOps Services

Commencez à utiliser GitHub Actions et Azure Artifacts ensemble. GitHub Actions vous aide à automatiser vos flux de travail de développement logiciel à partir de GitHub. Vous pouvez utiliser GitHub Actions pour effectuer un déploiement sur un flux Azure Artifacts.

Vous pouvez vous authentifier à l’aide d’une identité managée ou d’un jeton d’accès personnel (PAT). Un jeton d'accès personnel (PAT) est un jeton généré par l'utilisateur qui accorde l'accès aux ressources Azure DevOps. Une identité managée est un type de principal de service qu’Azure gère automatiquement pour autoriser l’authentification sans mot de passe entre les services Azure et Azure DevOps. L’identité managée est l’option d’authentification plus sécurisée.

Prérequis

Remarque

Une autre approche consiste à utiliser une application Microsoft Entra avec un principal de service et des informations d’identification d’authentification fédérées pour connecter Azure DevOps et GitHub Actions. Pour en savoir plus sur cette approche, consultez Configurer une application pour approuver un fournisseur d’identité externe.

Attribuer des autorisations à votre identité managée dans Azure DevOps

Pour affecter votre identité managée à l’équipe Contributeur , procédez comme suit :

  1. Connectez-vous à votre projet (https://dev.azure.com/{Your_Organization/Your_Project}).

  2. Accédez à Paramètres du projet.

  3. Sélectionnez Général>Autorisations.

  4. Choisissez le groupe Contributeurs .

    Capture d’écran montrant comment sélectionner le groupe Contributeurs dans les paramètres d’autorisations du projet Azure DevOps.

  5. Sélectionnez l’onglet Membres , puis sélectionnez Ajouter.

  6. Cherchez et trouvez l'identité gérée.

  7. Sélectionnez Enregistrer pour ajouter l’identité au groupe Contributeurs .

    Capture d’écran montrant l’onglet Membres dans lequel vous ajoutez une identité managée au groupe Contributeurs dans Azure DevOps.

Créer des secrets GitHub

Vous devez fournir l’ID client, l’ID de locataire et l’ID d’abonnement de votre identité managée à l’action de connexion. Ces valeurs sont stockées dans les secrets GitHub et référencées dans votre flux de travail.

  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 identité managée pour vos secrets GitHub :

    Secret de 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.

Créer un workflow GitHub qui génère un artefact

Les flux de travail GitHub sont une série d’actions similaires aux tâches dans Azure Pipelines. Ce flux de travail automatise le processus de création, de test, d’empaquetage et de publication d’un projet .NET sur Azure Artifacts à l’aide d’une identité managée et d’une authentification fédérée. Le workflow :

  1. Utilise l’action Azure/login pour vous connecter à Azure à l’aide d’une identité managée.
  2. Installe le fournisseur d’informations d’identification pour Azure Artifacts.
  3. Extrait un jeton d’accès à l’aide d’Azure CLI et configure le fournisseur d’authentification pour utiliser le jeton Azure DevOps.
  4. Configure un environnement CLI .NET Core à l’aide de l’action setup-dotnet.
  5. Restaure les dépendances, génère le projet et ses dépendances dans un ensemble de fichiers binaires et exécute tous les tests unitaires associés au projet.
  6. Packe le code dans un package NuGet avec la variable d’environnement GitHub Run ID incluse dans le numéro de version.
  7. Publie le package NuGet sur Azure Artifacts.

Créer un fichier YAML

  1. Dans votre dépôt GitHub, créez un fichier YAML dans le .github/workflows répertoire.

  2. Copiez le contenu suivant dans votre fichier YAML. Personnalisez les valeurs AZURE_ARTIFACTS_FEED_URL, BUILD_CONFIGURATION, et DOTNET_VERSION.

    • Définissez AZURE_ARTIFACTS_FEED_URL sur l'URL du registre pour votre flux Azure Artifacts.
    • Définissez BUILD_CONFIGURATION.
    • Définissez DOTNET_VERSION pour la version de votre projet.
    name: Push a NuGet package to Azure Artifacts with managed identity and federated authentication
    
    on:
      push:
        branches:
          - main
    
    permissions:
      id-token: write # Require write permission to Fetch an federated identity token.
      contents: read # Require read permission to access the repository contents.
    
    env:
      AZURE_ARTIFACTS_FEED_URL: https://pkgs.dev.azure.com/myorg/nuget-artifact/_packaging/Fabrikam_Feed/nuget/v3/index.json    
      BUILD_CONFIGURATION: 'Release'    # set this to the appropriate build configuration
      DOTNET_VERSION: '6.0' 
      NuGetDirectory: ${{ github.workspace}}/nuget
      VSS_NUGET_URI_PREFIXES: https://pkgs.dev.azure.com/myorg/
    
    
    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
          # Checkout the repo
          - uses: actions/checkout@v4
            with:
              token: ${{ secrets.GITHUB_TOKEN }}
    
          - name: Azure CLI Login
            uses: azure/login@v2
            with:
              client-id: ${{ secrets.AZURE_CLIENT_ID }}
              tenant-id: ${{ secrets.AZURE_TENANT_ID }}
              subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
    
          # Setup .NET Core SDK
          - name: Setup .NET Core
            uses: actions/setup-dotnet@v3
            with:
              dotnet-version: ${{ env.DOTNET_VERSION }}
    
          # Run dotnet build and package
          - name: dotnet build and test
            run: |
              dotnet restore
              dotnet build --configuration '${{ env.BUILD_CONFIGURATION }}'
              dotnet test --configuration '${{ env.BUILD_CONFIGURATION }}'
    
        # Create the NuGet package in the folder from the environment variable NuGetDirectory
          - run: dotnet pack --configuration Release --output ${{ env.NuGetDirectory }}
    
        # Publish the NuGet package as an artifact, so they can be used in the following jobs
          - uses: actions/upload-artifact@v3
            with:
              name: nuget
              if-no-files-found: error
              retention-days: 7
              path: ${{ env.NuGetDirectory }}/*.nupkg
    
      az-artifacts-build-and-deploy:
        needs: build
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v4
            with:
              token: ${{ secrets.GITHUB_TOKEN }}
    
          - name: Azure CLI Login
            uses: azure/login@v2
            with:
              client-id: ${{ secrets.AZURE_CLIENT_ID }}
              tenant-id: ${{ secrets.AZURE_TENANT_ID }}
              subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
    
          - uses: actions/download-artifact@v3
            with:
              name: nuget
              path: ${{ env.NuGetDirectory }}
    
          - name: Setup .NET Core
            uses: actions/setup-dotnet@v3
            with:
              dotnet-version: ${{ env.DOTNET_VERSION }}
              source-url: ${{ env.AZURE_ARTIFACTS_FEED_URL }}
            env:
              NUGET_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}
    
          - name: Install credential provider for Azure Artifacts
            run: sh -c "$(curl -fsSL https://aka.ms/install-artifacts-credprovider.sh)"
    
          - name: Extract access token
            run: |
                accessToken=$(az account get-access-token --query accessToken --resource 499b84ac-1321-427f-aa17-267ca6975798 -o tsv)
                echo "::add-mask::$accessToken"
                echo "ACCESS_TOKEN=$accessToken" >> $GITHUB_ENV
    
          - name: Configure authentication provider to use Azure DevOps token
            run: |
              echo "VSS_NUGET_ACCESSTOKEN=$ACCESS_TOKEN" >> $GITHUB_ENV
    
          - name: dotnet build and publish
            run: |
              dotnet restore
              dotnet build --configuration '${{ env.BUILD_CONFIGURATION }}'
              dotnet pack --configuration '${{ env.BUILD_CONFIGURATION }}' --output ./nupkg --version-suffix ${{ github.run_id }}
    
          - name: 'Publish the package to Azure Artifacts'
            run: dotnet nuget push ${{ env.NuGetDirectory }}/*.nupkg --api-key AzureDevOps --source ${{ env.AZURE_ARTIFACTS_FEED_URL }}    
    

Prérequis

  • Un compte GitHub avec un référentiel. Rejoignez GitHub et créez un référentiel.
  • Flux Azure Artifacts vers lequel vous envoyez votre package NuGet à partir d’un flux de travail GitHub. Mettre en route du package NuGet.
  • Jeton d’accès personnel (PAT) Azure DevOps à utiliser avec votre action GitHub. Créer un PAT.
    • Votre PAT doit disposer d’autorisations de lecture, d’écriture et de gestion des packages .

S’authentifier avec Azure Pipelines

Utilisez un jeton d’accès personnel (PAT) pour connecter votre compte GitHub à Azure DevOps. Vous pouvez générer un PAT à partir d’Azure DevOps, puis le stocker en tant que secret GitHub. Dans votre flux de travail GitHub, référencez le secret afin que votre action GitHub puisse s’authentifier auprès de votre projet Azure DevOps.

  1. Ouvrez votre dépôt GitHub et accédez à Settings (Paramètres).

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

    Choisir d’ajouter un secret

  3. Collez votre PAT et attribuez-lui le nom AZURE_DEVOPS_TOKEN.

  4. Sélectionnez Ajouter un secret.

Créer un workflow GitHub qui génère un artefact

Les workflows GitHub sont une série d’actions (comme des tâches dans Azure Pipelines). Ce workflow :

  1. Configure un environnement CLI .NET Core à l’aide de l’action setup-dotnet.
  2. Restaure les dépendances, génère le projet et ses dépendances dans un ensemble de fichiers binaires et exécute tous les tests unitaires associés au projet.
  3. Packe le code dans un package NuGet avec la variable d’environnement GitHub Run ID incluse dans le numéro de version.
  4. Publie le package NuGet sur Azure Artifacts.

Créer un fichier YAML

  1. Dans votre dépôt GitHub, créez un fichier YAML dans le .github/workflows répertoire.

  2. Copiez le contenu suivant dans votre fichier YAML. Personnalisez les valeurs AZURE_ARTIFACTS_FEED_URL, BUILD_CONFIGURATION et DOTNET_VERSION.

    • Définissez AZURE_ARTIFACTS_FEED_URL sur l'URL du registre pour votre flux Azure Artifacts.
    • Définissez BUILD_CONFIGURATION.
    • Définissez DOTNET_VERSION sur la version de votre projet.
    name: Push a NuGet package to Azure Artifacts
    
    on:
      push:
        branches:
          - main
    
    env:
      AZURE_ARTIFACTS_FEED_URL: https://pkgs.dev.azure.com/myorg/nuget-artifact/_packaging/Fabrikam_Feed/nuget/v3/index.json    
      BUILD_CONFIGURATION: 'Release'    # set this to the appropriate build configuration
      DOTNET_VERSION: '6.x' 
    
    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
          # Checkout the repo
          - uses: actions/checkout@v2
    
          # Setup .NET Core SDK
          - name: Setup .NET Core
            uses: actions/setup-dotnet@v1
            with:
              dotnet-version: ${{ env.DOTNET_VERSION }}
    
          # Run dotnet build and package
          - name: dotnet build and test
            run: |
              dotnet restore
              dotnet build --configuration '${{ env.BUILD_CONFIGURATION }}'
              dotnet test --configuration '${{ env.BUILD_CONFIGURATION }}'
    
      az-artifacts-build-and-deploy:
        needs: build
        runs-on: ubuntu-latest
        steps:
          # Checkout the repo
          - uses: actions/checkout@v2
    
          # Setup .NET Core SDK
          - name: Setup .NET Core
            uses: actions/setup-dotnet@v1
            with:
              dotnet-version: ${{ env.DOTNET_VERSION }}
              source-url: ${{ env.AZURE_ARTIFACTS_FEED_URL }}
            env:
              NUGET_AUTH_TOKEN: ${{ secrets.AZURE_DEVOPS_TOKEN }} 
    
          # Run dotnet build and package
          - name: dotnet build and publish
            run: |
              dotnet restore
              dotnet build --configuration '${{ env.BUILD_CONFIGURATION }}'
              dotnet pack -c '${{ env.BUILD_CONFIGURATION }}' --version-suffix $GITHUB_RUN_ID
    
          # Publish the package to Azure Artifacts
          - name: 'dotnet publish'
            run: dotnet nuget push bin/Release/*.nupkg --api-key AzureDevOps --source ${{ env.AZURE_ARTIFACTS_FEED_URL }}    
    
    
  3. Accédez à votre flux Azure Artifacts pour vérifier que vous voyez le package que vous avez envoyé.

    Capture d’écran de la page du flux Azure Artifacts affichant le package NuGet récemment publié.

Nettoyer les ressources

Si vous ne prévoyez pas de continuer à utiliser votre workflow GitHub, désactivez le flux de travail.

Étapes suivantes