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. Android随笔之——Android ADB详解

    ADB全称Android Debug Bridge, 是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的andriod设备.它主要有以下几个功能: 1.运 ...

  2. Google Chrome 应用商店上传扩展程序

    1. 进入 Google 开发者中心 网址: https://chrome.google.com/webstore/developer/dashboard?hl=zh-cn 2. 添加新项 上传后,出 ...

  3. 【Android】[转] Android Codec默认profile使用的是Baseline

    关于Android默认Codec使用的Profile找了半天没发现,还是Google的时候发现了开源中国有网友写的这边博客,相关的内容很少,便贴了过来做个笔记. 以下内容转自Android Media ...

  4. Android APP压力测试(三)之Monkey日志自动分析脚本

    Android APP压力测试(三) 之Monkey日志自动分析脚本 前言 上次说要分享Monkey日志的分析脚本,这次贴出来分享一下,废话不多说,请看正文. [目录] 1.Monkey日志分析脚本 ...

  5. ASP.NET MVC动作过滤器

    ASP.NET MVC提供了4种不同的动作过滤器(Aciton Filter). 1.Authorization Filter 在执行任何Filter或Action之前被执行,用于身份验证 2.Act ...

  6. SqlServer切换MySql总结

    最近项目任务不多就琢磨着把SqlServer换成MySql(数据访问使用的ado.net),初步想了下方案有2种: 方案一:继续使用ado.net,重写所有的sql语句 优势:数据访问效率高,改写Sq ...

  7. DevExpress ComboBoxEdit 添加值

    今天在使用ComboBoxEdit 这个控件的时候,不知道怎么添加值. 在官网上找到代码.在这里做个记录 ComboBoxEdit combo = new ComboBoxEdit(); ComboB ...

  8. Git 获取文件操作

    1. 在本地新建存放源代码的文件夹: 2. 进入文件夹下,右击选择 Git Bash Here ,弹出git命令行窗口: 3. 运行指定 git init,初始化git: 4. git  remote ...

  9. Spring学习系列(三) 通过Java代码装配Bean

    上面梳理了通过注解来隐式的完成了组件的扫描和自动装配,下面来学习下如何通过显式的配置的装配bean 二.通过Java类装配bean 在前面定义了HelloWorldConfig类,并使用@Compon ...

  10. python征程1.2(初识python)

    1.操作符. 和其他绝大多数语言一样,Python的算术操作符以你熟悉的方式工作. “+,—,×,/,//,%,**,” 注意:python有两种除法操作符(1)单斜杠用以传统除法,(2)双斜杠用以浮 ...