Automatizando ações de projetos em seu repositório Git

Neste tutorial, você aprenderá como configurar um pipeline para acionar uma atualização no seu projeto quando as alterações de configuração forem mescladas à ramificação principal do seu repositório. Ao concluir este tutorial, você aprenderá a automatizar tarefas comuns em um projeto, como validar uma configuração, usando os pipelines e cadeias de ferramentas de sua escolha.

Este é um recurso experimental que está disponível para fins de avaliação e teste e pode mudar sem aviso prévio.

Este tutorial se concentra em um caso de uso simples de atualização de uma configuração em um projeto quando as alterações são mescladas na ramificação principal do seu repositório, conforme ilustrado na imagem a seguir:

 A imagem mostra uma atualização que vai do projeto para uma ramificação lateral no repositório. Em seguida, uma seta indica que o ramo lateral é mesclado ao ramo principal, o que aciona o pipeline de CD. O pipeline de CD inclui um gatilho para atualizar as configurações no seu projeto com base nas atualizações na sua ramificação principal.
Atualizando automaticamente seu projeto após as alterações serem mescladas em sua ramificação principal

Como pipelines e cadeias de ferramentas são personalizáveis, os princípios deste tutorial podem ajudar você a automatizar outras ações comuns dentro de um projeto, como validar e implantar alterações de configuração depois que elas são mescladas ao branch principal no seu repositório. Este tutorial usa ações e fluxos de trabalho GitHub para automatizar um pipeline entre o repositório e o projeto. À medida que você conclui o tutorial, adapte cada etapa para corresponder aos pipelines e processos de CI e CD do seu repositório.

Você pode validar e implantar configurações de rascunho somente depois que elas forem mescladas à ramificação no seu repositório que gerencia seus pipelines de CD. Você também deve sincronizar as atualizações do seu repositório no seu projeto atualizando as configurações antes de poder validar e implantar essas configurações. Você pode automatizar essa atualização usando o método de API project.config.update (conforme descrito neste tutorial) ou usando o comando CLI ibmcloud project config-update.

Antes de Iniciar

  1. Certifique-se de que você tenha a função de Editor no serviço IBM Cloud Projects.
  2. Conclua as etapas para conectar seu projeto a um repositório Git. Para os propósitos deste tutorial, conecte um projeto vazio a um repositório GitHub.

Adicionando segredos e variáveis ao GitHub

Crie segredos e variáveis no repositório GitHub que você conectou ao seu projeto. Esses segredos e variáveis são usados no fluxo de trabalho GitHub. Adicione os seguintes segredos e variáveis:

  1. Para autenticar seu projeto, você deve incluir uma chave de API IBM Cloud no seu fluxo de trabalho GitHub. Para manter a chave de API segura, conclua as etapas para criar um segredo para um repositório para salvar a chave de API como um segredo no GitHub. Para os propósitos deste tutorial, nomeie o segredo IBM_CLOUD_API_KEY.

  2. Em seguida, conclua as etapas para criar variáveis de configuração para seu repositório GitHub. Salve as seguintes variáveis:

    Lista de variáveis para salvar no seu repositório GitHub
    Nome da Variável Valor Descrição
    CONFIG_FOLDER_PATH configs O caminho para a pasta do repositório que está conectada ao seu projeto. Esta pasta contém os arquivos de configuração do seu projeto.
    IAM_URL https://iam.cloud.ibm.com O URL para Cloud Identity and Access Management.
    PROJECTS_API_BASE_URL https://projects.api.cloud.ibm.com O URL da API do projeto.

Criando um fluxo de trabalho no GitHub

Conclua as etapas para escrever um fluxo de trabalho no repositório GitHub que você conectou ao seu projeto.

Comece com um arquivo de fluxo de trabalho de exemplo que você pode modificar conforme necessário em GitHub.

Você pode personalizar o fluxo de trabalho com qualquer número de trabalhos que precisar. Entretanto, o código a seguir precisa ser incluído para atualizar com sucesso as configurações no seu projeto quando as alterações são mescladas de uma ramificação lateral para a ramificação principal do seu repositório:

  1. Adicione types: [closed] à seção on do fluxo de trabalho para acionar o fluxo de trabalho quando uma solicitação de pull para a ramificação principal for fechada:

       # 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. Adicione uma instrução if que aciona esse fluxo de trabalho quando as alterações são mescladas na ramificação principal:

    jobs:
      update-config:
        if: github.event.pull_request.merged == true
        runs-on: ubuntu-latest
    
  3. Inclua o seguinte código no fluxo de trabalho para que seu repositório possa se conectar ao seu projeto, onde IBM_CLOUD_API_KEY é o nome do segredo que você adicionou ao 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. Inclua o seguinte código para identificar quais configurações foram editadas:

              # 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. Inclua o seguinte código para atualizar as configurações editadas no seu projeto:

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

Exemplo de arquivo de fluxo de trabalho

O seguinte trecho de código pode ser usado como modelo para seu arquivo de fluxo de trabalho:

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

Testando o fluxo de trabalho

Agora que seu fluxo de trabalho foi criado no GitHub, certifique-se de que ele seja executado com sucesso adicionando uma configuração ao projeto. Conclua as etapas a seguir:

  1. No console IBM Cloud, clique no ícone do menu de navegação Ícone do menu de navegação > Projetos e selecione o projeto que está conectado ao seu repositório GitHub.

  2. Clique em Criar para adicionar uma configuração ao seu projeto. Certifique-se de selecionar um ramo lateral onde sua configuração será salva.

  3. Edite a configuração. Por exemplo, adicione um método de autenticação no painel Configurar.

  4. Selecione o branch lateral onde você deseja confirmar suas alterações.

  5. Clique em Confirmar.

  6. Acesse seu repositório GitHub e abra uma solicitação de pull para mesclar o branch lateral no branch principal do seu repositório.

  7. Verifique se seu fluxo de trabalho é executado quando a ramificação lateral é mesclada à principal. Você pode verificar no repositório GitHub e no projeto:

    1. No repositório GitHub, vá para a aba Ações e selecione o fluxo de trabalho. Verifique se a atualização foi executada com êxito.
    2. No seu projeto, clique no ícone Opções Ícone Opções > Editar para a configuração que você adicionou e alterne para a ramificação principal. Verifique se sua atualização foi aplicada. Por exemplo, o método de autenticação que você adicionou anteriormente está incluído no painel Configurar.