企业中的代码发布解决方案

企业中的代码发布解决方案

 

 

所有实验环境初始化:

创建本地光盘Yum源,安装tree lrzsz vim,关闭iptables和selinux。

定义别名cls=’clear’,ll=’ls -Alh’。

代码发布解决方案:

1.安装优化软件环境

2.程序代码

3.配置变更

 

SVN是跨平台的开源版本控制系统。SVN会备份并记录文件每一次的修改更新的变动。

SVN是通用的软件系统,常用来管理程序代码。常见的版本控制软件有:VSS、CVS、SVN、Git。

Git与SVN的区别:

SVN是一个集中式的版本控制系统,SVN版本控制系统的工作流程:

1.在中央库中创建或者从主干复制一个分支。

2.从中央库check out下这个分支的代码。

3.增加自己的代码文件,修改现存代码或删除代码文件。

4.Commit代码,,假设有人刚刚提交了代码,系统就会提示就会提示代码过期。

5.所以就要下up自己的代码再提交代码,up代码的时候发现冲突就需要解决冲突再次提交。

SVN的缺点:

1.当无法连接到中央版本控制库,就会无法提交代码,将代码加入版本控制。

2.由于代码库集中管理,因此需要对中央版本库存储做备份。这点分布式的版本控制系统,SVN的备份要备份所有的代码数据以及所有更改的版本记录。

3.提交到代码版本控制系统的时候默认都是通过自测运行的,如果某个模块的代码比较复杂,不能短时间内实现可测试的功能,那么就需要等待很长的时间提交自己的代码。

Git分布式的版本控制:

Git是Linus开发,Git有本地的Git版本仓库,在某种角度上可以说Git本地仓库和远程的仓库是等价的,没有主从之分。

SVN的运行模式:

1.独立服务器访问:

访问地址:svn://....

2.借助Web服务器:

访问地址:http://...

(1)安装Apache+SVN

(2)CSVN(Apache+SVN)单独整合的软件,带Web管理界面。

3.本地直接访问:

访问地址:file://...

SVN客户端的访问方式:

访问方式

说明

file://

直接通过本地磁盘或网络的方式访问

http://

通过WebDAV协议访问支持SVN的Web服务器

https://

和http://相似,但是用SSL加密访问

svn://

通过TCP/IP自定义协议访问SVN服务器

svn+ssh://

通过认证并加密的TCP/IP自定义协议访问SVN服务器

SVN档案库的数据格式:

1.BDB:(伯克利)版本库可以使用的一种经过充分测试的后台数据库实现,不能通过网络共享的文件系统使用,BDB是SVN以前的缺省版本库格式。

2.FSFS:一个专门用于SVN的文件系统后端,可以使用网络文件系统,比如NFS或SMBFS

SVN是基于关系型数据库的或者是基于二进制文件的,一方面解决了并行文件读写的问题,也添加了事务的特性;但是另一方面数据也会变得不透明,不会看到数据的实体文件。

SVN的优缺点:

缺点:

1.由于每一次提交都要保留一个原始的副本,因此SVN数据库的容量会增速较快。

2.如果不能连接到SVN服务器上,基本上不可以工作。

3.不适合开源系统开发,但是一般集中式管理的有非常明确的权限管理机制,可以实现分层管理,从而很好解决开发人员多的问题。

优点:

1.管理方便,逻辑清晰明确。

2.易于管理,集中式SVN服务器更能保证数据安全性。

3.代码一致性非常高

4.适合开发人数不多项目开发。

5.普及度比较高。

SVN服务器安装及配置:

实验环境:

一台CentOS6x64的node0服务器,IP地址为:192.168.10.2

实验步骤:

1.查看系统版本:

[root@node0 ~]# uname-rm
2.6.32-573.el6.x86_64x86_64

2.检查是否安装subversion软件:

[root@node0 ~]# rpm-qa subversion

3.使用Yum安装SVN软件:

[root@node0 ~]# yuminstall subversion -y

4.创建目录:用于SVN数据代码和用户数据密码

[root@node0 ~]# mkdir-p /app/svndata
[root@node0 ~]# mkdir-p /app/svnpwd

5.启动SVN服务:

[root@node0 ~]#svnserve -d -r /app/svndata/

6.查看进程是否启动:

[root@node0 ~]# psaux | grep svn
root       2074 0.0  0.0 156532   748 ?       Ss   02:02   0:00 svnserve -d -r /app/svndata/

7.查看服务是否启动:

[root@node0 ~]#netstat -tunlap | grep 3690
tcp   0     0 0.0.0.0:3690    0.0.0.0:*   LISTEN     2074/svnserve

8.查看支持的命令:

[root@node0 ~]#svnserve --help

用法: svnserve [-d | -i | -t | -X] [options]

 

有效选项:

  -d [--daemon]            : 后台模式
  -i [--inetd]               :inetd 模式
  -t [--tunnel]            : 隧道模式
  -X [--listen-once]       : 监听一次方式(调试用)
  -r [--root] ARG          : 服务的根目录
  -R [--read-only]         : 强制只读;覆盖版本库配置文件
  --config-file ARG        : 从文件 ARG 读取配置
  --listen-port ARG        : 监听端口
                             [方式:daemon, listen-once]
  --listen-host ARG        : 监听主机名称或IP地址
                             [方式:daemon, listen-once]
  -T [--threads]           : 使用线程代替进程 [方式:daemon]
  --foreground             : 在前台运行(调试用)
                             [方式:daemon]
  --log-file ARG           : svnserve 日志文件
  --pid-file ARG           : 写进程 PID 到文件ARG
                             [方式:daemon, listen-once]
  --tunnel-user ARG        : 隧道用户名(默认是当前UID对应的用户名)
                             [方式:tunnel]
  -h [--help]              : 显示本帮助
  --version                : 显示程序版本信息

9.修改配置文件:

(1)备份配置文件:

[root@node0 ~]#cd  /app/svndata/sadoc/conf/
[root@node0 conf]# cpsvnserve.conf svnserve.conf.bak

(2)修改配置文件:

[root@node0 conf]#vim svnserve.conf
 12 anon-access = none    #关闭匿名访问
 13 auth-access = write    #允许写入权限
 20 password-db = /app/svnpwd/passwd    #配置统一管理密码文件
 27 authz-db = /app/svnpwd/authz         #配置统一管理权限文件

(3)使用diff检查配置文件:

[root@node0 conf]#diff svnserve.conf svnserve.conf.bak
12,13c12,13
< anon-access =none
< auth-access =write
---
> # anon-access =read
> # auth-access =write
20c20
< password-db =/app/svnpwd/passwd
---
> # password-db =passwd
27c27
< authz-db =/app/svnpwd/authz
---
> # authz-db =authz

(4)重启SVN服务:

[root@node0 svnpwd]#ps -elf | grep svn
1 S root       2074     1  0  80   0- 39133 inet_c 02:02 ?        00:00:00svnserve -d -r /app/svndata/
0 S root      25453  1836  0  80   0- 25831 pipe_w 04:14 pts/0    00:00:00grep svn
[root@node0 svnpwd]#kill 2074
[root@node0 svnpwd]#ps -elf | grep svn
0 S root      25457  1836  0  80   0- 25831 pipe_w 04:14 pts/0    00:00:00 grep svn
[root@node0 svnpwd]#svnserve -d -r /app/svndata/
[root@node0 svnpwd]#ps -elf | grep svn
1 S root      25465     1  0  80   0- 39133 inet_c 04:17 ?        00:00:00svnserve -d -r /app/svndata/
0 S root      25467  1836  0  80   0- 25831 pipe_w 04:17 pts/0    00:00:00grep svn

(5)修改文件权限:

[root@node0 svnpwd]#cd /app/svndata/sadoc/conf/
[root@node0 conf]# ll
[root@node0 ~]# cp/app/svndata/sadoc/conf/passwd /app/svnpwd/
[root@node0 ~]# cp/app/svndata/sadoc/conf/authz /app/svnpwd/
总用量 16K
-rwx------ 1 rootroot 1.1K 11月  702:11 authz
-rwx------ 1 rootroot  309 11月  7 02:11 passwd
-rwx------ 1 rootroot 2.3K 11月  704:08 svnserve.conf
-rwx------ 1 rootroot 2.3K 11月  703:58 svnserve.conf.bak

SVN基本操作:

1.创建版本库:

[root@node0 ~]#svnadmin create /app/svndata/sadoc
[root@node0 ~]# tree/app/svndata/sadoc/
/app/svndata/sadoc/
├── conf
│   ├── authz
│   ├── passwd
│   └── svnserve.conf
├── db
│   ├── current
│   ├── format
│   ├── fsfs.conf
│   ├── fs-type
│   ├── min-unpacked-rev
│   ├── rep-cache.db
│   ├── revprops
│   │   └──0
│   │       └── 0
│   ├── revs
│   │   └──0
│   │       └── 0
│   ├── transactions
│   ├── txn-current
│   ├──txn-current-lock
│   ├── txn-protorevs
│   ├── uuid
│   └── write-lock
├── format
├── hooks
│   ├──post-commit.tmpl
│   ├── post-lock.tmpl
│   ├──post-revprop-change.tmpl
│   ├──post-unlock.tmpl
│   ├──pre-commit.tmpl
│   ├── pre-lock.tmpl
│   ├──pre-revprop-change.tmpl
│   ├──pre-unlock.tmpl
│   └──start-commit.tmpl
├── locks
│   ├── db.lock
│   └── db-logs.lock
└── README.txt
 
10 directories, 28files
[root@node0 ~]#

2.使用help命令获取帮助:

[root@node0 ~]#svnadmin help create

create: 用法:svnadmin create REPOS_PATH

 

在 REPOS_PATH 创建一个新的空版本库。

 

有效选项:

  --bdb-txn-nosync         : 在提交事务时禁用fsync [BDB]
  --bdb-log-keep           : 禁用自动删除日志文件 [BDB]
  --config-dir ARG         : 从目录 ARG 读取用户配置文件
  --fs-type ARG            : 版本库类型: “fsfs”(默认)或“bdb”
  --pre-1.4-compatible     : 使用与1.4之前版本兼容的格式
  --pre-1.5-compatible     : 使用 Subversion 1.5 之前版本的格式
  --pre-1.6-compatible     : 使用与 1.6 之前版本兼容的格式

 

3.创建用户并授权访问:

[root@node0 conf]# cd/app/svndata/sadoc/conf/
[root@node0 conf]#vim passwd
  1 ### This file is an example password filefor svnserve.
  2 ### Its format is similar to that of svnserve.conf.As shown in the
  3 ### example below it contains one sectionlabelled [users].
  4 ### The name and password for each userfollow, one account per line.
  5
  6 [users]
  7 # harry = harryssecret
  8 # sally = sallyssecret

添加密码:

  9 user0 = user0123
 10 user1 = user1123

当更改svnserve.conf的时候需要重启svn服务,但是更改其他文件的时候不需要重启。

[root@node0 conf]#vim authz
  1 ###This file is an example authorization file for svnserve.
  2 ### Its format is identical to that ofmod_authz_svn authorization
  3 ### files.
  4 ### As shown below each section definesauthorizations for the path and
  5 ### (optional) repository specified by thesection name.
  6 ### The authorizations follow. Anauthorization line can refer to:
  7 ### - a single user,
  8 ### - a group of users defined in a special [groups] section,
  9 ### - an alias defined in a special [aliases] section,
 10 ### - all authenticated users, using the '$authenticated' token,
 11 ### - only anonymous users, using the '$anonymous' token,
 12 ### - anyone, using the '*' wildcard.
 13 ###
 14 ### A match can be inverted by prefixingthe rule with '~'. Rules can
 15 ### grant read ('r') access, read-write('rw') access, or no access
 16 ### ('').
 17
 18 [aliases]
 19 # joe = /C=XZ/ST=Dessert/L=Snake City/O=SnakeOil, Ltd./OU=Research Institute/CN=Joe Average
 20
 21 [groups]
 22 # harry_and_sally = harry,sally
 23 # harry_sally_and_joe =harry,sally,&joe
 24
 25 # [/foo/bar]
 26 # harry = rw
 27 # &joe = r
 28 # * =
 29
 30 # [repository:/baz/fuz]
 31 # @harry_and_sally = rw
 32 # * = r

一个用户组可以包含多个用户,用户名通过英文逗号分隔,版本库目录格式:

[版本库:项目目录]

用户名 = 权限

用户组名 = 权限

如果项目目录指定为/,指的是SVN服务的根目录,即/app/svndata/,表示对全部的版本库设置权限。

添加用户:

 34 [sadoc:/]
 35 user0 = r
 36 user1 = r

另一种添加方式:

 33 sagroup = user0,user1
 34 [sadoc:/]
 35 @sagroup = r

要保证authz文件和passwd文件中存在该用户。

4.使用SVN客户端TortoiseSVN或者是:

08632631edcf7e7ea8231c59f2243255.png

SVN客户端命令介绍:

(1)check outSVN服务器端的数据:

[root@node0 ~]# mkdir/svnproject
[root@node0 ~]# svnco svn://192.168.10.2/sadoc/ /svnproject/ --username=user0 --password=user0123
 
-----------------------------------------------------------------------

注意!  你的密码,对于认证域:

   <svn://192.168.10.2:3690>122a9f5c-c2da-46d5-9344-e27b4139d4be

只能明文保存在磁盘上!  如果可能的话,请考虑配置你的系统,让 Subversion

可以保存加密后的密码。请参阅文档以获得详细信息。

 

你可以通过在“/root/.subversion/servers”中设置选项“store-plaintext-passwords”为“yes”或“no”,

来避免再次出现此警告。

-----------------------------------------------------------------------

保存未加密的密码(yes/no)?yes

取出版本 0。

(2)查看Linux服务器端的数据:

svn list SVN服务器地址/项目目录

(3)提交客户端数据:

svn ci -m “信息”

SVN钩子脚本:

钩子脚本的具体写法就是操作系统中Shell脚本的写法,可以根据SVN服务器和Shell程序进行相应的开发。每个钩子脚本本来就是某些版本库事件触发的程序,根据钩子的输出或者是返回状态,钩子程序能以某种方式控制该动作继续执行,停止或者是挂起、开启。

钩子脚本的目录:

 

常用的钩子脚本:

post-commit、pre-commit、start-commit

1.post-commit:在提交完成成功创建版本之后执行这个钩子,提交已经完成,不可以更改,因此本脚本的返回值会被忽略,提交完成时触发事务。

2.pre-commit:提交完成客户端触发执行该脚本。

3.start-commit:在客户端还没有向服务器提交数据之前,即还没有建立Subversiontransation(缩写为TXN)之前,执行该脚本(提交前触发事务)。

不常用的钩子脚本:

1.pre-revprop-change属性之前,执行该脚本。

2.post-revprop-change属性之后,执行该脚本。因为修改稿已经完成,不可更改,因此本脚本的返回值会被忽略(不过实际上的实现似乎是该脚本的正确执行与否影响属性修改)。

3.pre-unlock对文件进行解锁操作之前执行的脚本。

4.post-unlock对文件进行加锁操作之前执行该脚本。

5.pre-lock对文件加锁操作之前执行该脚本。

6.post-lock对文件进行加锁操作之后执行该脚本。

SVN生产场景的应用:

pre-commit用来限制文件扩展名及大小,控制提交要输入的信息。

post-commit是在SVN更新时自动通知。SVN触发check out程序,然后实时rsync推送到服务器。

SVN错误集锦:

Can’t convert string from ‘UTF-8’ to nativeencoding      :...

说明文件名称或文件夹名称存在中文,Linux不支持中文。

rsync与SVN钩子实现实时数据同步企业案例:

[root@node0 ~]# mkdir-p /app/svndata /app/svnpwd   #创建数据和密码目录
[root@node0 ~]# yuminstall subversion -y  #安装SVN软件
[root@node0 ~]#svnserve -d -r /app/svndata/  #启动SVN软件
[root@node0 ~]#netstat -tunlap | grep svn
tcp   0   0 0.0.0.0:3690    0.0.0.0:*   LISTEN      1993/svnserve      
[root@node0 ~]#svnadmin create /app/svndata/code  #创建项目
[root@node0 ~]# cd/app/svndata/code/
[root@node0 code]# cphooks/post-commit.tmpl hooks/post-commit #修改脚本
[root@node0 code]#more /app/svndata/code/hooks/post-commit # 脚本代码,实现自动部署代码
REPOS="$1"
REV="$2"
 
export LC_CTYPE="en_US.UTF-8"
export LC_ALL
 
LOGPATH="/app/log"
 
[ ! -d ${LOGPATH} ] && ${LOGPATH}-p
svn update --username user0--password=user0123 /app/web/data
 
if[ $? -eq 0 ];then
   rsync -az -delete /app/web/data /tmp/
Fi
[root@node0 ~]# cp/app/svndata/code/hooks/pre-commit.tmpl /app/svndata/code/hooks/pre-commit   #修改脚本
[root@node0 ~]# vim/app/svndata/code/hooks/pre-commit
  1#!/bin/sh
  2REPOS="$1"
  3TXN="$2"
  4MAX_SIZE=5000
  5FILTER='\.(zip|rar|o|7z|obj|tar|gz|tgz)$'
  6 #LOGMSG=`svnlook log -t "$TXN" "$REPOS" | grep"[a-zA-Z0-9]" | wc -c`
  7LOGMSG=`svnlook log -t "$TXN" "$REPOS" | wc -c`
  8if [ "$MSGLOG" -lt 9 ]
  9then
 10    echo -e "nLog message can not ne empty,you must input more than 8chars as commit." 1>$2
 11exit 1
 12fi
 13
 14files=$(svnlook changed -t $TXN $REPOS | cut -d " " -f 4-)
 15rc=0
 16echo "$files" | while read f;
 17do
 18if echo $f|tr A-Z a-z|grep -Eq #FILTER;
 19then
 20    echo "File $f is not allow ($FILTER) file" >$2
 21    exit 1;
 22fi
 23
 24filesize=`svnlook cat -t "$TXN" "$REPOS" "$f" |wc -c`
 25if [ "$filesize" -gt "$MAX_SIZE" ];
 26then
 27    echo "File $f is too large(must <=$MAX_SIZE) B" >&2
 28    exit 1
 29fi
[root@node0 code]#chmod 755 /app/svndata/code/hooks/* #修改执行权限
[root@node0 code]#mkdir -p /app/web/data #创建Web服务器目录
[root@node0 code]#mkdir /svnpro
[root@node0 code]# cp/app/svndata/code/conf/* /app/svnpwd/  #修改配置文件
[root@node0 code]#chmod 700 /app/svnpwd/*   #修改配置文件权限
[root@node0 code]# ll/app/svnpwd/
总用量 12K
-rwx------ 1 root root 1.1K 11月 8 03:46 authz
-rwx------ 1 root root  309 11月  8 03:46 passwd
-rwx------ 1 root root 2.3K 11月 8 03:46 svnserve.conf
[root@node0 code]#vim /app/svnpwd/svnserve.conf
[root@node0 code]#grep -Ev '^$|^#' /app/svnpwd/svnserve.conf
[general]
anon-access = none
auth-access = write
password-db = /app/svnpwd/passwd
authz-db = /app/svnpwd/authz
[sasl]
[root@node0 code]#vim /app/svnpwd/authz
 33[repos:/code/]
 34user0 = rw
[root@node0 code]#vim /app/svnpwd/passwd
  6[users]
  7user0 = user0123
[root@node0 code]#netstat -tunalp | grep svn
tcp  0    0 0.0.0.0:3690    0.0.0.0:*   LISTEN      1993/svnserve      
[root@node0 code]#kill 1993
[root@node0 code]#netstat -tunalp | grep svn
[root@node0 code]#svnserve -d -r /app/svndata/
[root@node0 code]#netstat -tunalp | grep svn
tcp   0   0 0.0.0.0:3690     0.0.0.0:*      LISTEN 25227/svnserve     
 
[root@node0 code]#svn co svn://192.168.10.2/code/ /svnpro/ --username=user0 --password=user0123
取出版本 0。
[root@node0 code]#svn commit /svnpro/ -m "first"
[root@node0 code]#svn ls svn://192.168.10.2/code/ --username=user0 --password=user0123

互联网小型企业代码上线发布架构方案:

cf38dd570054bfbec030b13e8d9957cc.png

小型企业现状:

小型公司一般只有几个开发人员,并且网站核心程序大多是PHP语言开发的,为了方便,会直接通过FTP直接上传程序代码到线上服务器,随时随地上线更新。

问题和特点:

1.发布快,及时,随时随地就可以发布代码。

2.开发人员发布的代码不经过测试人员测试,并且用户访问页面刷新后页面就会改变,也可能刷新瞬间程序在更新,导致无法访问,用户对网站的体验度较差。

3.中小公司网站出了问题一般是运维人员的问题,但是这种情况下一般是由于开发人员或程序代码异常造成的。

建议:

1.开发人员需要在PC上搭建LAML环境测试,并且在IDC机房或者是办公室测试通过,最好有专职测试人员。

2.程序代码上线规定时间,看网站业务性质决定。

3.代码上传之前进行备份,方便网站回滚。先传输到版本目录,使用软连接链接到业务目录。

4.使运维人员管理业务上线。

互联网中型企业代码上线发布架构方案:

e46f7e00de9a961dd7ae628696c83c71.png

互联网大型企业代码上线发布架构方案:(Java代码上线方案)

a9143923262ccd5ec103fd2cca5b713d.png

Java代码更新具体思想:

上线的时候一般是大型服务器集群环境,同时需要更新或者是分批更新。

1.本地开发人员从SVN中取出代码,当天上线的提交到trunk,否则,长期项目单独开一个分之开发,然后合并到主线(trunk)。

2.办公内网开发测试时,有开发人员或配置管理员通过部署平台jenkins实现统一部署,也就是在部署平台控制开发机器从SVN服务器取出代码,编译,打包,发布到机器。

3.开发人员通知或者是和测试人员一起测试程序,没有问题后,打上新的tag标记。

4.配置管理员根据上一步的tag标记,检出上线代码,并配置好IDC测试环境的所有配置,执行编译,打包(Java需要使用MVN或ANT,PHP不需要),然后发布到IDC内统一分发服务器,这里需要注意的是,不同的环境的配置文件是随着代码同事发布的。

5.配置管理员或者是SA上线人员,把分发的程序代码内容推送到相关的测试服务器,然后通知开发人员及测试人员进行测试。如果有问题向上回滚,继续修改。

6.如果测试没有问题,继续打好tag标记,此时配置管理员根据上一步的标记检出测试好的代码,并配置好IDC正式环境的所有配置,执行编译打包(MVN,ANT,PHP不需要),然后发布代码到IDC内的统一分发服务器,准备批量发布。

7.配置管理员或者是SA上线人员,把分发内容推送到相关正式服务器。然后通知开发人员和测试人员进行测试,如果有问题直接发布回滚指令。

8.IDC正式上线的过程对于Java程序可以是分为A、B组上线的思路,即平滑下线一部分,然后分布代码更新测试,无问题后挂上服务器,同时平滑下线另一部分,发布代码更新测试,或者直接发布上线。

 

PHP代码更新具体思想:

对于PHP代码的上线,发布代码的时候可以发布到正式上线的临时目录,然后使用移动或者是软连接发布到上线目录,不需要重启HTTP服务。Sina和Ganji的上线方法。

 

Java代码的上线操作:

对于上线方法,较大的公司需要分组平滑上线,首先在负载均衡器上下线一半服务器,进行代码更新,然后重启服务器进行测试,无问题后上线更新后的服务器并下线另一半服务器进行更新。如果前端有DNS智能解析,上线还可以分地区进行,逐渐普及到全国,这个成为灰度分布。

 

自动化部署及代码发布管理平台:

对于门户网站或者重视规范或者开发能力比较强的公司也许结合系统服务和Web界面来更科学的自动进行上线代码管理。

 

开发人员和运维人员业务变更管理平台:

业务变更管理平台的优点:

1.变更管理制度有利于业务稳定。

2.保留变更业务的历史,便于核查发现业务问题。

3.故障跟踪平台,有利于跟踪服务问题的解决进度。

4.相关常用的软件:

Jira:用于缺陷跟踪、客户服务、需求收集、流程审批、任务跟踪、项目跟踪、敏捷管理等领域。

Mantis:一款PHP开源Bug跟踪系统,比较适合中小型项目的管理和跟踪。具有多特性包括易于安装、易于操作、基于Web、支持任何可运行的PHP平台(Windows、Linux、Mac、Solaris、AS400/i5等),已经被f翻译成68种语言,支持多个项目,为每一个项目设置不同的用户访问级别,跟踪缺陷变更历史,定制视图页面,提供全文搜索功能,内置生成报表功能,包括图形报表,通过Email报告缺陷,用户可以监视特殊的Bug。附件可以保存在Web服务器上或者是数据库中(也可以是FTP服务器),自定义缺陷处理工作流,支持输出格式包括CVS/MSExcel/MSWord/,集成源代码控制(SVN与CVS),集成WiKi知识库与聊天工具,支持多种数据库(MySQL/MSSQL/PostgreSQL/Oracle/DB2),提供WebService(SOAP)接口,提供Wep访问。

经领导讨论追加的上线规定:

即日起执行,请所有员工仔细阅读,各个组长及其他复杂人推进执行。

请开发人员严格按照本流程,出去XXX项目之外的所有项目。

要点:

1.大于2天的项目要架构组参与设计评审。

2.有数据库变动的项目需要DBA参与设计评审。

3.项目负责制,由负责人随时发Email进行通知。

4.有数据库变更的上线,需要签订上线单,由DBA进行签字确认执行。

数据库库变更申请单:

6c70689a3a04942c1c3f646e633354ae.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值