zoukankan      html  css  js  c++  java
  • 如何自动化一键部署PHP项目

    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      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原创文章,如转载请注明出处。

  • 相关阅读:
    收藏本站
    JS动态生成ID+JS绑定数据
    CSS样式a:link
    C#绑定gridview
    jQuery checkbox 全选、全取消
    JS打开新窗口
    中用图片代替浏览按钮
    给button端添加客户端方法
    jQuery操作 checkbox 的全选、反选 , radio, select 功能
    C#弹出对话框
  • 原文地址:https://www.cnblogs.com/dreamingodd/p/5221939.html
Copyright © 2011-2022 走看看