RabbitMQ: GitHub Actions & GitLab CI
Inicie um serviço real de RabbitMQ a partir do seu pipeline do GitHub Actions ou GitLab CI, execute os seus testes sobre ele e elimine-o automaticamente
Este guia irá guiá-lo na execução de um serviço real e dedicado de RabbitMQ dentro do seu pipeline CI, utilizando GitHub Actions ou GitLab CI. Ao seguir estes passos, poderá testar o seu código contra uma instância ativa de RabbitMQ em condições semelhantes às de produção, deixando de depender de mocks ou simulações. RabbitMQ is a widely-deployed open source message broker that moves work between your services reliably and at scale.
Sempre que o seu pipeline for executado, será criada uma nova instância de RabbitMQ. Isto significa que os seus testes interagem com o mesmo tipo de serviço que os seus utilizadores verão em produção. O workflow cria automaticamente uma stack temporária, adiciona o RabbitMQ, aguarda que esteja pronto, obtém as credenciais geradas, executa um smoke test com o curl e, no final, garante sempre a limpeza de todos os recursos.
Irá utilizar o Stackhero CLI, uma ferramenta de linha de comandos autónoma que facilita o lançamento e a gestão de serviços Stackhero de forma rápida e simples.
1. Criar um access token e guardá-lo como segredo CI
Para permitir que o CLI funcione de forma não interativa, irá necessitar de um access token (formato: usr-xxxxxx:tokenId). Só precisa de criar este token uma vez e adicioná-lo ao seu pipeline CI como um segredo seguro e encriptado.
- Criar o token: No seu dashboard Stackhero, clique na sua foto de perfil no canto superior direito, aceda a A sua conta, depois Access tokens e clique em Criar token.
- Para GitHub Actions: No seu repositório, vá a Settings > Secrets and variables > Actions > New repository secret e introduza o token como
STACKHERO_TOKEN. - Para GitLab CI: No seu projeto, vá a Settings > CI/CD > Variables > Add variable, defina a chave como
STACKHERO_TOKENe selecione Masked (e Protected se o seu CI só correr em branches protegidas).
Nunca inclua o seu access token diretamente no ficheiro YAML do pipeline. Se estiver presente no YAML, pode ser exposto a qualquer pessoa com acesso ao repositório e pode aparecer nos logs de build. Guardá-lo como segredo CI mantém-no encriptado e mascarado, garantindo a segurança do seu token.
2. O script de ciclo de vida
Segue-se um exemplo completo de script que gere todo o ciclo de vida do serviço. Demonstra como a configuração é simples, bastando apenas alguns comandos. Pode copiar o YAML pronto para a sua plataforma nas secções abaixo.
#!/bin/bash
set -euo pipefail
# STACKHERO_TOKEN é fornecido pelo segredo CI, o CLI deteta-o automaticamente.
stackName="ci-rabbitmq-$$" # Nome único da stack para cada execução
serviceStore="rabbitmq" # O serviço store de RabbitMQ
instance="200" # Altere se necessário (ver passo 3)
region="europe" # Nome da região (ver stackhero regions-list)
# 1. Instalar o CLI no runner
curl -fsSL https://www.stackhero.io/install.sh | sh
# 2. Instalar o cliente necessário para o smoke test (jq + curl são o mínimo)
apt-get update && apt-get install -y --no-install-recommends jq curl
# 3. Criar uma stack dedicada para esta execução
stackId=$(stackhero --format=script stack-create --name="$stackName")
echo "Stack criada: $stackId"
# 4. Adicionar RabbitMQ e obter o id do serviço
serviceId=$(stackhero --format=script service-add \
--stack="$stackId" \
--service-store="$serviceStore" \
--instance="$instance" \
--region="$region")
echo "Serviço adicionado: $serviceId"
# 5. Esperar até o serviço estar operacional (pode demorar alguns minutos)
stackhero service-wait-for --service="$serviceId"
# 6. Ler a configuração (contém as credenciais geradas)
config=$(stackhero service-configuration-get --service="$serviceId" --format=json)
# 7. Extrair as credenciais necessárias
host=$(echo "$config" | jq -r '.configuration.domain')
password=$(echo "$config" | jq -r '.configuration.password')
# 8. Smoke test: Call the management API (health check, falling back to overview).
curl -fsS -u "admin:$password" "https://$host/api/health/checks/alarms" | grep -q '"status":"ok"' \
|| curl -fsS -u "admin:$password" "https://$host/api/overview" | grep -q '"rabbitmq_version"'
echo "✅ RabbitMQ está acessível a partir do CI."
O passo de teardown, que elimina o serviço, aguarda a sua remoção e depois elimina a stack, é detalhado nas secções específicas de cada plataforma abaixo. Este método garante que a limpeza é sempre realizada, mesmo que um smoke test falhe.
Uma stack só pode ser eliminada quando estiver vazia. Elimine sempre o serviço primeiro e aguarde a sua remoção, depois elimine a stack. O comando
service-wait-forgarante que o serviço está em execução ou já foi eliminado antes de prosseguir, sendo a ferramenta adequada também para aguardar pela eliminação.
3. Escolher o tamanho da instância
Os exemplos abaixo utilizam por defeito a instância de entrada 200 para RabbitMQ. É uma escolha sólida para a maioria dos workloads, mas pode ajustá-la conforme necessário. Para ver todos os tipos de instância disponíveis para RabbitMQ, execute:
# A coluna NAME mostra o valor a passar para --instance
stackhero instances-store-list --service-store=rabbitmq
4. GitHub Actions
Para começar, guarde o seguinte conteúdo como .github/workflows/ci.yml. A partir de agora, cada push e pull request irá executar testes contra uma instância real de RabbitMQ.
name: CI com RabbitMQ
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
env:
STACKHERO_TOKEN: ${{ secrets.STACKHERO_TOKEN }}
STACK_NAME: ci-rabbitmq-${{ github.run_id }}-${{ github.run_attempt }}
INSTANCE: "200" # Altere se necessário (ver passo 3)
REGION: europe
steps:
- uses: actions/checkout@v4
- name: Instalar o Stackhero CLI e o cliente
run: |
curl -fsSL https://www.stackhero.io/install.sh | sh
apt-get update && apt-get install -y --no-install-recommends jq curl
- name: Criar o serviço RabbitMQ
run: |
set -euo pipefail
STACK_ID=$(stackhero --format=script stack-create --name="$STACK_NAME")
echo "STACK_ID=$STACK_ID" >> "$GITHUB_ENV"
SERVICE_ID=$(stackhero --format=script service-add \
--stack="$STACK_ID" \
--service-store="rabbitmq" \
--instance="$INSTANCE" \
--region="$REGION")
echo "SERVICE_ID=$SERVICE_ID" >> "$GITHUB_ENV"
stackhero service-wait-for --service="$SERVICE_ID"
- name: Executar testes sobre RabbitMQ
run: |
set -euo pipefail
config=$(stackhero service-configuration-get --service="$SERVICE_ID" --format=json)
host=$(echo "$config" | jq -r '.configuration.domain')
password=$(echo "$config" | jq -r '.configuration.password')
# Call the management API (health check, falling back to overview).
curl -fsS -u "admin:$password" "https://$host/api/health/checks/alarms" | grep -q '"status":"ok"' \
|| curl -fsS -u "admin:$password" "https://$host/api/overview" | grep -q '"rabbitmq_version"'
echo "✅ RabbitMQ está acessível a partir do CI."
# Pode executar a sua própria suite de testes aqui usando as credenciais acima ...
- name: Limpeza (sempre, mesmo em caso de falha)
if: always()
run: |
if [ -n "${SERVICE_ID:-}" ]; then
stackhero service-delete --service="$SERVICE_ID" --confirm
stackhero service-wait-for --service="$SERVICE_ID"
fi
if [ -n "${STACK_ID:-}" ]; then
stackhero stack-delete --stack="$STACK_ID" --confirm
fi
O passo de limpeza está configurado com if: always() para garantir que é sempre executado, assegurando que a sua instância de RabbitMQ é eliminada e que não será cobrado por recursos não utilizados.
5. GitLab CI
Pode guardar esta configuração como .gitlab-ci.yml. Com esta configuração, cada execução do pipeline cria uma nova instância real de RabbitMQ para os seus testes.
test:
image: ubuntu:24.04
variables:
STACK_NAME: "ci-rabbitmq-$CI_PIPELINE_ID-$CI_JOB_ID"
INSTANCE: "200" # Altere se necessário (ver passo 3)
REGION: "europe"
SERVICE_STORE: "rabbitmq"
# STACKHERO_TOKEN vem da variável CI/CD criada no passo 1.
script:
- set -euo pipefail
- curl -fsSL https://www.stackhero.io/install.sh | sh
- apt-get update && apt-get install -y --no-install-recommends jq curl
- STACK_ID=$(stackhero --format=script stack-create --name="$STACK_NAME")
- echo "STACK_ID=$STACK_ID" >> deploy.env
- SERVICE_ID=$(stackhero --format=script service-add --stack="$STACK_ID" --service-store="$SERVICE_STORE" --instance="$INSTANCE" --region="$REGION")
- echo "SERVICE_ID=$SERVICE_ID" >> deploy.env
- stackhero service-wait-for --service="$SERVICE_ID"
- config=$(stackhero service-configuration-get --service="$SERVICE_ID" --format=json)
- host=$(echo "$config" | jq -r '.configuration.domain')
password=$(echo "$config" | jq -r '.configuration.password')
# Call the management API (health check, falling back to overview).
- curl -fsS -u "admin:$password" "https://$host/api/health/checks/alarms" | grep -q '"status":"ok"' \
|| curl -fsS -u "admin:$password" "https://$host/api/overview" | grep -q '"rabbitmq_version"'
- echo "✅ RabbitMQ está acessível a partir do CI."
# Pode executar a sua própria suite de testes aqui usando as credenciais acima ...
after_script:
- test -f deploy.env && . ./deploy.env || true
- >
if [ -n "${SERVICE_ID:-}" ]; then
stackhero service-delete --service="$SERVICE_ID" --confirm
stackhero service-wait-for --service="$SERVICE_ID"
fi
- >
if [ -n "${STACK_ID:-}" ]; then
stackhero stack-delete --stack="$STACK_ID" --confirm
fi
No GitLab, a limpeza é feita na secção after_script. Esta secção é sempre executada, mesmo que o job falhe, garantindo que os recursos de RabbitMQ são eliminados e que não será cobrado por recursos não utilizados.
No GitLab, o
after_scriptcorre numa shell nova. Para lidar com isto, o script grava os IDs do serviço e da stack emdeploy.envdurante o job e volta a carregá-los antes da limpeza. Assim, mesmo que algo falhe a meio do job, os seus recursos são sempre eliminados.
Este é o ciclo CI completo para RabbitMQ: criar uma stack, adicionar o serviço, aguardar, obter credenciais, smoke-test e garantir sempre a limpeza. Cada execução do pipeline recebe um serviço real e isolado, sem nada a correr no final. Para mais informações sobre os comandos disponíveis e autenticação não interativa com STACKHERO_TOKEN, consulte a documentação completa do CLI.