码迷,mamicode.com
首页 > 其他好文 > 详细

jenkins自动化部署上线

时间:2018-07-04 15:07:44      阅读:388      评论:0      收藏:0      [点我收藏+]

标签:oca   clean   tar   命令   勿喷   sed   目标   dba   inf   

一、Jenkins是什么

Jenkins是一款自包含的开源自动化服务,可用于自动执行与构建,测试和交付或部署软件有关的各种任务。
Jenkins目前可以通过本地系统软件包Docker进行安装,甚至可以通过任何安装了Java运行环境的计算机独立运行
 

二、上线流程图

既然我们说到自动化上线,我们就不得不说说一个项目上线的流程.只有规范起来才可以做到不出事故!

上线流程图如下图所示 
技术分享图片

 

三、Jenkins安装配置

Jenkins依赖Java环境,我们需要安装Java环境以及相关的环境准备

 
  1. ###关闭防火墙
  2. $ iptables -F
  3. $ iptables -X
  4. $ systemctl stop firewalld
  5. $ systemctl disable firewalld
  6. ###安装yum源
  7. $ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
  8. $ wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
  9. $ yum clean all && yum makecache

1.下载Jdk包 
技术分享图片
下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

上传jdk包到服务器

 
  1. ###解压拷贝jdk
  2. $ tar xf jdk-8u171-linux-x64.tar.gz -C /usr/local/
  3. $ ln -s /usr/local/jdk1.8.0_171/ /usr/local/jdk
  4. $ ln -s /usr/local/jdk/bin/java /usr/bin/java
  5. ###设置环境变量
  6. $ vim /etc/profile
  7. export JAVA_HOME=/usr/local/jdk
  8. export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  9. export PATH=$JAVA_HOME/bin:$PATH
  10. $ source /etc/profile

2.安装Jenkins

 
  1. $ wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo
  2. $ rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key
  3. $ yum install jenkins -y
  4. $ systemctl start jenkins
  5. ##如果我们启动Jenkins出现错误可以直接使用systemctl status jenkins查看错误

jenkins相关目录释义:

(1)/usr/lib/jenkins/:jenkins安装目录,war包会放在这里。
(2)/etc/sysconfig/jenkins:jenkins配置文件,“端口”,“JENKINS_HOME”等都可以在这里配置。
(3)/var/lib/jenkins/:默认的JENKINS_HOME。
(4)/var/log/jenkins/jenkins.log:jenkins日志文件。

检查端口是否存在 
技术分享图片

3.配置Jenkins 
技术分享图片

Jenkins有安全策略,我们按照提示拷贝验证码即可 
技术分享图片

将验证码复制到Web框里 
技术分享图片

我们这里使用推荐就可以了,因为后期我们都可以在安装 
技术分享图片

安装插件中,有的插件会因为网络问题无法安装成功

技术分享图片

我们这里可以创建一个管理员,或者直接使用admin

我们最好不要直接使用admin

技术分享图片

技术分享图片

安装完成访问地址:iP:8080 
技术分享图片

到这里我们Jenkins已经安装成功,剩下的就是配置插件和配置环境

技术分享图片

因为我们目前什么都没有需要安装插件,点击下步安装插件 
技术分享图片

为了模拟环境我们需要安装Jenkins一些相关插件 
下面2个maven 插件都需要勾选 
插件名称:maven lntergration

技术分享图片

我们勾选安装重启 
技术分享图片
技术分享图片

安装完成后如下图所示 
默认是没有下面的maven项目的 
技术分享图片

4.Jenkins配置项目

配置SVN地址 
因为我是新建的Jenkins目录,没有权限,所以需要创建一个用于认证. 
技术分享图片

填写SVN地址,因为我这里的svn已经链接到ldap,所以不需要输入svn的密码,默认这里是svn的用户和密码

具体文章可以参考 VisualSVN 迁移至Linux SVN+Apache+ssl集成LDAP

技术分享图片

认证成功之后 
技术分享图片

了解maven 配置 
首先我们的svn分支下面需要有pom.xml 
技术分享图片

继续往下 
↓ 
↓ 
↓ 
↓ 
因为我们只安装maven的插件,并没有安装maven服务,所以这里需要我们配置 
技术分享图片

我们就在这里添加一个名字,maven就自动安装了 
技术分享图片

Maven安装完成了,需要依赖吧都是从maven.apache.org下载会比较慢,所以我们指定私服的地址,因为在实际生产中也都是使用私服的。

在maven的配置文件里面也需要配置 配置文件conf/settings.xml 因为我们所使用的是Jenkins的自动安装,而不是指定路径所以我们要查到这个配置文件

maven 自动安装的配置路径 
技术分享图片

配置Maven仓库地址

这里配置的都是私服地址 
相关文章 Jenkins+Maven+SVN+Nexus 搭建持续集成环境

技术分享图片
配置Maven 镜像地址 
技术分享图片

配置Maven 编译参数 [研发都会]

相关文章:maven 编译命令 
技术分享图片

这个pom.xml里面配置是私服的地址
因为代码里面有很多东西是需要拉去依赖包,这些依赖包就存放在本地的私有仓库里(Nexus)

代码中pom.xml配置如下 
私有仓库的地址 
技术分享图片

5.构建测试 
技术分享图片

控制台输出说明

技术分享图片

技术分享图片

技术分享图片

6.Jenkins 工程目录

技术分享图片

可以通过修改Jenkins主目录

技术分享图片

Jenkins打包好后的目录,这个war包就是我们需要拷贝的tomcat下面的 
技术分享图片




 

四、Jenkins 自动化部署项目案例

因为目前环境原因,我这里只是截图Jenkins发布的流程(本次演示只是针对测试环境日常发布版本)

 

(1) Java 环境演示 [Jenkins和Tomcat在一台服务器上]

1.Jenkins 配置 
技术分享图片

SVN部分配置 
技术分享图片

maven及脚本设置 
技术分享图片

2.不发脚本配置如下: 
相关参考:Jenkins可用环境变量列表 
脚本的存放路径可以在系统管理->全局配置->Jenkins路径

 
  1. Last login: Thu Jun 28 18:01:59 2018 from 172.16.29.39
  2. [root@tomcat ~]# cat /jenkins/deploy.sh
  3. #!/bin/bash
  4. #
  5. # Jenkins工程构建通用TOMCAT部署脚本
  6. # @author abcdocker
  7. # @create_time 2017-08-19
  8. #
  9. # 在Jenkins内配置部署单元参数
  10. # 参数格式:MAVEN_MODULE_NAME:TOMCAT_ABSOLUTE_PATH MAVEN模块名称:需要部署的目标TOMCAT绝对路径
  11. # 只有单个部署单元且没有Maven子模块时,模块名称参数可以没有,参数格式为:TOMCAT_ABSOLUTE_PATH
  12. #
  13. # 注意:
  14. # 在本部署脚本内会执行TOMCAT启动脚本,为避免Jenkins在构建成功以后杀掉所有衍生的后台进程,需要在Jenkins内配置全局环境变量 BUILD_ID 值为 allow_to_run_as_daemon
  15. #
  16. #
  17. DEPLOY_TARGET_TOMCAT=$TOMCAT
  18. #校验部署参数,不能为空
  19. if [ -z "$DEPLOY_TARGET_TOMCAT" ]
  20. then
  21. echo
  22. echo 部署参数为空,部署失败!
  23. echo "#####################################################################"
  24. echo
  25. echo 单个部署单元参数格式:
  26. echo MAVEN_MODULE_NAME:TOMCAT_ABSOLUTE_PATH MAVEN模块名称:需要部署的目标TOMCAT绝对路径
  27. echo
  28. echo 多个部署单元参数格式:(多个部署单元使用空格分割)
  29. echo MAVEN_MODULE_NAME:TOMCAT_ABSOLUTE_PATH MAVEN_MODULE_NAME:TOMCAT_ABSOLUTE_PATH
  30. echo
  31. echo "#####################################################################"
  32. exit 1
  33. fi
  34. echo
  35. echo 部署参数:${DEPLOY_TARGET_TOMCAT}
  36. TOMCAT_ARR=${DEPLOY_TARGET_TOMCAT//;/ }
  37. ARR=($TOMCAT_ARR)
  38. ARR_LEN=${#ARR[*]}
  39. echo ${ARR_LEN} 个部署单元
  40. i=1
  41. #获取Jenkins传入的目标TOMCAT组
  42. for T in $TOMCAT_ARR
  43. do
  44. echo
  45. echo 开始 处理第 ${i} 个部署单元
  46. echo 第一个部署单元:$T
  47. #获取目标TOMCAT的WAR路径和TOMCATA的绝对路径
  48. TOMCAT_PARAM=(${T//:/ })
  49. MODULE_NAME=${TOMCAT_PARAM[0]}
  50. TARGET_TOMCAT_PATH=${TOMCAT_PARAM[1]}
  51. WAR_PATH="$WORKSPACE/$MODULE_NAME/target/*.war"
  52. echo 部署单元模块名称:"${MODULE_NAME}"
  53. echo 部署WAR包路径:"${WAR_PATH}"
  54. echo 部署TOMCAT路径:"${TARGET_TOMCAT_PATH}"
  55. #需要考虑MAVEN单模块下的部署问题
  56. #if [ "${#ARR[*]}" -eq 1 -a -z "$TARGET_TOMCAT_PATH" ]
  57. if [ "$ARR_LEN" -eq 1 -a -z "$TARGET_TOMCAT_PATH" ]
  58. then
  59. #MAVEN过程没有子模块,单个部署单元
  60. TARGET_TOMCAT_PATH=$MODULE_NAME
  61. MODULE_NAME="NULL"
  62. fi
  63. #校验参数,WORKSPACE变量来自于Jenkins环境变量
  64. if [ -z "$MODULE_NAME" -o ! -f $WAR_PATH ]
  65. then
  66. echo 错误:MAVEN部署模块名称 参数为空 找不到WAR包!
  67. echo 部署失败!
  68. exit 1
  69. fi
  70. if [ -z "$TARGET_TOMCAT_PATH" -o ! -d "$TARGET_TOMCAT_PATH" ]
  71. then
  72. echo 错误:目标TOMCAT绝对路径 参数为空 TOMCAT目录不存在!
  73. echo 部署失败!
  74. exit 1
  75. fi
  76. echo 开始清理目标TOMCAT启动进程...
  77. TOMCAT_PID=`ps -ef |grep "$TARGET_TOMCAT_PATH" |grep "start" |awk ‘{print $2}‘`
  78. if [ -n "$TOMCAT_PID" ]
  79. then
  80. echo TOMCAT_${i},PID${TOMCAT_PID},正在结束该进程...
  81. kill -9 $TOMCAT_PID && echo PID${TOMCAT_PID} 已被干掉!
  82. else
  83. echo TOMCAT_${i} 进程未启动!
  84. fi
  85. echo 开始清理目标TOMCAT缓存...
  86. rm -rf $TARGET_TOMCAT_PATH/webapps/*
  87. rm -rf $TARGET_TOMCAT_PATH/logs/*
  88. rm -rf $TARGET_TOMCAT_PATH/work/*
  89. echo 开始部署WAR包...
  90. cp -a $WAR_PATH $TARGET_TOMCAT_PATH/webapps/ROOT.war && echo WAR包部署完毕。
  91. echo 开始启动目标TOMCAT服务...
  92. sleep 10
  93. /bin/bash $TARGET_TOMCAT_PATH/bin/startup.sh
  94. echo 开始配置web目录的FTP权限...
  95. #启动过程会自动解压WAR包,所以在这里需要等待WAR包解压完成再调整目录权限
  96. sleep 30
  97. chown -R vftpuser.vftpuser ${TARGET_TOMCAT_PATH}/webapps/ && echo 目录权限配置完毕。
  98. echo 部署成功
  99. echo 完成 第 ${i} 个部署单元处理。
  100. echo
  101. ((i++))
  102. done

3.构建效果如下图所示: 
技术分享图片




 

(2) Java 环境演示 [Jenkins和Tomcat不在一台服务器上]

上面的脚本是针对Jenkins和Tomcat都在相同的目录,有的时候我们测试环境会存在不在一台服务器的情况,脚本如下

 
  1. 只是脚本简单的修改
  2. [root@tomcat ~]# cat /jenkins/ysc.sh
  3. #!/bin/bash
  4. #
  5. # Jenkins工程构建通用TOMCAT部署脚本
  6. # @author 刘曙
  7. # @create_time 2017-08-19
  8. #
  9. # 在Jenkins内配置部署单元参数
  10. # 参数格式:MAVEN_MODULE_NAME:TOMCAT_ABSOLUTE_PATH MAVEN模块名称:需要部署的目标TOMCAT绝对路径
  11. # 只有单个部署单元且没有Maven子模块时,模块名称参数可以没有,参数格式为:TOMCAT_ABSOLUTE_PATH
  12. #
  13. # 注意:
  14. # 在本部署脚本内会执行TOMCAT启动脚本,为避免Jenkins在构建成功以后杀掉所有衍生的后台进程,需要在Jenkins内配置全局环境变量 BUILD_ID 值为 allow_to_run_as_daemon
  15. #
  16. #
  17. DEPLOY_TARGET_TOMCAT=$YSC
  18. HOST=root@172.16.1.35
  19. #校验部署参数,不能为空
  20. if [ -z "$DEPLOY_TARGET_TOMCAT" ]
  21. then
  22. echo
  23. echo 部署参数为空,部署失败!
  24. echo "#####################################################################"
  25. exit 1
  26. fi
  27. echo
  28. echo 部署参数:${DEPLOY_TARGET_TOMCAT}
  29. TOMCAT_ARR=${DEPLOY_TARGET_TOMCAT//;/ }
  30. ARR=($TOMCAT_ARR)
  31. ARR_LEN=${#ARR[*]}
  32. echo ${ARR_LEN} 个部署单元
  33. i=1
  34. #获取Jenkins传入的目标TOMCAT组
  35. for T in $TOMCAT_ARR
  36. do
  37. echo
  38. echo 开始 处理第 ${i} 个部署单元
  39. echo 第一个部署单元:$T
  40. #获取目标TOMCAT的WAR路径和TOMCATA的绝对路径
  41. TOMCAT_PARAM=(${T//:/ })
  42. MODULE_NAME=${TOMCAT_PARAM[0]}
  43. TARGET_TOMCAT_PATH=${TOMCAT_PARAM[1]}
  44. #WAR_PATH="/jenkins/workspace/ysc-all/${MODULE_NAME}/target/*.war"
  45. WAR_PATH="${WORKSPACE}/${MODULE_NAME}/target/*.war"
  46. echo 部署单元模块名称:"${MODULE_NAME}"
  47. echo 部署WAR包路径:"${WAR_PATH}"
  48. echo 部署TOMCAT路径:"${TARGET_TOMCAT_PATH}"
  49. #判断IP是否有相关目录
  50. ssh 172.16.1.35 "[ -d $TARGET_TOMCAT_PATH ]" >/dev/null 2>&1
  51. if [ $? != 0 ];then
  52. echo 错误
  53. else
  54. echo 正确
  55. fi
  56. #校验参数,WORKSPACE变量来自于Jenkins环境变量
  57. if [ -z "$MODULE_NAME" -o ! -f $WAR_PATH ]
  58. then
  59. echo 错误:MAVEN部署模块名称 参数为空 找不到WAR包!
  60. echo 部署失败!
  61. exit 1
  62. fi
  63. #scp 软件包
  64. ssh $HOST /etc/init.d/${MODULE_NAME} stop
  65. ssh 172.16.1.35 "[ -d $TARGET_TOMCAT_PATH/webapps/ROOT/ ]" >/dev/null 2>&1
  66. if [ $? = 0 ];then
  67. ssh 172.16.1.35 rm -rf $TARGET_TOMCAT_PATH/webapps/ROOT
  68. if [ $? = 0 ];then
  69. scp $WAR_PATH root@172.16.1.35:$TARGET_TOMCAT_PATH/webapps/ROOT.war && echo WAR包部署完毕。
  70. echo $TARGET_TOMCAT_PATH is OK
  71. else
  72. echo 删除$TARGET_TOMCAT_PATH is error
  73. fi
  74. else
  75. echo "not found $TARGET_TOMCAT_PATH/webapps/ROOT"
  76. scp $WAR_PATH root@172.16.1.35:$TARGET_TOMCAT_PATH/webapps/ROOT.war && echo WAR包部署完毕。
  77. ssh $HOST /etc/init.d/${MODULE_NAME} restart
  78. fi
  79. ####################启动文件
  80. done
  81. #scp /home/config.properties/ysc/${MODULE_NAME}.js root@172.16.1.35:$TARGET_TOMCAT_PATH/webapps/ROOT/web/js/basePath.js
  82. ssh $HOST /etc/init.d/${MODULE_NAME} restart

Jenkins配置如下修改 
技术分享图片

技术分享图片

修改完成后我们构建演示 
技术分享图片

提示:这种环境下配置文件都是通过maven build进行控制,也就是通过研发控制配置文件




+




 

(3) Java 环境演示 [上线脚本]

线上环境演示 
我们的上线流程如下: 
技术分享图片

Jenkins配置如下: 
技术分享图片
技术分享图片
技术分享图片






1.首先测试环境脚本:

 
  1. [root@tomcat ~]# cat /server/scripts/.upgrade-smscenter.sh
  2. #!/bin/bash
  3. WAR="/jenkins/workspace/portal-smscenter/bxg-sms-center-web/target/*.war"
  4. Path="/data/hub/bxg-smscenter/`date +%Y%m%d`/"
  5. scp_war(){
  6. if [ ! -d $Path ];then
  7. ssh root@file-server mkdir -p $Path
  8. scp $WAR root@file-server:$Path
  9. else
  10. scp $WAR root@file-server:$Path
  11. fi
  12. }
  13. ssh_file(){
  14. ssh root@file-server "/bin/bash /server/script/bxg/bxg-smscenter.sh"
  15. }
  16. scp_war
  17. ssh_file

2.跳板机脚本修改

 
  1. [root@File-server1 ~]# cat /server/script/bxg/bxg-smscenter.sh
  2. #!/bin/bash
  3. HOST=online-server2
  4. WAR="/data/hub/bxg-smscenter/`date +%Y%m%d`"
  5. DIR="/application/smscenter/webapps/ROOT/"
  6. function scp_file {
  7. if `ssh root@$HOST "[ ! -d $WAR ]"`;then
  8. ssh root@$HOST "mkdir -p $WAR"
  9. fi
  10. scp $WAR/*.war root@$HOST:$WAR/
  11. echo "scp $WAR/*.war root@$HOST:$WAR/"
  12. }
  13. ssh_deploy(){
  14. ssh root@$HOST "/bin/bash /server/scripts/deploy_smscenter.sh"
  15. }
  16. scp_file
  17. ssh_deploy

3.web 服务器脚本

 
  1. [root@online-server2 ~]# cat /server/scripts/deploy_smscenter.sh
  2. #!/bin/bash
  3. WAR="/data/hub/bxg-smscenter/`date +%Y%m%d`"
  4. OBJECT="/application/smscenter/webapps/ROOT/"
  5. Backup="/data/tomcat/bxg-smscenter-`date +%Y%m%d`"
  6. SCR_D="/application/smscenter/webapps/ROOT"
  7. #config="/data/bak"
  8. backup_tar(){
  9. tar zcvf $Backup.tar.gz $SCR_D/
  10. echo "为了防止意外cp整个项目目录存放"
  11. cp -a $SCR_D/ $Backup
  12. rm -rf $OBJECT/*
  13. }
  14. cp_war(){
  15. unzip $WAR/*.war -d $SCR_D/
  16. }
  17. cp_config(){
  18. cat $Backup/WEB-INF/classes/application-prod.properties >$SCR_D/WEB-INF/classes/application-prod.properties
  19. /etc/init.d/smscenter restart
  20. }
  21. backup_tar
  22. cp_war
  23. cp_config
  24. [root@online-server2 ~]#

相关文章 企业必会技能 tomcat




+




 

(4) NodeJs 环境演示 [上线脚本]

node 环境上线流程 
Jenkins配置如下 [node项目不适用maven,所以可以不用创建maven项目,直接在Jenkins创建普通项目就可以] 
技术分享图片
技术分享图片

1.测试环境脚本

 
  1. [root@tomcat ~]# cat /server/scripts/mobile/mobile.sh
  2. #!/bin/bash
  3. source /etc/profile
  4. HOST=file-server
  5. BASE_DIR=/server/scripts/mobile/m
  6. url=$1
  7. server=$2
  8. DATE=`date +%Y%m%d`
  9. tar(){
  10. rm -rf $BASE_DIR
  11. [ -d $BASE_DIR ] || mkdir $BASE_DIR
  12. cd $BASE_DIR
  13. echo "##########################################################"
  14. echo "代码拉取中!!!"
  15. svn co -q $url/ .
  16. echo "##########################################################"
  17. }
  18. cp(){
  19. cd ${BASE_DIR}
  20. /bin/tar -zcvf m_${DATE}.tar.gz ./*
  21. echo "##########################################################"
  22. echo "文件已经打包完成! 正在拷贝中!!!"
  23. echo "##########################################################"
  24. sleep 5
  25. scp m_${DATE}.tar.gz root@$HOST:/data/hub/bxg-mobile/
  26. echo "##########################################################"
  27. echo "文件已经拷贝完成! 正在上传服务器中!!!"
  28. echo "##########################################################"
  29. ssh root@file-server "/bin/bash /server/script/bxg/bxg-mobile.sh $server"
  30. }
  31. tar
  32. cp
  33. [root@tomcat ~]#

2.跳板机脚本

 
  1. [root@File-server1 ~]# cat /server/script/bxg/bxg-mobile.sh
  2. #!/bin/bash
  3. HOST=$1
  4. Mobile_tar="/data/hub/bxg-mobile"
  5. DIR="/application/node"
  6. DATE=`date +%Y%m%d`
  7. scp_file(){
  8. if `ssh root@$HOST "[ ! -d $Mobile_tar ]"`;then
  9. ssh root@$HOST "mkdir -p $Mobile_tar"
  10. fi
  11. scp $Mobile_tar/m_${DATE}.tar.gz root@$HOST:$DIR/
  12. sleep 3
  13. echo " "
  14. echo "##########################################################"
  15. echo "File-server 正在拷贝 ${HOST}!!!"
  16. sleep 3
  17. echo "##########################################################"
  18. }
  19. ssh_deploy(){
  20. echo "Hi"
  21. ssh root@$HOST "/bin/bash /server/scripts/bxg/bxg-mobile.sh"
  22. }
  23. scp_file
  24. ssh_deploy

3.web 发布脚本

 
  1. [root@iZbp11tefvghtcfn5mudgdZ ~]# cat /server/scripts/bxg/bxg-mobile.sh
  2. #!/bin/bash
  3. source /etc/profile
  4. DIR="/application/node"
  5. DATE=`date +%Y%m%d`
  6. Backup="/application/node/m/"
  7. BAK="/data/hub/bxg-mobile"
  8. backup_tar(){
  9. echo "为了防止意外cp整个项目目录存放"
  10. cp -ar $Backup ${BAK}/mobile_$DATE
  11. echo "online-server 原目录拷贝备份完成!"
  12. }
  13. cp_war(){
  14. /etc/init.d/mobile stop
  15. #mv $Backup /tmp/m_${DATE} && rm -rf /tmp/m_${DATE}
  16. rm -rf $Backup
  17. mkdir $Backup && cd /application/node/
  18. tar xf m_${DATE}.tar.gz -C $Backup
  19. }
  20. npm_config(){
  21. cd $Backup
  22. cnpm install
  23. npm run build-prod
  24. npm run start-prod &>/var/log/mobile_${DATE}.log &
  25. }
  26. C(){
  27. echo "++++++++++++++++++++++++++++++++++++++++++++++++++++"
  28. curl -I 127.0.0.1:3000
  29. echo "###################################################"
  30. echo "若是200 服务启动正常! 可以启动另一台!"
  31. echo "###################################################"
  32. }
  33. backup_tar
  34. cp_war
  35. npm_config
  36. C





Jenkins 构建结果如下: 
技术分享图片

总结:Jenkins自动化不是运维一个人就可以完成的,需要研发的参与,本文只是给大家展示一下我公司的自动化,我眼里所谓的自动化. 希望大家不喜勿喷,对文章有意见或建议请在评论留言哦~

jenkins自动化部署上线

标签:oca   clean   tar   命令   勿喷   sed   目标   dba   inf   

原文地址:https://www.cnblogs.com/wyjnb/p/9263204.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!