使用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.php
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服務端自動部署.
推薦參考:
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.html
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1. 生成公鑰
公鑰有兩個:1. git用戶公鑰,2. 部署公鑰:
git用戶公鑰
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”,一直回車下去
2. 准備鈎子文件
創建和修改目錄權限:
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,鈎子准備完成。
3.修改git配置和保存git用戶名密碼
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上一致
|
在Coding網站
1.添加用戶公鑰
復制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)
2.添加部署公鑰
復制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>的內容並添加到部署公鑰:
選擇項目 > 設置 > 部署公鑰 > 新建 > 粘貼到下面框並確認
3.添加hook
選擇項目 > 設置 > 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,稍過幾秒,正常的話你在配置的項目目錄里就會有你的項目文件了。