使用WebHook自動部署項目
今天在laravist.com看到了這個 Webhook 自動部署Git項目 這個教學視頻,之前本身也想作這樣作一個利用Git WebHook的自動化部署,但老是不成功,今天看到視頻就想着再次嘗試一下,雖然有視頻參考但仍是遇到了一些坑,在這裏我寫下本身的部署過程.
注:
1.我是在de style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(199, 37, 78); border-radius: 4px; " >coding.netde>作的操做,其餘相似git庫應該能夠參考使用.
2.個人Web環境運行用戶是de style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(199, 37, 78); border-radius: 4px; " >wwwde>,因此部分操做會切換到de style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(199, 37, 78); border-radius: 4px; " >wwwde>用戶下.
3.須要把de style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(199, 37, 78); border-radius: 4px; " >shell_exec()de>或者de style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(199, 37, 78); border-radius: 4px; " >exec()de>兩個函數從de style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(199, 37, 78); border-radius: 4px; " >php.inide>的de style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(199, 37, 78); border-radius: 4px; " >disable_functionde>中取消.
4.Web環境的運行用戶須要Web部署目錄的讀寫權限.
過程.
1.在de style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(199, 37, 78); border-radius: 4px; " >coding.netde>新建一個庫
2.在服務器上生成一個用來部署的Git Key:de style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(199, 37, 78); border-radius: 4px; " >sudo -Hu www ssh-keygen -t rsade>
3.添加部署key到項目的部署公鑰中.
4.在服務端執行克隆操做:de style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(199, 37, 78); border-radius: 4px; " >sudo -Hu www git clone git@git.coding.net:XXXXXX/XXXXXXde>
5.添加一個可訪問的部署文件deploy.phpphp
de style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: inherit; padding: 0.5em; color: rgb(248, 248, 242); border-radius: 0px; display: block; background: rgb(35, 36, 31);" ><?php error_reporting(1); $target = '/www/web/imwhere/weixin/weiphp'; // 生產環境web目錄 $token = '**************';//自定義token $json = json_decode(file_get_contents('php://input'), true); if (empty($json['token']) || $json['token'] !== $token) { exit('error request'); } $cmd = "cd $target && git pull"; exec($cmd); de>
6.添加deploy.php的連接到WebHook中.
7.本地push更新到coding.net服務端自動部署.html
推薦參考:
1.使用Git部署網站:http://www.imwhere.cn/index.php/archives/3/
2.利用WebHook實現PHP自動部署Git代碼:http://m.aoh.cc/149.html
3.Webhook 自動部署Git項目:https://laravist.com/series/something-that-a-little-helpful/episodes/3
4.關於LINUX子目錄須要父目錄X權限的問題:http://www.imwhere.cn/index.php/archives/39/
5.coding.net WebHook 參數:https://open.coding.net/webhook.htmlgit
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------web
公鑰有兩個:1. git用戶公鑰,2. 部署公鑰:shell
git用戶公鑰json
1
2
3
|
ssh-keygen -t rsa -C "admin@xsooo.com"
# 而後一直回車就行
# 生成的文件一般是 /root/.ssh/id_rsa,若是非root用戶請查看提示上的路徑
|
部署公鑰服務器
sudo -Hu www ssh-keygen -t rsa # 請選擇 「no passphrase」,一直回車下去ssh
建立和修改目錄權限:ide
1
2
|
mkdir /home/wwwroot/website.com/hook
chown -R www:www /home/wwwroot/website.com/hook
|
寫入鉤子文件:函數
1
|
sudo -Hu www touch /home/wwwroot/website.com/hook/index.php
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
<?php
error_reporting(1);
$target = '/home/wwwroot/website.com'; // 生產環境web目錄
$token = '您在coding填寫的hook令牌';
$wwwUser = 'www';
$wwwGroup = 'www';
$json = json_decode(file_get_contents('php://input'), true);
if (empty($json['token']) || $json['token'] !== $token) {
exit('error request');
}
$repo = $json['repository']['name'];
// $cmds = array(
// "cd $target && git pull",
// "chown -R {$wwwUser}:{$wwwGroup} $target/",
// );
// foreach ($cmds as $cmd) {
// shell_exec($cmd);
// }
// 感謝@墨跡凡指正,能夠直接用www用戶拉取代碼而不用每次拉取後再修改用戶組
// $cmd = "sudo -Hu www cd $target && git pull"; 有問題
$cmd = "cd $target && git pull"; 改成這個
shell_exec($cmd);
|
確保你的hook文件能夠訪問:http://example.com/hook/index.php,鉤子準備完成。
1
2
3
|
sudo -Hu www git config --global credential.helper store # 永久保存
sudo -Hu www git config --global user.name "Bantes"
sudo -Hu www git config --global user.email "admin@xsooo.com" # 郵箱請與conding上一致
|
複製de style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 13.5px; padding: 2px 4px; color: rgb(199, 37, 78); border-radius: 4px; " >/root/.ssh/id_rsa.pubde>內容到我的設置頁的SSH公鑰裏添加便可(https://coding.net/user/account/setting/keys)
複製de style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 13.5px; padding: 2px 4px; color: rgb(199, 37, 78); border-radius: 4px; " >/home/www/.ssh/id_rsa.pubde>的內容並添加到部署公鑰:
選擇項目 > 設置 > 部署公鑰 > 新建 > 粘貼到下面框並確認
選擇項目 > 設置 > WebHook > 新建hook > 粘貼你的hook/index.php所在的網址。好比:http://example.com/hook/index.php, 令牌可選,可是建議寫上。
稍過幾秒刷新頁面查看hook狀態,顯示爲綠色勾就OK了。
1.咱們須要先在服務器上clone一次,之後均可以實現自動部署了:
1
|
sudo -Hu www git clone https://git.coding.net/yourname/yourgit.git /home/wwwroot/website.com/ --depth=1
|
這個時候應該會要求你輸入一次Coding的賬號和密碼,由於上面咱們設置了永久保存用戶名和密碼,因此以後再執行git就不會要求輸入用戶名和密碼了。
**!!注意,這裏初始化clone必需要用www用戶**
2.往Coding.net提交一次代碼測試:
在本地clone的倉庫執行:
1
2
|
git commit -am "test hook" --allow-empty
git push
|
OK,稍過幾秒,正常的話你在配置的項目目錄裏就會有你的項目文件了。