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 --exclude correspondente. 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.