Apache Ant 实现自动化部署
Apache Ant 实现自动化部署
这篇文章帮你解决下列问题:
源码获取,源码编译,处理配置文件,应用部署,远程备份,部署回撤,启动,服务器状态,停止
目录
- 1. 背景
- 2. 我们需要什么样的流程
- 3. 怎样实现自动部署
- 3.1. 操作系统
- 3.2. 程序部署
- 3.3. 自动部署程序
- 4. Apache Ant 实现自动化部署
- 4.1. 运行环境
- 4.2. 部署机
- 5. 延伸阅读
1. 背景
在你的企业中是怎样完成从开发,测试到运维的?
很多企业的升级是这样做的,写完代码后编译打包,放到FTP上,同时发送一个升级邮件。然后让运维按照升级文档,一步一步操作。
这样的流程有很多问题
- 开发者通常是在Windows系统上完成开发与编译,而服务器通常是Linux操作系统,操作系统的差异可能导致编译后的程序运行不了。
- 安全角度,源码可以审查,但编译文件无法审查,打包过程可能被植入恶意代码
- 经常出现生产环境与本地开发环境不一致,运行有差异
- 浪费人力,理论上代码写完,就跟开发人员一点关系都没有了,但实际上每次升级过程开发与测试都需要在场
稍先进一点做法是使用Subversion/Git,开发将代码放到版本库中,运维直接使用 svn up / git pull 升级,这样做法也有很多问题存在
- 首次升级非常慢,svn 还好些,svn只取最后一次提交的版本;git 将所有的版本克隆到本地。
- 如果修改了本地文件,更新会产生冲突
- 配置文件无法个性化配置
2. 我们需要什么样的流程
我们需要什么样的流程或者什么样的流程才是最理想流程?
我认为:
- 开发人员不要做与开发无关的事情,代码写完就与开发没有半点关系了。通知测试人员,代码已经完成。
- 测试人员自己部署测试环境,不依赖开发人员,测试完成,通知运维人员可能升级了
- 运维人员不接受任何部门提供的打包或补丁程序,代码只能在配置管理服务器上完成编译打包以及部署。
- 升级应该由自动化工具完成,而不是人工操作。
开发,测试,运维各司其职,这就是DevOps。
3. 怎样实现自动部署
实现自动化部署有很多方法,很多年前笔者就开始研究总结,下面是一些经验分享。
3.1. 操作系统
开发,测试,生产三个环境的配置如果出自同一个模板会减少很多由于环境差异带来的困扰。
过程 1. 操作系统部署
- 无人值守安装 通过无人值守脚本安装操作系统,减少人为安装造成的差异
- 运行环境 统一配置运行环境,开发库以及版本统一
- 应用服务器统一 应用服务器版本,安装标准,配置文件都需要统一,减少差异
3.2. 程序部署
实现应用程序自动部署,首先你要清楚自动部署所需要的流程,部署一个流程通常是这样的:
过程 2. 自动部署步骤
- 初始化 建立工作环境,例如目录,检查所需环境
- 获取 从版本库指定分支中获取代码并保存到本地
- 编译 编译可执行代码
- 配置 处理配置文件
- 备份 备份应用程序
- 停止 服务服务
- 部署 部署应用程序到目的主机,如果已存在需要覆盖原来的程序
- 启动 启动服务
3.3. 自动部署程序
自动部署程序完成上面的部署,还需要做下面一些事情。
日志功能
- 记录什么时间点做过部署
- 部署了那些文件
4. Apache Ant 实现自动化部署
4.1. 运行环境
准备一个全新的的服务器,最小化安装CentOS 7操作系统,然后运行下面脚本初始化
curl -s https://raw.githubusercontent.com/oscm/shell/master/os/centos7.sh | bash
curl -s https://raw.githubusercontent.com/oscm/shell/master/os/selinux.sh | bash
curl -s https://raw.githubusercontent.com/oscm/shell/master/os/iptables/iptables.sh | bash
curl -s https://raw.githubusercontent.com/oscm/shell/master/os/ntpd/ntp.sh | bash
curl -s https://raw.githubusercontent.com/oscm/shell/master/os/ssh/sshd_config.sh | bash
curl -s https://raw.githubusercontent.com/oscm/shell/master/os/user/www.sh | bash
curl -s https://raw.githubusercontent.com/oscm/shell/master/lang/gcc/gcc.sh | bash
安装 server-jre 与 apache-tomcat
curl -s https://raw.githubusercontent.com/oscm/shell/master/lang/java/server-jre-8u40.sh | bash
curl -s https://raw.githubusercontent.com/oscm/shell/master/web/tomcat/apache-tomcat-8.0.26.sh | bash
curl -s https://raw.githubusercontent.com/oscm/shell/master/web/tomcat/systemctl.sh | bash
请使用systemctl 启动与停止 Tomcat
systemctl start tomcat
systemctl stop tomcat
Infrastructure Management Shell https://github.com/oscm/shell
4.2. 部署机
安装Ant
curl -s https://raw.githubusercontent.com/oscm/shell/master/lang/java/ant.sh | bash
下载build.xml文件 https://github.com/oscm/build/tree/master/Ant
wget https://raw.githubusercontent.com/oscm/build/master/Ant/build.xml
打开 build.xml 文件
修改下面几处定义
<property name="repository" value="版本库地址" />
<property name="branch" value="部署分支" />
<property name="remote" value="远程服务器" />
<property name="destination" value="远程目录" />
开始部署代码
ant backup
ant stop
ant deploy
ant start
5. 延伸阅读
如果你想学习制作部署工具,还可以看看笔者早期的作品https://github.com/oscm/deployment这个工具使用Bash开发,写这个工具仅仅半天时间,后面小改过几次,这个工具伴随笔者很多年。
第一个版本因为很多缺陷存在,笔者使用Python重新开发 https://github.com/oscm/devops 这个工具更适合PHP项目部署
- 【数据科学】什么是数据科学家与数据科学
- Android基础总结(12)——XML和JSON解析
- 【Python环境】scikit-learn的线性回归模型
- Android基础总结(8)——服务
- 你需要每天写代码吗?
- Java基础——多线程
- No.010 Regular Expression Matching
- JavaScript依赖注入的实现思路
- No.011 Container With Most Water
- No.009 Palindrome Number
- Windows DNS API RCE漏洞分析及PoC构造
- 爬虫采集去重优化浅谈
- Android基础总结(10)——手机多媒体的运用:通知、短信、相机、视频播放
- Android基础总结(9)——网络技术
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- php弹出提示框的是实例写法
- laravel 时间格式转时间戳的例子
- php新建文件的方法实例
- 解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
- PHP迭代器和生成器用法实例分析
- php中关于换行的实例写法
- laravel 获取当前url的别名方法
- php中文语义分析实现方法示例
- laravel 中某一字段自增、自减的例子
- php统计数组不同元素的个数的实例方法
- PHP实现单条sql执行多个数据的insert语句方法
- PHP的JSON封装、转变及输出操作示例
- php 策略模式原理与应用深入理解
- 解决在Laravel 中处理OPTIONS请求的问题
- PHP使用观察者模式处理异常信息的方法详解