Copia de seguridad y restauración de la configuración de Jenkins

Beginner

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.

Salida de la consola del job restaurado en Jenkins

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.