最近在学习shell编程,编程这件小事个人觉得多练练才能学的好学得扎实。平常工作中一般用gitlab进行版本控制,开发中就避免不了将代码获取到测试机上去调试代码,用过phpstorm的人都知道,ps集成了代码自动上传的功能,用起来也很方便。但是本着学习的目的,我就尝试自己写一段sell一条命令实现代码自动获取到服务器。下面是代码内容:
trans.sh
#!/bin/bash
echo 'start...'
##############获得用户输入选项和参数############
while getopts :csp: opt ;do
#标记用户想要获取client或是server #client和server是平时我们工作中的两个仓库
case "$opt" in
c ) client_flag=1 ;;
s ) server_flag=1 ;;
p ) postfix_name=$OPTARG
postfix_flag=1 ;;
* ) echo "Unknow option:'$opt'"
exit 13 ;;
esac
done
shift $[$OPTIND - 1]
#引入配置
source /usr/local/sh/config.sh
#根据参数个数作不同处理
if [ "$postfix_flag" = 1 ] ;then
client_branch="$PREFIX_CLIENT$postfix_name"
server_branch="$PREFIX_SERVER$postfix_name"
else
if [ "$#" -gt 2 ];then
#参数超过两个提示错误
echo "too much paramter"
exit 10
elif [ "$#" = 0 ]; then
client_branch="master"
server_branch="master"
elif [ "$#" = 1 ]; then
#一个参数时
if [ -n "$client_flag" ];then
client_branch=$1
else
client_branch="master"
fi
if [ -n "$server_flag" ]; then
server_branch=$1
else
server_branch="master"
fi
elif [ "$#" = 2 ]; then
#两个参数时默认第一个为client,第二个为server
client_branch=$1
server_branch=$2
fi
fi
echo "Going to get $client_branch and $server_branch code..."
################################################
#function #将命令输出信息重定向到文件
function fd {
if [ "$#" = 0 ]; then
#输出内容存在文件中
echo '' >"$dir/access"
else
$1 2>> "$dir/access"
fi
}
#获取client仓库代码,并保存到服务器临时目录
function updateITClientCode {
cd "$dir"
if [ -d "./ITClient" ] ;then #ITClient is a directory,or not?
fd "cd $ITClient"
if [ ! -d "./.git" ];then
fd "git init"
else
fd "git checkout master"
fd "git branch -D $client_branch" #delete local branch
fi
else
fd "git clone $client_url"
echo "get $ITClient repository from git ...."
fd "cd $ITClient"
fi
echo "git fetch $client_branch content ...."
if fd "git fetch origin $client_branch" ;then
if [ "$client_branch" = "master" ];then
fd "git checkout -b $ITClient FETCH_HEAD"
else
fd "git checkout -b $client_branch FETCH_HEAD"
fi
echo "client code has in workspace ..."
else
echo "fail:Coudln\`t fetch $client_branch"
exit 14
fi
}
#获取server仓库代码,并保存到服务器临时目录
function updateITServerCode {
cd "$dir"
if [ -d "./ITServer" ] ;then #ITServer is a directory
fd "cd $ITServer"
if [ ! -d "./.git" ];then
fd 'git init'
else
fd "git checkout master"
fd "git branch -D $server_branch" #delete local branch
fi
else
fd "git clone $server_url"
echo "get $ITServer repository from git ...."
fd "cd $ITServer"
fi
echo "git fetch $server_branch content ...."
if fd "git fetch origin $server_branch";then
if [ "$server_branch" = "master" ];then
fd "git checkout -b $ITServer FETCH_HEAD"
else
fd "git checkout -b $server_branch FETCH_HEAD"
fi
echo "server code has in workspace ..."
else
echo "fail:Coudln\`t fetch $server_branch"
exit 14
fi
}
# ########################################################
# #
# ######代码从git仓库克隆到服务器的临时目录#######
gitplace=$(which git) #have git?
if [ -n "$gitplace" ];then
gitconfig=`git config user.name`
if [ ! -n "$gitconfig" ];then
git config --global user.name "$Name"
git config --global user.email "$Email"
fi
if [ ! -d "$dir" ]; then
mkdir "$dir"
fi
fd
if fd "cd $dir" ;then
updateITClientCode
updateITServerCode
else
echo "$dir:no such directory"
exit 15
fi
else
echo "this machine does not have git,please install it"
exit 12
fi
################################################
#copy code to target location #代码从临时目录拷贝到apache根目录
cd "$dir"
#copy client
if [ ! -d "/usr/ET/project/ITClient" ];then
fd "mkdir /usr/ET/project/ITClient"
fi
fd "cp ./ITClient/bin-debug/ITClient.swf /usr/ET/project/ITClient/ITClient.swf"
#delete branch #复制完代码后这里将本地分支删除
cd "$ITClient"
fd "git checkout master"
if [ "$client_branch" = "master" ];then
fd "git branch -D $ITClient"
else
fd "git branch -D $client_branch"
fi
cd ..
#copy server
fd "shopt -s extglob"
if [ ! -d "/usr/ET/project/ITServer" ];then
fd "mkdir /usr/ET/project/ITServer"
fi
fd "cp -prf ./ITServer/!(itconfigitsvrconf.php) /usr/ET/project/ITServer"
#delete branch
cd "$ITServer"
fd "git checkout master"
if [ "$server_branch" = "master" ];then
fd "git branch -D $ITServer"
else
fd "git branch -D $server_branch"
fi
cd ..
echo
echo "-----------------get code from git success!-----------------------"
echo
下面是配置文件
config.sh
#!/bin/bash
USER_ACCOUNT=**** #登陆git的用户名
USER_PASSWORD=**** #登陆git的密码
#
dir="/usr/local/sh/temp" #临时目录
#
PREFIX_CLIENT="ITClient" #分支的前缀,输入p参数时有效
PREFIX_SERVER="ITServer"
#
ITClient="ITClient" #获取master分支时为了删除方便,起了个别名
ITServer="ITServer"
client_url="client repository code url"
server_url="server repository code url"
#
Name="Your Name"
Email="Your Email"
#
代码亲测可用,平时开发时也在用着呢,写脚本的其中一个方便之处就是直接一条命令./transh.sh -p _v1.40s就能把整个工程代码获取下来,实在太快太省事了。
代码源地址:https://github.com/walry/yuwenlanzi.git
如果你感兴趣可以加微信:
领取专属 10元无门槛券
私享最新 技术干货