开发流程管理规范

在项目日益复杂,开发人员越来越多的时候,项目开发过程中产生了诸多问题。比如代码的版本管理不规范导致经常发生冲突,数据库的版本管理不规范导致的数据污染,数据的污染势必导致测试的不准确等等问题,问题愈来愈严重,开发出来的产品质量可想而知。综上所述,项目开发流程势必要有一套合适的规范。
代码管理
现在代码的版本控制一般都是git或svn,但是在团队协作开发过程中,如何规范工具的使用,这就不仅仅是技术上的问题了。如果没有在管理层面解决这个问题,带来是需要在技术上花更多时间和精力去弥补,而且还不能根治。
问题1:开发团队人员少的时候,大家都在master上拉代码,提交代码,貌似也没用多大问题,最多提交之前重新拉一下代码,偶尔会有冲突的情况。后来人多了,冲突的情况越来越多,也存在刚刚提交的代码被同事改了。

image.png

如果按照上图的方式,每一个feature都另外拉一条分支出来,开发人员可随意提交,对同时并行开发的其他同事不会有任何影响,双方不存在任何阻塞的情况,从一定程度上提高了效率。需要注意的就是在合并的时候需要适时地解决可能会出现的冲突问题,事实上这并不是什么大问题。

问题2:整个产品开发流程中不仅仅只有开发人员参与,确切地说,开发人员只是其中的角色之一,软件的产品质量还需要经过测试人员的测试才能发布,我们必须给测试人员单独一条分支。

image.png

所以在上图我们给测试人员另外拉出拉一条分支专门用作集成测试,在集成测试的过程中,会出现大量的bug,开发人员需要对测试分支里面出现的bug做修复(无论是直接拉测试分支代码修复还是另外对测试分支创建额外的修复bug的分支)。另外需要注意的是,有可能在集成测试的这段时间,又有新的feature代码合并到master。
问题3:我们什么时候才能发布代码到生产环境
image.png

按照上图来说,我们会提前计划那些功能需要在下一个版本发布,当这些功能开发好之后,开始做集成测试,经过完善的集成测试后,可以给代码打上一个tag,并且发布一个release版本,同时需要将代码合并会master。在集成测试的这段时间合并到master的代码并不在这次发布的计划当中。
问题5:线上代码有bug需要修复怎么办
image.png

我们另外从release中拉出了一条热修复的分支,在修复并充分测试后,将代码合并回release并发布,同时需要将热修复的代码合并回master。

我们的代码管理从最简单的一条master到多条分支协作开发,每条分支只做一件事情,从责任上划分清楚,避免一条分支承担过多责任导致不明晰。

数据管理
和代码版本管理一样,数据库也会遇到类似问题。一开始大家图省事儿都共用同一个数据库,随着时间的迁移这个数据库就成了一团浆糊,我们同样需要从管理上解决这个问题。为了避免数据之间的交叉干扰,我们需要对每一个分支配一个对应的数据库,尽可能做到数据的隔离,避免数据被污染。

image.png

为了达到上述要求,我们做了开发的自动化构建。这样做有以下几个好处:
1.前端开发人员不需要自己去搭建后台环境,只需要专注于前端开发。
2.后台开发人员也不需要自己去搭建数据库,可以直接使用自动化构建好的数据库。
3.后台人员开发好的新功能只要代码提交即可立马构建最新代码。
4.测试人员也可以随时参与进来。
同样的,以上自动化构建也针对集成测试环境。

下面附一份自动化复制数据库的自动化脚本代码:
copyDB.sh

#!/bin/bash
#示例: sh ./copyDB.sh -h 127.0.0.1 -o 3306 -u root -p root -d FROM_DB -H 127.0.0.1 -O 3306 -U root -P root -D target_DB

#源数据库默认值
FROM_HOST="127.0.0.1"
FROM_PORT="3306"
FROM_USERNAME="root"
FROM_PASSWORD="root"
FROM_DB=""

#目标数据库默认值
TARGET_HOST="127.0.0.1"
TARGET_PORT="3306"
TARGET_USERNAME="root"
TARGET_PASSWORD="root"
TARGET_DB=""


# 用于初始化参数
function init(){
    # 解析参数
    while getopts h:o:u:p:d:H:O:U:P:D: option
    do 
        case "$option" in
            h)
                FROM_HOST=$OPTARG;;
            o) 
                FROM_PORT=$OPTARG;;
            u)
                FROM_USERNAME=$OPTARG;;
            p)
                FROM_PASSWORD=$OPTARG;;
            d)
                FROM_DB=$OPTARG;;
            H)
                TARGET_HOST=$OPTARG;;
            O)
                TARGET_PORT=$OPTARG;;
            U)
                TARGET_USERNAME=$OPTARG;;
            P)
                TARGET_PASSWORD=$OPTARG;;
            D)
                TARGET_DB=$OPTARG;;
            \?)
                echo "Usage: args [-h] [-o] [-u] [-p] [-d] [-H] [-O] [-U] [-P] [-D]"
                echo "-h means from host(源数据库ip,默认127.0.0.1)"
                echo "-o means from port(源数据库端口,默认3306)"
                echo "-u means user(源数据库的用户名,默认root)"
                echo "-p means passwd(源数据库的密码,默认root)"
                echo "-d means from db(源数据库名)"
                echo "-H means target host(目标数据库ip,默认127.0.0.1)"
                echo "-O means port(目标数据库端口,默认3306)"
                echo "-U means user(目标数据库用户名,默认root)"
                echo "-P means passwd(目标数据库密码,默认root)"
                echo "-D means target db(目标数据库名)"
                echo "example: sh ./copyDB.sh -h 127.0.0.1 -o 3306 -u root -p root -d FROM_DB -H 127.0.0.1 -O 3306 -U root -P root -D target_DB"
                exit 1;;
        esac
    done
}

#检查参数不能为空
function checkDB(){
    if [ -z $FROM_DB ]; then
        echo "源数据库名不能为空"
        echo "请指定-d参数"
        exit 1
    elif [ -z $TARGET_DB ]; then
        echo "目标数据库名不能为空"
        echo "请指定-D参数"
        exit 1
    fi
}

#判断是否存在源数据库
function isExistDB(){
    mysql  -h$1 -P$2 -u$3 -p$4  -e "use $5"
    if [[ $? -eq 0 ]]; then
        if [[ $6 -eq 0 ]]; then
            echo "from db is exist(存在目标数据库,可以复制)"
        elif [[ $6 -eq 1 ]]; then
            echo "target db is exist(已经存在目标数据库,不可以复制)"
            echo "-H$1 -O$2 -U$3 -P$4 -D$5已存在"
            exit 1
        fi
    else
        if [[ $6 -eq 0 ]]; then
            echo "from db is not exist(源数据库不存在,不可以复制)"
            echo "-h$1 -o$2 -u$3 -p$4 -d$5不存在"
            exit 1
        elif [[ $6 -eq 1 ]]; then
            echo "target db is not exist(目标数据库不存在,可以创建)"
        fi
    fi
}

#创建数据库
function createDataBase(){
    mysql  -h$1 -P$2 -u$3 -p$4  -e "CREATE DATABASE $5 CHARACTER SET utf8mb4 COLLATE utf8mb4_bin"
    if [[ !($? -eq 0) ]]; then
        echo "创建数据库失败:-H$1 -O$2 -U$3 -P$4 -D$5"
        exit 1
    fi
    echo "创建数据库成功:-H$1 -O$2 -U$3 -P$4 -D$5"
}

#复制数据
function copyData(){
    mysqldump --default-character-set=utf8mb4 --host=$1 -P$2 -u$3 -p$4 --opt $5 | mysql --host=$6 -P$7 -u$8 -p$9 --default-character-set=utf8mb4 -C ${10}
    if [[ !($? -eq 0) ]]; then
        echo "复制数据库失败:-h$1 -o$2 -u$3 -p$4 -d$5 ------》 -H$6 -P$7 -U$8 -P$9 -D${10}"
        exit 1
    fi
    echo "复制数据库成功:-h$1 -o$2 -u$3 -p$4 -d$5 ------》 -H$6 -P$7 -U$8 -P$9 -D${10}"
}

#初始化
init $*
#检查初始化的参数
checkDB
#判断源数据库是否存在
isExistDB $FROM_HOST $FROM_PORT $FROM_USERNAME $FROM_PASSWORD $FROM_DB 0
#判断目标数据库是否存在
isExistDB $TARGET_HOST $TARGET_PORT $TARGET_USERNAME $TARGET_PASSWORD $TARGET_DB 1
#创建目标数据库
createDataBase $TARGET_HOST $TARGET_PORT $TARGET_USERNAME $TARGET_PASSWORD $TARGET_DB
#复制数据
copyData $FROM_HOST $FROM_PORT $FROM_USERNAME $FROM_PASSWORD $FROM_DB $TARGET_HOST $TARGET_PORT $TARGET_USERNAME $TARGET_PASSWORD $TARGET_DB
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容

  • 从前我没把时间太当时间 直到一切都划上句点 清晰的从前就在眼前 可我却再不能用心来体验 莫名的语言在脑海盘旋 场景...
    夜灯下的影总有份孤寂阅读 180评论 0 1
  • 随着各种长租公寓的诞生,城市里房中房不断蔓延,隔成小隔间的房租显然比整租一套的房租要高,以品牌自居的自如也是如此取...
    爱莉莎_c017阅读 741评论 0 0
  • 这是我在上语法课最喜欢问学生的问题:某个词充当某种成分,某个成分在句中是由那个词表示的。 SUBJECT PRED...
    jiajiasoso阅读 496评论 0 1
  • 说到布料解算和毛发解算,可能很多人不太理解。单从字面上的意思来看,应该跟衣服和头发有关,但说到具体点的,可能就不知...
    辛陌阅读 1,059评论 2 4