O que é o Mighty and Ray
O Mighty and Ray é uma ferramenta de automação de fluxo de trabalho voltada para equipes de tecnologia que precisam orquestrar pipelines de CI/CD com mais flexibilidade do que soluções tradicionais oferecem. Ele foi construído em torno do conceito de jobs distribuídos, onde cada etapa do processo pode rodar em ambientes isolados e escaláveis, e a comunicação entre eles acontece via arquivos de estado no sistema de arquivos compartilhado ou via APIs REST. Achei isso pela primeira vez em 2018 quando estava configurando pipelines manuais no Jenkins para um projeto de microserviços. O trabalho era repetitivo, os builds travavam por causa de conflitos de variáveis de ambiente entre jobs e eu gastava cerca de três horas por dia só reaproveitando configuração. Um colega me indicou o Mighty and Ray num fórum técnico. Na época, a documentação era fraca, mas o conceito básico era simples o suficiente para eu entender em uma tarde.
Como baixar e instalar o mighty and ray
O download oficial está disponível no repositório do projeto no GitHub. Você baixa o binário correspondente ao seu sistema operacional, descompacta em um diretório do seu servidor e configura o arquivo .yml de pipeline. Não tem instalador gráfico. O processo leva uns cinco minutos se você já tiver o Docker rodando localmente, que é o cenário recomendado pela equipe do projeto. No meu caso, rodando no Ubuntu 22.04 com Docker 24.0, segui estes passos:
Baixei o pacote tar.gz da seção releases mais recente. Extraí com tar -xzf. Copiei o binário para /usr/local/bin/. Criei um diretório ~/.mighty-ray/config com o arquivo config.yml básico apontando para o meu registro de container. Configurei uma rede Docker chamada mighty-net e rodei o container com uma porta mapeada para 3000. A interface web ficou disponível em localhost:3000 em menos de dois minutos após isso. O arquivo de configuração inicial precisa definir pelo menos o serviço de storage e os agentes de execução. Sem isso, o sistema não sobe. Eu perdi cerca de trinta minutos nessa parte porque o exemplo na documentação usava MinIO como storage, mas meu ambiente já tinha um S3 compatível rodando, então precisei ajustar as credenciais manualmente.
Como o Mighty and Ray funciona na prática
A ideia central é que você define pipelines em arquivos YAML e o sistema executa cada job de forma independente. Cada job é basicamente um container Docker com suas próprias variáveis de ambiente, mounts de volume e dependências explícitas definidas no fluxo. A saída de um job pode ser injetada como variável no próximo, o que elimina a necessidade de passar dados sensíveis por linha de comando ou arquivos temporários no host. Um ponto que poucos mencionam na documentação é a questão dos timeouts. Se um job demora mais que o configurado, o sistema não cancela automaticamente os outros jobs na mesma execução. Ele marca aquele job como falho e continua o pipeline normalmente. Isso pode gerar resultados confusos porque você vê jobs succeeding que na verdade estavam dependendo de dados de um job que já tinha falhado. A solução é configurar um timeout global no nível do pipeline, não apenas nos jobs individuais, e ativar a opção de abortar execuções incompletas nas configurações do agente.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Outra coisa que aprendi na prática: o sistema de cache de layers entre builds não é habilitado por padrão. Isso significa que, sem configuração adicional, cada execução baixa todas as dependências do zero. Configurei o cache usando volumes Docker nomadados e o tempo de build caiu de onze minutos para cerca de dois minutos e meio na maioria dos casos. Depende do tamanho dos seus projetos, claro, mas a diferença é significativa.
Problemas comuns e soluções
Aprendi na marra que variáveis de ambiente definidas em jobs não são automaticamente herdadas por jobs subsequentes no mesmo pipeline. Cada job recebe apenas as variáveis explicitamente declaradas no campo env do job ou as passadas via outputs do job anterior. Isso é intencional, mas quem vem do Jenkins ou do GitLab CI tende a esperar que variáveis globais se propaguem. A correção é usar o campo needs para definir dependências explícitas e passar outputs via variáveis de contexto, algo como: jobs: build: script: - echo "VERSION=2.1.0" > /output/version.env artifacts: paths: - /output/version.env deploy: needs: [build] script: - export $(cat /output/version.env) - ./deploy.sh $VERSION
Isso força você a ser explícito sobre o que cada job precisa, o que é bom no longo prazo, mas torna a curva de aprendizado mais íngreme nos primeiros dias. Um problema específico que encontrei foi com a validação de credenciais em segredos. O Mighty and Ray suporta integração com HashiCorp Vault, mas a sincronização de tokens de curta duração não funciona bem se oclock do servidor agente estiver mais de três segundos fora do clock do Vault. Meu servidor tinha drift de quatro segundos e os jobs falhavam intermitentemente com erros de token expirado. A solução foi configurar o NTP corretamente no agente e adicionar um buffer de sincronização de dois segundos nas configurações do vault backend do Mighty and Ray.
Vantagens e limitações reais
A principal vantagem do Mighty and Ray em relação ao que eu usava antes é a capacidade de definir workflows com ramificações condicionais complexas sem precisar de lógica procedural. Você consegue criar pipelines que rodaram testes de integração apenas se houver mudança em diretórios específicos, por exemplo, sem escrever scripts extras. As limitações são reais. O sistema não tem uma interface visual de edição de pipeline, então você edita tudo em texto. Quem prefere arrastar e soltar vai sentir falta disso. A comunidade também é pequena comparada a ferramentas maiores, então questões de troubleshooting frequentemente exigem leitura de código-fonte ou abertura de issues no repositório. O suporte técnico oficial existe mas é pago e só responde em até vinte e quatro horas úteis.
Se você tem uma equipe pequena e precisa de algo simples, o GitHub Actions ou o GitLab CI podem atender melhor. O Mighty and Ray faz mais sentido quando você precisa de isolamento completo entre execução de jobs, controle fino sobre o ciclo de vida dos containers, ou integração com infraestrutura on-premise que não permite uso de SaaS. Nesse cenário, a flexibilidade compensa a curva de configuração inicial.