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信息,备份数据库,跑数据库脚本。
大概的代码在下面,我删了一些项目相关的,你也可以根据自己的需求删减或添加:
1 #!/bin/bash 2 #-------------------------------------------------------------------------------------------------- 3 #@auther dreamingodd 4 #@20160226 5 #My project name is ocdp. 6 #1.git pull 7 #2.backup PHP 8 #3.deploy PHP. 9 #4.change config in PHP project. 10 #5.backup DB... 11 #6.deploy SQLs 12 #-------------------------------------------------------------------------------------------------- 13 14 sys_time=`date "+%Y%m%d_%H%M%S"` 15 #Refresh git folder 16 echo "----1.git processing" 17 #Let\'s pretend your project is in /home/git/YourProjectName 18 if [ -d /home/git ] 19 then 20 echo "Git folder exists." 21 cd /home/git/YourProjectName 22 git pull 23 else 24 mkdir /home/git 25 echo "created Git folder" 26 cd /home/git 27 git clone https://github.com/YourGitName/YourProjectName 28 fi 29 30 #Deploy YourProjectName 31 echo "----2.backing up PHP" 32 cd /var/www/html/ 33 if [ -d /var/www/html/YourProjectName ] 34 then 35 echo "YourProjectName exists." 36 if [ -d /home/back ] 37 then 38 echo "Backup folder exists." 39 else 40 mkdir /home/back 41 fi 42 mv /var/www/html/YourProjectName /home/back/YourProjectName_${sys_time} 43 mkdir /var/www/html/YourProjectName 44 else 45 #some config file creation for the first time deployment.一些首次部署的config设置 46 #... 47 echo "YourProjectName config files are created." 48 fi 49 echo "----3.deploying PHP." 50 cd /var/www/html 51 cp -r /home/git/YourProjectName ./YourProjectName 52 #config change.你的项目部署需要的config修改 53 #... 54 55 #MySQL backup 56 echo "----5.backing up DB..." 57 backupFile=/tmp/DB_backup${sys_time}.sql 58 mysqldump -uroot -p${pwd} YourProjectName>${backupFile} 59 60 #MySQL script deployment 61 echo "----6.deploying SQLs" 62 if [ -f /home/git/YourProjectName/sql/deployment/*.sql ] 63 then 64 for FILE in /home/git/YourProjectName/sql/deployment/*.sql 65 do 66 sys_time=`date "+%Y%m%d_%H%M%S"` 67 mysql -uroot -p${pwd} -e "source $FILE" | tee /tmp/DB_log_${sys_time}.sql 68 done 69 fi
现在运行这个脚本测试一下,新手注意权限问题,大多shell脚本的失败都是权限问题。
其实现在已经算是完成了,log和sql都在/tmp中可供查看,但是我们是要连登陆服务器这一步都要省略掉的变态,所以我们还要研究一下apache。
5.如何做的Part3-PHP
想要让php运行shell脚本需要以下步骤,我也是从跟别人学的,这里说一下思路,具体看一看这篇文章
你需要一个执行shell的用户(EXECUTOR),在httpd.conf里面把apache运行用户改成EXECUTOR,在sudo里面给EXECUTOR加上无需密码的运行权限。
PHP示例代码如下:
1 <html> 2 <head> 3 <title>OCDP</title> 4 <style type="text/css"> 5 #container { 6 margin: 0 auto; 7 border: 1px solid grey; 8 width: 500px; 9 padding: 15px; 10 margin-top: 100px; 11 } 12 h3 { 13 text-align: center; 14 } 15 </style> 16 </head> 17 <body> 18 <div id="container"> 19 <h3>Auto-deploy Tool</h3> 20 <?php 21 $pwd = $_POST["pwd"]; 22 if (empty($pwd)) { 23 ?> 24 <form method="post" id="form"> 25 Input Password: 26 <input type="password" id="pwd" name="pwd" value="<?php echo $_POST[\'pwd\'];?>"> 27 <input type="submit" value="Deploy"> 28 </form> 29 <?php 30 } else { 31 $command = "sudo /home/git/ocdp/sh/deploy.sh $pwd"; 32 $logFileName = "/tmp/deploy_".date(\'Ymd_His\').".log"; 33 $logFile = fopen($logFileName, \'w\') or die(\'File: \'.$logFileName.\' open failed!\');; 34 exec($command, $outputArray, $returnVal); 35 foreach ($outputArray as $line) { 36 echo $line.\'<br/>\'; 37 fwrite($logFile, $line.\'\n\'); 38 } 39 fclose($logFile); 40 if ($returnVal) { 41 echo \'<br/><span style="color:red;">执行失败!<br/>Details refer to /etc/httpd/logs/error_log</span>\'; 42 } else { 43 echo \'<br/><span style="color:green;">执行完毕!<br/>Logs save in \'.$logFileName.\'</span>\'; 44 } 45 } 46 ?> 47 </div> 48 </body> 49 </html>
密码可以在php或者shell中检查,我这里输入的是数据库密码。
6.总结
麻烦是麻烦了点,但是完成之后当你每天部署4、5次,加起来只用了2分钟的时候,你就能感觉到慢慢的成就感了。
github 项目地址:https://github.com/dreamingodd/ocdp
如果以上对你有一点点用处的话,请到github上给我点个star吧,拜谢!
dreamingodd原创文章,如转载请注明出处。