mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-04 20:45:58 +01:00
139 lines
3.5 KiB
Bash
139 lines
3.5 KiB
Bash
#!bin/bash
|
|
|
|
DEBUG=0
|
|
if [ "$1" = "-v" ]
|
|
then
|
|
DEBUG=1
|
|
shift
|
|
fi
|
|
|
|
GITBUCKET_DATA=$1
|
|
BACKUP_FOLDER=$2
|
|
GITBUCKET_DB_BACKUP_URL=$3
|
|
|
|
gitbucketRepositoriesFolder=$GITBUCKET_DATA/repositories
|
|
repositoriesFolderNameSize=${#gitbucketRepositoriesFolder}
|
|
|
|
repositoriesBackupFolder=$BACKUP_FOLDER/repositories
|
|
|
|
##
|
|
## trace allows to print messages on the console if -v argument (verbose) has been given to the program
|
|
##
|
|
function trace {
|
|
if [ "$DEBUG" = "1" ]
|
|
then
|
|
echo "$@"
|
|
fi
|
|
}
|
|
|
|
##
|
|
## create a git mirror clone of a repository. If the clone already exists, the operation is skipped
|
|
## arg1: source of the repository to be cloned
|
|
## arg2: full folder name of the clone
|
|
##
|
|
function createClone {
|
|
source=$1
|
|
dest=$2
|
|
|
|
if [ ! -d $dest ]
|
|
then
|
|
trace " cloning $source into $dest"
|
|
git clone --mirror $source $dest > /dev/null 2>&1
|
|
else
|
|
trace " $dest already exists, skipping git clone operation"
|
|
fi
|
|
}
|
|
|
|
##
|
|
## update a clone folder, the update is down toward the latests state of it's default remote
|
|
##
|
|
function updateRepository {
|
|
currentFolder=$(pwd)
|
|
cd $1
|
|
trace " updating $1"
|
|
git remote update > /dev/null
|
|
cd $currentFolder
|
|
}
|
|
|
|
# Perform some initializations
|
|
if [ ! -d $repositoriesBackupFolder ]
|
|
then
|
|
mkdir -p $repositoriesBackupFolder > /dev/null
|
|
fi
|
|
|
|
|
|
#
|
|
# To keep integrity as its maximum possible, the database export and git backups must be done in the shortest possible timeslot.
|
|
# Thus we will:
|
|
# - clone new repositories into backup directory
|
|
# - update them all a first time, so that we gather gib updates
|
|
# - export the database
|
|
# - update all repositories a second time, this time it should be ultra-fast
|
|
#
|
|
|
|
# First let's be sure that all existing directories have a clone
|
|
# as clone operation can be heavy let's do it now
|
|
repositories=$(find $gitbucketRepositoriesFolder -name *.git -print)
|
|
|
|
echo "Starting clone process"
|
|
for fullRepositoryFolderPath in $repositories
|
|
do
|
|
repositoryFolder=${fullRepositoryFolderPath:$repositoriesFolderNameSize}
|
|
mirrorFolder=$BACKUP_FOLDER$repositoryFolder
|
|
|
|
createClone $fullRepositoryFolderPath $mirrorFolder
|
|
done;
|
|
echo "All repositories, cloned"
|
|
|
|
echo "Update repositories: phase 1"
|
|
#
|
|
# Then let's update all our clones
|
|
#
|
|
for fullRepositoryFolderPath in $repositories
|
|
do
|
|
repositoryFolder=${fullRepositoryFolderPath:$repositoriesFolderNameSize}
|
|
mirrorFolder=$BACKUP_FOLDER$repositoryFolder
|
|
|
|
updateRepository $mirrorFolder
|
|
done;
|
|
echo "Update repositories: phase 1, terminated"
|
|
|
|
#
|
|
# Export the database
|
|
#
|
|
if [ "$GITBUCKET_DB_BACKUP_URL" != "" ]
|
|
then
|
|
echo "Database backup"
|
|
curl $GITBUCKET_DB_BACKUP_URL > /dev/null
|
|
cp -f $GITBUCKET_DATA/gitbucket-database-backup.zip $BACKUP_FOLDER > /dev/null
|
|
else
|
|
echo "No database URL provided, skipping database backup"
|
|
fi
|
|
|
|
#
|
|
# Export the gitbucket configuration
|
|
#
|
|
echo "Configuration backup"
|
|
cp $GITBUCKET_DATA/gitbucket.conf $BACKUP_FOLDER > /dev/null
|
|
|
|
#
|
|
# Export the gitbucket data directory (avatars, ...)
|
|
#
|
|
echo "Avatars backup"
|
|
tar -cf $BACKUP_FOLDER/data.tar $GITBUCKET_DATA/data > /dev/null 2>&1
|
|
gzip -f $BACKUP_FOLDER/data.tar > /dev/null
|
|
|
|
#
|
|
# Then let's do a final update
|
|
#
|
|
echo "Update repositories: phase 2"
|
|
for fullRepositoryFolderPath in $repositories
|
|
do
|
|
repositoryFolder=${fullRepositoryFolderPath:$repositoriesFolderNameSize}
|
|
mirrorFolder=$BACKUP_FOLDER$repositoryFolder
|
|
|
|
updateRepository $mirrorFolder
|
|
done;
|
|
echo "Update repositories: phase 2, terminated"
|
|
|
|
echo "Update process ended, backup available under: $BACKUP_FOLDER" |