Introducción
Jenkins almacena la mayor parte de la configuración del controlador y de los jobs como archivos dentro de JENKINS_HOME. Un plan de respaldo eficaz debe capturar los archivos que definen los jobs y la configuración del controlador, mientras que un plan de restauración debe demostrar que Jenkins es capaz de cargar los archivos restaurados.
En este laboratorio, creará un job de ejemplo, realizará una copia de seguridad de su config.xml, eliminará el job, lo restaurará desde un archivo tar, recargará Jenkins y verificará que el job funcione correctamente de nuevo.
Crear un estado de Jenkins digno de respaldo
En este paso, creará un job de tipo Freestyle llamado backup-restore-demo. Esto le proporcionará un archivo de configuración real de Jenkins para realizar la copia de seguridad y la restauración.
Escriba la configuración del job:
cat > /home/labex/project/backup-restore-demo-config.xml <<'XML'
<?xml version='1.1' encoding='UTF-8'?>
<project>
<actions/>
<description>Job used to practice Jenkins backup and restore.</description>
<keepDependencies>false</keepDependencies>
<properties/>
<scm class="hudson.scm.NullSCM"/>
<canRoam>true</canRoam>
<disabled>false</disabled>
<blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
<blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
<triggers/>
<concurrentBuild>false</concurrentBuild>
<builders>
<hudson.tasks.Shell>
<command>echo "Restored Jenkins job is running"</command>
<configuredLocalRules/>
</hudson.tasks.Shell>
</builders>
<publishers/>
<buildWrappers/>
</project>
XML
Copie el job en Jenkins y recargue:
docker exec -u root jenkins mkdir -p /var/jenkins_home/jobs/backup-restore-demo
docker cp /home/labex/project/backup-restore-demo-config.xml jenkins:/var/jenkins_home/jobs/backup-restore-demo/config.xml
docker exec -u root jenkins chown -R jenkins:jenkins /var/jenkins_home/jobs/backup-restore-demo
/home/labex/project/reload-jenkins.sh
Confirme que Jenkins puede cargar el job:
curl -fsS http://localhost:8080/job/backup-restore-demo/api/json | grep -o '"name":"backup-restore-demo"'
Realizar una copia de seguridad de la configuración del job
En este paso, copiará la configuración del job fuera del contenedor de Jenkins y la archivará. La copia de seguridad mantiene la ruta relativa jobs/backup-restore-demo/config.xml, lo que facilita la claridad de la ruta de restauración.
Cree un directorio de trabajo para la copia de seguridad y copie la configuración del job:
mkdir -p /home/labex/project/jenkins-backup-work/jobs/backup-restore-demo
docker cp jenkins:/var/jenkins_home/jobs/backup-restore-demo/config.xml /home/labex/project/jenkins-backup-work/jobs/backup-restore-demo/config.xml
Cree un archivo tar comprimido:
cd /home/labex/project/jenkins-backup-work
tar -czf /home/labex/project/backup-restore-demo.tar.gz jobs/backup-restore-demo/config.xml
Enumere el contenido del archivo:
tar -tzf /home/labex/project/backup-restore-demo.tar.gz
La salida debería incluir:
jobs/backup-restore-demo/config.xml
Eliminar el job para simular la pérdida de datos
En este paso, eliminará el job de Jenkins. Esto simula una eliminación accidental y le proporciona un objetivo claro para la restauración.
Elimine el directorio del job y recargue Jenkins:
docker exec -u root jenkins rm -rf /var/jenkins_home/jobs/backup-restore-demo
/home/labex/project/reload-jenkins.sh
Confirme que el job ya no es accesible. El siguiente comando trata intencionalmente una respuesta 404 como un éxito para esta comprobación:
if curl -fsS http://localhost:8080/job/backup-restore-demo/api/json >/dev/null 2>&1; then
echo "Job still exists"
exit 1
else
echo "Job is absent and ready to restore"
fi
Restaurar el job desde la copia de seguridad
En este paso, extraerá el archivo de respaldo, copiará el directorio del job restaurado de vuelta a Jenkins y recargará el controlador.
Extraiga el archivo en un directorio de restauración:
rm -rf /home/labex/project/restore-work
mkdir -p /home/labex/project/restore-work
tar -xzf /home/labex/project/backup-restore-demo.tar.gz -C /home/labex/project/restore-work
Copie el directorio del job restaurado en Jenkins y recargue:
docker cp /home/labex/project/restore-work/jobs/backup-restore-demo jenkins:/var/jenkins_home/jobs/backup-restore-demo
docker exec -u root jenkins chown -R jenkins:jenkins /var/jenkins_home/jobs/backup-restore-demo
/home/labex/project/reload-jenkins.sh
Confirme que Jenkins puede cargar el job restaurado:
curl -fsS http://localhost:8080/job/backup-restore-demo/api/json | grep -o '"name":"backup-restore-demo"'
Ejecutar el job restaurado
En este paso, ejecutará el job restaurado. Una restauración solo es útil si Jenkins puede cargar y ejecutar la configuración restaurada.
Inicie la compilación (build). Jenkins devuelve primero un elemento de cola, así que guarde las cabeceras de respuesta y lea la cabecera Location:
CRUMB=$(curl -fsS -c /tmp/jenkins-backup-build.cookies 'http://localhost:8080/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)')
curl -fsS -D /tmp/backup-restore-build.headers -o /dev/null -b /tmp/jenkins-backup-build.cookies -H "$CRUMB" -X POST http://localhost:8080/job/backup-restore-demo/build
QUEUE_URL=$(awk 'tolower($1)=="location:" {print $2}' /tmp/backup-restore-build.headers | tr -d '\r')
echo "Jenkins queued the restored job at ${QUEUE_URL}"
Espere hasta que el elemento en cola se convierta en una compilación real. Jenkins puede pasar unos segundos en un periodo de espera antes de asignar el número de compilación final:
until BUILD_NUMBER=$(python3 - "$QUEUE_URL" <<'PY'
import json
import sys
import urllib.request
with urllib.request.urlopen(sys.argv[1] + 'api/json') as response:
data = json.load(response)
executable = data.get('executable')
if not executable:
raise SystemExit(1)
print(executable['number'])
PY
); do
echo "Waiting for Jenkins to assign a build number..."
sleep 3
done
echo "The restored job is running as build #${BUILD_NUMBER}"
Espere a que la compilación finalice:
until curl -fsS "http://localhost:8080/job/backup-restore-demo/${BUILD_NUMBER}/api/json" >/tmp/backup-restore-build.json 2>/dev/null && grep -q '"building":false' /tmp/backup-restore-build.json; do
echo "Waiting for restored job build #${BUILD_NUMBER}..."
sleep 3
done
Inspeccione la salida de la consola:
curl -fsS "http://localhost:8080/job/backup-restore-demo/${BUILD_NUMBER}/consoleText" | grep -E 'Restored Jenkins job is running|Finished: SUCCESS'
Abra Firefox desde la interfaz de escritorio y visite la URL de la consola para el número de compilación que se muestra en su terminal, por ejemplo http://localhost:8080/job/backup-restore-demo/2/console. La página de la consola debería mostrar que el job restaurado se ejecutó correctamente.

Resumen
Ha creado una configuración de Jenkins digna de respaldo, archivado el config.xml de un job, eliminado el job, lo ha restaurado desde el archivo de respaldo, recargado Jenkins y verificado el job restaurado mediante la ejecución exitosa de una compilación.