一看就懂系列之 构建一套简单但规范的php代码上线流程

前言

是的,写这篇文章的目的是纪念项目在引入代码推送系统之前,一直使用的代码上线流程。当然代码推送系统原理和这个差不多,但是随着公司壮大很多细节的实现将会被封装化(服务化),将看不到怎么实现的了,还是写一下以免忘记。
本文适用于创业公司或者想简单实现规范化上线流程的公司。
本文主要记录两个问题:
1.开发流程
2.上线流程

开发流程

环境维度

环境区分四个维度
1.本地开发环境:本地自己搭的写代码的环境。数据库是连单独机器创建的公用数据库(不用自己本地的,主要原因是减少表新增与改动的维护成本)。

2.拟真开发环境:测试+开发使用的环境,数据库是连拟真环境独立的数据库。

3.beta开发环境:测试+开发+洗数据使用的环境,数据库连的是线上的数据库。

4.线上环境:面向用户。

开发流程

1.在本地开发环境开发好代码+建好数据库表结构(本地+拟真),进行自测后,传至拟真环境。

2.在拟真开发环境测试将进行各种测试,反馈开发bug回到流程1,没问题后,进行数据库资源相关申请,待dba与运维配置好后,传代码至beta环境。

3.在beta开发环境测试将用自己线上的账号进行最后一步确认测试,原则上不进行会产生垃圾数据的写入相关操作(线上数据清数据麻烦)。没问题后,进行代码推送至线上

git约定

1.git将开出两个公用的分支:develop和beta,用于存放两个过度环境的代码。

2.本地开发分支将开在feature的文件夹下,如fearute/20170702_test。写完后合并流程为fearute/20170702_test-develop、fearute/20170702_test-beta、fearute/20170702_test-master。注意:develop和beta不能直接合master分支,允许master合develop和beta分支

上线流程

流程图

一看就懂系列之 构建一套简单但规范的php代码上线流程_第1张图片

解释一下几个点:

1.除去本地开发环境,其余三个环境,拟真环境与beta环境、线上环境都将通过代码推送机进行代码的推送。注意:拟真环境与beta环境代码推送机是一台,线上推送机器是额外的一台。主要是防止误操作推错代码+代码权限管理

2.每个环境对应的代码推送机都将git的分支切到各环境对应的分支上头。推代码时候先进行代码的拉取(git pull),再进行php语法检测,最后通过rsync进行代码文件的传输覆盖掉各个环境上的代码,来实现代码的上传。

推送脚本分享

以推送pre环境为例子:push_pre.sh

#!/bin/bash
dir_path="/www/pre.咖啡色的羊驼.com/"
remote_path="41.xx.xx.xxx/pre_咖啡色的羊驼_com/"

cd "$dir_path" && git pull 2>&1 >/dev/null
rsync_option=-avn
already_execute=0
if [ $# -eq 1 ];then
case "$1" in
        execute)
                already_execute=1
                rsync_option=-av
esac
fi

file_list=`rsync "$rsync_option" "$dir_path" rsync://"$remote_path" --exclude=.* --delete`
echo "$file_list"

#文件校验
for i in $file_list
do
        if [[ $i =~ ".php" ]]&&[ -f $dir_path$i ];then
                phpl_res=`php -l $dir_path$i`
                is_normal=`echo "$phpl_res" | grep "No syntax errors"`
                if [ ! -n "$is_normal" ];then
                        echo "$dir_path$i语法错误,请调整代码"
                        exit 0
                fi
        fi
done

#确认推送
if [ $already_execute -eq 0 ];then
 echo "================以上是否是您想要推送的内容?================"
 echo "请输入密码ok执行,放弃请按任意键回车"
 read Select
 case $Select in
ok)
rsync -av $dir_path rsync://"$remote_path" --exclude=.* --delete
 ;;

推送时候进行执行脚本即可

./push_pre.sh

推送各种环境以此类推。

但是有个小麻烦的点,每次推送代码都要登录代码推送机,有没有办法简单点呢?
有的,使用sshpass。请点击 如何巧妙的使用sshpass来提高效率

此方案的问题

由于线上机器过多,rsync的需要一台一台机器来,会存在推送瞬间的php报警,暂未想到合理的解决方案。

如果有解决方案,或者更好的流程麻烦同步一份在留言板告诉我,感谢。

后记(2018.07.11)

知道解决方案了,一直忘记写上来了。
分析:关键痛点在于文件替换的时候存在交叉错读,有可能导致一些未定义的情况的报警。
具体的方式有两种:
1.先将要上线的机器从节点摘除,然后替换好之后再重现上线。
2.将要发布的代码进行打包(tar),然后同步到发布的机器,解压后进行mv的操作

如果量级实在大,可以两种方法结合的来看

你可能感兴趣的:(php)