代码更新系统(application code release)
-
声明(statement)
本人英语不好,为了让大家能够正确的看到文档内容,请把字符集设置为UTF-8.
I love English. but I don't have good English. In order for everyone to see the contents of the document correctly, please set the character set to UTF-8.
-
功能
上传代码(setup code)、更新代码(update code) 备份代码(backup code)、回滚代码(recover code)
-
命令
Usage: acr [OPTION] DEST Options -f, --file filename : set configuration file (default: application/conf/acr.conf) -h, --help : this help -v, -V, --version : show version and exit -
菜单选项
-
第一级菜单
- 上传代码(第一次发布代码)(有二级菜单,选择代码的获取方式)
- 更新代码(程序运行逻辑是:先备份,在更新代码到指定目录)(有二级菜单,选择代码的获取方式)
- 备份代码(备份代码到指定的目录)
- 回滚代码(回滚到上一个版本代码,注意:版本新旧是根据备份目录下文件的时间戳来判断的)
- 退出程序(exit)
-
第二级菜单
- Tar包 (把打好包的程序放到指定的目录后,选择这项会自动去这个目录解压代码)
- Git (程序自动去Git仓库拉代码,注意:必须在配置文件中写入相关信息)
- Svn (程序自动去Git仓库拉代码,注意:必须在配置文件中写入相关信息)
- 返回上级菜单(Previous page)
- 退出程序 (exit)
-
-
程序目录、文件说明
acr # 程序一级目录 ├── application ## 程序二级目录(程序) │ ├── bin ### 程序三级目录(执行程序) │ │ ├── acr.sh ### * 程序入口文件副本(rpm安装完以后会在/usr/local/bin/acr) │ │ ├── rsync-client.sh ### * rsync客户端的配置脚本 │ │ ├── rsyncd.conf ### * rsync 服务器端的配置文件(把这个文件拷贝到服务器端的/etc目录下) │ │ └── rsync-server.sh ### * rsync 服务器端的配置脚本 │ ├── conf ### 程序三级目录(配置文件) │ │ └── acr.conf ### * 程序默认的配置文件 │ ├── module ### 程序三级目录(实现方法) │ │ ├── acr.backup ### * 备份代码 │ │ ├── acr.git-download ### * Git下载代码 │ │ ├── acr.init ### * 程序初始化参数 │ │ ├── acr.menu ### * 交互界面 │ │ ├── acr.new ### * 上传、更新代码 │ │ ├── acr.recover ### * 回滚代码 │ │ └── acr.tar-download ### * Tar包代码 │ └── status ### 程序三级目录(程序执行状态) │ ├── BackUp-Status ### * 备份状态 │ ├── Copy-Status ### * 复制状态 │ ├── Git-Code-Status ### * Git获取代码状态 │ ├── New-Code-Status ### * 上传、更新代码状态 │ ├── Recover-Status ### * 回滚代码状态 │ ├── Svn-Code-Status ### * Svn获取代码状态 │ ├── Tar-Code-Status ### * Tar包获取代码状态 │ └── Unzip-Status ### * 解压缩代码状态 ├── backup-old-code ## 程序二级目录(存放备份代码) ├── download-code ## 程序二级目录(存放下载代码) │ ├── git-code ### 程序三级目录(存放Git下载代码) │ ├── svn-code ### 程序三级目录(存放Svn下载代码) │ └── tar-code ### 程序三级目录(存放Tar包代码) ├── log ## 程序二级目录(存放日志) │ ├── error.log ## * 错误日志 │ └── messages.log ## * 正确日志 ├── man ## 程序二级目录(存放帮助文件) │ └── acr.1.gz ## * 帮助文件副本(rpm安装完以后会在/usr/share/man/man1/acr.1.gz) ├── passwd ## 程序二级目录(存放rsync客户端密码文件) │ └── taagoo ## * rsync客户端密码文件 ├── temp ## 程序二级目录(程序运行的中间文件全部存放在这个地方) -
程序运行流程图
- 主程序的逻辑
+--------+
| start |
+--------+
|
|
v
+-------------+
+--------------------------- | init | ---------------+
| +-------------+ |
| | | |
| | | |
v v | v
+-------------------+ +--------+ | +------------++-------------+
| setup | | update | +> | backup || recover |
+-------------------+ +--------+ +------------++-------------+
| | | |
| | | |
v | v v
+-------------------+ | +------------++-------------+
| Sub_Code_Download | <----------+ | Sub_Backup || Sub_Recover |
+-------------------+ +------------++-------------+
|
|
v
+-------------------+
| Sub_SU_Upload |
+-------------------+
-
子程序的逻辑
-
代码下载
- Tar
+-------------------------+ | Tar_Code_Download | +-------------------------+ | | v +--------------+ no +-------------------------+ | Note_Code_No | <---- | Tar_Code_File_Exist | +--------------+ +-------------------------+ | | | | yes v v +--------------+ +-------------------------+ 1 | Error_Stop | | If_Tar_File_Status | ---------+ +--------------+ +-------------------------+ | | | | 0 | v v +-------------------------+ +---------------------+ | Write_Tar_File_Status-1 | <----- | Note_Lasttime_Error | +-------------------------+ +---------------------+ | | v +-------------------------+ yes | Temp_Code_File_Exist | ---------+ +-------------------------+ | | | | no | v v +-------------------------+ +---------------------+ | Pack_File_To_Temp | <----- | Clear_Temp_File | +-------------------------+ +---------------------+ | | v +-------------------------+ | Writ_Status_Print-0 | +-------------------------+ | | v +-------------------------+ | End | +-------------------------+- Git
-
+---------------------+
| Git_Code_Download |
+---------------------+
|
|
v
+-----------------+ no +---------------------+
| Configure_Error | <-------------- | Git_Init_Configure |
+-----------------+ +---------------------+
| |
| | yes
v v
+-----------------+ +---------------------+ no
| Error_Stop | | Git_Soft_Setup? | -------------------+
+-----------------+ +---------------------+ |
| |
| yes |
v v
+---------------------+ +-----------------+
| Git_File_Status | <--------------- | Git_Soft_Setup |
+---------------------+ +-----------------+
|
|
v
+---------------------+ 1
| Git_File_Status? | -------------------+
+---------------------+ |
| |
| 0 |
v v
+---------------------+ +-----------------+
| Write_Git_Status-1 | <--------------- | Note_LT_Error |
+---------------------+ +-----------------+
|
|
v
+---------------------+
+------------- | Git_Code_Factory? | -+
| +---------------------+ |
| |
| |
v v
+---------------+ +----------------+
| Pull_Git_Code | +------------------- | Clone_Git_Code |
+---------------+ | +----------------+
| |
| |
| v
| +---------------------+
+------------> | Write_Git_Status-0 |
+---------------------+
|
|
v
+---------------------+ 1
| Temp_File_Status? | -------------------+
+---------------------+ |
| |
| 0 |
v v
+---------------------+ +-----------------+
| Write_Temp_Status-1 | <--------------- | Note_Copy_Error |
+---------------------+ +-----------------+
|
|
v
+---------------------+ yes
| Temp_File_Exist? | -------------------+
+---------------------+ |
| |
| no |
v v
+---------------------+ +-----------------+
| Copy_Code | <--------------- | Clear_Temp_File |
+---------------------+ +-----------------+
|
|
v
+---------------------+
| Write_Temp_Status-0 |
+---------------------+
|
|
v
+---------------------+
| End |
+---------------------+
- 上传和更新
+----------------------+
| Setup_Update_Code |
+----------------------+
|
|
v
+-----------------+ no +----------------------+
| Echo_File_Error | <---- | Temp_File_Exist? |
+-----------------+ +----------------------+
| |
| | yes
v |
+-----------------+ |
| Error_End | |
+-----------------+ |
^ |
| |
| v
+-----------------+ no +----------------------+
| Echo_IP_Error | <---- | Server_Ip? |
+-----------------+ +----------------------+
|
| yes
v
1 +----------------------+
+---------------------- | Setup_Update_Status? |
| +----------------------+
| |
| | 0
v v
+-----------------+ +----------------------+
| Note_LT_Error | ----> | Write_Status-1 |
+-----------------+ +----------------------+
|
|
v
+----------------------+
| Rsync_Code |
+----------------------+
|
|
v
+----------------------+
| Clear_Temp_Dir |
+----------------------+
|
|
v
+----------------------+
| Write_Status-0 |
+----------------------+
|
|
v
+----------------------+
| End |
+----------------------+
-
备份
+------------------+ | backup | +------------------+ | | v +------------------+ yes +----------------+ | Temp_File_Exist? | -----> | Clear_Temp_Dir | +------------------+ +----------------+ | | | no | v | +------------+ no +------------------+ | | Echo_Error | <---- | Server_Ip? | <--------+ +------------+ +------------------+ | | | | yes v v +------------+ +------------------+ 1 +----------------+ | Error_End | | Backup_Status? | -----> | Echo_LT_Error | +------------+ +------------------+ +----------------+ | | | 0 | v | +------------------+ | | Write_Status-1 | <--------+ +------------------+ | | v +------------------+ | Rsync_Pull_Code | +------------------+ | | v +------------------+ | Pack_TO_Back | +------------------+ | | v +------------------+ | Write_Status-0 | +------------------+ | | v +------------------+ | End | +------------------+ -
回滚
+------------------+ | recover | +------------------+ | | v +---------------+ no +------------------+ | Echo_Error | <---- | Back_Code_Exist? | +---------------+ +------------------+ | | | | yes v v +---------------+ +------------------+ | Error_End | | Clear_Temp_Dir | +---------------+ +------------------+ | | v +---------------+ 1 +------------------+ | Echo_LT_Error | <---- | Recover_Status? | +---------------+ +------------------+ | | | | 0 | v | +------------------+ +-------------------> | Write_Status-1 | +------------------+ | | v +------------------+ | Pack_Code | +------------------+ | | v +------------------+ | Echo_Yes | +------------------+ | | v +------------------+ | Rsync_Code | +------------------+ | | v +------------------+ | Clear_Temp_Dir1 | +------------------+ | | v +------------------+ | Write_Status-0 | +------------------+ | | v +------------------+ | End | +------------------+ -
程序未解决的问题
- 第一个问题
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1518)
这个问题没有解决,临时使用的方法是:set +e 运行rsync语句 set -e
-
第二个问题
rsync --delete 回滚代码的时候,使用了fake super = yes ,要不会报错并终止程序运行。
-
程序可能的优化方法
是否能够把程序放到内存中运行,想到的方法是把/acr/temp目录直接挂载到/dev/shm目录下,没有做的原因是顾虑万一程序过大,导致内存放不下,会出错。下一步做好保护后在使用这种方式。