jenkins-peace 1.0.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 +3 -0
- data/.pullreview.yml +8 -0
- data/.travis.yml +12 -0
- data/AUTHORS +2 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +8 -0
- data/LICENSE +19 -0
- data/README.md +69 -0
- data/Rakefile +28 -0
- data/bin/jenkins.peace +5 -0
- data/jenkins-peace.gemspec +29 -0
- data/lib/jenkins/peace.rb +133 -0
- data/lib/jenkins/peace/cli.rb +91 -0
- data/lib/jenkins/peace/console_logger.rb +34 -0
- data/lib/jenkins/peace/content_downloader.rb +71 -0
- data/lib/jenkins/peace/thor_extensions.rb +86 -0
- data/lib/jenkins/peace/version.rb +5 -0
- data/lib/jenkins/peace/war_file.rb +151 -0
- data/lib/jenkins_peace.rb +7 -0
- data/spec/lib/console_logger_spec.rb +33 -0
- data/spec/lib/content_downloader_spec.rb +81 -0
- data/spec/lib/jenkins_peace_spec.rb +194 -0
- data/spec/lib/thor_extensions_spec.rb +101 -0
- data/spec/lib/war_file_spec.rb +156 -0
- data/spec/spec_helper.rb +43 -0
- metadata +161 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 83adb7855da16bf2491e373d1f1a63eb7246ace0
|
4
|
+
data.tar.gz: 68800057f45f6e45ffc3a3b66d6a85ff1ac008c1
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b4259c305059ff23b05ef402e3db85c98cc2ac806a01052a41c5d021a968779d27c5cc38cfecf9a20eed5fdfb3f6d6bcf87e30df44959c6849c85e1e94b544aa
|
7
|
+
data.tar.gz: f8b7108210e1ddb0426f863eab337689b31598fe17cf036b995a8c483b1b4adc032205d47a9c0f9807345e14c06cefeec2e2e54295c3bb0803ca884125f65187
|
data/.gitignore
ADDED
data/.pullreview.yml
ADDED
data/.travis.yml
ADDED
data/AUTHORS
ADDED
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
5
|
+
in the Software without restriction, including without limitation the rights
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in
|
11
|
+
all copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
## Jenkins ~~War~~ Peace
|
2
|
+
|
3
|
+
[](https://github.com/jbox-web/jenkins-peace/blob/master/LICENSE)
|
4
|
+
[](https://github.com/jbox-web/jenkins-peace/releases/latest)
|
5
|
+
[](https://rubygems.org/gems/jenkins-peace/versions/1.0.0)
|
6
|
+
[](https://rubygems.org/gems/jenkins-peace/versions/1.0.0)
|
7
|
+
[](https://travis-ci.org/jbox-web/jenkins-peace)
|
8
|
+
[](https://codeclimate.com/github/jbox-web/jenkins-peace)
|
9
|
+
[](https://codeclimate.com/github/jbox-web/jenkins-peace/coverage)
|
10
|
+
[](https://gemnasium.com/jbox-web/jenkins-peace)
|
11
|
+
[](https://www.pullreview.com/github/jbox-web/jenkins-peace/reviews/master)
|
12
|
+
|
13
|
+
### A small console application to manage Jenkins war files, easy, and in peace ;)
|
14
|
+
|
15
|
+
This gem aims to replace [jenkins-war](https://rubygems.org/gems/jenkins-war/versions/1.514) to manage Jenkins war files.
|
16
|
+
|
17
|
+
The previous version of this gem used to embed the war file directly in the GitHub repo which could lead to very long download time.
|
18
|
+
|
19
|
+
This one uses a cache directory to store Jenkins war files (```/<home directory>/.jenkins/war-files```).
|
20
|
+
|
21
|
+
|
22
|
+
## Installation
|
23
|
+
|
24
|
+
```ruby
|
25
|
+
gem install jenkins-peace
|
26
|
+
```
|
27
|
+
|
28
|
+
No need to add it to your Gemfile, it will be globally available.
|
29
|
+
|
30
|
+
## Usage
|
31
|
+
|
32
|
+
```sh
|
33
|
+
Commands:
|
34
|
+
jenkins.peace clean # Remove all war files
|
35
|
+
jenkins.peace download <version> # Download war file corresponding to version passed in params
|
36
|
+
jenkins.peace help [COMMAND] # Describe available commands or one specific command
|
37
|
+
jenkins.peace infos # Display infos about this gem
|
38
|
+
jenkins.peace install <version> # Install war file corresponding to version passed in params (will download then unpack war file)
|
39
|
+
jenkins.peace latest # Display infos about the latest version of war file installed
|
40
|
+
jenkins.peace list # List war files installed
|
41
|
+
jenkins.peace remove <version> # Remove war file corresponding to version passed in params
|
42
|
+
jenkins.peace server <version> # Start a server with the war file corresponding to version passed in params
|
43
|
+
jenkins.peace unpack <version> # Unpack war file corresponding to version passed in params
|
44
|
+
```
|
45
|
+
|
46
|
+
## Example
|
47
|
+
|
48
|
+
```sh
|
49
|
+
nicolas@desktop:~$ jenkins.peace list
|
50
|
+
+------------------+-------------------------------------------------------+-------------------------------------------------------------------------+-------------+
|
51
|
+
| Version | Location | Classpath | Installed |
|
52
|
+
+------------------+-------------------------------------------------------+-------------------------------------------------------------------------+-------------+
|
53
|
+
| latest (1.629) | /home/nicolas/.jenkins/war-files/latest/jenkins.war | /home/nicolas/.jenkins/wars/latest/WEB-INF/lib/jenkins-core-1.629.jar | true |
|
54
|
+
| 1.628 | /home/nicolas/.jenkins/war-files/1.628/jenkins.war | /home/nicolas/.jenkins/wars/1.628/WEB-INF/lib/jenkins-core-1.628.jar | true |
|
55
|
+
+------------------+-------------------------------------------------------+-------------------------------------------------------------------------+-------------+
|
56
|
+
```
|
57
|
+
|
58
|
+
## Contributors
|
59
|
+
|
60
|
+
A big thank to [them](https://github.com/jbox-web/jenkins-peace/blob/master/AUTHORS) for their contribution!
|
61
|
+
|
62
|
+
## Contribute
|
63
|
+
|
64
|
+
You can contribute to this plugin in many ways such as :
|
65
|
+
|
66
|
+
* Helping with documentation
|
67
|
+
* Contributing code (features or bugfixes)
|
68
|
+
* Reporting a bug
|
69
|
+
* Submitting translations
|
data/Rakefile
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
Bundler::GemHelper.install_tasks
|
3
|
+
|
4
|
+
require 'rake'
|
5
|
+
require 'rspec/core/rake_task'
|
6
|
+
|
7
|
+
desc 'Start unit tests'
|
8
|
+
task test: :spec
|
9
|
+
task :spec do
|
10
|
+
RSpec::Core::RakeTask.new(:spec) do |config|
|
11
|
+
config.rspec_opts = '--color'
|
12
|
+
end
|
13
|
+
Rake::Task['spec'].invoke
|
14
|
+
end
|
15
|
+
|
16
|
+
desc 'Install latest Jenkins war file'
|
17
|
+
task default: :prepare
|
18
|
+
task :prepare do
|
19
|
+
begin
|
20
|
+
require 'bundler/setup'
|
21
|
+
require 'jenkins_peace'
|
22
|
+
Jenkins::Peace::ConsoleLogger.new().info("Installing Jenkins war file version : 'latest'")
|
23
|
+
Jenkins::Peace.install('latest')
|
24
|
+
Jenkins::Peace::ConsoleLogger.new().info('Done !')
|
25
|
+
rescue
|
26
|
+
puts "Failed to install Jenkins war, you'll have to install it yourself with 'jenkins.peace install <version>'"
|
27
|
+
end
|
28
|
+
end
|
data/bin/jenkins.peace
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path('../lib', __FILE__)
|
3
|
+
require 'jenkins/peace/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'jenkins-peace'
|
7
|
+
s.version = Jenkins::Peace::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ['Nicolas Rodriguez']
|
10
|
+
s.email = ['nrodriguez@jbox-web.com']
|
11
|
+
s.homepage = 'http://jbox-web.github.io/jenkins-peace/'
|
12
|
+
s.summary = %q{Fetch and use a specific Jenkins version with Rubygems}
|
13
|
+
s.description = %q{Download and install a specific version of the Jenkins war file which can be used for either running a server, or for plugin development}
|
14
|
+
s.license = 'MIT'
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.extensions = ['Rakefile']
|
20
|
+
s.require_paths = ['lib']
|
21
|
+
|
22
|
+
s.add_runtime_dependency 'rake'
|
23
|
+
s.add_runtime_dependency 'thor'
|
24
|
+
s.add_runtime_dependency 'tty-table'
|
25
|
+
s.add_runtime_dependency 'ruby-progressbar'
|
26
|
+
|
27
|
+
s.add_development_dependency 'rspec'
|
28
|
+
s.add_development_dependency 'simplecov'
|
29
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
|
3
|
+
module Jenkins
|
4
|
+
module Peace
|
5
|
+
extend self
|
6
|
+
|
7
|
+
def jenkins_war_url
|
8
|
+
'http://mirrors.jenkins-ci.org/war/'
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
def base_path
|
13
|
+
File.join(ENV['HOME'], '.jenkins')
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
def war_files_cache
|
18
|
+
File.join(base_path, 'war-files')
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
def war_unpacked_cache
|
23
|
+
File.join(base_path, 'wars')
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
def server_path
|
28
|
+
File.join(base_path, 'server')
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
def infos
|
33
|
+
{
|
34
|
+
jenkins_war_url: jenkins_war_url,
|
35
|
+
base_path: base_path,
|
36
|
+
war_files_cache: war_files_cache,
|
37
|
+
war_unpacked_cache: war_unpacked_cache,
|
38
|
+
server_path: server_path
|
39
|
+
}
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
def latest_war_file
|
44
|
+
return nil if all_war_files_as_object.empty?
|
45
|
+
all_war_files_as_object.select { |f| f.installed? }.first
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
def latest_version
|
50
|
+
latest_war_file ? latest_war_file.classpath : nil
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
def list
|
55
|
+
all_war_files_as_object
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
def download(version, overwrite = false, url = nil)
|
60
|
+
war_file = build_war_file(version, url)
|
61
|
+
war_file = check_for_presence_and_execute(war_file, :download!, overwrite)
|
62
|
+
war_file
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
def install(version, overwrite = false, url = nil)
|
67
|
+
war_file = build_war_file(version, url)
|
68
|
+
war_file = check_for_presence_and_execute(war_file, :install!, overwrite)
|
69
|
+
war_file
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
def unpack(version, overwrite = false)
|
74
|
+
war_file = build_war_file(version)
|
75
|
+
war_file = check_for_presence_and_execute(war_file, :unpack!, overwrite)
|
76
|
+
war_file
|
77
|
+
end
|
78
|
+
|
79
|
+
|
80
|
+
def remove(version)
|
81
|
+
war_file = build_war_file(version)
|
82
|
+
war_file.remove! if war_file.exists?
|
83
|
+
war_file
|
84
|
+
end
|
85
|
+
|
86
|
+
|
87
|
+
def clean!
|
88
|
+
all_war_files_as_object.map(&:remove!)
|
89
|
+
end
|
90
|
+
|
91
|
+
|
92
|
+
def build_war_file(version, url = nil)
|
93
|
+
options = build_war_file_options
|
94
|
+
options = options.merge(base_url: url) unless url.nil?
|
95
|
+
WarFile.new(version, options)
|
96
|
+
end
|
97
|
+
|
98
|
+
|
99
|
+
def all_war_files
|
100
|
+
FileUtils.mkdir_p war_files_cache unless File.exists?(war_files_cache)
|
101
|
+
Pathname.new(war_files_cache).children.select { |c| c.directory? }
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
def check_for_presence_and_execute(war_file, method, overwrite = false)
|
106
|
+
if !war_file.exists?
|
107
|
+
war_file.send(method)
|
108
|
+
elsif war_file.exists? && overwrite
|
109
|
+
war_file.send(method)
|
110
|
+
end
|
111
|
+
war_file
|
112
|
+
end
|
113
|
+
|
114
|
+
|
115
|
+
private
|
116
|
+
|
117
|
+
|
118
|
+
def build_war_file_options
|
119
|
+
{ base_url: jenkins_war_url, base_path: war_files_cache, lib_path: war_unpacked_cache, server_path: server_path, logger: ConsoleLogger.new }
|
120
|
+
end
|
121
|
+
|
122
|
+
|
123
|
+
def all_war_files_sorted
|
124
|
+
all_war_files.sort.reverse
|
125
|
+
end
|
126
|
+
|
127
|
+
|
128
|
+
def all_war_files_as_object
|
129
|
+
all_war_files_sorted.map { |f| build_war_file(File.basename(f)) }
|
130
|
+
end
|
131
|
+
|
132
|
+
end
|
133
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'tty-table'
|
2
|
+
require 'thor'
|
3
|
+
|
4
|
+
module Jenkins
|
5
|
+
module Peace
|
6
|
+
class CLI < Thor
|
7
|
+
|
8
|
+
include Jenkins::Peace::ThorExtensions
|
9
|
+
|
10
|
+
desc 'infos', 'Display infos about this gem'
|
11
|
+
|
12
|
+
def infos
|
13
|
+
say
|
14
|
+
table = TTY::Table.new rows: Jenkins::Peace.infos.to_a
|
15
|
+
puts table.render(:basic, padding: [0, 2])
|
16
|
+
say
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
desc 'latest', 'Display infos about the latest version of war file installed'
|
21
|
+
|
22
|
+
def latest
|
23
|
+
return warn 'No Jenkins war files installed' unless Jenkins::Peace.latest_version
|
24
|
+
info Jenkins::Peace.latest_version
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
desc 'list', 'List war files installed'
|
29
|
+
|
30
|
+
def list
|
31
|
+
return warn 'No Jenkins war files installed' if Jenkins::Peace.list.empty?
|
32
|
+
table = TTY::Table.new header: formated_headers, rows: formated_war_files_list
|
33
|
+
puts table.render(:ascii, padding: [0, 2])
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
desc 'download <version>', 'Download war file corresponding to version passed in params'
|
38
|
+
|
39
|
+
def download(version)
|
40
|
+
check_conflicts_and_call_method(:download, version)
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
desc 'unpack <version>', 'Unpack war file corresponding to version passed in params'
|
45
|
+
|
46
|
+
def unpack(version)
|
47
|
+
check_conflicts_and_call_method(:unpack, version, :unpacked?) do |war_file|
|
48
|
+
return download_it_first! unless war_file.exists?
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
desc 'install <version>', 'Install war file corresponding to version passed in params (will download then unpack war file)'
|
54
|
+
|
55
|
+
def install(version)
|
56
|
+
check_conflicts_and_call_method(:install, version)
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
desc 'remove <version>', 'Remove war file corresponding to version passed in params'
|
61
|
+
|
62
|
+
def remove(version)
|
63
|
+
Jenkins::Peace.remove(version)
|
64
|
+
success_message
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
desc 'clean', 'Remove all war files'
|
69
|
+
|
70
|
+
def clean
|
71
|
+
yes_no_question('Are you sure?') { Jenkins::Peace.clean! }
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
desc 'server <version>', 'Start a server with the war file corresponding to version passed in params'
|
76
|
+
|
77
|
+
method_option :home, aliases: '-h', default: File.join(ENV['HOME'], '.jenkins', 'server'), type: :string, desc: 'Use this directory to store server data'
|
78
|
+
method_option :port, aliases: '-p', default: 3001, type: :numeric, desc: 'Port for server (default 3001)'
|
79
|
+
method_option :control, aliases: '-c', default: 3002, type: :numeric, desc: 'Shutdown/Control port (default 3002)'
|
80
|
+
method_option :daemon, aliases: '-d', default: false, type: :boolean, desc: 'Daemonize'
|
81
|
+
method_option :kill, aliases: '-k', default: false, type: :boolean, desc: 'Kill'
|
82
|
+
method_option :logfile, aliases: '-l', default: File.join(Dir.pwd, 'jenkins.log'), type: :string, desc: 'Redirect log messages to this file'
|
83
|
+
|
84
|
+
def server(version)
|
85
|
+
war_file = Jenkins::Peace.build_war_file(version)
|
86
|
+
war_file.exists? ? war_file.start!(options) : download_it_first!
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Jenkins
|
2
|
+
module Peace
|
3
|
+
class ConsoleLogger
|
4
|
+
|
5
|
+
RED = "\e[31m"
|
6
|
+
GREEN = "\e[32m"
|
7
|
+
YELLOW = "\e[33m"
|
8
|
+
CLEAR = "\e[0m"
|
9
|
+
|
10
|
+
attr_reader :logger
|
11
|
+
|
12
|
+
|
13
|
+
def initialize(logger = $stdout)
|
14
|
+
@logger = logger
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
def info(message)
|
19
|
+
logger << "#{GREEN}#{message}#{CLEAR}\n"
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
def warn(message)
|
24
|
+
logger << "#{YELLOW}#{message}#{CLEAR}\n"
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
def error(message)
|
29
|
+
logger << "#{RED}#{message}#{CLEAR}\n"
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|