Build Pipeline (pipeline de compilação) é uma sequência de etapas automatizadas que o código percorre desde o momento do commit até um artefato pronto para implantação. O pipeline inclui compilação, execução de testes, análise estática e preparação do pacote de lançamento. De acordo com Google Cloud DORA, 2025, equipes com um pipeline bem configurado alcançam 440 vezes mais rapidez na entrega de mudanças em comparação com equipes sem automação.
Pontos principais
Build Pipeline é uma sequência formalizada de passos que são executados automaticamente a cada mudança de código. Cada passo verifica um determinado aspecto de qualidade: compilabilidade, correção dos testes, ausência de vulnerabilidades, conformidade com o estilo de código. Se algum passo falhar, o pipeline para.
O conceito de pipeline vem da linha de produção — como em uma fábrica onde cada estação agrega valor ao produto. No desenvolvimento, cada etapa adiciona confiança de que o código está pronto para o lançamento. Pipelines modernos são definidos como código (Pipeline as Code) e armazenados no repositório Git junto com o projeto.
De acordo com a Continuous Delivery Foundation, 2025, um pipeline de compilação maduro reduz o tempo do commit ao lançamento de semanas para minutos. Isso é alcançado através da automação completa e execução paralela de etapas independentes.
Em vez de configurar através de uma interface web, um pipeline moderno é descrito em arquivos YAML ou Groovy. Jenkinsfile, `.gitlab-ci.yml`, `.github/workflows/build.yml` são exemplos de Pipeline as Code. Vantagens: versionamento, revisão de código, reprodutibilidade.
Jenkins tem duas sintaxes. Declarativo — mais simples, com uma estrutura clara de stages/steps. Scripted — mais flexível, baseado em Groovy. Para a maioria dos projetos, a abordagem declarativa é recomendada por ser mais legível e previsível.
Um pipeline de compilação típico para um aplicativo móvel inclui várias etapas principais. Cada etapa desempenha sua função e filtra problemas potenciais em um estágio inicial.
O pipeline começa clonando o repositório. Em seguida, as dependências são instaladas: pacotes Gradle/Maven, CocoaPods, SPM (Swift Package Manager), pacotes npm. O uso de cache nesta etapa acelera as compilações subsequentes em 50-70%.
Antes da compilação, ferramentas de qualidade de código são executadas: Detekt ou ktlint para Kotlin, SwiftLint para Swift, ESLint para JavaScript. Elas verificam a conformidade com o estilo de código e encontram possíveis bugs no nível de análise de código.
O código é compilado em formato binário e os testes unitários são executados em paralelo. Para Android é `./gradlew testDebugUnitTest`, para iOS — `xcodebuild test -scheme App -destination 'platform=iOS Simulator'`. A falha nos testes interrompe imediatamente o pipeline.
name: Mobile Build Pipeline
on: [push, pull_request]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: ./gradlew detekt
unit-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: ./gradlew testDebugUnitTest
- run: ./gradlew jacocoTestReport
build-release:
needs: [lint, unit-tests]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: ./gradlew assembleRelease
- uses: actions/upload-artifact@v4
with:
name: release-apk
path: app/build/outputs/apk/release/app-release.apk
Após a compilação bem-sucedida, são executados os testes que exigem a execução do aplicativo: Espresso para Android, XCTest/XCUITest para iOS, Detox para React Native. Nesta etapa, o artefato é implantado em um simulador ou dispositivo real através de serviços farm (Firebase Test Lab, BrowserStack, Sauce Labs).
A configuração adequada do pipeline determina a eficiência de todo o processo CI/CD. A configuração inclui a escolha de gatilhos, a definição de etapas paralelas e sequenciais, a parametrização e a integração com serviços externos.
Principais gatilhos: push ao repositório, pull request (especialmente para revisão de código com verificações automatizadas), criação de tag Git (para compilações de lançamento), agendamento (nightly build). O gatilho de pull request é o mais prático para o trabalho em equipe, pois identifica problemas antes da mesclagem do código.
Etapas independentes (linting, testes em diferentes versões de SO) devem ser executadas em paralelo para acelerar. As dependentes — sequencialmente. Sistemas CI modernos gerenciam automaticamente tarefas paralelas, distribuindo-as entre os agentes disponíveis.
Um pipeline longo retarda o ciclo de desenvolvimento e reduz a motivação da equipe. A otimização do tempo de compilação é uma das principais tarefas de um engenheiro DevOps ao trabalhar com pipelines de compilação.
Gradle Build Cache salva os resultados de compilações anteriores. Se o código-fonte de um módulo não mudou, ele não é recompilado. A compilação incremental em Swift e Kotlin funciona de forma semelhante. O tamanho do cache pode chegar a gigabytes, mas a economia de tempo varia de 30% a 70%.
Testes unitários podem ser executados em múltiplos agentes simultaneamente, distribuindo as classes de teste. Sharding é uma técnica de dividir os testes em grupos (shards). GitHub Actions suporta `strategy.matrix`, Jenkins — Parallel Test Executor, Gradle — `--parallel --max-workers`.
Cada etapa extra adiciona tempo. Analise o pipeline regularmente: quais etapas podem ser combinadas? Por exemplo, o linting pode ser executado em paralelo com a compilação em vez de antes. Testes de integração — apenas para pull requests, não para cada commit.
pipeline {
agent any
options {
timestamps()
timeout(time: 30, unit: 'MINUTES')
}
stages {
stage('Parallel Checks') {
parallel {
stage('Lint') {
steps { sh './gradlew detekt' }
}
stage('Unit Tests') {
steps { sh './gradlew test' }
}
}
}
stage('Build') {
steps { sh './gradlew assembleRelease' }
}
}
}
O pipeline de compilação é um elemento crítico da cadeia de suprimentos de software e sua segurança não pode ser ignorada. O comprometimento do pipeline pode levar à injeção de código malicioso no artefato de lançamento, afetando todos os usuários do aplicativo.
Ataques conhecidos: SolarWinds (2020), Codecov (2021), 3CX (2023) — todos exploraram vulnerabilidades em pipelines CI/CD. Vetor comum — um invasor obtém acesso às credenciais do servidor de compilação e modifica o código na etapa de compilação. Resultado — um lançamento malicioso assinado com um certificado legítimo.
Nunca armazene chaves de assinatura, tokens de API e senhas no repositório ou em variáveis de ambiente do sistema CI em texto simples. Use segredos do sistema CI (GitHub Secrets, GitLab CI Variables), HashiCorp Vault, AWS Secrets Manager. Minimize o acesso a segredos — cada pipeline deve receber apenas as chaves necessárias para suas etapas específicas.
Cada artefato que sai do pipeline deve ser assinado criptograficamente e conter attestation — prova de origem (provenance). Ferramentas: framework SLSA, attestation in-toto, cosign para assinatura de contêineres. A verificação de assinatura deve ser realizada antes da implantação em qualquer ambiente.
name: Secure Build Pipeline
on: [push]
jobs:
security-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Scan dependencies
run: ./gradlew dependencyCheckAnalyze
- name: SAST scan
run: ./gradlew detekt
sign-attest:
needs: security-scan
runs-on: ubuntu-latest
steps:
- run: ./gradlew assembleRelease
- name: Sign APK
run: jarsigner -keystore ${{ secrets.KEYSTORE }} \
app-release.apk ${{ secrets.KEY_ALIAS }}
- name: Generate provenance
uses: actions/attest-build-provenance@v1
O pipeline de compilação é um sistema complexo que requer monitoramento constante. Sem métricas, é impossível determinar se o pipeline desacelerou e qual etapa se tornou um gargalo.
Acompanhe: duração total do pipeline, tempo de cada etapa, taxa de falha de compilação, tempo de espera na fila. Para uma equipe grande (>20 desenvolvedores), é recomendado configurar um dashboard no Grafana ou Datadog com estatísticas agregadas por semana/mês.
Cada falha no pipeline requer uma resposta. Configure notificações em mensageiros (Slack, Telegram, Discord) com um link para o log de erro e o nome do autor do commit. Para falhas críticas — PagerDuty ou Opsgenie com escalonamento.
Ferramentas como Act (para GitHub Actions) ou Jenkins Pipeline Unit Test permitem executar o pipeline localmente sem fazer commit. Isso acelera o desenvolvimento e a depuração de pipelines, especialmente ao adicionar novas etapas ou alterar a configuração.
Perguntas frequentes
Build pipeline é uma parte do pipeline CI/CD responsável pela compilação e preparação do artefato. O pipeline CI/CD é mais amplo: inclui implantação, monitoramento pós-lançamento e verificações de infraestrutura.
A cada push ao repositório. Para pull requests — obrigatório antes da mesclagem. Nightly build — para testes longos (e2e, desempenho) que não são necessários para cada commit.
Para novos projetos — YAML (GitHub Actions, GitLab CI, Bitrise). É legível e simples. Groovy (Jenkins) é mais poderoso, mas mais difícil de manter. A escolha depende do sistema CI utilizado.
Métodos principais: cache de dependências, execução paralela de etapas independentes, sharding de testes, exclusão de testes longos do pipeline para cada commit, uso de agentes de compilação potentes.
Analise os logs: qual teste específico falhou e por quê. Se o teste for instável (flaky) — adicione um mecanismo de repetição. Se for um bug real — corrija o código, não desative o teste. Desativar testes é o último recurso.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também