Last active
October 10, 2024 10:26
-
-
Save cenkalti/5089392 to your computer and use it in GitHub Desktop.
Backup Jenkins home periodicallly with git.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Setup | |
# | |
# - Create a new Jenkins Job | |
# - Mark "None" for Source Control Management | |
# - Select the "Build Periodically" build trigger | |
# - configure to run as frequently as you like | |
# - Add a new "Execute Shell" build step | |
# - Paste the contents of this file as the command | |
# - Save | |
# | |
# NOTE: before this job will work, you'll need to manually navigate to the $JENKINS_HOME directory | |
# and do the initial set up of the git repository. | |
# Make sure the appropriate remote is added and the default remote/branch set up. | |
# | |
# Jenkins Configuraitons Directory | |
cd $JENKINS_HOME | |
# Add general configurations, job configurations, and user content | |
git add -- *.xml jobs/*/*.xml userContent/* | |
# only add user configurations if they exist | |
if [ -d users ]; then | |
user_configs=`ls users/*/config.xml` | |
if [ -n "$user_configs" ]; then | |
git add $user_configs | |
fi | |
fi | |
# mark as deleted anything that's been, well, deleted | |
to_remove=`git status | grep "deleted" | awk '{print $3}'` | |
if [ -n "$to_remove" ]; then | |
git rm --ignore-unmatch $to_remove | |
fi | |
git commit -m "Automated Jenkins commit" | |
git push -q -u origin master |
I'm noticing that when you restore jenkins, it's important to make sure the files are all owned by the jenkins user with the jenkins group or you might see the below error in the GUI:
jenkins.model.InvalidBuildsDir: ${ITEM_ROOTDIR}/builds does not exist and probably cannot be created
at jenkins.model.Jenkins.checkRawBuildsDir(Jenkins.java:3126)
at jenkins.model.Jenkins.loadConfig(Jenkins.java:3047)
Caused: java.io.IOException
at jenkins.model.Jenkins.loadConfig(Jenkins.java:3050)
at jenkins.model.Jenkins.access$1300(Jenkins.java:309)
at jenkins.model.Jenkins$13.run(Jenkins.java:3145)
at org.jvnet.hudson.reactor.TaskGraphBuilder$TaskImpl.run(TaskGraphBuilder.java:169)
at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:296)
at jenkins.model.Jenkins$5.runTask(Jenkins.java:1096)
at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:214)
at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:117)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused: org.jvnet.hudson.reactor.ReactorException
at org.jvnet.hudson.reactor.Reactor.execute(Reactor.java:282)
at jenkins.InitReactorRunner.run(InitReactorRunner.java:48)
at jenkins.model.Jenkins.executeReactor(Jenkins.java:1130)
at jenkins.model.Jenkins.<init>(Jenkins.java:932)
at hudson.model.Hudson.<init>(Hudson.java:85)
at hudson.model.Hudson.<init>(Hudson.java:81)
at hudson.WebAppMain$3.run(WebAppMain.java:233)
Caused: hudson.util.HudsonFailedToLoad
at hudson.WebAppMain$3.run(WebAppMain.java:250)
transistorgit's comment was mangled by the Markdown renderer, but I think this was the intention:
The initial script works fine for me, but leaves out some more complex (deeper nested) jobs.
So I added
shopt -s globstar
at the beginning and changed
git add -- *.xml jobs/*/*.xml userContent/*
to
git add -- *.xml jobs/**/config.xml userContent/*
This script has one issue though, folders and build history are not saved.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Published here: https://github.com/ilyaevseev/jenkins2git/