redmine-installer 2.4.0 → 3.0.1
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 +4 -4
- data/.dockerignore +8 -0
- data/.gitignore +2 -2
- data/CHANGELOG.md +16 -0
- data/Dockerfile +13 -0
- data/README.md +27 -19
- data/gems.locked +76 -0
- data/gems.rb +1 -0
- data/lib/redmine-installer/cli.rb +28 -8
- data/lib/redmine-installer/command.rb +1 -1
- data/lib/redmine-installer/database.rb +2 -2
- data/lib/redmine-installer/easycheck.rb +1 -1
- data/lib/redmine-installer/environment.rb +16 -2
- data/lib/redmine-installer/package.rb +4 -4
- data/lib/redmine-installer/package_config.rb +1 -1
- data/lib/redmine-installer/profile.rb +2 -2
- data/lib/redmine-installer/redmine.rb +1 -1
- data/lib/redmine-installer/version.rb +1 -1
- data/redmine-installer.gemspec +14 -18
- metadata +10 -25
- data/.travis.yml +0 -7
- data/spec/custom_matchers.rb +0 -21
- data/spec/installer_helper.rb +0 -204
- data/spec/installer_process.rb +0 -94
- data/spec/lib/backup_restore_spec.rb +0 -81
- data/spec/lib/install_spec.rb +0 -164
- data/spec/lib/upgrade_spec.rb +0 -202
- data/spec/packages_helper.rb +0 -31
- data/spec/shared_contexts.rb +0 -13
- data/spec/spec_helper.rb +0 -51
data/spec/installer_helper.rb
DELETED
@@ -1,204 +0,0 @@
|
|
1
|
-
module InstallerHelper
|
2
|
-
|
3
|
-
def db_username
|
4
|
-
ENV['SPEC_DB_USERNAME'].to_s
|
5
|
-
end
|
6
|
-
|
7
|
-
def db_password
|
8
|
-
ENV['SPEC_DB_PASSWORD'].to_s
|
9
|
-
end
|
10
|
-
|
11
|
-
def expected_output(text)
|
12
|
-
expect(@process).to have_output(text)
|
13
|
-
end
|
14
|
-
|
15
|
-
def expected_output_in(text, max_wait)
|
16
|
-
expect(@process).to have_output_in(text, max_wait)
|
17
|
-
end
|
18
|
-
|
19
|
-
def write(text)
|
20
|
-
@process.write(text + "\n")
|
21
|
-
end
|
22
|
-
|
23
|
-
# Be carefull - this could have later unpredictable consequences on stdin
|
24
|
-
def select_choice
|
25
|
-
# @process.write(' ')
|
26
|
-
@process.write("\r")
|
27
|
-
# @process.write("\r\n")
|
28
|
-
end
|
29
|
-
|
30
|
-
def go_up
|
31
|
-
@process.write("\e[A")
|
32
|
-
end
|
33
|
-
|
34
|
-
def go_down
|
35
|
-
# write(TTY::Reader::Keys.keys[:down])
|
36
|
-
# write("\e[B")
|
37
|
-
@process.write("\e[B")
|
38
|
-
end
|
39
|
-
|
40
|
-
def email_username
|
41
|
-
'username'
|
42
|
-
end
|
43
|
-
|
44
|
-
def email_password
|
45
|
-
'password'
|
46
|
-
end
|
47
|
-
|
48
|
-
def email_address
|
49
|
-
'address'
|
50
|
-
end
|
51
|
-
|
52
|
-
def email_port
|
53
|
-
'123'
|
54
|
-
end
|
55
|
-
|
56
|
-
def email_domain
|
57
|
-
'domain'
|
58
|
-
end
|
59
|
-
|
60
|
-
def email_authentication
|
61
|
-
'plain'
|
62
|
-
end
|
63
|
-
|
64
|
-
def email_openssl_verify_mode
|
65
|
-
'none'
|
66
|
-
end
|
67
|
-
|
68
|
-
def email_enable_tls
|
69
|
-
false
|
70
|
-
end
|
71
|
-
|
72
|
-
def email_enable_starttls
|
73
|
-
true
|
74
|
-
end
|
75
|
-
|
76
|
-
def expected_successful_configuration(email: false)
|
77
|
-
expected_output('Creating database configuration')
|
78
|
-
expected_output('What database do you want use?')
|
79
|
-
expected_output('‣ MySQL')
|
80
|
-
|
81
|
-
go_down
|
82
|
-
expected_output('‣ PostgreSQL')
|
83
|
-
select_choice
|
84
|
-
|
85
|
-
expected_output('Database:')
|
86
|
-
write('test')
|
87
|
-
|
88
|
-
expected_output('Host: (localhost)')
|
89
|
-
write('')
|
90
|
-
|
91
|
-
expected_output('Username:')
|
92
|
-
write(db_username)
|
93
|
-
|
94
|
-
expected_output('Password:')
|
95
|
-
write(db_password)
|
96
|
-
|
97
|
-
expected_output('Encoding: (utf8)')
|
98
|
-
write('')
|
99
|
-
|
100
|
-
expected_output('Port: (5432)')
|
101
|
-
write('')
|
102
|
-
|
103
|
-
expected_output('Creating email configuration')
|
104
|
-
expected_output('Which service to use for email sending?')
|
105
|
-
|
106
|
-
if email
|
107
|
-
go_up
|
108
|
-
go_up
|
109
|
-
go_up
|
110
|
-
expected_output('‣ Custom configuration (SMTP)')
|
111
|
-
select_choice
|
112
|
-
|
113
|
-
expected_output('Username:')
|
114
|
-
write(email_username)
|
115
|
-
|
116
|
-
expected_output('Password:')
|
117
|
-
write(email_password)
|
118
|
-
|
119
|
-
expected_output('Address:')
|
120
|
-
write(email_address)
|
121
|
-
|
122
|
-
expected_output('Port:')
|
123
|
-
write(email_port)
|
124
|
-
|
125
|
-
expected_output('Domain:')
|
126
|
-
write(email_domain)
|
127
|
-
|
128
|
-
expected_output('Authentication:')
|
129
|
-
write(email_authentication)
|
130
|
-
|
131
|
-
expected_output('Openssl verify mode:')
|
132
|
-
write(email_openssl_verify_mode)
|
133
|
-
|
134
|
-
expected_output('Enable tls?: (y/N)')
|
135
|
-
write(email_enable_tls ? 'y' : 'n')
|
136
|
-
|
137
|
-
expected_output('Enable starttls?: (Y/n)')
|
138
|
-
write(email_enable_starttls ? 'y' : 'n')
|
139
|
-
else
|
140
|
-
expected_output('‣ Nothing')
|
141
|
-
select_choice
|
142
|
-
end
|
143
|
-
end
|
144
|
-
|
145
|
-
def expected_successful_installation_or_upgrade(db_creating: false, after_create: nil)
|
146
|
-
expected_output_in('--> Bundle install', 50)
|
147
|
-
expected_output_in('--> Database creating', 50) if db_creating
|
148
|
-
after_create && after_create.call
|
149
|
-
expected_output_in('--> Database migrating', 50)
|
150
|
-
expected_output_in('--> Plugins migration', 50)
|
151
|
-
expected_output_in('--> Generating secret token', 50)
|
152
|
-
|
153
|
-
expected_output('Cleaning root ... OK')
|
154
|
-
expected_output('Moving redmine to target directory ... OK')
|
155
|
-
expected_output('Cleanning up ... OK')
|
156
|
-
expected_output('Moving installer log ... OK')
|
157
|
-
end
|
158
|
-
|
159
|
-
def expected_successful_installation(**options)
|
160
|
-
expected_output('Redmine installing')
|
161
|
-
expected_successful_installation_or_upgrade(db_creating: true, **options)
|
162
|
-
expected_output('Redmine was installed')
|
163
|
-
end
|
164
|
-
|
165
|
-
def expected_successful_upgrade
|
166
|
-
expected_output('Redmine upgrading')
|
167
|
-
expected_successful_installation_or_upgrade
|
168
|
-
expected_output('Redmine was upgraded')
|
169
|
-
|
170
|
-
expected_output('Do you want save steps for further use?')
|
171
|
-
write('n')
|
172
|
-
end
|
173
|
-
|
174
|
-
def expected_redmine_version(version)
|
175
|
-
Dir.chdir(@redmine_root) do
|
176
|
-
out = `rails runner "puts Redmine::VERSION.to_s"`
|
177
|
-
expect($?.success?).to be_truthy
|
178
|
-
expect(out).to include(version)
|
179
|
-
end
|
180
|
-
end
|
181
|
-
|
182
|
-
def expected_email_configuration
|
183
|
-
Dir.chdir(@redmine_root) do
|
184
|
-
configuration = YAML.load_file('config/configuration.yml')['default']['email_delivery']
|
185
|
-
smtp_settings = configuration['smtp_settings']
|
186
|
-
|
187
|
-
expect(configuration['delivery_method']).to eq(:smtp)
|
188
|
-
expect(smtp_settings['address']).to eq(email_address)
|
189
|
-
expect(smtp_settings['port']).to eq(email_port.to_i)
|
190
|
-
expect(smtp_settings['authentication']).to eq(email_authentication.to_sym)
|
191
|
-
expect(smtp_settings['domain']).to eq(email_domain)
|
192
|
-
expect(smtp_settings['user_name']).to eq(email_username)
|
193
|
-
expect(smtp_settings['password']).to eq(email_password)
|
194
|
-
expect(smtp_settings['tls']).to eq(email_enable_tls)
|
195
|
-
expect(smtp_settings['enable_starttls_auto']).to eq(email_enable_starttls)
|
196
|
-
expect(smtp_settings['openssl_verify_mode']).to eq(email_openssl_verify_mode)
|
197
|
-
end
|
198
|
-
end
|
199
|
-
|
200
|
-
def wait_for_stdin_buffer
|
201
|
-
sleep 0.5
|
202
|
-
end
|
203
|
-
|
204
|
-
end
|
data/spec/installer_process.rb
DELETED
@@ -1,94 +0,0 @@
|
|
1
|
-
require 'childprocess'
|
2
|
-
|
3
|
-
class InstallerProcess
|
4
|
-
|
5
|
-
attr_reader :stdout, :last_get_return
|
6
|
-
|
7
|
-
def initialize(command, *args)
|
8
|
-
tempfile_out = File.open('redmine-installer-out', 'w')
|
9
|
-
tempfile_err = File.open('redmine-installer-err', 'w')
|
10
|
-
|
11
|
-
tempfile_out.sync = true
|
12
|
-
tempfile_err.sync = true
|
13
|
-
|
14
|
-
args = args.flatten.compact
|
15
|
-
|
16
|
-
if ['install', 'upgrade'].include?(command)
|
17
|
-
args << '--bundle-options' << '--without rmagick'
|
18
|
-
end
|
19
|
-
|
20
|
-
redmine_bin_file = File.expand_path('../bin/redmine', __dir__)
|
21
|
-
|
22
|
-
@process = ChildProcess.build(redmine_bin_file, command, *args)
|
23
|
-
# @process = ChildProcess.build('bin/redmine', command, *args)
|
24
|
-
# @process = ChildProcess.build('redmine', command, *args)
|
25
|
-
@process.io.stdout = tempfile_out
|
26
|
-
@process.io.stderr = tempfile_err
|
27
|
-
@process.environment['REDMINE_INSTALLER_SPEC'] = '1'
|
28
|
-
@process.environment['REDMINE_INSTALLER_LOGFILE'] = File.expand_path(File.join(File.dirname(__FILE__), '..', 'log.log'))
|
29
|
-
@process.duplex = true
|
30
|
-
@process.detach = true
|
31
|
-
|
32
|
-
# Because of file description is shared with redmine installer
|
33
|
-
# so changing posiiotn has effect fot both processes
|
34
|
-
@stdout = File.open(tempfile_out.path)
|
35
|
-
|
36
|
-
@last_get_return = ''
|
37
|
-
@buffer = ''
|
38
|
-
@seek = 0
|
39
|
-
end
|
40
|
-
|
41
|
-
def run
|
42
|
-
Bundler.with_unbundled_env {
|
43
|
-
start
|
44
|
-
yield
|
45
|
-
}
|
46
|
-
ensure
|
47
|
-
stop
|
48
|
-
end
|
49
|
-
|
50
|
-
def start
|
51
|
-
@process.start
|
52
|
-
end
|
53
|
-
|
54
|
-
def stop
|
55
|
-
@process.stop
|
56
|
-
end
|
57
|
-
|
58
|
-
def write(text)
|
59
|
-
@process.io.stdin << text
|
60
|
-
|
61
|
-
# @process.io.stdin.puts(text)
|
62
|
-
# @process.io.stdin.flush
|
63
|
-
|
64
|
-
# @process.io.stdin.syswrite(text + "\n")
|
65
|
-
# @process.io.stdin.flush
|
66
|
-
|
67
|
-
# @process.io.stdin.write_nonblock(text + "\n")
|
68
|
-
end
|
69
|
-
|
70
|
-
def get(text, **args)
|
71
|
-
@last_get_return = _get(text, **args)
|
72
|
-
end
|
73
|
-
|
74
|
-
private
|
75
|
-
|
76
|
-
# max_wait in s
|
77
|
-
def _get(text, max_wait: 10)
|
78
|
-
wait_to = Time.now + max_wait
|
79
|
-
while Time.now < wait_to
|
80
|
-
@buffer << @stdout.read
|
81
|
-
index = @buffer.rindex(text)
|
82
|
-
|
83
|
-
if index
|
84
|
-
break
|
85
|
-
# return @buffer.slice!(0, index+text.size)
|
86
|
-
else
|
87
|
-
sleep 0.5
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
@buffer
|
92
|
-
end
|
93
|
-
|
94
|
-
end
|
@@ -1,81 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
DATABASE_DUMP = File.join(Dir.tmpdir, 'redmine_installer_database_backup.sql')
|
4
|
-
|
5
|
-
RSpec.describe 'RedmineInstaller backup / restore', order: :defined do
|
6
|
-
|
7
|
-
let(:project_count) { 5 }
|
8
|
-
|
9
|
-
it 'create backup', :install_first, command: 'backup' do
|
10
|
-
# First ensure `project_count` project
|
11
|
-
Dir.chdir(@redmine_root) do
|
12
|
-
out = `rails runner "
|
13
|
-
Project.delete_all
|
14
|
-
|
15
|
-
#{project_count}.times do |i|
|
16
|
-
p = Project.new
|
17
|
-
p.name = 'Test ' + i.to_s
|
18
|
-
p.identifier = 'test_' + i.to_s
|
19
|
-
p.save(validate: false)
|
20
|
-
end
|
21
|
-
|
22
|
-
puts Project.count
|
23
|
-
"`
|
24
|
-
|
25
|
-
expect($?.success?).to be_truthy
|
26
|
-
expect(out.to_i).to eq(project_count)
|
27
|
-
end
|
28
|
-
|
29
|
-
# Backup database
|
30
|
-
expected_output('Path to redmine root:')
|
31
|
-
write(@redmine_root)
|
32
|
-
expected_output('Data backup')
|
33
|
-
go_down
|
34
|
-
expected_output('‣ Only database')
|
35
|
-
select_choice
|
36
|
-
expected_output('Where to save backup:')
|
37
|
-
write(@backup_dir)
|
38
|
-
expected_output('Database backuping')
|
39
|
-
expected_output('Database backed up')
|
40
|
-
|
41
|
-
# Ensure 0 project (database is shared with all tests)
|
42
|
-
Dir.chdir(@redmine_root) do
|
43
|
-
out = `rails runner "
|
44
|
-
Project.delete_all
|
45
|
-
puts Project.count
|
46
|
-
"`
|
47
|
-
|
48
|
-
expect($?.success?).to be_truthy
|
49
|
-
expect(out.to_i).to eq(0)
|
50
|
-
end
|
51
|
-
|
52
|
-
# Save backup (after test end - all backup will be deleted)
|
53
|
-
dump = Dir.glob(File.join(@backup_dir, '*', '*')).last
|
54
|
-
expect(dump).to end_with('test.sql')
|
55
|
-
|
56
|
-
FileUtils.rm_f(DATABASE_DUMP)
|
57
|
-
FileUtils.cp(dump, DATABASE_DUMP)
|
58
|
-
end
|
59
|
-
|
60
|
-
it 'restore', command: 'install', args: [package_v503, '--database-dump', DATABASE_DUMP] do
|
61
|
-
expected_output('Path to redmine root:')
|
62
|
-
write(@redmine_root)
|
63
|
-
|
64
|
-
expected_successful_configuration
|
65
|
-
|
66
|
-
expected_output('Database dump will be loaded.')
|
67
|
-
expected_output('‣ Skip dump loading')
|
68
|
-
|
69
|
-
go_down
|
70
|
-
expected_output('‣ I am aware of this.')
|
71
|
-
select_choice
|
72
|
-
|
73
|
-
expected_output_in('Redmine was installed', 500)
|
74
|
-
|
75
|
-
Dir.chdir(@redmine_root) do
|
76
|
-
out = `rails runner "puts Project.count"`
|
77
|
-
expect(out.to_i).to eq(project_count)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
end
|
data/spec/lib/install_spec.rb
DELETED
@@ -1,164 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
RSpec.describe RedmineInstaller::Install, command: 'install' do
|
4
|
-
|
5
|
-
it 'unreadable file', args: [] do
|
6
|
-
FileUtils.chmod(0000, @redmine_root)
|
7
|
-
|
8
|
-
expected_output('Path to redmine root:')
|
9
|
-
write(@redmine_root)
|
10
|
-
|
11
|
-
expected_output('Application root contains unreadable files')
|
12
|
-
|
13
|
-
FileUtils.chmod(0600, @redmine_root)
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'unwritable directory', args: [] do
|
17
|
-
directory = File.join(@redmine_root, 'directory')
|
18
|
-
subdirectory = File.join(directory, 'subdirectory')
|
19
|
-
|
20
|
-
FileUtils.mkdir_p(subdirectory)
|
21
|
-
FileUtils.chmod(0444, directory)
|
22
|
-
|
23
|
-
expected_output('Path to redmine root:')
|
24
|
-
write(@redmine_root)
|
25
|
-
|
26
|
-
expected_output('Application root contains unreadable files')
|
27
|
-
|
28
|
-
FileUtils.chmod(0700, directory)
|
29
|
-
end
|
30
|
-
|
31
|
-
it 'non-existinig package', args: [] do
|
32
|
-
this_file = File.expand_path(File.join(File.dirname(__FILE__)))
|
33
|
-
|
34
|
-
expected_output('Path to redmine root:')
|
35
|
-
write(@redmine_root)
|
36
|
-
|
37
|
-
expected_output('Path to package:')
|
38
|
-
write(this_file)
|
39
|
-
|
40
|
-
expected_output("File #{this_file} must have format: .zip, .gz, .tgz")
|
41
|
-
end
|
42
|
-
|
43
|
-
it 'non-existinig zip package', args: [] do
|
44
|
-
expected_output('Path to redmine root:')
|
45
|
-
write(@redmine_root)
|
46
|
-
|
47
|
-
expected_output('Path to package:')
|
48
|
-
write('aaa.zip')
|
49
|
-
|
50
|
-
expected_output("File doesn't exist")
|
51
|
-
end
|
52
|
-
|
53
|
-
it 'install without arguments', args: [] do
|
54
|
-
expected_output('Path to redmine root:')
|
55
|
-
write(@redmine_root)
|
56
|
-
|
57
|
-
expected_output('Path to package:')
|
58
|
-
write(package_v503)
|
59
|
-
|
60
|
-
expected_output('Extracting redmine package')
|
61
|
-
|
62
|
-
expected_successful_configuration(email: true)
|
63
|
-
expected_successful_installation
|
64
|
-
|
65
|
-
expected_redmine_version('5.0.3')
|
66
|
-
expected_email_configuration
|
67
|
-
end
|
68
|
-
|
69
|
-
it 'download redmine', args: ['v5.0.3'] do
|
70
|
-
expected_output('Path to redmine root:')
|
71
|
-
write(@redmine_root)
|
72
|
-
|
73
|
-
expected_output_in('Downloading https://www.redmine.org/releases/redmine-5.0.3.zip', 30)
|
74
|
-
expected_output('Extracting redmine package')
|
75
|
-
|
76
|
-
expected_successful_configuration
|
77
|
-
expected_successful_installation
|
78
|
-
|
79
|
-
expected_redmine_version('5.0.3')
|
80
|
-
end
|
81
|
-
|
82
|
-
it 'installing something else', args: [package_someting_else] do
|
83
|
-
write(@redmine_root)
|
84
|
-
|
85
|
-
expected_output('is not valid')
|
86
|
-
end
|
87
|
-
|
88
|
-
it 'bad database settings', args: [package_v503] do
|
89
|
-
write(@redmine_root)
|
90
|
-
|
91
|
-
expected_output('Creating database configuration')
|
92
|
-
go_down
|
93
|
-
expected_output('‣ PostgreSQL')
|
94
|
-
write('')
|
95
|
-
|
96
|
-
write('test')
|
97
|
-
write('')
|
98
|
-
write('testtesttest')
|
99
|
-
sleep 0.5 # wait for buffer
|
100
|
-
write(db_password)
|
101
|
-
write('')
|
102
|
-
write('')
|
103
|
-
|
104
|
-
expected_output('Creating email configuration')
|
105
|
-
write('')
|
106
|
-
|
107
|
-
expected_output('Redmine installing')
|
108
|
-
expected_output_in('--> Database migrating', 60)
|
109
|
-
expected_output('Migration end with error')
|
110
|
-
expected_output('‣ Try again')
|
111
|
-
|
112
|
-
go_down
|
113
|
-
go_down
|
114
|
-
expected_output('‣ Change database configuration')
|
115
|
-
write('')
|
116
|
-
|
117
|
-
go_down
|
118
|
-
expected_output('‣ PostgreSQL')
|
119
|
-
write('')
|
120
|
-
|
121
|
-
write('test')
|
122
|
-
write('')
|
123
|
-
write(db_username)
|
124
|
-
sleep 0.5 # wait for buffer
|
125
|
-
write(db_password)
|
126
|
-
write('')
|
127
|
-
write('')
|
128
|
-
|
129
|
-
expected_output('--> Database migrating')
|
130
|
-
expected_output_in('Redmine was installed', 60)
|
131
|
-
|
132
|
-
expected_redmine_version('5.0.3')
|
133
|
-
end
|
134
|
-
|
135
|
-
it 'high installer version', args: [package_high_installer_version] do
|
136
|
-
write(@redmine_root)
|
137
|
-
expected_output('You are using an old version of installer')
|
138
|
-
end
|
139
|
-
|
140
|
-
it 'download redmine', args: [package_default_db] do
|
141
|
-
expected_output('Path to redmine root:')
|
142
|
-
write(@redmine_root)
|
143
|
-
|
144
|
-
expected_successful_configuration
|
145
|
-
expected_successful_installation(
|
146
|
-
after_create: proc {
|
147
|
-
expected_output('Would you like to load default data')
|
148
|
-
|
149
|
-
write('y')
|
150
|
-
expected_output('Database cleaning')
|
151
|
-
expected_output('Database restoring')
|
152
|
-
}
|
153
|
-
)
|
154
|
-
|
155
|
-
expected_redmine_version('3.4.5')
|
156
|
-
|
157
|
-
Dir.chdir(@redmine_root) do
|
158
|
-
out = `rails runner "puts Issue.count"`.strip
|
159
|
-
expect($?.success?).to be_truthy
|
160
|
-
expect(out).to eq('3')
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
end
|