leeroy_jenkins 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +11 -0
- data/.rspec +2 -0
- data/.travis.yml +4 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +37 -0
- data/Rakefile +6 -0
- data/Vagrantfile +16 -0
- data/bin/console +7 -0
- data/exe/leeroy +5 -0
- data/leeroy_jenkins.gemspec +35 -0
- data/lib/leeroy_jenkins.rb +24 -0
- data/lib/leeroy_jenkins/cli.rb +85 -0
- data/lib/leeroy_jenkins/jenkins_client_builder.rb +22 -0
- data/lib/leeroy_jenkins/job_backupper.rb +40 -0
- data/lib/leeroy_jenkins/job_finder.rb +14 -0
- data/lib/leeroy_jenkins/job_restorer.rb +39 -0
- data/lib/leeroy_jenkins/job_updater.rb +59 -0
- data/lib/leeroy_jenkins/version.rb +3 -0
- metadata +233 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 1d3df8dc1299f3417af4e55e13a438104437dd7a
|
4
|
+
data.tar.gz: ba55c5b0cddbdae4400402244b2b812acf425141
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 151b61e31a352ad18fd87ad0b8e87a620f52d8be577c3dd1936800ae82fbaccaff217c34b90359c285095d4287eca2629d81fb00c341817bea61b7d302cccbf5
|
7
|
+
data.tar.gz: 05d7282a0d2cfbedccf1b2ecb722b990a8dbb3665dbf5aef98448cbf0728cee42afe64410548c2291d47aa8855ef73c40d19163115a6e9ef538573f1de77080d
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2015 Jellyvision
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# leeroy_jenkins
|
2
|
+
|
3
|
+
## Description
|
4
|
+
A CLI tool for managing Jenkins job configurations: bulk update, backup, and restore your Jenkins job configurations
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
Add this line to your application's Gemfile:
|
9
|
+
|
10
|
+
```ruby
|
11
|
+
gem 'leeroy_jenkins', git: 'https://github.com/Jellyvision/leeroy_jenkins.git'
|
12
|
+
```
|
13
|
+
|
14
|
+
And then execute:
|
15
|
+
|
16
|
+
$ bundle
|
17
|
+
|
18
|
+
Or install it yourself as:
|
19
|
+
|
20
|
+
$ git clone https://github.com/Jellyvision/leeroy_jenkins.git
|
21
|
+
$ cd leeroy_jenkins
|
22
|
+
$ bundle install
|
23
|
+
$ bundle exec rake install
|
24
|
+
|
25
|
+
## Usage
|
26
|
+
|
27
|
+
Set your `LEEROY_JENKINS_USERNAME`, `LEEROY_JENKINS_PASSWORD`, and `LEEROY_JENKINS_SERVER_URL` appropriately for your Jenkins. These can also be overridden with command line options.
|
28
|
+
|
29
|
+
$ leeroy --help
|
30
|
+
$ leeroy help [COMMAND_NAME]
|
31
|
+
|
32
|
+
## Development
|
33
|
+
|
34
|
+
After checking out the repo, run `bundle install` to install dependencies. Then, run `bundle exec rspec` to run the unit tests. You can also run `bundle exec bin/console` for an interactive prompt that will allow you to experiment. Run `bundle exec exe/leeroy` to use the gem in this directory, ignoring other installed copies of this gem.
|
35
|
+
|
36
|
+
To run the acceptance tests, run `vagrant up` to start your own Jenkins instance. This may take 5-10 minutes, but when finished you'll be able to access Jenkins at `192.168.50.33:8080` in your web browser. Then run `bundle exec cucumber`.
|
37
|
+
|
data/Rakefile
ADDED
data/Vagrantfile
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
Vagrant.configure 2 do |config|
|
2
|
+
config.vm.box = "ubuntu/trusty64"
|
3
|
+
config.vm.network "private_network", ip: "192.168.50.33"
|
4
|
+
|
5
|
+
config.vm.provision "shell", inline: <<-SCRIPT
|
6
|
+
apt-get update
|
7
|
+
apt-get upgrade -y
|
8
|
+
|
9
|
+
apt-get install openjdk-7-jdk -y
|
10
|
+
|
11
|
+
wget -q -O - https://jenkins-ci.org/debian/jenkins-ci.org.key | apt-key add -
|
12
|
+
sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'
|
13
|
+
apt-get update
|
14
|
+
apt-get install jenkins -y
|
15
|
+
SCRIPT
|
16
|
+
end
|
data/bin/console
ADDED
data/exe/leeroy
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'leeroy_jenkins/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "leeroy_jenkins"
|
8
|
+
spec.version = LeeroyJenkins::VERSION
|
9
|
+
spec.authors = ["Jeff Rabovsky"]
|
10
|
+
spec.email = ["jeffr@jellyvision.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{A CLI tool for managing Jenkins job configurations}
|
13
|
+
# spec.description = %q{TODO: Write a longer description or delete this line.}
|
14
|
+
# spec.homepage = "TODO: Put your gem's website or public repo URL here."
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
+
spec.bindir = "exe"
|
19
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
|
22
|
+
spec.add_dependency "jenkins_api_client", "~> 1.4"
|
23
|
+
spec.add_dependency "thor", "~> 0.19.1"
|
24
|
+
spec.add_dependency "nokogiri", "~> 1.6"
|
25
|
+
spec.add_dependency "parallel", "~> 1.6"
|
26
|
+
|
27
|
+
spec.add_development_dependency "bundler", "~> 1.10"
|
28
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
29
|
+
spec.add_development_dependency "rspec", "~> 3.3"
|
30
|
+
spec.add_development_dependency "aruba", "~> 0.9.0"
|
31
|
+
spec.add_development_dependency "cucumber", "~> 2.1"
|
32
|
+
spec.add_development_dependency "pry", "~> 0.10.1"
|
33
|
+
spec.add_development_dependency "pry-doc", "~> 0.8.0"
|
34
|
+
spec.add_development_dependency "pry-stack_explorer", "~> 0.4.9"
|
35
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "jenkins_api_client"
|
2
|
+
require "thor"
|
3
|
+
require "nokogiri"
|
4
|
+
require "parallel"
|
5
|
+
|
6
|
+
require "leeroy_jenkins/version"
|
7
|
+
require "leeroy_jenkins/cli"
|
8
|
+
require "leeroy_jenkins/job_finder"
|
9
|
+
require "leeroy_jenkins/jenkins_client_builder"
|
10
|
+
require "leeroy_jenkins/job_updater"
|
11
|
+
require "leeroy_jenkins/job_backupper"
|
12
|
+
require "leeroy_jenkins/job_restorer"
|
13
|
+
|
14
|
+
module LeeroyJenkins
|
15
|
+
def self.invalid_xml_document? raw_xml
|
16
|
+
begin
|
17
|
+
Nokogiri::XML(raw_xml) { |config| config.strict }
|
18
|
+
rescue Nokogiri::XML::SyntaxError => e
|
19
|
+
return e
|
20
|
+
end
|
21
|
+
|
22
|
+
false
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module LeeroyJenkins
|
2
|
+
class Cli < Thor
|
3
|
+
class_option :log_level, required: false, type: :numeric, desc: 'The detail of the messages logged by the Jenkins API client. DEBUG (0), INFO (1), WARN (2), FATAL (3)', enum: [0, 1, 2, 3], default: 3
|
4
|
+
class_option :log_location, required: false, type: :string, desc: 'Path to the log file', default: STDOUT
|
5
|
+
class_option :username, required: false, type: :string, desc: 'Override LEEROY_JENKINS_USERNAME'
|
6
|
+
class_option :password, required: false, type: :string, desc: 'Override LEEROY_JENKINS_PASSWORD'
|
7
|
+
class_option :server_url, required: false, type: :string, desc: 'Override LEEROY_JENKINS_SERVER_URL'
|
8
|
+
class_option :threads, required: false, type: :numeric, desc: 'Number of threads to use for network and disk IO', default: 4
|
9
|
+
|
10
|
+
desc 'update-config', 'Modify jobs\' config.xml'
|
11
|
+
option :job_regex, required: false, type: :string, desc: 'Regular expression to select jobs by name', default: '.*'
|
12
|
+
option :new_xml, required: true, type: :string, desc: 'Path to an XML file'
|
13
|
+
option :xpath, required: false, type: :string, desc: 'XPath of node(s) to modify in the config.xml of the specified job(s)', default: '/'
|
14
|
+
option :dry_run, type: :boolean, desc: 'Write XML to STDOUT instead of to Jenkins', default: true
|
15
|
+
option :at_xpath, required: false, type: :string, desc: 'Replace, append to, or delete the XML node(s) specified by the given XPath', enum: ['replace', 'append', 'delete'], default: 'replace'
|
16
|
+
def update_config
|
17
|
+
raw_xml_string = File.read options[:new_xml]
|
18
|
+
if error = LeeroyJenkins.invalid_xml_document?(raw_xml_string)
|
19
|
+
error "#{options[:new_xml]}} is not well-formed XML: #{error}"
|
20
|
+
exit 1
|
21
|
+
end
|
22
|
+
|
23
|
+
jenkins_client = build_jenkins_client options
|
24
|
+
|
25
|
+
job_names_to_update = JobFinder.new(options[:job_regex], jenkins_client).find_jobs
|
26
|
+
job_updater = JobUpdater.new job_names_to_update, raw_xml_string, jenkins_client, options[:xpath], options[:at_xpath], options[:threads]
|
27
|
+
result = options[:dry_run] ? job_updater.dry_run : job_updater.update_jobs!
|
28
|
+
|
29
|
+
if options[:dry_run]
|
30
|
+
result.each do |key, value|
|
31
|
+
puts "#{key}:"
|
32
|
+
puts
|
33
|
+
puts value
|
34
|
+
end
|
35
|
+
else
|
36
|
+
result.each do |key, value|
|
37
|
+
puts "#{key}: #{value}"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
desc 'backup', 'Save the config.xml of Jenkins jobs to disk'
|
43
|
+
option :job_regex, required: false, type: :string, desc: 'Regular expression to select jobs by name', default: '.*'
|
44
|
+
option :backup_dir, required: true, type: :string, desc: 'Path to the directory to save the config.xml file to, created if it does not exist'
|
45
|
+
def backup
|
46
|
+
jenkins_client = build_jenkins_client options
|
47
|
+
job_names_to_backup = JobFinder.new(options[:job_regex], jenkins_client).find_jobs
|
48
|
+
JobBackupper.new(job_names_to_backup, jenkins_client, options[:backup_dir], options[:threads]).backup
|
49
|
+
end
|
50
|
+
|
51
|
+
desc 'restore', 'Restore config.xml files to Jenkins jobs from backups'
|
52
|
+
option :backup_dir, required: true, type: :string, desc: 'Path to the directory where config.xml files were backed up'
|
53
|
+
option :dry_run, type: :boolean, desc: 'Write XML to STDOUT instead of to Jenkins', default: true
|
54
|
+
def restore
|
55
|
+
jenkins_client = build_jenkins_client options
|
56
|
+
job_restorer = JobRestorer.new jenkins_client, options[:backup_dir], options[:threads]
|
57
|
+
result = options[:dry_run] ? job_restorer.dry_run : job_restorer.restore!
|
58
|
+
|
59
|
+
if options[:dry_run]
|
60
|
+
result.each do |key, value|
|
61
|
+
puts "#{key}:"
|
62
|
+
puts
|
63
|
+
puts value
|
64
|
+
end
|
65
|
+
else
|
66
|
+
result.each do |key, value|
|
67
|
+
puts "#{key}: #{value}"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def build_jenkins_client options
|
75
|
+
JenkinsClientBuilder.new(
|
76
|
+
server_url: options[:server_url],
|
77
|
+
username: options[:username],
|
78
|
+
password: options[:password],
|
79
|
+
log_level: options[:log_level],
|
80
|
+
log_location: options[:log_location]
|
81
|
+
).build
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module LeeroyJenkins
|
2
|
+
class JenkinsClientBuilder
|
3
|
+
attr_reader :server_url, :username, :password, :log_level, :log_location
|
4
|
+
|
5
|
+
def initialize(options = {})
|
6
|
+
@server_url = options[:server_url] || ENV['LEEROY_JENKINS_SERVER_URL']
|
7
|
+
@username = options[:username] || ENV['LEEROY_JENKINS_USERNAME']
|
8
|
+
@password = options[:password] || ENV['LEEROY_JENKINS_PASSWORD']
|
9
|
+
|
10
|
+
@log_level = options[:log_level] || 1
|
11
|
+
@log_location = options[:log_location] || STDOUT
|
12
|
+
end
|
13
|
+
|
14
|
+
def build
|
15
|
+
JenkinsApi::Client.new server_url: server_url,
|
16
|
+
username: username,
|
17
|
+
password: password,
|
18
|
+
log_level: log_level,
|
19
|
+
log_location: log_location
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module LeeroyJenkins
|
2
|
+
class JobBackupper
|
3
|
+
attr_reader :job_names_to_backup, :backup_dir, :jenkins_client, :threads
|
4
|
+
|
5
|
+
def initialize(job_names_to_backup, jenkins_client, backup_dir, threads)
|
6
|
+
@job_names_to_backup = job_names_to_backup
|
7
|
+
@jenkins_client = jenkins_client
|
8
|
+
@backup_dir = backup_dir
|
9
|
+
@threads = threads
|
10
|
+
end
|
11
|
+
|
12
|
+
def get_job_configs
|
13
|
+
pairs = map_job_configs do |job_name, job_config|
|
14
|
+
[job_name, job_config]
|
15
|
+
end
|
16
|
+
|
17
|
+
Hash[pairs]
|
18
|
+
end
|
19
|
+
|
20
|
+
def backup
|
21
|
+
unless Dir.exists? backup_dir
|
22
|
+
FileUtils.mkdir_p backup_dir
|
23
|
+
end
|
24
|
+
|
25
|
+
map_job_configs do |job_name, job_config|
|
26
|
+
File.write "#{backup_dir}/#{job_name}.xml", job_config
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def map_job_configs &block
|
33
|
+
Parallel.map(job_names_to_backup, in_threads: threads) do |job_name|
|
34
|
+
job_config = jenkins_client.job.get_config job_name
|
35
|
+
yield job_name, job_config
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module LeeroyJenkins
|
2
|
+
class JobRestorer
|
3
|
+
attr_reader :backup_dir, :jenkins_client, :threads
|
4
|
+
|
5
|
+
def initialize(jenkins_client, backup_dir, threads)
|
6
|
+
@jenkins_client = jenkins_client
|
7
|
+
@backup_dir = backup_dir
|
8
|
+
@threads = threads
|
9
|
+
end
|
10
|
+
|
11
|
+
def dry_run
|
12
|
+
pairs = Parallel.map(config_xml_file_paths, in_threads: threads) do |xml_path|
|
13
|
+
job_name = File.basename xml_path, '.*'
|
14
|
+
[job_name, File.read(xml_path)]
|
15
|
+
end
|
16
|
+
|
17
|
+
Hash[pairs]
|
18
|
+
end
|
19
|
+
|
20
|
+
def restore!
|
21
|
+
pairs = Parallel.map(config_xml_file_paths, in_threads: threads) do |xml_path|
|
22
|
+
job_name = File.basename xml_path, '.*'
|
23
|
+
http_status_code = jenkins_client.job.create_or_update job_name, File.read(xml_path)
|
24
|
+
[job_name, http_status_code]
|
25
|
+
end
|
26
|
+
|
27
|
+
Hash[pairs]
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def config_xml_file_paths
|
33
|
+
Dir.entries(backup_dir).
|
34
|
+
select { |file_name| file_name.end_with? '.xml' }.
|
35
|
+
map { |file_name| "#{backup_dir}/#{file_name}" }
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module LeeroyJenkins
|
2
|
+
class JobUpdater
|
3
|
+
attr_reader :job_names_to_update, :new_xml, :jenkins_client, :xpath, :at_xpath, :threads
|
4
|
+
|
5
|
+
def initialize(job_names_to_update, new_xml, jenkins_client, xpath, at_xpath, threads)
|
6
|
+
@job_names_to_update = job_names_to_update
|
7
|
+
@new_xml = new_xml
|
8
|
+
@jenkins_client = jenkins_client
|
9
|
+
@xpath = xpath
|
10
|
+
@at_xpath = at_xpath
|
11
|
+
@threads = threads
|
12
|
+
end
|
13
|
+
|
14
|
+
def update_jobs!
|
15
|
+
pairs = Parallel.map(job_names_to_update, in_threads: threads) do |job_name|
|
16
|
+
http_status_code = jenkins_client.job.post_config job_name, construct_xml(job_name)
|
17
|
+
[job_name, http_status_code]
|
18
|
+
end
|
19
|
+
|
20
|
+
Hash[pairs]
|
21
|
+
end
|
22
|
+
|
23
|
+
def dry_run
|
24
|
+
pairs = Parallel.map(job_names_to_update, in_threads: threads) do |job_name|
|
25
|
+
[job_name, construct_xml(job_name)]
|
26
|
+
end
|
27
|
+
|
28
|
+
Hash[pairs]
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def construct_xml job_name
|
34
|
+
element_to_insert = Nokogiri.XML(new_xml).root
|
35
|
+
document_to_modify = Nokogiri.XML current_xml(job_name), &:noblanks
|
36
|
+
elements_to_modify = document_to_modify.xpath(xpath).map do |node|
|
37
|
+
node.document? ? node.root : node
|
38
|
+
end
|
39
|
+
|
40
|
+
elements_to_modify.each do |node|
|
41
|
+
case at_xpath
|
42
|
+
when 'replace'
|
43
|
+
node.replace element_to_insert
|
44
|
+
when 'append'
|
45
|
+
node << element_to_insert
|
46
|
+
when 'delete'
|
47
|
+
node.remove
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
document_to_modify.canonicalize
|
52
|
+
end
|
53
|
+
|
54
|
+
def current_xml job_name
|
55
|
+
jenkins_client.job.get_config job_name
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
metadata
ADDED
@@ -0,0 +1,233 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: leeroy_jenkins
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jeff Rabovsky
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-10-07 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: jenkins_api_client
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.4'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.4'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: thor
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.19.1
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.19.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: nokogiri
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.6'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.6'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: parallel
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.6'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.6'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: bundler
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.10'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.10'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rake
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '10.0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '10.0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rspec
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '3.3'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '3.3'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: aruba
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 0.9.0
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 0.9.0
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: cucumber
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '2.1'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '2.1'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: pry
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: 0.10.1
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: 0.10.1
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: pry-doc
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: 0.8.0
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - "~>"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: 0.8.0
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: pry-stack_explorer
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - "~>"
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: 0.4.9
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - "~>"
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: 0.4.9
|
181
|
+
description:
|
182
|
+
email:
|
183
|
+
- jeffr@jellyvision.com
|
184
|
+
executables:
|
185
|
+
- leeroy
|
186
|
+
extensions: []
|
187
|
+
extra_rdoc_files: []
|
188
|
+
files:
|
189
|
+
- ".gitignore"
|
190
|
+
- ".rspec"
|
191
|
+
- ".travis.yml"
|
192
|
+
- Gemfile
|
193
|
+
- LICENSE.txt
|
194
|
+
- README.md
|
195
|
+
- Rakefile
|
196
|
+
- Vagrantfile
|
197
|
+
- bin/console
|
198
|
+
- exe/leeroy
|
199
|
+
- leeroy_jenkins.gemspec
|
200
|
+
- lib/leeroy_jenkins.rb
|
201
|
+
- lib/leeroy_jenkins/cli.rb
|
202
|
+
- lib/leeroy_jenkins/jenkins_client_builder.rb
|
203
|
+
- lib/leeroy_jenkins/job_backupper.rb
|
204
|
+
- lib/leeroy_jenkins/job_finder.rb
|
205
|
+
- lib/leeroy_jenkins/job_restorer.rb
|
206
|
+
- lib/leeroy_jenkins/job_updater.rb
|
207
|
+
- lib/leeroy_jenkins/version.rb
|
208
|
+
homepage:
|
209
|
+
licenses:
|
210
|
+
- MIT
|
211
|
+
metadata: {}
|
212
|
+
post_install_message:
|
213
|
+
rdoc_options: []
|
214
|
+
require_paths:
|
215
|
+
- lib
|
216
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
217
|
+
requirements:
|
218
|
+
- - ">="
|
219
|
+
- !ruby/object:Gem::Version
|
220
|
+
version: '0'
|
221
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
222
|
+
requirements:
|
223
|
+
- - ">="
|
224
|
+
- !ruby/object:Gem::Version
|
225
|
+
version: '0'
|
226
|
+
requirements: []
|
227
|
+
rubyforge_project:
|
228
|
+
rubygems_version: 2.4.5.1
|
229
|
+
signing_key:
|
230
|
+
specification_version: 4
|
231
|
+
summary: A CLI tool for managing Jenkins job configurations
|
232
|
+
test_files: []
|
233
|
+
has_rdoc:
|