shell脚本实现git项目自动部署

以下内容仅为编写脚本时所用到的linux\shell\git内容的总结,并非全面总结。

  1. shell文件头:(#! 符号标记,脚本需要什么解释器来执行,即使用哪一种 Shell
    如:#!/usr/bin/env sh
    常用的shell如下:
    Bourne Shell(/usr/bin/sh或/bin/sh)
    Bourne Again Shell(/bin/bash)
    C Shell(/usr/bin/csh)
    K Shell(/usr/bin/ksh)
    Shell for Root(/sbin/sh)
    ……

  2. 自动化部署流程:切换到项目主目录(cd …)->找到项目进程id,kill -9 pid->git checkout 版本号->git pull ->配置文件检查->启动进程,代码如下(非标准流程):
    defcd(){
    #切换到项目主目录
    cd ${path}
    pwd
    #输入分支版本
    read -t 30 -p “请输入需要checkout的版本号,输入后直接点击回车键:” branch_master
    #切换到指定分支
    git checkout ${branch_master}
    #删除原有日志内容 或清空
    cat /dev/null > giterror.txt
    #rm -rf giterror.txt
    rm -rf pull.txt
    #更新
    echo “开始更新”
    check=“git pull”
    ${check} >pull.txt
    key=“Please commit your changes or stash them before you merge”
    #查找报错日志
    grep -s KaTeX parse error: Expected 'EOF', got '#' at position 32: … giterror.txt #̲判断更新是否报错 if [ …{branch_master}
    git pull
    echo “本地存在修改,先撤销本地修改”
    else
    echo “本地无修改,已经更新成功”
    fi
    #比较程序配置文件
    rm -rf diffrent.txt
    file2_bk="…/config.json_bk"
    diff config.json $file2_bk > diffrent.txt
    if [ -s “diffrent.txt” ]; then
    \cp ${file2_bk} config.json
    echo “mysql.json文件已替换成功”
    else
    echo “mysql.json文件无需替换”
    fi
    #项目名称
    process_name=“iqidao”
    killall KaTeX parse error: Expected 'EOF', got '#' at position 21: …ess_name} #̲获取项目进程号 pi…(ps -ef | grep iqidao | grep -v grep | awk ‘{print $2}’)
    echo p i d n o i f [ − z " {pid_no} if [ -z " pidnoif[z"{pid_no}" ]
    then
    echo “进程已经被kill”
    else
    kill -9 KaTeX parse error: Expected 'EOF', got '#' at position 51: …-9命令" fi #̲编译 echo "开始编译"…(ps -ef | grep iqidao | grep -v grep | awk ‘{print $2}’)
    echo p i d n o r e b o t i f [ − z " {pid_no_rebot} if [ -z " pidnorebotif[z"pid_no_rebot" ]
    then
    echo “进程启动失败,请检查错误”
    else
    echo “进程成功启动”
    fi
    }
    defcd

  3. 涉及的shell总结:

  • [变量 ]
    a.定义变量:var_value=“Hello”
    b.引用变量: v a r v a l u e 或 var_value或 varvalue{var_value}
  • [ 获取键盘输入] read -p(提示语句) -n(字符个数) -t(等待时间) -s(不回显)
    a. -t 30 :即等待30s时间,若不输入则退出输入
    b.-s 输入内容时不显示在监视器上,输入完毕后回显在监视器上。
  • [算数运算符 ]加减乘除 、取余、等于不等于
    a. val=expr $a + $b
    b. val=expr $a - $b
    c. val=expr $a \* $b
    d. val=expr $a / $b
    e.val=expr $a % $b
    f.[ $a == $b ]
    h.[ $a != $b]
  • [ 字符串运算符] 判断变量
    a. -z 判断 变量的值,是否为空 ,为空返回True
    b. -n 判断变量的值是否为空,为空返回False
    格式:[ -z “$var_value” ]
  • [ 运算符]文件判断
    a.[ -s file ] 判断文件是否为空,不为空返回True
    b.[-e file ] 判断文件是否存在,存在返回True
  • [流程控制 ] if 语句,切记内容与[]之间一定要有空格,否则会报错
    if [condition]
    then
    command1
    echo “*********”
    else
    command2
    echo “$$$$$$$$”
    fi
  • [ 输出]
    a.echo “***”
    b.printf “$$$$”
  1. 涉及的linux命令总结
    a.cd path 切换到指定目录
    b.rm 删除文件
    强制删除:-f
    给出提示:-i
    删除目录下的所有文件:-r
    强制删除/home下所有文件:rm -rf /home
    c.grep
    找出内容且输出行号:-n
    查找内容不区分大小写:-i
    找出/home/log文件下所有关于tomcat的内容且输出行号:grep -ni tomcat/home/log
    d.diff:比较文件差异
    diff $file2 $file2_bk
    e.ps 查看j进程
    显示终端上所有进程:a
    显示所有进程及其路径:-e
    显示正在运行进程:-r
    全格式显示:-f
    查看所有名为process进程及其详细路径:ps -ef |grep process
    f.kill-杀掉进程
    强制执行:kill -9 pid
    killall process = ps aux |grep 进程名+kill -9
    pkill process
    h.cp 复制文件
    直接覆盖重名文件不给出提示:-f
    给出重复提示:-i
    复制目录及所有文件:-r
    文件操作权限一同复制:-p
    强制复制:\cp
    将/home/a文件夹下的所有文件强制复制至/usr/local下,且文件操作权限不变:cp -rfp /home/a /usr/local
    i.删除文件内容
    (1) : > filen
    (2)> file
    (3)echo “” > file
    (4)echo > file
    (5)cat /dev/null > file
  2. 涉及的git内容总结
    a.git tag–查看所有版本
    b.git checkout +版本号–切换到当前版本
    c.git pull origin 版本 --更新;git pull默认更新当前分支
    d.git fetch -all 下载远程内容,不合并本地
    e. git reset --hard origin/master Head指向下载的最新版本

你可能感兴趣的:(软件测试,自动化部署,shell,linux)