1.技能需求

完成自动化一键部署PHP需要:PHP(略懂),Shell(略懂),git(略懂)

2.最终效果

输入密码,回车,5~20秒后(一般一天一次持续交付,部署的代码量和sql脚本都不会很大)

执行产生的log文件、数据库备份和数据库执行结果在这里:

3.如何做的Part1-Git

首先要有一个VCS系统,我这里用的是Git客户端,本地和服务器都是。(没用过Git可以看这篇文章,我就是用它入门的)

这里只用到Git pull,其他的如svn等,都是一样的。

Linux服务器装Git客户端,我有一个脚本:

#Git related
yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
#Git
yum -y install git-core
git config --global user.name "YourName"
git config --global user.email YourMail
echo "Git installation completed."

这一段代码失败率很高,原因不详,我Linux也是初级,如果失败可以尝试一句一句手打,还不行可能是Linux的yum源有问题,没有git下载地址什么的。

安装好之后运行git --version,像这样:

[root@XXX tmp]# git --version

git version 1.8.2.1

就OK。接下来服务器一个合适的位置git clone 下来代码库。就可以了。

4.如何做的Part2-Shell

基本工作都在这里,包含几部分内容:更新代码,备份代码,部署代码,修改项目config信息,备份数据库,跑数据库脚本。

大概的代码在下面,我删了一些项目相关的,你也可以根据自己的需求删减或添加:

 #!/bin/bash
#--------------------------------------------------------------------------------------------------
#@auther dreamingodd
#@
#My project name is ocdp.
#.git pull
#.backup PHP
#.deploy PHP.
#.change config in PHP project.
#.backup DB...
#.deploy SQLs
#-------------------------------------------------------------------------------------------------- sys_time=`date "+%Y%m%d_%H%M%S"`
#Refresh git folder
echo "----1.git processing"
#Let's pretend your project is in /home/git/YourProjectName
if [ -d /home/git ]
then
echo "Git folder exists."
cd /home/git/YourProjectName
git pull
else
mkdir /home/git
echo "created Git folder"
cd /home/git
git clone https://github.com/YourGitName/YourProjectName
fi #Deploy YourProjectName
echo "----2.backing up PHP"
cd /var/www/html/
if [ -d /var/www/html/YourProjectName ]
then
echo "YourProjectName exists."
if [ -d /home/back ]
then
echo "Backup folder exists."
else
mkdir /home/back
fi
mv /var/www/html/YourProjectName /home/back/YourProjectName_${sys_time}
mkdir /var/www/html/YourProjectName
else
#some config file creation for the first time deployment.一些首次部署的config设置
#...
echo "YourProjectName config files are created."
fi
echo "----3.deploying PHP."
cd /var/www/html
cp -r /home/git/YourProjectName ./YourProjectName
#config change.你的项目部署需要的config修改
#... #MySQL backup
echo "----5.backing up DB..."
backupFile=/tmp/DB_backup${sys_time}.sql
mysqldump -uroot -p${pwd} YourProjectName>${backupFile} #MySQL script deployment
echo "----6.deploying SQLs"
if [ -f /home/git/YourProjectName/sql/deployment/*.sql ]
then
for FILE in /home/git/YourProjectName/sql/deployment/*.sql
do
sys_time=`date "+%Y%m%d_%H%M%S"`
mysql -uroot -p${pwd} -e "source $FILE" | tee /tmp/DB_log_${sys_time}.sql
done
fi

现在运行这个脚本测试一下,新手注意权限问题,大多shell脚本的失败都是权限问题。

其实现在已经算是完成了,log和sql都在/tmp中可供查看,但是我们是要连登陆服务器这一步都要省略掉的变态,所以我们还要研究一下apache。

5.如何做的Part3-PHP

想要让php运行shell脚本需要以下步骤,我也是从跟别人学的,这里说一下思路,具体看一看这篇文章

你需要一个执行shell的用户(EXECUTOR),在httpd.conf里面把apache运行用户改成EXECUTOR,在sudo里面给EXECUTOR加上无需密码的运行权限。

PHP示例代码如下:

 <html>
<head>
<title>OCDP</title>
<style type="text/css">
#container {
margin: 0 auto;
border: 1px solid grey;
width: 500px;
padding: 15px;
margin-top: 100px;
}
h3 {
text-align: center;
}
</style>
</head>
<body>
<div id="container">
<h3>Auto-deploy Tool</h3>
<?php
$pwd = $_POST["pwd"];
if (empty($pwd)) {
?>
<form method="post" id="form">
Input Password:
<input type="password" id="pwd" name="pwd" value="<?php echo $_POST['pwd'];?>">
<input type="submit" value="Deploy">
</form>
<?php
} else {
$command = "sudo /home/git/ocdp/sh/deploy.sh $pwd";
$logFileName = "/tmp/deploy_".date('Ymd_His').".log";
$logFile = fopen($logFileName, 'w') or die('File: '.$logFileName.' open failed!');;
exec($command, $outputArray, $returnVal);
foreach ($outputArray as $line) {
echo $line.'<br/>';
fwrite($logFile, $line.'\n');
}
fclose($logFile);
if ($returnVal) {
echo '<br/><span style="color:red;">执行失败!<br/>Details refer to /etc/httpd/logs/error_log</span>';
} else {
echo '<br/><span style="color:green;">执行完毕!<br/>Logs save in '.$logFileName.'</span>';
}
}
?>
</div>
</body>
</html>

密码可以在php或者shell中检查,我这里输入的是数据库密码。

6.总结

麻烦是麻烦了点,但是完成之后当你每天部署4、5次,加起来只用了2分钟的时候,你就能感觉到慢慢的成就感了。

github 项目地址:https://github.com/dreamingodd/ocdp

如果以上对你有一点点用处的话,请到github上给我点个star吧,拜谢!

dreamingodd原创文章,如转载请注明出处。

如何自动化一键部署PHP项目的更多相关文章

  1. windows一键部署java项目

    windows一键部署java项目 因为公司需求,要在windows的环境上做一键部署启动java项目,同时还要支持从安装界面动态修改配置文件的IP地址.就像安装软件一样将jdk,tomcat,mys ...

  2. docker开启2376端口CA认证及IDEA中一键部署docker项目

    嘿,大家好,今天更新的内容是docker开启2376端口CA认证及IDEA中一键部署docker项目... 先看效果 我们可以通过idea一键部署docker项目,还以通过idea的控制台实时查看容器 ...

  3. shell自动化一键部署脚本,秒级一键回滚脚本

    #!/bin/bash # Node List PRE_LIST="192.168.222.163" # 预生产环境节点 GROUP1_LIST= ROLLBACK_LIST=&q ...

  4. IDEA一键部署SpringBoot项目到服务器

    1. 安装Alibaba Cloud Toolkit插件 2. 配置部署环境 2.1 为本次部署设置一个名字 2.2 选择被部署文件的生成方式 IDEA提供了三种方式:Maven Build,Uplo ...

  5. 自动化集成部署udeployer 批量统一安装一键部署

    通过jenkins构建项目:version版本控制:udployer自动化集成:ucop业务巡检做到高效高可用的自动化体系.   1.0版本: 逻辑与业务分离,完美实现逻辑与业务分离,业务实现统一sh ...

  6. .NET持续集成与自动化部署之路第三篇——测试环境到生产环境的一键部署策略(Windows)

    Jenkins测试环境到生产环境的一键部署策略(Windows) 一.前言     前面我们已经初步实现了开发集成环境.测试环境的持续集成(自动化构建.自动化测试.自动化部署).但生产环境自动化部署迟 ...

  7. Tomcat热部署:Maven项目一键部署到Tomcat服务器 - 支持多环境

    参考:Eclipse中的Maven项目一键部署到Tomcat服务器 - 支持多环境部署 命令 debug模式设置关联源码 eclipse --> 项目右键 --> Debug As --& ...

  8. Jenkins使用FTP进行一键部署及回滚2(Windows)(项目实践)

     转载:http://www.cnblogs.com/EasonJim/p/6295372.html Jenkins使用FTP进行一键部署及回滚2(Windows)(项目实践) 前提: 这一篇是继上一 ...

  9. 【Spring Boot】Spring Boot之使用Alibaba Cloud Toolkit(Idea插件)本地一键部署Spring Boot项目到远程服务器

    一.Alibaba Cloud Toolkit(Idea插件)的安装 1)Alibaba Cloud Toolkit 介绍 Cloud Toolkit 是本地 IDE 插件,帮助开发者更高效地开发.测 ...

随机推荐

  1. 虚拟目录webconfig的配置

    昨天需要新建一个虚拟目录放在以前的一个站点下,新建了应用池,配好了环境置顶路径,虚拟目录页建立成功 ,但是程序一直是报错.这个程序我在测试服务器上是测过的,新建了一个站点是可以正常访问的,排除了程序问 ...

  2. PHP中MySQL操作

    本次使用的demo是MySQL的示例数据库employees,点击下载地址,注意在导入的时候,在employees.sql文件中,将source改成你当前的目录. PHP中的demo代码可以在ideo ...

  3. 附录D 安装ZooKeeper

    D.1    安装ZooKeeper D.1.1   下载ZooKeeper ZooKeeper是Apache基金会的一个开源.分布式应用程序协调服务,是Google的Chubby一个开源的实现.它是 ...

  4. SQLServer学习笔记系列12

    一.写在前面的话 这个sql学习系列,今天准备告一段落,虽然短短的十几篇文章,深刻感受到将学习的东西记录下来,是需要一种坚持! 这些东西只有反复的学习吸收,最终沉淀下来的才是属于自己的知识.也是提醒自 ...

  5. RDD、DataFrame和DataSet的区别

    原文链接:http://www.jianshu.com/p/c0181667daa0 RDD.DataFrame和DataSet是容易产生混淆的概念,必须对其相互之间对比,才可以知道其中异同. RDD ...

  6. Elasticsearch+Logstash+Kibana教程

    参考资料 累了就听会歌吧! Elasticsearch中文参考文档 Elasticsearch官方文档 Elasticsearch 其他——那些年遇到的坑 Elasticsearch 管理文档 Ela ...

  7. [Asp.net 5] Options-配置文件之后的配置

    今天要讲的是OptionsModel解决方案,整个解决方案中也只有Microsoft.Framework.OptionsModel一个工程.按照表面文字OptionsModel应该翻译成选项模型,但是 ...

  8. SQL 循环语句 while 介绍 实例

    declare @i int begin insert into test (userid) values(@i) end --------------- while 条件 begin 执行操作 en ...

  9. Elasticsearch 的坑爹事——记录一次mapping field修改过程

    Elasticsearch 的坑爹事 本文记录一次Elasticsearch mapping field修改过程 团队使用Elasticsearch做日志的分类检索分析服务,使用了类似如下的_mapp ...

  10. 关于前期在云服务器上部署TOMCAT服务器的问题

    如果你要将你的项目放在服务器上(针对云服务器),首先你必须要学会前期部署Tomcat的准备, 第一步:安装jdk,配置环境变量 这个比较简单,配置java环境变量最为简单的方法是将java的 (../ ...