Um dos objetivos da plataforma Embrapa I/O é fomentar o desenvolvimento colaborativo junto à comunidade de desenvolvedores. Assim, os artefatos de software que compõem os projetos são, em grande parte, forks de repositórios-base no GitLab da plataforma.

Esta estratégia possibilita que qualquer problema encontrado nas derivações destes repositórios (seja no momento de desenvolver uma aplicação, ou quando estiver customizando um repositório de suporte) possam ser corrigidos pela própria equipe que identificou o problema e, em seguida, retroalimentar o repositório-base, corrigindo o problema também em sua origem. A partir daí, todos os demais repositórios que foram derivados a partir desta origem, poderão também ser corrigidos por um processo simples de merge no GIT.

Para demonstrar como isso pode ser realizado, vamos exemplificar por meio de um estudo de caso. Imagine que, ao tentar realizar o processo de backup por demanda em uma build denominada agroapp/api@alpha, o seguinte erro tenha sido emitido:

COMMAND > env $(cat .env.sh) DOCKER_HOST="ssh://root@cluster.agro.rocks" /usr/bin/docker-compose run --rm --no-deps backup
sh: syntax error: unexpected "&&"
CRITICAL > Impossibe to backup build. Backup service failed to RUN!

Ao observar o arquivo docker-compose.yaml na raiz do repositório é possível constatar que o atributo command no serviço backup do stack de containers está implementado de forma errônea:

backup:
  build:
    context: .
    dockerfile: ./docker/${ENVIRONMENT}/backup/Dockerfile
  restart: "no"
  depends_on:
    - db
  links:
    - db
  volumes:
    - data_backup:/backup
  command: >
    sh -c  "set -ex
      && export BACKUP_DIR=${COMPOSE_PROJECT_NAME}_${STAGE}_$$(date +'%Y-%m-%d_%H-%M-%S')
      && cd /backup && mkdir $$BACKUP_DIR
      && mongodump --host db --username root --password ${MONGO_ROOT_PASSWORD} --authenticationDatabase admin --out /backup/$$BACKUP_DIR/db
      && tar -czf $$BACKUP_DIR.tar.gz $$BACKUP_DIR
      && rm -rf /backup/$$BACKUP_DIR"
  profiles:
    - cli

Uma vez que este erro é originário do boilerplate, iremos realizar a correção de forma que, posteriormente, possamos sugerí-la também ao repositório-base. Para isso, precisamos primeiro criar uma branch de correção, que deverá ser uma ramificação da main a partir do commit imediatamente anterior ao fork do repositório-base. Para criar esta branch, primeiramente acesse o histórico de commits do repositório:

Merge request: histórico de commits

Em seguida, procure na listagem de commits por uma entrada denomidada “Configuração inicial automática do repositório.”, submetida pelo usuário “embrapa.io Genesis Automaton” e copie o Commit SHA do commit realizado imediatamente antes desta entrada:

Merge request: obtendo o SHA do commit-base

Agora, crie uma nova branch utilizando este commit como base:

Merge request: criando a branch de correção

Utilizando um cliente GIT ou a própria interface do GitLab, faça o checkout para esta nova branch, efetue as correções no código-fonte e realize o commit:

Merge request: fazendo as alterações no código-fonte

Faça agora o merge da sua branch de correção para o troco do projeto (main). Teste em ambiente de desenvolvimento. Estando tudo certo, faça o merge da main para a branch de estágio alpha e realize o deploy criando uma nova tag. No nosso exemplo, uma vez que o deploy da build agroapp/api@alpha tenha sido realizado com sucesso, iremos testar novamente o serviço de backup diretamente no ambiente de testes internos.

Uma vez que esteja tudo funcionando corretamente, iremos realizar um merge request da nossa branch de correção para o repositório-base (ou seja, do boileplate), que no nosso estudo de caso é io/boilerplate/nodejs-mongodb-jwt-password-less (veja a primeira imagem desta página). Para isso, crie um merge request tendo como source a branch de correção e como target o tronco do repositório do boilerplate:

Merge request

Pronto! Um mantenedor do boilerplate poderá agora avaliar as alterações, aprovar e realizar o merge no repositório-base. Isto permitirá também a outros desenvolvedores que tenham aplicações derivadas do mesmo boilerplate aplicarem as correções.