TypeCodes

CentOS中将备份文件同步到BitBucket、GitHub和Coding的shell脚本

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

CentOS中git同步的shell脚本

1 功能需求描述

我自己为这个shell同步脚本设定了以下三个需求功能点:

1、自动获取数据库备份目和程序备份目录下自动生成的最新的备份文件;
2、将获取到的最新的备份数据库和程序文件自动同步到BitBucket、GitHub和Coding这三个Git平台;
3、生成相应的执行日志文件。
2 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`获取远端仓库的最新内容到本地仓库,然后再将本地仓库更新的备份文件同步到远端仓库中。
3 完整的脚本内容
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#!/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
4 单独执行该shell脚本

可以将这个脚本保存为git.sh,然后使用时通过chmod +x git.sh命令添加执行权限,最后通过./git.sh执行该脚本即可。附图如下:

同步到BitBucket仓库时的截图: 同步到BitBucket仓库时

同步到GitHub仓库时的截图: 同步到GitHub仓库时

5 定时执行该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

git同步的shell脚本执行生成的日志

打赏支持

Comments »