Como Fazer Backup e Restaurar Sua Instância Jenkins
Faça backup e restaure o Jenkins com segurança arquivando o JENKINS_HOME, preservando segredos e testando a recuperação antes de precisar.
Como Fazer Backup e Restaurar Sua Instância Jenkins
O Jenkins frequentemente se torna o plano de controle para suas builds, implantações, credenciais e histórico de versões. Se você perder $JENKINS_HOME durante uma falha de disco ou migração mal-sucedida, seus pipelines de CI/CD podem parar, mesmo que o pacote Jenkins em si seja fácil de reinstalar.
Este guia mostra o que fazer backup, como criar um arquivo do sistema de arquivos com segurança e como restaurar o Jenkins sem quebrar credenciais ou propriedade de arquivos.
Entendendo o Núcleo: O Diretório $JENKINS_HOME
Cada instância Jenkins depende de um único diretório raiz, referido como $JENKINS_HOME. Este diretório contém todos os arquivos de configuração, plugins, logs e dados de jobs. Fazer backup do Jenkins significa, fundamentalmente, fazer backup do conteúdo deste diretório.
Dependendo do seu método de instalação (por exemplo, pacote Linux, contêiner Docker), a localização de $JENKINS_HOME normalmente varia:
- Linux (Instalação por Pacote):
/var/lib/jenkins - Docker: Frequentemente montado em um volume, ex.:
/var/jenkins_home - JAR Independente: O diretório onde o processo Jenkins foi iniciado, a menos que especificado por variáveis de ambiente.
Identificando Componentes de Dados Críticos
Embora fazer backup de todo o diretório $JENKINS_HOME seja a abordagem mais simples, isso pode resultar em arquivos extremamente grandes se o histórico de builds e dados do workspace forem incluídos. Para um backup rápido e eficiente de recuperação de desastres, você deve garantir que os seguintes diretórios e arquivos sejam capturados:
| Componente | Caminho dentro de $JENKINS_HOME |
Propósito |
|---|---|---|
| Configuração Global | config.xml |
Arquivo de configuração principal para a instância raiz do Jenkins. |
| Definições de Jobs | jobs/ |
Contém subdiretórios para cada job configurado, cada um com seu próprio config.xml. |
| Usuários e Credenciais | users/ e credentials.xml |
Contas de usuário, configurações do realm de segurança e segredos armazenados. |
| Chaves de Segurança | secrets/ |
Chaves de criptografia essenciais para descriptografar dados sensíveis como credenciais armazenadas. |
| Lista de Plugins | plugins/ |
Contém os arquivos .hpi de todos os plugins instalados. |
| Definições de Nós | nodes/ |
Configurações para todos os agentes de build conectados (se definidos). |
Método 1: O Backup do Sistema de Arquivos (Recomendado)
O método mais confiável para fazer backup do Jenkins é criar um arquivo compactado e consistente dos arquivos necessários enquanto o serviço é momentaneamente interrompido.
Passo 1: Parar o Serviço Jenkins
Para garantir a consistência dos dados e evitar gravações parciais de arquivos durante o processo de backup, o processo Jenkins deve ser interrompido. Falhar ao parar o serviço corre o risco de um backup incompleto ou corrompido.
# Para sistemas que usam systemd (a maioria das distribuições Linux modernas)
sudo systemctl stop jenkins
# Ou, para sistemas que usam o comando service
sudo service jenkins stop
Passo 2: Criar o Arquivo de Backup
Navegue até o diretório pai de $JENKINS_HOME e use tar para criar um arquivo compactado. É altamente recomendável excluir os grandes artefatos de build para economizar espaço e tempo.
Supondo que $JENKINS_HOME seja /var/lib/jenkins:
JENKINS_HOME="/var/lib/jenkins"
BACKUP_TARGET="/mnt/backups/jenkins"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
ARCHIVE_NAME="jenkins_backup_${TIMESTAMP}.tar.gz"
# Crie o diretório de destino se ele não existir
mkdir -p $BACKUP_TARGET
# Crie o arquivo, excluindo histórico de builds e workspaces
sudo tar -czvf "${BACKUP_TARGET}/${ARCHIVE_NAME}" \
--exclude="${JENKINS_HOME}/workspace" \
--exclude="${JENKINS_HOME}/caches" \
--exclude="${JENKINS_HOME}/jobs/*/builds" \
"${JENKINS_HOME}"
Dica: Incluindo Histórico de Builds
Se manter o histórico de builds (
jobs/*/builds) for crítico, você pode remover a flag--excludecorrespondente. No entanto, esteja preparado para tamanhos de arquivo potencialmente chegando a centenas de gigabytes.
Passo 3: Verificar e Armazenar Fora do Local
Depois que o arquivo for criado, teste se ele pode ser lido antes de confiar nele:
tar -tzf "${BACKUP_TARGET}/${ARCHIVE_NAME}" >/dev/null
Em seguida, transfira-o para um local de armazenamento externo, como um bucket S3 ou um sistema de backup de rede, para que uma falha no disco local não destrua tanto o Jenkins quanto seu backup.
Passo 4: Reiniciar o Jenkins
sudo systemctl start jenkins
Método 2: Utilizando o Plugin de Backup do Jenkins (Solução Parcial)
Embora existam plugins como o ThinBackup ou Backup Plugin, eles geralmente capturam apenas arquivos de configuração (config.xml) e podem não lidar com arquivos grandes ou todos os elementos de segurança necessários de forma robusta. Geralmente, são adequados para fazer backup de configurações de jobs apenas e não devem ser usados para uma estratégia completa e segura de recuperação de desastres.
Restaurando Sua Instância Jenkins
A restauração envolve copiar os dados do backup para o diretório $JENKINS_HOME da máquina de destino e garantir que as permissões de arquivo estejam corretas antes de iniciar o serviço.
Passo 1: Preparar o Ambiente de Destino
Certifique-se de que o sistema de destino (ou o sistema reparado) tenha o Jenkins instalado, mas mantenha o serviço parado.
sudo systemctl stop jenkins
Passo 2: Limpar Dados Jenkins Existentes (Opcional, mas Recomendado)
Se você estiver restaurando para uma máquina que anteriormente hospedava o Jenkins, limpe o conteúdo existente de $JENKINS_HOME para garantir que o ambiente esteja limpo.
# Tenha cuidado com o comando 'rm -rf'!
sudo rm -rf /var/lib/jenkins/*
Passo 3: Extrair o Arquivo de Backup
Copie o arquivo compactado (jenkins_backup_latest.tar.gz) para a máquina de destino e extraia-o no diretório $JENKINS_HOME. A flag -C especifica o diretório de destino para extração.
# Supondo que o arquivo esteja em /tmp e JENKINS_HOME seja /var/lib/jenkins
sudo tar -xzvf /tmp/jenkins_backup_latest.tar.gz -C /var/lib/
# Nota: Se o comando tar incluiu o diretório pai no arquivo, ajuste o caminho.
# O resultado deve ser o conteúdo do arquivo substituindo o conteúdo de /var/lib/jenkins
Passo 4: Verificar e Corrigir Permissões
Este é o passo mais crítico após a restauração. Se a propriedade do arquivo estiver incorreta, o Jenkins falhará ao iniciar ou operar de forma segura. Você deve definir a propriedade recursivamente para o usuário e grupo sob os quais o serviço Jenkins é executado (frequentemente jenkins:jenkins).
JENKINS_HOME="/var/lib/jenkins"
JENKINS_USER="jenkins"
JENKINS_GROUP="jenkins"
sudo chown -R $JENKINS_USER:$JENKINS_GROUP $JENKINS_HOME
sudo find "$JENKINS_HOME" -type d -exec chmod 755 {} \;
sudo find "$JENKINS_HOME" -type f -exec chmod 644 {} \;
sudo chmod -R go-rwx "$JENKINS_HOME/secrets" "$JENKINS_HOME/users" 2>/dev/null || true
Passo 5: Iniciar o Jenkins e Verificar
Inicie o serviço e monitore os logs para garantir uma inicialização bem-sucedida.
sudo systemctl start jenkins
# Monitore os logs de inicialização
sudo tail -f /var/log/jenkins/jenkins.log
Após a inicialização bem-sucedida, verifique se todos os jobs, usuários e plugins instalados estão presentes e funcionando corretamente.
Melhores Práticas para Backups Automatizados
Para ir além dos backups manuais, implemente a automação usando ferramentas do sistema e gerenciamento de configuração externo.
1. Aproveite os Cron Jobs
Agende o script de backup (Passos 1 e 2 do Método 1) para ser executado diariamente ou noturnamente usando cron ou um agendador semelhante. Certifique-se de que o cron job seja executado como um usuário com permissões apropriadas para parar e iniciar o serviço Jenkins e ler/gravar no diretório $JENKINS_HOME.
2. Configuração como Código (CasC)
Considere adotar a Configuração como Código (CasC) do Jenkins. O CasC define configurações, jobs e plugins do Jenkins usando arquivos YAML declarativos. Ao armazenar esses arquivos YAML em um repositório de controle de origem separado (como Git), sua configuração se torna portátil e com versão controlada, simplificando drasticamente o requisito principal de backup.
Conclusão
Trate um backup do Jenkins como útil somente depois de testar uma restauração. Um bom plano de recuperação preserva config.xml, jobs/, plugins/, users/, credentials.xml e secrets/, e então verifica se os jobs podem ser executados em uma instância limpa.
Aviso: Protegendo Credenciais
Ao restaurar uma instância, certifique-se de que o diretório
secrets/esteja presente e correto. Se o Jenkins não conseguir encontrar as chaves usadas para criptografar credenciais (como chaves de API ou senhas), essas credenciais se tornarão inutilizáveis e deverão ser reinseridas manualmente.