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 <<EOF
provider:
  name: faas
  gateway: faas_gateway
functions:
  function_name:
    lang: xx
    handler: ./function
    image: xx.cn/xx/docker_name:version
EOF

fi

#faas template pull git@xx.cn/xx/xx.git --overwrite     
# 默认不使用,公司后端统一模板,配置了orm,dockerfile,flask配置等
# faas template pull 即拉git上的模板,业务相关,可忽略

# Dockerfile默认在template业务模板中有,但每个项目都可能定制化Dockerfile
# 这里操作就是如果自定义Dockerfile,放到指定文件夹中,并覆盖原模板的Dockerfile
# 放到指定目录的原因就是在git中你可以看到这个目录,提醒其他人Dockerfile是定制的
if [ -f "./function/extra/Dockerfile" ];then
    cp -rf ./function/extra/Dockerfile ./template/python3-flask/
fi

# run.sh同理,此为业务中脚本,可忽略
if [ -f "./function/extra/run.sh" ];then
    cp -rf ./function/extra/run.sh ./template/python3-flask/
fi

# commit_id为设计的Docker tag,采用当前时间动态获取
# 这种tag必然是不会重复的
commit_id=$(date "+%Y%m%d%H%M%S")
# new_version是当前要部署的版本
new_version=$commit_id
echo version: $new_version-$env

# docker name即name:tag中的name,部署到私有hub上的镜像name
docker_name=$function_basename
function_name=$function_basename

# 为openfaas的项目function起名,除了正式环境,其他都要带上环境变量名
# 如dev-function..../stage-function...
if [ "$env" != "prod" ];then
    function_name=$env-$function_basename
fi

# 重要步骤,将template.yml模板指定内容替换
# template.yml的固定部分:faas_gateway,funtion_name,docker_name,version
# sed不重定向不会修改原yml的内容,用指定变量替换相应字符串位置
sed -e "s/version/$new_version/g;s/function_name/$function_name/g;s/faas_gateway/$faas_gateway_/g;s/docker_name/$docker_name/g" 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等这样的做法,可以使你实现一行命令完成部署的要求。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266