釋出一個自認為安全的 webbook 自動部署流程 歡迎拍磚指正

jasonchang發表於2017-09-20

阿婆主 自認為安全的點主要在於,沒有為了 webhook 可以拉取到程式碼而給程式碼目錄附加 nginx 寫入許可權。
阿婆主 個人習慣 程式碼放置於 /home/web/sites 目錄下,php nginx 執行中需要可寫的目錄全部適用 setfacl 賦予許可權。

  1. 執行過程需要 一部分 linux 知識與命令 expect
  2. 首先安裝 expect
    yum install -y expect
  3. 編寫 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
  1. 書寫 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 協議》,轉載必須註明作者和本文連結

相關文章