阿婆主 自認為安全的點主要在於,沒有為了 webhook 可以拉取到程式碼而給程式碼目錄附加 nginx 寫入許可權。
阿婆主 個人習慣 程式碼放置於 /home/web/sites 目錄下,php nginx 執行中需要可寫的目錄全部適用 setfacl 賦予許可權。
- 執行過程需要 一部分 linux 知識與命令 expect
- 首先安裝 expect
yum install -y expect - 編寫 deploy.sh 請注意我我們的指令碼是支援 多專案的哦 單獨執行 是這個樣子的
/home/web/shells/deploy.sh project
#!/usr/bin/env bash
unset GIT_DIR;
webpass='qnYpudBiIil3SvS#!9fuIr$8p$C5zqmX'
if [ $1 == "icoding" ]
then
/usr/bin/expect <<-EOF
spawn su - web
exp_internal 0
expect "*密碼:"
send "$webpass\r"
expect "*~]$"
send "cd /home/web/sites/icoding\r"
expect "*icoding]$"
send "/usr/bin/git reset --hard origin/master\r"
expect "*icoding]$"
send "/usr/bin/git pull origin master\r"
expect "*icoding]$"
send "exit\r"
interact
expect eof
EOF
cd /home/web/site/icoding
/usr/bin/php artisan view:clear
/usr/bin/php artisan config:clear
/usr/bin/php artisan route:clear
fi
- 書寫 deploy.php 適用於 gitlab webhook
<?php
ini_set('max_execution_time', '120');
$token = $_SERVER['HTTP_X_GITLAB_TOKEN'];
if ($token != 'm2S0tGOyj8APTbg0gIs4z9shU8hY3Dxi') {
echo 'Token Error';
header('HTTP/1.1 403 Token Error');
exit();
}
$data = file_get_contents('php://input');
file_put_contents('logs/input.txt', $data, FILE_APPEND);
$data = json_decode($data, true);
$branch = $data['ref'];
$branch = str_replace('refs/heads/', '', $branch);
if ($branch != 'master') {
exit();
}
$repository = $data['repository']['name'];
$command = '/home/web/shells/deploy.sh '.$repository;
echo $command;
$result = shell_exec($command);
if($result == null){
header('HTTP/1.1 500 Internal Server Error');
}else{
file_put_contents('logs/input.txt', $result, FILE_APPEND);
echo $result;
}
以上作者的表達能力著實有限,希望兄弟們提點指正,我明後晚會積極改正、潤色。
然後 @Summer 大神能幫排個版就更酷了。
本作品採用《CC 協議》,轉載必須註明作者和本文連結