backup_jenkins 0.0.10 → 0.0.11
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.
- data/backup_jenkins.gemspec +2 -0
- data/lib/backup_jenkins/aws.rb +6 -6
- data/lib/backup_jenkins/backup.rb +10 -10
- data/lib/backup_jenkins/cli.rb +3 -0
- data/lib/backup_jenkins/config.rb +11 -8
- data/lib/backup_jenkins/formatter.rb +1 -1
- data/lib/backup_jenkins/version.rb +1 -1
- data/lib/backup_jenkins.rb +1 -0
- data/spec/lib/backup_jenkins/aws_spec.rb +17 -13
- data/spec/lib/backup_jenkins/backup_spec.rb +8 -9
- data/spec/lib/backup_jenkins/config_spec.rb +2 -2
- data/spec/lib/backup_jenkins/formatter_spec.rb +1 -1
- metadata +16 -5
data/backup_jenkins.gemspec
CHANGED
data/lib/backup_jenkins/aws.rb
CHANGED
@@ -54,7 +54,7 @@ module BackupJenkins
|
|
54
54
|
|
55
55
|
# TODO change this to use a time decay algorithm
|
56
56
|
def files_to_remove
|
57
|
-
files - files.last(config.backup
|
57
|
+
files - files.last(config.backup.backups_to_keep.remote)
|
58
58
|
end
|
59
59
|
|
60
60
|
def files
|
@@ -66,20 +66,20 @@ module BackupJenkins
|
|
66
66
|
end
|
67
67
|
|
68
68
|
def backup_files_for_all_hosts
|
69
|
-
s3_files.with_prefix(config.backup
|
69
|
+
s3_files.with_prefix(config.backup.file_name_base)
|
70
70
|
end
|
71
71
|
|
72
72
|
def setup_aws
|
73
73
|
s3 = initialize_s3_object
|
74
|
-
@bucket = s3.buckets[config.aws
|
75
|
-
@bucket = s3.buckets.create(config.aws
|
74
|
+
@bucket = s3.buckets[config.aws.bucket_name]
|
75
|
+
@bucket = s3.buckets.create(config.aws.bucket_name) unless @bucket.exists?
|
76
76
|
raise "Couldn't create bucket!" unless @bucket.exists?
|
77
77
|
end
|
78
78
|
|
79
79
|
def initialize_s3_object
|
80
80
|
::AWS::S3.new(
|
81
|
-
:access_key_id => config.aws
|
82
|
-
:secret_access_key => config.aws
|
81
|
+
:access_key_id => config.aws.access_key,
|
82
|
+
:secret_access_key => config.aws.secret
|
83
83
|
)
|
84
84
|
end
|
85
85
|
|
@@ -42,7 +42,7 @@ module BackupJenkins
|
|
42
42
|
attr_reader :config
|
43
43
|
|
44
44
|
def backup_directory
|
45
|
-
@backup_directory ||= "#{config.backup
|
45
|
+
@backup_directory ||= "#{config.backup.dir_base}/#{config.base_file_name}_#{timestamp}"
|
46
46
|
end
|
47
47
|
|
48
48
|
def timestamp
|
@@ -72,21 +72,21 @@ module BackupJenkins
|
|
72
72
|
end
|
73
73
|
|
74
74
|
def new_file_path(file_name)
|
75
|
-
"#{backup_directory}/#{file_name.gsub(%r{#{config.jenkins
|
75
|
+
"#{backup_directory}/#{file_name.gsub(%r{#{config.jenkins.home}}, "")}".gsub(%r{//}, '/')
|
76
76
|
end
|
77
77
|
|
78
78
|
def plugin_files
|
79
|
-
Dir["#{config.jenkins
|
80
|
-
Dir["#{config.jenkins
|
81
|
-
Dir["#{config.jenkins
|
79
|
+
Dir["#{config.jenkins.home}/plugins/*.jpi"] +
|
80
|
+
Dir["#{config.jenkins.home}/plugins/*.jpi.pinned"] +
|
81
|
+
Dir["#{config.jenkins.home}/plugins/*.jpi.disabled"]
|
82
82
|
end
|
83
83
|
|
84
84
|
def user_content_files
|
85
|
-
Dir["#{config.jenkins
|
85
|
+
Dir["#{config.jenkins.home}/userContent/*"]
|
86
86
|
end
|
87
87
|
|
88
88
|
def jobs_files
|
89
|
-
`find #{config.jenkins
|
89
|
+
`find #{config.jenkins.home}/jobs -maxdepth 3 -name config.xml -or -name nextBuildNumber`.split(/\n/)
|
90
90
|
end
|
91
91
|
|
92
92
|
def create_tarball
|
@@ -110,17 +110,17 @@ module BackupJenkins
|
|
110
110
|
|
111
111
|
def files_to_remove
|
112
112
|
glob_of_backup_files -
|
113
|
-
glob_of_backup_files.last(config.backup
|
113
|
+
glob_of_backup_files.last(config.backup.backups_to_keep.local)
|
114
114
|
end
|
115
115
|
|
116
116
|
def glob_of_backup_files
|
117
|
-
Dir["#{config.backup
|
117
|
+
Dir["#{config.backup.dir_base}/#{config.base_file_name}_*tar.bz2"]
|
118
118
|
end
|
119
119
|
|
120
120
|
def backup_files
|
121
121
|
glob_of_backup_files.sort.map do |file|
|
122
122
|
{
|
123
|
-
:key => file.gsub(%r{#{config.backup
|
123
|
+
:key => file.gsub(%r{#{config.backup.dir_base}/}, ''),
|
124
124
|
:content_length => File.size(file)
|
125
125
|
}
|
126
126
|
end
|
data/lib/backup_jenkins/cli.rb
CHANGED
@@ -9,6 +9,9 @@ module BackupJenkins
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
+
# TODO Some options depend on the config file being correct. Some other
|
13
|
+
# options exit. Mark different options with whether they do one thing or
|
14
|
+
# another.
|
12
15
|
def parse_options
|
13
16
|
options.each do |opt, arg|
|
14
17
|
case opt
|
@@ -3,7 +3,7 @@ module BackupJenkins
|
|
3
3
|
attr_reader :s3
|
4
4
|
|
5
5
|
def initialize(path = default_config_file_path)
|
6
|
-
@config = config_file(path)
|
6
|
+
@config = Hashie::Mash.new(config_file(path))
|
7
7
|
end
|
8
8
|
|
9
9
|
def valid?
|
@@ -11,7 +11,7 @@ module BackupJenkins
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def base_file_name
|
14
|
-
"#{backup
|
14
|
+
"#{backup.file_name_base}_#{hostname}"
|
15
15
|
end
|
16
16
|
|
17
17
|
def override(options = {})
|
@@ -44,18 +44,21 @@ module BackupJenkins
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def aws_valid?
|
47
|
-
aws
|
47
|
+
aws.access_key &&
|
48
|
+
aws.secret &&
|
49
|
+
aws.bucket_name
|
48
50
|
end
|
49
51
|
|
50
52
|
def jenkins_valid?
|
51
|
-
!!jenkins
|
53
|
+
!!jenkins.home
|
52
54
|
end
|
53
55
|
|
54
56
|
def backup_valid?
|
55
|
-
backup
|
56
|
-
backup
|
57
|
-
backup
|
58
|
-
backup
|
57
|
+
backup.dir_base &&
|
58
|
+
backup.file_name_base &&
|
59
|
+
backup.backups_to_keep &&
|
60
|
+
backup.backups_to_keep.remote &&
|
61
|
+
backup.backups_to_keep.local
|
59
62
|
end
|
60
63
|
|
61
64
|
def hostname
|
@@ -60,7 +60,7 @@ module BackupJenkins
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def extract_data_from_filename(filename)
|
63
|
-
sans_base = filename.gsub(/#{config.backup
|
63
|
+
sans_base = filename.gsub(/#{config.backup.file_name_base}_/, '').gsub(/\.tar\.bz2/, '')
|
64
64
|
(hostname, date, time) = sans_base.split("_")
|
65
65
|
formatted_date = Time.parse(date << time).strftime("%Y/%m/%d %H:%M")
|
66
66
|
[formatted_date, hostname, filename]
|
data/lib/backup_jenkins.rb
CHANGED
@@ -1,26 +1,30 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe BackupJenkins::AWS do
|
4
|
-
let(:config) { stub }
|
5
|
-
let(:s3_mocks) {
|
4
|
+
let(:config) { stub(:aws => aws, :backup => backup) }
|
5
|
+
let(:s3_mocks) {
|
6
|
+
stub(:buckets => stub(:[] => stub(:exists? => true), :create => true))
|
7
|
+
}
|
8
|
+
let(:aws) {
|
9
|
+
stub(
|
10
|
+
:access_key => "some_key",
|
11
|
+
:secret => "some_secret",
|
12
|
+
:bucket_name => "some_bucket"
|
13
|
+
)
|
14
|
+
}
|
15
|
+
let(:backup) {
|
16
|
+
stub(:backups_to_keep => stub(:remote => 2), :file_name_base => "jenkins")
|
17
|
+
}
|
6
18
|
|
7
19
|
before do
|
8
20
|
BackupJenkins::Config.stub(:new).and_return(config)
|
9
|
-
|
10
|
-
config.stub(:aws).and_return({ "access_key" => "some_key", "secret" => "some_secret" })
|
11
|
-
config.stub(:backup).and_return({ "backups_to_keep" => { "remote" => 2 }, "file_name_base" => "jenkins" })
|
12
|
-
|
13
21
|
::AWS::S3.stub(:new).and_return(s3_mocks)
|
14
22
|
end
|
15
23
|
|
16
24
|
describe "#setup_aws" do
|
17
|
-
after
|
18
|
-
subject
|
19
|
-
end
|
25
|
+
after { subject }
|
20
26
|
|
21
|
-
it
|
22
|
-
::AWS::S3.should_receive(:new).and_return(s3_mocks)
|
23
|
-
end
|
27
|
+
it { ::AWS::S3.should_receive(:new).and_return(s3_mocks) }
|
24
28
|
|
25
29
|
it "shuld create bucket" do
|
26
30
|
s3_mocks.buckets.should_receive(:[]).and_return(mock(:exists? => false))
|
@@ -53,7 +57,7 @@ describe BackupJenkins::AWS do
|
|
53
57
|
|
54
58
|
describe "#backup_files_for_all_hosts" do
|
55
59
|
it "should return the right files" do
|
56
|
-
config.should_receive(:backup).and_return(
|
60
|
+
config.should_receive(:backup).and_return(mock(:file_name_base => "base_file_name"))
|
57
61
|
objects = mock
|
58
62
|
objects.should_receive(:with_prefix).with("base_file_name").and_return([1, 2, 3])
|
59
63
|
subject.should_receive(:s3_files).and_return(objects)
|
@@ -16,7 +16,7 @@ describe BackupJenkins::Backup do
|
|
16
16
|
describe "#backup_files" do
|
17
17
|
it "should get a listing for all the files in backup directory" do
|
18
18
|
file = "dir/base_1234"
|
19
|
-
config.
|
19
|
+
config.stub_chain(:backup, :dir_base).and_return("dir")
|
20
20
|
config.stub(:base_file_name).and_return("base")
|
21
21
|
|
22
22
|
File.should_receive(:size).with(file).and_return("size")
|
@@ -31,7 +31,7 @@ describe BackupJenkins::Backup do
|
|
31
31
|
end
|
32
32
|
|
33
33
|
describe "#backup_directory" do
|
34
|
-
let(:backup) {
|
34
|
+
let(:backup) { mock(:dir_base => "/path/to/some/dir_base") }
|
35
35
|
|
36
36
|
it "should return the dir base + the base file name + time stamp" do
|
37
37
|
config.should_receive(:backup).and_return(backup)
|
@@ -81,7 +81,7 @@ describe BackupJenkins::Backup do
|
|
81
81
|
|
82
82
|
describe "#list_local_files" do
|
83
83
|
before do
|
84
|
-
config.
|
84
|
+
config.stub_chain(:backup, :dir_base).and_return("base")
|
85
85
|
config.stub(:base_file_name).and_return("base_file_name")
|
86
86
|
end
|
87
87
|
|
@@ -195,7 +195,7 @@ describe BackupJenkins::Backup do
|
|
195
195
|
end
|
196
196
|
|
197
197
|
describe "#jobs_files" do
|
198
|
-
before { config.
|
198
|
+
before { config.stub_chain(:jenkins, :home).and_return("home") }
|
199
199
|
|
200
200
|
it "should return the config.xml and nextBuildNumber files in job directories" do
|
201
201
|
subject.should_receive(:`).
|
@@ -208,7 +208,7 @@ describe BackupJenkins::Backup do
|
|
208
208
|
describe "#new_file_path" do
|
209
209
|
it "should return backup_directory/something" do
|
210
210
|
subject.should_receive(:backup_directory).and_return("backup_directory")
|
211
|
-
config.should_receive(:jenkins).and_return(
|
211
|
+
config.should_receive(:jenkins).and_return(mock(:home => "some_nice_house"))
|
212
212
|
|
213
213
|
subject.send(:new_file_path, "some_nice_house/and/then/a/room").should ==
|
214
214
|
"backup_directory/and/then/a/room"
|
@@ -216,7 +216,7 @@ describe BackupJenkins::Backup do
|
|
216
216
|
end
|
217
217
|
|
218
218
|
describe "#plugin_files" do
|
219
|
-
before { config.
|
219
|
+
before { config.stub_chain(:jenkins, :home).and_return("home") }
|
220
220
|
|
221
221
|
it "returns a collection of directories including all the files that have .jpi" do
|
222
222
|
Dir.should_receive(:[]).with("home/plugins/*.jpi").and_return(["jpi"])
|
@@ -238,7 +238,7 @@ describe BackupJenkins::Backup do
|
|
238
238
|
|
239
239
|
describe "#files_to_remove" do
|
240
240
|
before do
|
241
|
-
config.
|
241
|
+
config.stub_chain(:backup, :backups_to_keep, :local).and_return(2)
|
242
242
|
subject.stub(:glob_of_backup_files).and_return(
|
243
243
|
%w(old_file_1 old_file_2 old_file_3 old_file_4 old_file_5)
|
244
244
|
)
|
@@ -278,14 +278,13 @@ describe BackupJenkins::Backup do
|
|
278
278
|
|
279
279
|
describe "#timestamp" do
|
280
280
|
it "should return the current time with the desired timestamp from the config" do
|
281
|
-
config.stub(:backup).and_return("timestamp" => "%Y%m%d_%H%M")
|
282
281
|
Time.stub(:now).and_return(Time.parse("2013/01/01 12:34PM"))
|
283
282
|
subject.send(:timestamp).should == "20130101_1234"
|
284
283
|
end
|
285
284
|
end
|
286
285
|
|
287
286
|
describe "#user_content_files" do
|
288
|
-
before { config.
|
287
|
+
before { config.stub_chain(:jenkins, :home).and_return("home") }
|
289
288
|
|
290
289
|
it "should return files inside the userContent directory" do
|
291
290
|
Dir.should_receive(:[]).with("home/userContent/*").and_return(["my_file"])
|
@@ -30,8 +30,8 @@ describe BackupJenkins::Config do
|
|
30
30
|
|
31
31
|
describe "#config_file" do
|
32
32
|
it "should load file" do
|
33
|
-
YAML.should_receive(:load_file).and_return(
|
34
|
-
subject.instance_variable_get(:"@config").should ==
|
33
|
+
YAML.should_receive(:load_file).and_return({ :a => :b })
|
34
|
+
subject.instance_variable_get(:"@config").should == Hashie::Mash.new({ :a => :b })
|
35
35
|
end
|
36
36
|
|
37
37
|
it "should exit with non 0 on error" do
|
@@ -11,7 +11,7 @@ class SpecFormatterIncluder
|
|
11
11
|
end
|
12
12
|
|
13
13
|
describe BackupJenkins::Formatter do
|
14
|
-
let(:config) { mock(:backup =>
|
14
|
+
let(:config) { mock(:backup => mock(:file_name_base => "jenkins")) }
|
15
15
|
subject { SpecFormatterIncluder.new(config) }
|
16
16
|
|
17
17
|
describe "#format_backup_file_data" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: backup_jenkins
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.11
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-11-12 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: aws-sdk
|
16
|
-
requirement: &
|
16
|
+
requirement: &29093460 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,21 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *29093460
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: hashie
|
27
|
+
requirement: &29093040 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *29093040
|
25
36
|
- !ruby/object:Gem::Dependency
|
26
37
|
name: rake
|
27
|
-
requirement: &
|
38
|
+
requirement: &29092620 !ruby/object:Gem::Requirement
|
28
39
|
none: false
|
29
40
|
requirements:
|
30
41
|
- - ! '>='
|
@@ -32,7 +43,7 @@ dependencies:
|
|
32
43
|
version: '0'
|
33
44
|
type: :development
|
34
45
|
prerelease: false
|
35
|
-
version_requirements: *
|
46
|
+
version_requirements: *29092620
|
36
47
|
description: Simple Jenkins config and plugin backup to S3
|
37
48
|
email:
|
38
49
|
- jcmuller@gmail.com
|