BigW Consortium Gitlab
Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
gitlab-ce
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Forest Godfrey
gitlab-ce
Commits
567baf0e
Commit
567baf0e
authored
Oct 10, 2017
by
Rémy Coutable
Committed by
Winnie Hellmann
Oct 21, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Stub ENV in the backup task spec file
Signed-off-by:
Rémy Coutable
<
remy@rymai.me
>
parent
be2c6657
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
109 additions
and
188 deletions
+109
-188
manager.rb
lib/backup/manager.rb
+39
-39
manager_spec.rb
spec/lib/gitlab/backup/manager_spec.rb
+0
-4
backup_rake_spec.rb
spec/tasks/gitlab/backup_rake_spec.rb
+70
-145
No files found.
lib/backup/manager.rb
View file @
567baf0e
...
...
@@ -101,50 +101,50 @@ module Backup
end
def
unpack
Dir
.
chdir
(
backup_path
)
# check for existing backups in the backup dir
if
backup_file_list
.
empty?
$progress
.
puts
"No backups found in
#{
backup_path
}
"
$progress
.
puts
"Please make sure that file name ends with
#{
FILE_NAME_SUFFIX
}
"
exit
1
elsif
backup_file_list
.
many?
&&
ENV
[
"BACKUP"
].
nil?
$progress
.
puts
'Found more than one backup, please specify which one you want to restore:'
$progress
.
puts
'rake gitlab:backup:restore BACKUP=timestamp_of_backup'
exit
1
end
Dir
.
chdir
(
backup_path
)
do
# check for existing backups in the backup dir
if
backup_file_list
.
empty?
$progress
.
puts
"No backups found in
#{
backup_path
}
"
$progress
.
puts
"Please make sure that file name ends with
#{
FILE_NAME_SUFFIX
}
"
exit
1
elsif
backup_file_list
.
many?
&&
ENV
[
"BACKUP"
].
nil?
$progress
.
puts
'Found more than one backup, please specify which one you want to restore:'
$progress
.
puts
'rake gitlab:backup:restore BACKUP=timestamp_of_backup'
exit
1
end
tar_file
=
if
ENV
[
'BACKUP'
].
present?
"
#{
ENV
[
'BACKUP'
]
}#{
FILE_NAME_SUFFIX
}
"
else
backup_file_list
.
first
end
tar_file
=
if
ENV
[
'BACKUP'
].
present?
"
#{
ENV
[
'BACKUP'
]
}#{
FILE_NAME_SUFFIX
}
"
else
backup_file_list
.
first
end
unless
File
.
exist?
(
tar_file
)
$progress
.
puts
"The backup file
#{
tar_file
}
does not exist!"
exit
1
end
unless
File
.
exist?
(
tar_file
)
$progress
.
puts
"The backup file
#{
tar_file
}
does not exist!"
exit
1
end
$progress
.
print
'Unpacking backup ... '
$progress
.
print
'Unpacking backup ... '
unless
Kernel
.
system
(
*
%W(tar -xf
#{
tar_file
}
)
)
$progress
.
puts
'unpacking backup failed'
.
color
(
:red
)
exit
1
else
$progress
.
puts
'done'
.
color
(
:green
)
end
unless
Kernel
.
system
(
*
%W(tar -xf
#{
tar_file
}
)
)
$progress
.
puts
'unpacking backup failed'
.
color
(
:red
)
exit
1
else
$progress
.
puts
'done'
.
color
(
:green
)
end
ENV
[
"VERSION"
]
=
"
#{
settings
[
:db_version
]
}
"
if
settings
[
:db_version
].
to_i
>
0
# restoring mismatching backups can lead to unexpected problems
if
settings
[
:gitlab_version
]
!=
Gitlab
::
VERSION
$progress
.
puts
'GitLab version mismatch:'
.
color
(
:red
)
$progress
.
puts
" Your current GitLab version (
#{
Gitlab
::
VERSION
}
) differs from the GitLab version in the backup!"
.
color
(
:red
)
$progress
.
puts
' Please switch to the following version and try again:'
.
color
(
:red
)
$progress
.
puts
" version:
#{
settings
[
:gitlab_version
]
}
"
.
color
(
:red
)
$progress
.
puts
$progress
.
puts
"Hint: git checkout v
#{
settings
[
:gitlab_version
]
}
"
exit
1
ENV
[
"VERSION"
]
=
"
#{
settings
[
:db_version
]
}
"
if
settings
[
:db_version
].
to_i
>
0
# restoring mismatching backups can lead to unexpected problems
if
settings
[
:gitlab_version
]
!=
Gitlab
::
VERSION
$progress
.
puts
'GitLab version mismatch:'
.
color
(
:red
)
$progress
.
puts
" Your current GitLab version (
#{
Gitlab
::
VERSION
}
) differs from the GitLab version in the backup!"
.
color
(
:red
)
$progress
.
puts
' Please switch to the following version and try again:'
.
color
(
:red
)
$progress
.
puts
" version:
#{
settings
[
:gitlab_version
]
}
"
.
color
(
:red
)
$progress
.
puts
$progress
.
puts
"Hint: git checkout v
#{
settings
[
:gitlab_version
]
}
"
exit
1
end
end
end
...
...
spec/lib/gitlab/backup/manager_spec.rb
View file @
567baf0e
...
...
@@ -172,10 +172,6 @@ describe Backup::Manager do
end
describe
'#unpack'
do
before
do
allow
(
Dir
).
to
receive
(
:chdir
)
end
context
'when there are no backup files in the directory'
do
before
do
allow
(
Dir
).
to
receive
(
:glob
).
and_return
([])
...
...
spec/tasks/gitlab/backup_rake_spec.rb
View file @
567baf0e
...
...
@@ -4,7 +4,15 @@ require 'rake'
describe
'gitlab:app namespace rake task'
do
let
(
:enable_registry
)
{
true
}
before
:all
do
def
tars_glob
Dir
.
glob
(
File
.
join
(
Gitlab
.
config
.
backup
.
path
,
'*_gitlab_backup.tar'
))
end
def
backup_tar
tars_glob
.
first
end
before
(
:all
)
do
Rake
.
application
.
rake_require
'tasks/gitlab/helpers'
Rake
.
application
.
rake_require
'tasks/gitlab/backup'
Rake
.
application
.
rake_require
'tasks/gitlab/shell'
...
...
@@ -19,9 +27,16 @@ describe 'gitlab:app namespace rake task' do
end
before
do
stub_env
(
'force'
,
'yes'
)
FileUtils
.
rm
(
tars_glob
,
force:
true
)
reenable_backup_sub_tasks
stub_container_registry_config
(
enabled:
enable_registry
)
end
after
do
FileUtils
.
rm
(
tars_glob
,
force:
true
)
end
def
run_rake_task
(
task_name
)
Rake
::
Task
[
task_name
].
reenable
Rake
.
application
.
invoke_task
task_name
...
...
@@ -34,22 +49,15 @@ describe 'gitlab:app namespace rake task' do
end
describe
'backup_restore'
do
before
do
# avoid writing task output to spec progress
allow
(
$stdout
).
to
receive
:write
end
context
'gitlab version'
do
before
do
allow
(
Dir
).
to
receive
(
:glob
).
and_return
([
'1_gitlab_backup.tar'
])
allow
(
Dir
).
to
receive
(
:chdir
)
allow
(
File
).
to
receive
(
:exist?
).
and_return
(
true
)
allow
(
Kernel
).
to
receive
(
:system
).
and_return
(
true
)
allow
(
FileUtils
).
to
receive
(
:cp_r
).
and_return
(
true
)
allow
(
FileUtils
).
to
receive
(
:mv
).
and_return
(
true
)
allow
(
Rake
::
Task
[
"gitlab:shell:setup"
])
.
to
receive
(
:invoke
).
and_return
(
true
)
ENV
[
'force'
]
=
'yes'
end
let
(
:gitlab_version
)
{
Gitlab
::
VERSION
}
...
...
@@ -58,8 +66,9 @@ describe 'gitlab:app namespace rake task' do
allow
(
YAML
).
to
receive
(
:load_file
)
.
and_return
({
gitlab_version:
"not
#{
gitlab_version
}
"
})
expect
{
run_rake_task
(
'gitlab:backup:restore'
)
}
.
to
raise_error
(
SystemExit
)
expect
do
expect
{
run_rake_task
(
'gitlab:backup:restore'
)
}.
to
output
.
to_stdout
end
.
to
raise_error
(
SystemExit
)
end
it
'invokes restoration on match'
do
...
...
@@ -75,44 +84,15 @@ describe 'gitlab:app namespace rake task' do
expect
(
Rake
::
Task
[
'gitlab:backup:lfs:restore'
]).
to
receive
(
:invoke
)
expect
(
Rake
::
Task
[
'gitlab:backup:registry:restore'
]).
to
receive
(
:invoke
)
expect
(
Rake
::
Task
[
'gitlab:shell:setup'
]).
to
receive
(
:invoke
)
expect
{
run_rake_task
(
'gitlab:backup:restore'
)
}.
not_to
raise_error
expect
{
run_rake_task
(
'gitlab:backup:restore'
)
}.
to
output
.
to_stdout
end
end
end
# backup_restore task
describe
'backup'
do
before
(
:all
)
do
ENV
[
'force'
]
=
'yes'
end
def
tars_glob
Dir
.
glob
(
File
.
join
(
Gitlab
.
config
.
backup
.
path
,
'*_gitlab_backup.tar'
))
end
def
create_backup
FileUtils
.
rm
tars_glob
before
do
# This reconnect makes our project fixture disappear, breaking the restore. Stub it out.
allow
(
ActiveRecord
::
Base
.
connection
).
to
receive
(
:reconnect!
)
# Redirect STDOUT and run the rake task
orig_stdout
=
$stdout
$stdout
=
StringIO
.
new
reenable_backup_sub_tasks
run_rake_task
(
'gitlab:backup:create'
)
reenable_backup_sub_tasks
$stdout
=
orig_stdout
@backup_tar
=
tars_glob
.
first
end
def
restore_backup
orig_stdout
=
$stdout
$stdout
=
StringIO
.
new
reenable_backup_sub_tasks
run_rake_task
(
'gitlab:backup:restore'
)
reenable_backup_sub_tasks
$stdout
=
orig_stdout
end
describe
'backup creation and deletion using custom_hooks'
do
...
...
@@ -120,27 +100,17 @@ describe 'gitlab:app namespace rake task' do
let
(
:user_backup_path
)
{
"repositories/
#{
project
.
disk_path
}
"
}
before
do
@origin_cd
=
Dir
.
pwd
path
=
File
.
join
(
project
.
repository
.
path_to_repo
,
filename
)
stub_env
(
'SKIP'
,
'db'
)
path
=
File
.
join
(
project
.
repository
.
path_to_repo
,
'custom_hooks'
)
FileUtils
.
mkdir_p
(
path
)
FileUtils
.
touch
(
File
.
join
(
path
,
"dummy.txt"
))
ENV
[
"SKIP"
]
=
"db"
create_backup
end
after
do
ENV
[
"SKIP"
]
=
""
FileUtils
.
rm
(
@backup_tar
)
Dir
.
chdir
(
@origin_cd
)
end
context
'project uses custom_hooks and successfully creates backup'
do
let
(
:filename
)
{
"custom_hooks"
}
it
'creates custom_hooks.tar and project bundle'
do
tar_contents
,
exit_status
=
Gitlab
::
Popen
.
popen
(
%W{tar -tvf
#{
@backup_tar
}
}
)
expect
{
run_rake_task
(
'gitlab:backup:create'
)
}.
to
output
.
to_stdout
tar_contents
,
exit_status
=
Gitlab
::
Popen
.
popen
(
%W{tar -tvf
#{
backup_tar
}
}
)
expect
(
exit_status
).
to
eq
(
0
)
expect
(
tar_contents
).
to
match
(
user_backup_path
)
...
...
@@ -149,47 +119,43 @@ describe 'gitlab:app namespace rake task' do
end
it
'restores files correctly'
do
restore_backup
expect
{
run_rake_task
(
'gitlab:backup:create'
)
}.
to
output
.
to_stdout
expect
{
run_rake_task
(
'gitlab:backup:restore'
)
}.
to
output
.
to_stdout
expect
(
Dir
.
entries
(
File
.
join
(
project
.
repository
.
path
,
"custom_hooks"
))).
to
include
(
"dummy.txt"
)
expect
(
Dir
.
entries
(
File
.
join
(
project
.
repository
.
path
,
'custom_hooks'
))).
to
include
(
"dummy.txt"
)
end
end
end
context
'tar creation'
do
before
do
create_backup
end
after
do
FileUtils
.
rm
(
@backup_tar
)
end
context
'archive file permissions'
do
it
'sets correct permissions on the tar file'
do
expect
(
File
.
exist?
(
@backup_tar
)).
to
be_truthy
expect
(
File
::
Stat
.
new
(
@backup_tar
).
mode
.
to_s
(
8
)).
to
eq
(
'100600'
)
expect
{
run_rake_task
(
'gitlab:backup:create'
)
}.
to
output
.
to_stdout
expect
(
File
.
exist?
(
backup_tar
)).
to
be_truthy
expect
(
File
::
Stat
.
new
(
backup_tar
).
mode
.
to_s
(
8
)).
to
eq
(
'100600'
)
end
context
'with custom archive_permissions'
do
before
do
allow
(
Gitlab
.
config
.
backup
).
to
receive
(
:archive_permissions
).
and_return
(
0651
)
# We created a backup in a before(:all) so it got the default permissions.
# We now need to do some work to create a _new_ backup file using our stub.
FileUtils
.
rm
(
@backup_tar
)
create_backup
end
it
'uses the custom permissions'
do
expect
(
File
::
Stat
.
new
(
@backup_tar
).
mode
.
to_s
(
8
)).
to
eq
(
'100651'
)
expect
{
run_rake_task
(
'gitlab:backup:create'
)
}.
to
output
.
to_stdout
expect
(
File
::
Stat
.
new
(
backup_tar
).
mode
.
to_s
(
8
)).
to
eq
(
'100651'
)
end
end
end
it
'sets correct permissions on the tar contents'
do
expect
{
run_rake_task
(
'gitlab:backup:create'
)
}.
to
output
.
to_stdout
tar_contents
,
exit_status
=
Gitlab
::
Popen
.
popen
(
%W{tar -tvf
#{
@
backup_tar
}
db uploads.tar.gz repositories builds.tar.gz artifacts.tar.gz pages.tar.gz lfs.tar.gz registry.tar.gz}
%W{tar -tvf
#{
backup_tar
}
db uploads.tar.gz repositories builds.tar.gz artifacts.tar.gz pages.tar.gz lfs.tar.gz registry.tar.gz}
)
expect
(
exit_status
).
to
eq
(
0
)
expect
(
tar_contents
).
to
match
(
'db/'
)
expect
(
tar_contents
).
to
match
(
'uploads.tar.gz'
)
...
...
@@ -203,6 +169,8 @@ describe 'gitlab:app namespace rake task' do
end
it
'deletes temp directories'
do
expect
{
run_rake_task
(
'gitlab:backup:create'
)
}.
to
output
.
to_stdout
temp_dirs
=
Dir
.
glob
(
File
.
join
(
Gitlab
.
config
.
backup
.
path
,
'{db,repositories,uploads,builds,artifacts,pages,lfs,registry}'
)
)
...
...
@@ -214,9 +182,12 @@ describe 'gitlab:app namespace rake task' do
let
(
:enable_registry
)
{
false
}
it
'does not create registry.tar.gz'
do
expect
{
run_rake_task
(
'gitlab:backup:create'
)
}.
to
output
.
to_stdout
tar_contents
,
exit_status
=
Gitlab
::
Popen
.
popen
(
%W{tar -tvf
#{
@
backup_tar
}
}
%W{tar -tvf
#{
backup_tar
}
}
)
expect
(
exit_status
).
to
eq
(
0
)
expect
(
tar_contents
).
not_to
match
(
'registry.tar.gz'
)
end
...
...
@@ -232,37 +203,33 @@ describe 'gitlab:app namespace rake task' do
}
end
let
(
:project_a
)
{
create
(
:project
,
:repository
,
repository_storage:
'default'
)
}
let
(
:project_b
)
{
create
(
:project
,
:repository
,
repository_storage:
'test_second_storage'
)
}
before
do
FileUtils
.
mkdir
(
'tmp/tests/default_storage'
)
FileUtils
.
mkdir
(
'tmp/tests/custom_storage'
)
# We only need a backup of the repositories for this test
stub_env
(
'SKIP'
,
'db,uploads,builds,artifacts,lfs,registry'
)
FileUtils
.
mkdir
(
Settings
.
absolute
(
'tmp/tests/default_storage'
))
FileUtils
.
mkdir
(
Settings
.
absolute
(
'tmp/tests/custom_storage'
))
allow
(
Gitlab
.
config
.
repositories
).
to
receive
(
:storages
).
and_return
(
storages
)
# Create the projects now, after mocking the settings but before doing the backup
project_a
project_b
# Avoid asking gitaly about the root ref (which will fail beacuse of the
# mocked storages)
allow_any_instance_of
(
Repository
).
to
receive
(
:empty_repo?
).
and_return
(
false
)
# We only need a backup of the repositories for this test
ENV
[
"SKIP"
]
=
"db,uploads,builds,artifacts,lfs,registry"
create_backup
end
after
do
FileUtils
.
rm_rf
(
'tmp/tests/default_storage'
)
FileUtils
.
rm_rf
(
'tmp/tests/custom_storage'
)
FileUtils
.
rm
(
@backup_tar
)
if
@backup_tar
FileUtils
.
rm_rf
(
Settings
.
absolute
(
'tmp/tests/default_storage'
))
FileUtils
.
rm_rf
(
Settings
.
absolute
(
'tmp/tests/custom_storage'
))
end
it
'includes repositories in all repository storages'
do
project_a
=
create
(
:project
,
:repository
,
repository_storage:
'default'
)
project_b
=
create
(
:project
,
:repository
,
repository_storage:
'test_second_storage'
)
expect
{
run_rake_task
(
'gitlab:backup:create'
)
}.
to
output
.
to_stdout
tar_contents
,
exit_status
=
Gitlab
::
Popen
.
popen
(
%W{tar -tvf
#{
@
backup_tar
}
repositories}
%W{tar -tvf
#{
backup_tar
}
repositories}
)
expect
(
exit_status
).
to
eq
(
0
)
expect
(
tar_contents
).
to
match
(
"repositories/
#{
project_a
.
disk_path
}
.bundle"
)
expect
(
tar_contents
).
to
match
(
"repositories/
#{
project_b
.
disk_path
}
.bundle"
)
...
...
@@ -271,35 +238,15 @@ describe 'gitlab:app namespace rake task' do
end
# backup_create task
describe
"Skipping items"
do
def
tars_glob
Dir
.
glob
(
File
.
join
(
Gitlab
.
config
.
backup
.
path
,
'*_gitlab_backup.tar'
))
end
before
:all
do
@origin_cd
=
Dir
.
pwd
reenable_backup_sub_tasks
FileUtils
.
rm
tars_glob
# Redirect STDOUT and run the rake task
orig_stdout
=
$stdout
$stdout
=
StringIO
.
new
ENV
[
"SKIP"
]
=
"repositories,uploads"
run_rake_task
(
'gitlab:backup:create'
)
$stdout
=
orig_stdout
@backup_tar
=
tars_glob
.
first
end
after
:all
do
FileUtils
.
rm
(
@backup_tar
)
Dir
.
chdir
@origin_cd
before
do
stub_env
(
'SKIP'
,
'repositories,uploads'
)
end
it
"does not contain skipped item"
do
expect
{
run_rake_task
(
'gitlab:backup:create'
)
}.
to
output
.
to_stdout
tar_contents
,
_exit_status
=
Gitlab
::
Popen
.
popen
(
%W{tar -tvf
#{
@
backup_tar
}
db uploads.tar.gz repositories builds.tar.gz artifacts.tar.gz pages.tar.gz lfs.tar.gz registry.tar.gz}
%W{tar -tvf
#{
backup_tar
}
db uploads.tar.gz repositories builds.tar.gz artifacts.tar.gz pages.tar.gz lfs.tar.gz registry.tar.gz}
)
expect
(
tar_contents
).
to
match
(
'db/'
)
...
...
@@ -313,9 +260,10 @@ describe 'gitlab:app namespace rake task' do
end
it
'does not invoke repositories restore'
do
expect
{
run_rake_task
(
'gitlab:backup:create'
)
}.
to
output
.
to_stdout
allow
(
Rake
::
Task
[
'gitlab:shell:setup'
])
.
to
receive
(
:invoke
).
and_return
(
true
)
allow
(
$stdout
).
to
receive
:write
expect
(
Rake
::
Task
[
'gitlab:db:drop_tables'
]).
to
receive
:invoke
expect
(
Rake
::
Task
[
'gitlab:backup:db:restore'
]).
to
receive
:invoke
...
...
@@ -327,38 +275,15 @@ describe 'gitlab:app namespace rake task' do
expect
(
Rake
::
Task
[
'gitlab:backup:lfs:restore'
]).
to
receive
:invoke
expect
(
Rake
::
Task
[
'gitlab:backup:registry:restore'
]).
to
receive
:invoke
expect
(
Rake
::
Task
[
'gitlab:shell:setup'
]).
to
receive
:invoke
expect
{
run_rake_task
(
'gitlab:backup:restore'
)
}.
not_to
raise_error
expect
{
run_rake_task
(
'gitlab:backup:restore'
)
}.
to
output
.
to_stdout
end
end
describe
"Human Readable Backup Name"
do
def
tars_glob
Dir
.
glob
(
File
.
join
(
Gitlab
.
config
.
backup
.
path
,
'*_gitlab_backup.tar'
))
end
before
:all
do
@origin_cd
=
Dir
.
pwd
reenable_backup_sub_tasks
FileUtils
.
rm
tars_glob
# Redirect STDOUT and run the rake task
orig_stdout
=
$stdout
$stdout
=
StringIO
.
new
run_rake_task
(
'gitlab:backup:create'
)
$stdout
=
orig_stdout
@backup_tar
=
tars_glob
.
first
end
after
:all
do
FileUtils
.
rm
(
@backup_tar
)
Dir
.
chdir
@origin_cd
end
it
'name has human readable time'
do
expect
(
@backup_tar
).
to
match
(
/\d+_\d{4}_\d{2}_\d{2}_\d+\.\d+\.\d+.*_gitlab_backup.tar$/
)
expect
{
run_rake_task
(
'gitlab:backup:create'
)
}.
to
output
.
to_stdout
expect
(
backup_tar
).
to
match
(
/\d+_\d{4}_\d{2}_\d{2}_\d+\.\d+\.\d+.*_gitlab_backup.tar$/
)
end
end
end
# gitlab:app namespace
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment