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. SQLServer 2012重启服务后,自增1的标识列一次增长了1000左右

    sql2012我重启了下sql服务,然后自增列Id居然一下子跳了1000,怎么回事啊?   如果第一条数据是1,我重启服务,再添加就是1001,如果继续添加不重启服务的话就是1002,如果再次重启的话 ...

  2. 1Z0-053 争议题目解析86

    1Z0-053 争议题目解析86 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 86.Your production database is running in archivel ...

  3. ACM-东北大学程序设计竞赛-网络赛(2016.04.16)

    Problem: A Time limit: 1s    Mem limit: 64 MB    AC/Submission: 0/0    Discuss Back   Ranklist  Stat ...

  4. Kooboo CMS - Html.FrontHtml.Position 详解

    DataContract 数据契约 http://www.cnblogs.com/Gavinzhao/archive/2010/06/01/1748736.html https://msdn.micr ...

  5. 移动端IM系统的协议选型:UDP还是TCP?

    1.前言 对于有过网络编程经验的开发者来说,使用何种数据传输层协议来实现数据的通信,是个非常基础的问题,它涉及到你的第一行代码该如何编写. 从PC时代的IM开始,IM开发者就在为数据传输协议的选型争论 ...

  6. 百度编辑器ueditor插入表格没有边框,没有颜色的解决方法 2015-01-06 09:24 98人阅读 评论(0) 收藏

    百度富文本编辑器..很强大.. - - ,不过有些BUG..真的很无解.. 最近用这个,发现上传的表格全部没有表框.. 解决办法如下: 转载的.. 百度编辑器ueditor插入一个表格后,在编辑过程中 ...

  7. (转载)构建public APIs与CORS

    from: https://segmentfault.com/a/1190000000709909 理由:在操作层面详细的讲解了跨域的操作.尤其是对于option请求的详解.收藏. 在构建Public ...

  8. CSS魔法堂:重拾Border之——解构Border

    前言  当CSS3推出border-radius属性时我们是那么欣喜若狂啊,一想到终于不用再添加额外元素来模拟圆角了,但发现border-radius还分水平半径和垂直半径,然后又发现border-t ...

  9. 重构sql server的sys.sp_helptext存储

    本文目录列表: 1.sys.sp_helptext存储的功能和效果 2.重构sys.sp_helptext存储(命名为dbo.usp_helptext)提供直观的效果 3.sys.sp_helptex ...

  10. 使用签名来保证ASP.NET MVC OR WEBAPI的接口安全

    当我们开发一款App的时候,App需要跟后台服务进行通信获取或者提交数据.如果我们没有完善的安全机制则很容易被别用心的人伪造请求而篡改数据. 所以我们需要使用某种安全机制来保证请求的合法.现在最常用的 ...