在上一篇文章讲述了如何在Linux系统中配置BitBucket、GitHub和Coding这三个平台的git账户,这篇文章就分享如何通过shell脚本定时获取自己的CentOS7.1服务器上的备份文件,然后使用git命令同步到这三个平台仓库上。

一、功能需求描述
我自己为这个shell同步脚本设定了以下三个需求功能点:
1、自动获取数据库备份目和程序备份目录下自动生成的最新的备份文件;
2、将获取到的最新的备份数据库和程序文件自动同步到BitBucket、GitHub和Coding这三个Git平台;
3、生成相应的执行日志文件。二、shell脚本的思路和流程
根据上面的需求,整理出脚本思路:先获取最新的备份文件,然后复制到本地的BitBucket、GitHub和Coding仓库目录下,然后通过Git命令同步到远端仓库即可,整个过程执行的命令以追加的方式保存到同一个日志文件中。
脚本的主要流程:
1、先声明变量`Source_DB_Dir`、`Source_PRG_Dir`表示自己的CentOS服务器上的数据库和程序备份目录,然后`Git_Err_Log_Dir`是生成的执行日志目录。
2、接着声明BitBucket、GitHub和Coding这3个Git平台的本地仓库所在目录(主要是数据库DB目录和程序PRG目录);
3、后面的三个函数`ERROR`、`NOTICE`和`RUNCMD`对应着不同的操作命令级别并生成相应的日志文件;
4、函数`Get_last_file`功能是获取该目录下面最新的文件;
5、`Git_Commit`函数主要会先通过`git pull`获取远端仓库的最新内容到本地仓库,然后再将本地仓库更新的备份文件同步到远端仓库中。三、完整的脚本内容
script.sh
#!/bin/bash
# TypeCodes Git Synchronous Script v1.0.0
# (c) 2015 vfhky https://typecodes.com/linux/gitsynbackupshell.html
Source_DB_Dir=/mydata/backups/data/mysql
Source_PRG_Dir=/mydata/backups/data/typecodes
Git_Err_Log_Dir=/mydata/backups/logs/git
# Coding.net
CodingNet_DB_Dir=/mydata/GitBang/CodingNet/myblog/db
CodingNet_PRG_Dir=/mydata/GitBang/CodingNet/myblog/program
# BitBucket.org
BitBucket_Dir=/mydata/GitBang/BitBucket/myblog/db
BitBucket_PRG_Dir=/mydata/GitBang/BitBucket/myblog/program
# GitHub.com
GitHub_Dir=/mydata/GitBang/GitHub/myblog/db
GitHub_PRG_Dir=/mydata/GitBang/GitHub/myblog/program
# Get the newest file name
#Newest_File="ls -lrt| tail -n 1 | awk '{print $9}'"
# Space separated list of databases
PRGNAME="Git_Synchronous"
# Current date format: e.g 20150505_2015
Current_Date=`date +%Y%m%d_%H%M`
function USAGE() {
cat << EOF
usage: $0 options
This script synchronize the backup files to BitBucket, GitHub and Coding.
OPTIONS:
-h Show this message
-n Number of days to keep backups
EOF
}
while getopts "hal:n:" opt; do
case $opt in
a)
PRGNAME=""
;;
h)
USAGE
exit 1
;;
l)
PRGNAME="$OPTARG"
;;
n)
NUMDAYS=$OPTARG
;;
\?)
USAGE
exit
;;
:)
echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
function ERROR() {
echo && echo "[error] $@" >> $Git_Err_Log_Dir/Git_$Current_Date.log
exit 1
}
function NOTICE() {
echo && echo "[notice] $@" >> $Git_Err_Log_Dir/Git_$Current_Date.log
}
function RUNCMD() {
echo $@ >> $Git_Err_Log_Dir/Git_$Current_Date.log
eval $@
}
# Git commit command function
function Git_Commit(){
if [ $# -ne 0 -a $# -ne 1 ]; then
ERROR "Usage: Git_Commit or Git_Commit file_path!"
exit 1;
elif [ $# -lt 1 ]; then
RUNCMD git pull && git add --all && git commit -m "Backup from TypeCodes.com [Time:$Current_Date]" && git push origin master
else
RUNCMD git pull && git add $1 && git commit -m "Backup from TypeCodes.com [Time:$Current_Date]" && git push origin master
fi
}
# $1:path $2:filter file-type
function Get_last_file(){
if [ $# -ne 1 -a $# -ne 2 ]; then
ERROR "Usage: Get_last_file file_path or Get_last_file file_path file_type!"
exit 1;
elif [ $# -lt 2 ]; then
ls -lrt $1 | tail -n 1 | awk '{print $9}'
else
ls -lrt $1 | awk "/$2/" | tail -n 1 | awk '{print $9}'
fi
}
if [ ! -d $Git_Err_Log_Dir ]; then
mkdir -p $Git_Err_Log_Dir
fi
NOTICE "Start copy the db_file to git index"
RC=0
Last_Source_DB_File=$(Get_last_file $Source_DB_Dir)
RUNCMD "cd $Source_DB_Dir && \cp -rf $Last_Source_DB_File $CodingNet_DB_Dir && \cp -rf $Last_Source_DB_File $BitBucket_Dir && \cp -rf $Last_Source_DB_File $GitHub_Dir"
RC=$?
if [ $RC -gt 0 ]; then
ERROR "Copy db_file failed!"
fi
NOTICE "Start copy the program_file to git index"
Last_Program_DB_File=$(Get_last_file $Source_PRG_Dir)
RUNCMD "cd $Source_PRG_Dir && \cp -rf $Last_Program_DB_File $CodingNet_PRG_Dir && \cp -rf $Last_Program_DB_File $BitBucket_PRG_Dir && \cp -rf $Last_Program_DB_File $GitHub_PRG_Dir"
RC=$?
if [ $RC -gt 0 ]; then
ERROR "Copy program_file failed!"
fi
NOTICE "Start push to CodingNet"
RUNCMD "cd $CodingNet_PRG_Dir && tar -zxf $(Get_last_file $CodingNet_PRG_Dir .tar.gz) && cd ../ && Git_Commit"
NOTICE "Start push to BitBucket"
RUNCMD "cd $BitBucket_PRG_Dir && tar -zxf $(Get_last_file $BitBucket_PRG_Dir .tar.gz) && cd ../ && Git_Commit"
NOTICE "Start push to GitHub"
RUNCMD "cd $GitHub_PRG_Dir && tar -zxf $(Get_last_file $GitHub_PRG_Dir .tar.gz) && cd ../ && Git_Commit"
# exit 0四、单独执行该shell脚本
可以将这个脚本保存为git.sh,然后使用时通过chmod +x git.sh命令添加执行权限,最后通过./git.sh执行该脚本即可。附图如下:
同步到BitBucket仓库时的截图:

同步到GitHub仓库时的截图:

五、定时执行该shell脚本
利用Linux系统的crontab定时任务工具执行该脚本,例如下面这个配置就是每天凌晨1点的时候执行该shell脚本。
[root@typecodes bak_list]# crontab -e
0 1 * * * /mydata/backups/bak_list/git.sh根据脚本中的配置,生成的日志类似于/mydata/backups/logs/git/Git_20150706_0100.log:

评论
评论加载中…