Automatiser les actions des projets dans votre dépôt Git

Dans ce didacticiel, vous apprendrez à configurer un pipeline pour déclencher une mise à jour dans votre projet lorsque les modifications de configuration sont fusionnées dans la branche principale de votre référentiel. En suivant ce didacticiel, vous apprendrez à automatiser les tâches courantes d'un projet, telles que la validation d'une configuration, en utilisant les pipelines et les chaînes d'outils de votre choix.

Il s'agit d'une fonctionnalité expérimentale disponible à des fins d'évaluation et de test et susceptible d'être modifiée sans préavis.

Ce didacticiel se concentre sur un cas d'utilisation simple de mise à jour d'une configuration dans un projet lorsque les modifications sont fusionnées dans la branche principale de votre référentiel, comme illustré dans l'image suivante :

 L'image montre une mise à jour qui passe du projet à une branche latérale du référentiel. Ensuite, une flèche indique que la branche latérale est fusionnée dans la branche principale, ce qui déclenche le pipeline CD. Le pipeline CD inclut un déclencheur pour mettre à jour les configurations de votre projet en fonction des mises à jour de votre branche principale.
Mise à jour automatique de votre projet après la fusion des modifications dans votre branche principale

Étant donné que les pipelines et les chaînes d’outils sont personnalisables, les principes de ce didacticiel peuvent vous aider à automatiser d’autres actions courantes au sein d’un projet, telles que la validation et le déploiement des modifications de configuration après leur fusion dans la branche principale de votre référentiel. Ce tutoriel utilise les actions et les workflows GitHub pour automatiser un pipeline entre le référentiel et le projet. Au fur et à mesure que vous terminez le didacticiel, adaptez chaque étape pour qu'elle corresponde aux pipelines et processus CI et CD de votre référentiel.

Vous ne pouvez valider et déployer des brouillons de configuration qu'après leur fusion dans la branche de votre référentiel qui gère vos pipelines CD. Vous devez également synchroniser les mises à jour de votre référentiel dans votre projet en mettant à jour les configurations avant de pouvoir valider et déployer ces configurations. Vous pouvez automatiser cette mise à jour en utilisant la méthode API project.config.update (comme décrit dans ce tutoriel) ou en utilisant la commande CLI ibmcloud project config-update.

Avant de commencer

  1. Assurez-vous que vous avez le rôle d'éditeur sur le service IBM Cloud Projects.
  2. Suivez les étapes pour connecter votre projet à un référentiel Git. Pour les besoins de ce tutoriel, connectez un projet vide à un référentiel GitHub.

Ajout de secrets et de variables à GitHub

Créez des secrets et des variables dans le référentiel GitHub que vous avez connecté à votre projet. Ces secrets et variables sont utilisés dans le workflow GitHub. Ajoutez les secrets et variables suivants :

  1. Pour vous authentifier auprès de votre projet, vous devez inclure une clé API IBM Cloud dans votre workflow GitHub. Pour sécuriser la clé API, suivez les étapes pour créer un secret pour un référentiel afin d'enregistrer la clé API en tant que secret dans GitHub. Pour les besoins de ce tutoriel, nommez le secret IBM_CLOUD_API_KEY.

  2. Ensuite, suivez les étapes pour créer des variables de configuration pour votre référentiel GitHub. Sauvegardez les variables suivantes :

    Liste des variables à enregistrer dans votre référentiel GitHub
    Nom de la variable Valeur Description
    CONFIG_FOLDER_PATH configs Le chemin d'accès au dossier du référentiel connecté à votre projet. Ce dossier contient les fichiers de configuration de votre projet.
    IAM_URL https://iam.cloud.ibm.com De URL à Cloud Identity and Access Management.
    PROJECTS_API_BASE_URL https://projects.api.cloud.ibm.com L' URL de l'API du projet.

Créer un workflow dans GitHub

Suivez les étapes pour écrire un workflow dans le référentiel GitHub que vous avez connecté à votre projet.

Commencez avec un exemple de fichier de flux de travail que vous pouvez modifier selon vos besoins dans GitHub.

Vous pouvez personnaliser le flux de travail avec n'importe quel nombre de tâches dont vous avez besoin. Cependant, le code suivant doit être inclus pour mettre à jour avec succès les configurations de votre projet lorsque les modifications sont fusionnées d'une branche secondaire vers la branche principale de votre référentiel :

  1. Ajoutez types: [closed] à la section on du workflow pour déclencher le workflow lorsqu'une demande d'extraction vers la branche principale est fermée :

       # Controls when the workflow will run
       on:
         # Triggers the workflow on push or pull request events but only for the "main" branch
         # push:
         #   branches: [ "main" ]
         pull_request:
           branches: [ "main" ]
           types: [closed]
    
  2. Ajoutez une instruction if qui déclenche ce flux de travail lorsque les modifications sont fusionnées dans la branche principale :

    jobs:
      update-config:
        if: github.event.pull_request.merged == true
        runs-on: ubuntu-latest
    
  3. Incluez le code suivant dans le flux de travail afin que votre référentiel puisse se connecter à votre projet, où IBM_CLOUD_API_KEY est le nom du secret que vous avez ajouté à GitHub:

      IAM_TOKEN=$(curl -X POST "https://iam.cloud.ibm.com/identity/token" \
            -H "Content-Type: application/x-www-form-urlencoded" \
             -H "Accept: application/json" \
             -d "grant_type=urn:ibm:params:oauth:grant-type:apikey&apikey=${{ secrets.IBM_CLOUD_API_KEY }}" | jq -r .access_token)
    
  4. Incluez le code suivant pour identifier les configurations qui ont été modifiées :

              # get files changed in the PR
              changed_files=$(git diff --name-only HEAD^ HEAD)
              echo "Changed files: $changed_files"
    
              for file in $changed_files; do
                # find config files that were changed
                if [[ "${file}" == ${{ vars.CONFIG_FOLDER_PATH }}/* ]] && [ -s "${file}" ]; then
                  echo "Config file updated: ${file}"
    
                  # extract data from config files
                  PROJECT_ID=$(jq -r '.project_id' $file)
                  CONFIG_ID=$(jq -r '.config_id' $file)
                  DEF=$(jq '.definition' $file)
    
                  echo "Project ID: ${PROJECT_ID}"
                  echo "Config ID: ${CONFIG_ID}"
    
  5. Incluez le code suivant pour mettre à jour les configurations modifiées dans votre projet :

                  # update config definition
                  RESPONSE=$(curl -X PATCH "${BASE_URL}/v1/projects/${PROJECT_ID}/configs/${CONFIG_ID}" \
                  --header "Authorization: Bearer ${IAM_TOKEN}" \
                  --header "Accept: application/json" \
                  --header "Content-Type: application/json" \
                  --data "{ \"definition\": ${DEF} }")
    

Exemple de fichier de flux de travail

L'extrait de code suivant peut être utilisé comme modèle pour votre fichier de workflow :

name: Projects Git Integration Workflow

# Controls when the workflow will run
on:
  # Triggers the workflow on push or pull request events but only for the "main" branch
  pull_request:
    branches: [ "main" ]
    types: [closed]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

jobs:
  update-configs:
    if: github.event.pull_request.merged == true
    runs-on: ubuntu-latest
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Update Project Configs
        run: |
          IAM_TOKEN=$(curl -X POST "${{ vars.IAM_URL }}/identity/token" \
          -H "Content-Type: application/x-www-form-urlencoded" \
          -H "Accept: application/json" \
          -d "grant_type=urn:ibm:params:oauth:grant-type:apikey&apikey=${{ secrets.IBM_CLOUD_API_KEY }}" | jq -r .access_token)

          BASE_URL=${{ vars.PROJECTS_API_BASE_URL }}

          # get files changed in the PR
          changed_files=$(git diff --name-only HEAD^ HEAD)
          echo "Changed files: $changed_files"

          for file in $changed_files; do
            # find config files that were changed
            if [[ "${file}" == ${{ vars.CONFIG_FOLDER_PATH }}/* ]] && [ -s "${file}" ]; then
              echo "Config file updated: ${file}"

              # extract data from config files
              PROJECT_ID=$(jq -r '.project_id' $file)
              CONFIG_ID=$(jq -r '.config_id' $file)
              DEF=$(jq '.definition' $file)

              echo "Project ID: ${PROJECT_ID}"
              echo "Config ID: ${CONFIG_ID}"

              # update config definition
              RESPONSE=$(curl -X PATCH "${BASE_URL}/v1/projects/${PROJECT_ID}/configs/${CONFIG_ID}" \
              --header "Authorization: Bearer ${IAM_TOKEN}" \
              --header "Accept: application/json" \
              --header "Content-Type: application/json" \
              --data "{ \"definition\": ${DEF} }")

              echo $RESPONSE
              ERR_CODE=$(echo $RESPONSE | jq '.code')
              if [ "${ERR_CODE}" != "null" ]; then
                exit 1
              fi
            else
              echo "Not a project configuration file: ${file}"
            fi
          done

Tester le flux de travail

Maintenant que votre workflow est créé dans GitHub, assurez-vous que le workflow s'exécute correctement en ajoutant une configuration au projet. Procédez comme suit :

  1. Dans la console IBM Cloud, cliquez sur l'icône du menu de navigation Icône du menu de navigation > Projets et sélectionnez le projet connecté à votre référentiel GitHub.

  2. Cliquez sur Créer pour ajouter une configuration à votre projet. Assurez-vous de sélectionner une branche latérale où votre configuration sera enregistrée.

  3. Modifiez la configuration. Par exemple, ajoutez une méthode d’authentification dans le panneau Configurer.

  4. Sélectionnez la branche latérale dans laquelle vous souhaitez valider vos modifications.

  5. Cliquez sur Valider.

  6. Accédez à votre référentiel GitHub et ouvrez une demande d’extraction pour fusionner la branche latérale dans la branche principale de votre référentiel.

  7. Vérifiez que votre workflow s’exécute lorsque la branche latérale est fusionnée dans la branche principale. Vous pouvez vérifier dans le dépôt GitHub et le projet :

    1. Dans le référentiel GitHub, accédez à l’onglet Actions et sélectionnez le workflow. Vérifiez que la mise à jour s'est bien déroulée.
    2. Dans votre projet, cliquez sur l’ icône Options Icône Options > Modifier pour la configuration que vous avez ajoutée et passez à la branche principale. Vérifiez que votre mise à jour est appliquée. Par exemple, la méthode d’authentification que vous avez ajoutée précédemment est incluse dans le panneau Configurer.