Skip to content

Instantly share code, notes, and snippets.

@skitazaki
Last active May 29, 2019 16:28
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save skitazaki/5343794 to your computer and use it in GitHub Desktop.
Save skitazaki/5343794 to your computer and use it in GitHub Desktop.
Backup Jenkins configuration XML files.

Backup Jenkins configuration XML files.

Setup

Python 2.7 and pip are required.

$ virtualenv --distribute $HOME/pyvenv/jenkins-backup
$ source $HOME/pyvenv/jenkins-backup/bin/activate
$ pip install -r requirements.txt

Prepare config.yaml for configuration file. Example is :

development:
  url: "http://localhost:8080/jenkins"

Usage

Run as following to specify -c, --environment, and --outdir option.

$ ./jenkins-backup.py -c config.yaml --environment development --outdir=jenkins-backup 
#!/usr/bin/env python
# -*- coding: utf-8 -*-
""" Backup Jenkins configuration as XML files.
Example configuration file is:
development:
url: "http://localhost:8080"
staging:
url: "http://test.example.com/jenkins"
username: "skitazaki"
password: "secret"
production:
url: "http://ci.example.com/jenkins"
username: "skitazaki"
password: "super-secret"
proxy: proxy.example.com:3128
"""
import codecs
import os
import logging
from jenkinsapi import jenkins
from jenkinsapi.exceptions import JenkinsAPIException
from clitool.cli import parse_arguments, cliconfig
def main():
args = parse_arguments(
environment=dict(flags='--environment', required=True),
outdir=dict(flags='--outdir', required=True))
cfg = cliconfig(args.config, args.environment)
if cfg is None:
raise SystemExit('Key is not found for "{}" in "{}"'.format(
args.environment, args.config.name))
output = args.outdir
if os.path.isdir(output):
logging.warning("Output directory already exists: %s", output)
else:
os.mkdir(output)
logging.info("Create output directory: %s", output)
# Set PROXY server
if 'proxy' in cfg:
os.environ['http_proxy'] = cfg['proxy']
jobs = {}
try:
api = jenkins.Jenkins(cfg['url'],
username=cfg.get('username'), password=cfg.get('password'))
except JenkinsAPIException:
raise SystemExit(cfg)
for name, job in api.get_jobs():
logging.debug("Backup: %s", name)
try:
c = job.get_config()
except JenkinsAPIException:
logging.error(name)
jobs[name] = False
continue
fname = os.path.join(output, name + ".xml")
with codecs.open(fname, 'w', encoding=args.output_encoding) as fp:
fp.write(c)
logging.info("Wrote: %s", fname)
jobs[name] = True
with open(os.path.join(output, 'README'), 'w') as fp:
fp.write(api.baseurl + '\n\n')
for name in sorted(jobs.keys()):
ret = 'SUCCESS' if jobs[name] else 'FAIL'
fp.write('- ' + name + ': ' + ret + '\n')
if __name__ == '__main__':
main()
# vim: set et ts=4 sw=4 cindent fileencoding=utf-8 :
jenkinsapi
clitool
pyyaml
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment