travis-backup 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +4 -1
- data/Gemfile.lock +1 -1
- data/config/database.yml +3 -0
- data/lib/config.rb +37 -4
- data/lib/models/build.rb +1 -1
- data/lib/models/job.rb +2 -0
- data/lib/models/log.rb +9 -0
- data/lib/travis-backup.rb +46 -3
- data/travis-backup.gemspec +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dca7a53c9e3689c5f0988d074296449769a106b86ed6ddc26c6a8b7c0cba15b2
|
4
|
+
data.tar.gz: 25765ff21af6e3bbba2fbf5a971d678acd6447b59c54fc685ddaa0912e84f73a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bcc37fc6219ac84eda44f953879952567eb33981a9a2436b5922acefa515994262ab174e25e8fe9660153e73e3d55838eaa8fd375dc8f79cefff02f574f8e516
|
7
|
+
data.tar.gz: 377cef9823245bd5153bc291e6fb078c723544986e6fd85a79e50b64d8cc5110c1331ac8247a40b158022633672ad93e3a85719d2b70f4659e152913f0b4b729
|
data/.travis.yml
CHANGED
@@ -30,4 +30,7 @@ before_script:
|
|
30
30
|
- psql --version
|
31
31
|
- psql -c 'CREATE DATABASE travis_test;' -U postgres
|
32
32
|
- psql -t -c "SELECT 1 FROM pg_roles WHERE rolname='travis'" -U postgres | grep 1 || psql -c 'CREATE ROLE travis SUPERUSER LOGIN CREATEDB;' -U postgres
|
33
|
-
- psql -f db/schema.sql -v ON_ERROR_STOP=1 travis_test
|
33
|
+
- psql -f db/schema.sql -v ON_ERROR_STOP=1 travis_test
|
34
|
+
- psql -c 'CREATE DATABASE travis_test_destination;' -U postgres
|
35
|
+
- psql -t -c "SELECT 1 FROM pg_roles WHERE rolname='travis'" -U postgres | grep 1 || psql -c 'CREATE ROLE travis SUPERUSER LOGIN CREATEDB;' -U postgres
|
36
|
+
- psql -f db/schema.sql -v ON_ERROR_STOP=1 travis_test_destination
|
data/Gemfile.lock
CHANGED
data/config/database.yml
CHANGED
data/lib/config.rb
CHANGED
@@ -2,7 +2,17 @@
|
|
2
2
|
require 'optparse'
|
3
3
|
|
4
4
|
class Config
|
5
|
-
attr_reader :if_backup,
|
5
|
+
attr_reader :if_backup,
|
6
|
+
:dry_run,
|
7
|
+
:limit,
|
8
|
+
:threshold,
|
9
|
+
:files_location,
|
10
|
+
:database_url,
|
11
|
+
:user_id,
|
12
|
+
:repo_id,
|
13
|
+
:org_id,
|
14
|
+
:move_logs,
|
15
|
+
:destination_db_url
|
6
16
|
|
7
17
|
def initialize(args={}) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/MethodLength
|
8
18
|
set_values(args)
|
@@ -43,7 +53,7 @@ class Config
|
|
43
53
|
@files_location = first_not_nil(
|
44
54
|
args[:files_location],
|
45
55
|
argv_opts[:files_location],
|
46
|
-
ENV['
|
56
|
+
ENV['BACKUP_FILES_LOCATION'],
|
47
57
|
config.dig('backup', 'files_location'),
|
48
58
|
'./dump'
|
49
59
|
)
|
@@ -71,10 +81,23 @@ class Config
|
|
71
81
|
ENV['ORG_ID'],
|
72
82
|
config.dig('backup', 'org_id')
|
73
83
|
)
|
84
|
+
@move_logs = first_not_nil(
|
85
|
+
args[:move_logs],
|
86
|
+
argv_opts[:move_logs],
|
87
|
+
ENV['BACKUP_MOVE_LOGS'],
|
88
|
+
config.dig('backup', 'move_logs'),
|
89
|
+
false
|
90
|
+
)
|
91
|
+
@destination_db_url = first_not_nil(
|
92
|
+
args[:destination_db_url],
|
93
|
+
argv_opts[:destination_db_url],
|
94
|
+
ENV['BACKUP_DESTINATION_DB_URL'],
|
95
|
+
connection_details.dig(ENV['RAILS_ENV'], 'destination')
|
96
|
+
)
|
74
97
|
end
|
75
98
|
|
76
99
|
def check_values
|
77
|
-
if !@threshold
|
100
|
+
if !@move_logs && !@threshold
|
78
101
|
message = abort_message("Please provide the threshold argument. Data younger than it will be omitted. " +
|
79
102
|
"Threshold defines number of months from now.")
|
80
103
|
abort message
|
@@ -84,6 +107,14 @@ class Config
|
|
84
107
|
message = abort_message("Please provide proper database URL.")
|
85
108
|
abort message
|
86
109
|
end
|
110
|
+
|
111
|
+
if (@move_logs && !@destination_db_url)
|
112
|
+
abort "\nFor moving logs you need to specify your destination database. Example usage:\n" +
|
113
|
+
"\n $ bin/travis_backup 'postgres://source_url' --move_logs --destination_db_url 'postgres://destination_url'\n" +
|
114
|
+
"\nor using in code:\n" +
|
115
|
+
"\n Backup.new(database_url: 'postgres://source_url', destination_db_url: 'postgres://destination_url', move_logs: true)\n" +
|
116
|
+
"\nYou can also set it using environment variables or configuration files.\n"
|
117
|
+
end
|
87
118
|
end
|
88
119
|
|
89
120
|
def abort_message(intro)
|
@@ -91,7 +122,7 @@ class Config
|
|
91
122
|
"\n $ bin/travis_backup 'postgres://my_database_url' --threshold 6\n" +
|
92
123
|
"\nor using in code:\n" +
|
93
124
|
"\n Backup.new(database_url: 'postgres://my_database_url', threshold: 6)\n" +
|
94
|
-
"\nYou can also set it using environment variables or
|
125
|
+
"\nYou can also set it using environment variables or configuration files.\n"
|
95
126
|
end
|
96
127
|
|
97
128
|
def argv_options
|
@@ -106,6 +137,8 @@ class Config
|
|
106
137
|
opt.on('-u', '--user_id X') { |o| options[:user_id] = o.to_i }
|
107
138
|
opt.on('-r', '--repo_id X') { |o| options[:repo_id] = o.to_i }
|
108
139
|
opt.on('-o', '--org_id X') { |o| options[:org_id] = o.to_i }
|
140
|
+
opt.on('--move_logs') { |o| options[:move_logs] = o }
|
141
|
+
opt.on('--destination_db_url X') { |o| options[:destination_db_url] = o }
|
109
142
|
end.parse!
|
110
143
|
|
111
144
|
options[:database_url] = ARGV.shift if ARGV[0]
|
data/lib/models/build.rb
CHANGED
@@ -7,7 +7,7 @@ require 'models/repository'
|
|
7
7
|
# Build model
|
8
8
|
class Build < Model
|
9
9
|
belongs_to :repository
|
10
|
-
has_many :jobs, -> { order('id') }, foreign_key: :source_id, dependent: :
|
10
|
+
has_many :jobs, -> { order('id') }, foreign_key: :source_id, dependent: :destroy, class_name: 'Job'
|
11
11
|
|
12
12
|
self.table_name = 'builds'
|
13
13
|
end
|
data/lib/models/job.rb
CHANGED
@@ -2,12 +2,14 @@
|
|
2
2
|
|
3
3
|
require 'models/model'
|
4
4
|
require 'models/repository'
|
5
|
+
require 'models/log'
|
5
6
|
|
6
7
|
# Job model
|
7
8
|
class Job < Model
|
8
9
|
self.inheritance_column = :_type_disabled
|
9
10
|
|
10
11
|
belongs_to :repository
|
12
|
+
has_many :logs, -> { order('id') }, foreign_key: :job_id, dependent: :destroy, class_name: 'Log'
|
11
13
|
|
12
14
|
self.table_name = 'jobs'
|
13
15
|
end
|
data/lib/models/log.rb
ADDED
data/lib/travis-backup.rb
CHANGED
@@ -4,24 +4,30 @@ require 'active_support/core_ext/array'
|
|
4
4
|
require 'active_support/time'
|
5
5
|
require 'config'
|
6
6
|
require 'models/repository'
|
7
|
+
require 'models/log'
|
7
8
|
|
8
9
|
# main travis-backup class
|
9
10
|
class Backup
|
11
|
+
attr_accessor :config
|
12
|
+
attr_reader :dry_run_removed
|
13
|
+
|
10
14
|
def initialize(config_args={})
|
11
15
|
@config = Config.new(config_args)
|
12
16
|
|
13
17
|
if @config.dry_run
|
14
|
-
@dry_run_removed = {builds: [], jobs: []}
|
18
|
+
@dry_run_removed = {builds: [], jobs: [], logs: []}
|
15
19
|
end
|
16
20
|
|
17
21
|
connect_db
|
18
22
|
end
|
19
23
|
|
20
|
-
def connect_db
|
21
|
-
ActiveRecord::Base.establish_connection(
|
24
|
+
def connect_db(url=@config.database_url)
|
25
|
+
ActiveRecord::Base.establish_connection(url)
|
22
26
|
end
|
23
27
|
|
24
28
|
def run(args={})
|
29
|
+
return move_logs if @config.move_logs
|
30
|
+
|
25
31
|
user_id = args[:user_id] || @config.user_id
|
26
32
|
repo_id = args[:repo_id] || @config.repo_id
|
27
33
|
org_id = args[:org_id] || @config.org_id
|
@@ -53,6 +59,24 @@ class Backup
|
|
53
59
|
puts 'Dry run active. The following data would be removed in normal mode:'
|
54
60
|
puts " - builds: #{@dry_run_removed[:builds].to_json}"
|
55
61
|
puts " - jobs: #{@dry_run_removed[:jobs].to_json}"
|
62
|
+
puts " - logs: #{@dry_run_removed[:logs].to_json}"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def move_logs
|
67
|
+
connect_db(@config.database_url)
|
68
|
+
Log.order(:id).in_groups_of(@config.limit.to_i, false).map do |logs_batch|
|
69
|
+
log_hashes = logs_batch.as_json
|
70
|
+
connect_db(@config.destination_db_url)
|
71
|
+
|
72
|
+
log_hashes.each do |log_hash|
|
73
|
+
new_log = Log.new(log_hash)
|
74
|
+
new_log.save!
|
75
|
+
end
|
76
|
+
|
77
|
+
connect_db(@config.database_url)
|
78
|
+
|
79
|
+
logs_batch.each(&:destroy)
|
56
80
|
end
|
57
81
|
end
|
58
82
|
|
@@ -85,10 +109,20 @@ class Backup
|
|
85
109
|
|
86
110
|
def destroy_batch_dry(builds_batch)
|
87
111
|
@dry_run_removed[:builds].concat(builds_batch.map(&:id))
|
112
|
+
|
88
113
|
jobs = builds_batch.map do |build|
|
89
114
|
build.jobs.map(&:id) || []
|
90
115
|
end.flatten
|
116
|
+
|
91
117
|
@dry_run_removed[:jobs].concat(jobs)
|
118
|
+
|
119
|
+
logs = builds_batch.map do |build|
|
120
|
+
build.jobs.map do |job|
|
121
|
+
job.logs.map(&:id) || []
|
122
|
+
end.flatten || []
|
123
|
+
end.flatten
|
124
|
+
|
125
|
+
@dry_run_removed[:logs].concat(logs)
|
92
126
|
end
|
93
127
|
|
94
128
|
def save_file(file_name, content) # rubocop:disable Metrics/MethodLength
|
@@ -127,8 +161,17 @@ class Backup
|
|
127
161
|
def export_jobs(jobs)
|
128
162
|
jobs.map do |job|
|
129
163
|
job_export = job.attributes
|
164
|
+
job_export[:logs] = export_logs(job.logs)
|
130
165
|
|
131
166
|
job_export
|
132
167
|
end
|
133
168
|
end
|
169
|
+
|
170
|
+
def export_logs(logs)
|
171
|
+
logs.map do |log|
|
172
|
+
log_export = log.attributes
|
173
|
+
|
174
|
+
log_export
|
175
|
+
end
|
176
|
+
end
|
134
177
|
end
|
data/travis-backup.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: travis-backup
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Karol Selak
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-09-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -250,6 +250,7 @@ files:
|
|
250
250
|
- lib/config.rb
|
251
251
|
- lib/models/build.rb
|
252
252
|
- lib/models/job.rb
|
253
|
+
- lib/models/log.rb
|
253
254
|
- lib/models/model.rb
|
254
255
|
- lib/models/organization.rb
|
255
256
|
- lib/models/repository.rb
|