发布一个自认为安全的 webbook 自动部署流程 欢迎拍砖指正
阿婆主 自认为安全的点主要在于,没有为了 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 协议》,转载必须注明作者和本文链接
看到:
我惊呆了!
@Summer 版主 = 帮忙排版的主要工作人员