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原創文章,如轉載請註明出處。