Automazione delle azioni dei progetti nel tuo repository Git

In questo tutorial imparerai come impostare una pipeline per attivare un aggiornamento nel tuo progetto quando le modifiche alla configurazione vengono unite al ramo principale del tuo repository. Completando questo tutorial, imparerai come automatizzare attività comuni in un progetto, come la convalida di una configurazione, utilizzando le pipeline e le toolchain di tua scelta.

Questa è una funzionalità sperimentale disponibile a scopo di valutazione e test e potrebbe cambiare senza preavviso.

Questo tutorial si concentra su un semplice caso d'uso di aggiornamento di una configurazione in un progetto quando le modifiche vengono unite al ramo principale del repository, come illustrato nell'immagine seguente:

 L'immagine mostra un aggiornamento che va dal progetto a un ramo laterale nel repository. Quindi, una freccia indica che il ramo laterale viene unito al ramo principale, attivando la pipeline CD. La pipeline CD include un trigger per aggiornare le configurazioni nel progetto in base agli aggiornamenti nel ramo principale.
Aggiornamento automatico del progetto dopo che le modifiche sono state unite al ramo principale

Poiché pipeline e toolchain sono personalizzabili, i principi illustrati in questo tutorial possono aiutarti ad automatizzare altre azioni comuni all'interno di un progetto, come la convalida e l'implementazione delle modifiche alla configurazione dopo che sono state unite al ramo principale del tuo repository. Questo tutorial utilizza le azioni e i flussi di lavoro GitHub per automatizzare una pipeline tra il repository e il progetto. Man mano che completi il tutorial, adatta ogni passaggio in modo che corrisponda alle pipeline e ai processi CI e CD del tuo repository.

È possibile convalidare e distribuire le bozze di configurazione solo dopo averle unite al ramo nel repository che gestisce le pipeline CD. È inoltre necessario sincronizzare gli aggiornamenti dal repository al progetto aggiornando le configurazioni prima di poter convalidare e distribuire tali configurazioni. È possibile automatizzare questo aggiornamento utilizzando il metodo API project.config.update (come descritto in questo tutorial) oppure utilizzando il comando CLI ibmcloud project config-update.

Prima di iniziare

  1. Assicurati di disporre del ruolo di Editor sul servizio Progetti IBM Cloud.
  2. Completa i passaggi per connettere il tuo progetto a un repository Git. Ai fini di questo tutorial, collega un progetto vuoto a un repository GitHub.

Aggiungere segreti e variabili a GitHub

Crea segreti e variabili nel repository GitHub che hai collegato al tuo progetto. Questi segreti e variabili vengono utilizzati nel flusso di lavoro GitHub. Aggiungere i seguenti segreti e variabili:

  1. Per autenticarti con il tuo progetto, devi includere una chiave API IBM Cloud nel tuo flusso di lavoro GitHub. Per proteggere la chiave API, completa i passaggi per creare un segreto per un repository per salvare la chiave API come segreto in GitHub. Ai fini di questo tutorial, assegna al segreto il nome IBM_CLOUD_API_KEY.

  2. Successivamente, completa i passaggi per creare variabili di configurazione per il tuo repository GitHub. Salvare le seguenti variabili:

    Elenco delle variabili da salvare nel tuo repository GitHub
    Nome variabile Valore Descrizione
    CONFIG_FOLDER_PATH configs Percorso verso la cartella del repository collegata al progetto. Questa cartella contiene i file di configurazione del tuo progetto.
    IAM_URL https://iam.cloud.ibm.com Il sito URL a Cloud Identity and Access Management.
    PROJECTS_API_BASE_URL https://projects.api.cloud.ibm.com L' URL dell'API del progetto.

Creazione di un flusso di lavoro in GitHub

Completa i passaggi per scrivere un flusso di lavoro nel repository GitHub che hai collegato al tuo progetto.

Inizia con un file di flusso di lavoro di esempio che puoi modificare secondo necessità in GitHub.

Puoi personalizzare il flusso di lavoro con il numero di attività di cui hai bisogno. Tuttavia, è necessario includere il seguente codice per aggiornare correttamente le configurazioni nel progetto quando le modifiche vengono unite da un ramo laterale al ramo principale del repository:

  1. Aggiungere types: [closed] alla sezione on del flusso di lavoro per attivare il flusso di lavoro quando viene chiusa una richiesta pull al ramo principale:

       # 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. Aggiungere un'istruzione if che attiva questo flusso di lavoro quando le modifiche vengono unite al ramo principale:

    jobs:
      update-config:
        if: github.event.pull_request.merged == true
        runs-on: ubuntu-latest
    
  3. Includi il seguente codice nel flusso di lavoro in modo che il tuo repository possa connettersi al tuo progetto, dove IBM_CLOUD_API_KEY è il nome del segreto che hai aggiunto a 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. Includere il seguente codice per identificare quali configurazioni sono state modificate:

              # 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. Includi il seguente codice per aggiornare le configurazioni modificate nel tuo progetto:

                  # 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} }")
    

Esempio di file di flusso di lavoro

Il seguente frammento di codice può essere utilizzato come modello per il file del flusso di lavoro:

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

Test del flusso di lavoro

Ora che il flusso di lavoro è stato creato in GitHub, assicurati che venga eseguito correttamente aggiungendo una configurazione al progetto. Completa i seguenti passi:

  1. Nella console IBM Cloud, fai clic sull'icona del menu di navigazione Icona del menu di navigazione > Progetti e seleziona il progetto connesso al tuo repository GitHub.

  2. Fare clic su Crea per aggiungere una configurazione al progetto. Assicurati di selezionare un ramo laterale in cui verrà salvata la tua configurazione.

  3. Modifica la configurazione. Ad esempio, aggiungere un metodo di autenticazione nel pannello Configura.

  4. Seleziona il ramo laterale in cui desideri apportare le modifiche.

  5. Fai clic su Commit.

  6. Vai al tuo repository GitHub e apri una richiesta pull per unire il ramo laterale al ramo principale del tuo repository.

  7. Verificare che il flusso di lavoro venga eseguito quando il ramo laterale viene unito a quello principale. Puoi verificare nel repository GitHub e nel progetto:

    1. Nel repository GitHub, vai alla scheda Azioni e seleziona il flusso di lavoro. Verificare che l'aggiornamento sia stato eseguito correttamente.
    2. Nel tuo progetto, fai clic sull'icona Opzioni Icona Opzioni > Modifica per la configurazione che hai aggiunto e passa al ramo principale. Verifica che l'aggiornamento sia stato applicato. Ad esempio, il metodo di autenticazione aggiunto in precedenza è incluso nel pannello Configura.