如何自動化一鍵部署PHP項目

1.技能需求php

完成自動化一鍵部署PHP須要:PHP(略懂),Shell(略懂),git(略懂)css

2.最終效果html

輸入密碼,回車,5~20秒後(通常一天一次持續交付,部署的代碼量和sql腳本都不會很大)mysql

執行產生的log文件、數據庫備份和數據庫執行結果在這裏:git

 

3.如何作的Part1-Gitgithub

首先要有一個VCS系統,我這裏用的是Git客戶端,本地和服務器都是。(沒用過Git能夠看這篇文章,我就是用它入門的)sql

這裏只用到Git pull,其餘的如svn等,都是同樣的。shell

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下載地址什麼的。apache

 

安裝好以後運行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.總結

麻煩是麻煩了點,可是完成以後當你天天部署四、5次,加起來只用了2分鐘的時候,你就能感受到慢慢的成就感了。

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

若是以上對你有一點點用處的話,請到github上給我點個star吧,拜謝!

 

dreamingodd原創文章,如轉載請註明出處。

相關文章
相關標籤/搜索