Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
gitlab-ce
Commits
12b34c81
Commit
12b34c81
authored
Jul 09, 2012
by
Stefan Morgenthaler
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add: rake task to backup/restore gitlab db and repos
parent
be1b4080
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
199 additions
and
0 deletions
+199
-0
config/gitlab.yml.example
config/gitlab.yml.example
+2
-0
lib/tasks/gitlab/backup.rake
lib/tasks/gitlab/backup.rake
+197
-0
No files found.
config/gitlab.yml.example
View file @
12b34c81
...
@@ -21,6 +21,8 @@ email:
...
@@ -21,6 +21,8 @@ email:
# Like default project limit for user etc
# Like default project limit for user etc
app:
app:
default_projects_limit: 10
default_projects_limit: 10
# backup_path: "/vol/backups" # default: Rails.root + backups/
# backup_keep_time: 7.days # default: 0 (forever)
#
#
...
...
lib/tasks/gitlab/backup.rake
0 → 100644
View file @
12b34c81
require
'active_record/fixtures'
# load config
GITLAB_OPTS
=
YAML
.
load_file
(
"
#{
Rails
.
root
}
/config/gitlab.yml"
)[
'app'
]
# backup path options
backup_path
=
GITLAB_OPTS
[
'backup_path'
].
nil?
?
"backups/"
:
GITLAB_OPTS
[
'backup_path'
]
# set default path if not specified in settings.
backup_path
=
/^\//
.
match
(
backup_path
)
?
backup_path
:
File
.
join
(
Rails
.
root
+
backup_path
)
# check for absolut or relative path.
FileUtils
.
mkdir_p
(
backup_path
)
until
Dir
.
exists?
(
backup_path
)
# keep last n backups
backup_keep_time
=
GITLAB_OPTS
[
'backup_keep_time'
].
nil?
?
0
:
eval
(
GITLAB_OPTS
[
'backup_keep_time'
])
backup_path_repo
=
File
.
join
(
backup_path
,
"repositories"
)
backup_path_db
=
File
.
join
(
backup_path
,
"db"
)
namespace
:gitlab
do
namespace
:app
do
# Create backup of gitlab system
desc
"GITLAB | Create a backup of the gitlab system"
task
:backup_create
=>
:environment
do
Dir
.
chdir
(
backup_path
)
Rake
::
Task
[
"gitlab:app:db_dump"
].
invoke
Rake
::
Task
[
"gitlab:app:repo_dump"
].
invoke
# saving additional informations
s
=
Hash
.
new
s
[
"db_version"
]
=
"
#{
ActiveRecord
::
Migrator
.
current_version
}
"
s
[
"backup_created_at"
]
=
"
#{
Time
.
now
}
"
s
[
"gitlab_version"
]
=
%x{git rev-parse HEAD}
.
gsub
(
/\n/
,
""
)
s
[
"tar_version"
]
=
%x{tar --version | head -1}
.
gsub
(
/\n/
,
""
)
File
.
open
(
"
#{
backup_path
}
/backup_information.yml"
,
"w+"
)
do
|
file
|
file
<<
s
.
to_yaml
.
gsub
(
/^---\n/
,
''
)
end
# create archive
print
"Creating backup archive:
#{
Time
.
now
.
to_i
}
_gitlab_backup.tar "
if
Kernel
.
system
(
"tar -cf
#{
Time
.
now
.
to_i
}
_gitlab_backup.tar repositories/ db/ backup_information.yml"
)
puts
"[DONE]"
.
green
else
puts
"[FAILED]"
.
red
end
# cleanup: remove tmp files
print
"Deletion of tmp directories..."
if
Kernel
.
system
(
"rm -rf repositories/ db/ backup_information.yml"
)
puts
"[DONE]"
.
green
else
puts
"[FAILED]"
.
red
end
# delete backups
print
"Deleting old backups... "
if
backup_keep_time
>
0
file_list
=
Dir
.
glob
(
"*_gitlab_backup.tar"
).
map
{
|
f
|
f
.
split
(
/_/
).
first
.
to_i
}
file_list
.
sort
.
each
do
|
timestamp
|
if
Time
.
at
(
timestamp
)
<
(
Time
.
now
-
backup_keep_time
)
%x{rm
#{
timestamp
}
_gitlab_backup.tar}
end
end
puts
"[DONE]"
.
green
else
puts
"[SKIPPING]"
.
yellow
end
end
desc
"GITLAB | Restore a previously created backup"
task
:backup_restore
=>
:environment
do
Dir
.
chdir
(
backup_path
)
file_list
=
Dir
.
glob
(
"*_gitlab_backup.tar"
).
each
.
map
{
|
f
|
f
.
split
(
/_/
).
first
.
to_i
}
puts
"no backup found"
if
file_list
.
count
==
0
if
file_list
.
count
>
1
&&
ENV
[
"BACKUP"
].
nil?
puts
"Found more than one backup, please specify which one you want to restore:"
puts
"rake gitlab:app:backup_restore BACKUP=timestamp_of_backup"
exit
1
;
end
tar_file
=
ENV
[
"BACKUP"
].
nil?
?
File
.
join
(
file_list
.
first
.
to_s
+
"_gitlab_backup.tar"
)
:
File
.
join
(
ENV
[
"BACKUP"
]
+
"_gitlab_backup.tar"
)
if
!
File
.
exists?
(
tar_file
)
puts
"The specified backup doesn't exist!"
end
print
"Unpacking backup... "
if
!
Kernel
.
system
(
"tar -xf
#{
tar_file
}
"
)
puts
"[FAILED]"
.
red
exit
1
else
puts
"[DONE]"
.
green
end
settings
=
YAML
.
load_file
(
"backup_information.yml"
)
ENV
[
"VERSION"
]
=
"
#{
settings
[
"db_version"
]
}
"
if
settings
[
"db_version"
].
to_i
>
0
# restoring mismatching backups can lead to unexpected problems
if
settings
[
"gitlab_version"
]
!=
%x{git rev-parse HEAD}
.
gsub
(
/\n/
,
""
)
puts
"gitlab_version mismatch:"
.
red
puts
" Your current HEAD differs from the HEAD in the backup!"
.
red
puts
" Please switch to the following revision and try again:"
.
red
puts
" revision:
#{
settings
[
"gitlab_version"
]
}
"
.
red
exit
1
end
Rake
::
Task
[
"gitlab:app:db_restore"
].
invoke
Rake
::
Task
[
"gitlab:app:repo_restore"
].
invoke
# cleanup: remove tmp files
print
"Deletion of tmp directories..."
if
Kernel
.
system
(
"rm -rf repositories/ db/ backup_information.yml"
)
puts
"[DONE]"
.
green
else
puts
"[FAILED]"
.
red
end
end
################################################################################
################################# invoked tasks ################################
################################# REPOSITORIES #################################
task
:repo_dump
=>
:environment
do
FileUtils
.
mkdir_p
(
backup_path_repo
)
until
Dir
.
exists?
(
backup_path_repo
)
puts
"Dumping repositories:"
project
=
Project
.
all
.
map
{
|
n
|
[
n
.
name
,
n
.
path_to_repo
]
}
project
<<
[
"gitolite-admin.git"
,
File
.
join
(
File
.
dirname
(
project
.
first
.
second
),
"gitolite-admin.git"
)]
project
.
each
do
|
project
|
print
"- Dumping repository
#{
project
.
first
}
... "
if
Kernel
.
system
(
"cd
#{
project
.
second
}
> /dev/null 2>&1 && git bundle create
#{
backup_path_repo
}
/
#{
project
.
first
}
.bundle --all > /dev/null 2>&1"
)
puts
"[DONE]"
.
green
else
puts
"[FAILED]"
.
red
end
end
end
task
:repo_restore
=>
:environment
do
puts
"Restoring repositories:"
project
=
Project
.
all
.
map
{
|
n
|
[
n
.
name
,
n
.
path_to_repo
]
}
project
<<
[
"gitolite-admin.git"
,
File
.
join
(
File
.
dirname
(
project
.
first
.
second
),
"gitolite-admin.git"
)]
project
.
each
do
|
project
|
print
"- Restoring repository
#{
project
.
first
}
... "
FileUtils
.
rm_rf
(
project
.
second
)
if
File
.
dirname
(
project
.
second
)
# delet old stuff
if
Kernel
.
system
(
"cd
#{
File
.
dirname
(
project
.
second
)
}
> /dev/null 2>&1 && git clone --bare
#{
backup_path_repo
}
/
#{
project
.
first
}
.bundle
#{
project
.
first
}
.git > /dev/null 2>&1"
)
puts
"[DONE]"
.
green
else
puts
"[FAILED]"
.
red
end
end
end
###################################### DB ######################################
task
:db_dump
=>
:environment
do
FileUtils
.
mkdir_p
(
backup_path_db
)
until
Dir
.
exists?
(
backup_path_db
)
puts
"Dumping database tables:"
ActiveRecord
::
Base
.
connection
.
tables
.
each
do
|
tbl
|
print
"- Dumping table
#{
tbl
}
... "
count
=
1
File
.
open
(
File
.
join
(
backup_path_db
,
tbl
+
".yml"
),
"w+"
)
do
|
file
|
ActiveRecord
::
Base
.
connection
.
select_all
(
"SELECT * FROM
#{
tbl
}
"
).
each
do
|
line
|
line
.
delete_if
{
|
k
,
v
|
v
.
blank?
}
output
=
{
tbl
+
'_'
+
count
.
to_s
=>
line
}
file
<<
output
.
to_yaml
.
gsub
(
/^---\n/
,
''
)
+
"
\n
"
count
+=
1
end
puts
"[DONE]"
.
green
end
end
end
task
:db_restore
=>
:environment
do
puts
"Restoring database tables:"
Rake
::
Task
[
"db:reset"
].
invoke
Dir
.
glob
(
File
.
join
(
backup_path_db
,
"*.yml"
)
).
each
do
|
dir
|
fixture_file
=
File
.
basename
(
dir
,
".*"
)
print
"- Loading fixture
#{
fixture_file
}
..."
if
File
.
size
(
dir
)
>
0
ActiveRecord
::
Fixtures
.
create_fixtures
(
backup_path_db
,
fixture_file
)
puts
"[DONE]"
.
green
else
puts
"[SKIPPING]"
.
yellow
end
end
end
end
# namespace end: app
end
# namespace end: gitlab
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