Shell系列(四)——— 实例解读后端项目自动部署的Shell脚本

后端结构:

公司后端采用了Kubernetes+OpenFaaS+Flask的架构。openfaas提供FaaS服务。每一个flask项目具体到一个function中,一个function部署在一个docker容器中,各function之间相互独立,保证每个后端在操作同一个工作项目时逻辑的独立性。


脚本应用场景:

部署脚本需求的必要性:

  • openfaas的部署需要自动生成yml文件
  • 实际部署阶段需要区分生产环境(dev开发,stage预发布,prod正式,test测试)
  • yml的生成结果需要动态化,如后端每一个项目都不一样,一个项目相当于一个faas function,因此function_name每个人必然是不一样的。

代码实现:

里面一些比较重要的文件:

  • template.yml:OpenFaaS Function部署的模板yml,需要手动修改,这里要通过脚本自动化这个流程
  • $0:即当前要执行的脚本名称,可以是"deploy.sh"
  • deploy.yml:修改模板得到的yml,用于OpenFaas的部署
  • 变量env:控制部署的环境
    具体的脚本解读请看代码注释。
// 具体名称已隐去
"deploy.sh"
#!/usr/bin/env bash

#function_basename=$(basename `pwd`)
function_basename="xx"  # function name,即openfaas function的名称,项目名称

env=$1   # 需要部署的环境的名称,$1即为后面第一位输入的参数

option=$2  # 执行的操作,如deploy为部署
# 前几行定义了整个脚本的操作,如 sh deploy.sh dev deploy,表明这个操作可以自动化整个项目到dev开发环境的部署

# 分配faas_gateway(openfaas的具体路由)
# 在使用变量时,如果不修改操作,调用变量需要加${env}
# 大括号的作用是隔离,如${A}B和$AB是完全不一样的含义。
# 定义了-h/--help的含义,一个instructions,为操作全过程的介绍。
case ${env} in
    dev|test)
        faas_gateway="xx1"
        faas_gateway_="xx2"
        ;;
    prod|stage)
        faas_gateway="xx3"
        faas_gateway_="xx4"
        ;;
    *|-h|--help)
        echo "$0:usage: [ test ] | [ prod ] | [ dev ] | [ stage ] \n"

        echo "Env:"
        echo "\ttest    Testing Env"
        echo "\tprod    Prod Env"
        echo "\tdev     Dev Env"
        echo "\tstage   Stage Env\n"

        echo "Available Commands:"
        echo "\tbuild   Builds OpenFaaS function containers"
        echo "\tdeploy  Deploy OpenFaaS functions"

        echo "Examples:"
        echo "\tsh deploy.sh test    [ build | deploy ]"
        echo "\tsh deploy.sh prod    [ build | deploy ]"
        echo "\tsh deploy.sh dev     [ build | deploy ]"
        echo "\tsh deploy.sh stage   [ build | deploy ]\n"

        echo "Use \"sh $0 -h\" for more information about a command."
        exit 1
        ;;
esac

# if [ -f "..." ]; 意为检查引号内文件是否存在,如果存在执行步骤,不存在执行另一步骤
if [ -f "./template.yml" ];then
    echo "template.yml exists."
else
# 重定向内容,cat << EOF ... EOF会将EOF开始和结束中间的内容作为输入
# 再通过">"将内容重定向到template.yml
# 这里的含义就是判断如果这个template模板不存在,创建一个
cat > template.yml < deploy.yml

# faas cli 操作 u/p登录
faas-cli login -g $faas_gateway -u xx --password 'xx'

# option如果是build,用Dockerfile去build,但并不deploy
if [ "$option" = "build" ];then
    function_name=$env-$function_name
fi

faas-cli build -f deploy.yml --build-arg FLASK_ENV=$env

faas-cli push -f deploy.yml

echo "Version:$new_version"

if [ "$option" = "deploy" ];then
    faas-cli deploy -f deploy.yml
    echo '======deploy success======'
    echo [function]: $function_name
    echo [version ]: $new_version
    echo [image   ]: xx.cn/xx/$docker_name:$new_version
    echo '=========================='
    echo ' '

else
    echo '======build success======'
    echo [function]: $function_name
    echo [version ]: $new_version
    echo [image   ]: xx.cn/xx/$docker_name:$new_version
    echo '========================='
    echo ' '

fi

# build完后,项目代码中删除build目录,本地并不需要
rm -rf ./build

以上是一些自动化部署问题的小思考~
如果架构不同,也可以参考一下其中的动态修改,用于自己的项目中,尤其是时间代替tag等这样的做法,可以使你实现一行命令完成部署的要求。

你可能感兴趣的:(Shell系列(四)——— 实例解读后端项目自动部署的Shell脚本)