前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >tp6+webhook 实现自动部署

tp6+webhook 实现自动部署

原创
作者头像
以星河为聘礼
发布2022-12-29 11:27:49
7720
发布2022-12-29 11:27:49
举报
文章被收录于专栏:编码遇到的坑

1.安装git

代码语言:javascript
复制
yum install git -y

2.创建linux用户

代码语言:javascript
复制
//创建普通用户
adduser [创建的用户名] 
 
//修改密码
passwd  [创建的用户名]
//此处输入两遍密码
 
//编辑/etc/sudoers
vim /etc/sudoers
 

 配置完成后执行如下命令

代码语言:javascript
复制
//赋予创建的用户root权限
usermod -g root [上面创建的用户]
 
//切换到创建的用户名
su [创建的用户名]

注意:以下操作皆是在上面创建的用户下操作 

3.配置git公钥

代码语言:javascript
复制
//生成公钥回车三次 详情参考gitee帮助中心
ssh-keygen -t rsa -C "你的git邮箱号"
 
 
//查看公钥
cat ~/.ssh/id_rsa.pub
//将下面一行看到的公钥选中复制下来

部署如下图

公钥添加完成后再终端执行

代码语言:javascript
复制
ssh -T git@gitee.com

4.配置git全局用户名和邮箱以及密码

代码语言:javascript
复制
//配置全局用户名
git config --global user.name "你的用户名"
//配置全局邮箱
git config --global user.email"你的邮箱"
//配置全局密码
git config --global user.password"你的密码"
//生成本地文件用于记录用户名和密码
git config --global credential.helper store

5.配置weebhook

 6.配置php的FPM文件位置在 cd www/server/php/80/etc/ 到此目录下 执行 vim php-fpm.conf

修改如下的user 为你创建的用户

执行git的语句需要如下条件 1.root权限的用户,2.可配置全局git账号执行git指令时就无需输入账号密码3.我们下面用到的shell_exec()函数就是默认这里的user用户

7.安装tp6 框架写自动拉取的脚本

邮箱Email.php控制器

先安装邮箱的依赖环境执行 composer require phpmailer/phpmailer 安装依赖环境

代码语言:javascript
复制
<?php
/**
 * Created by PhpStorm
 * User: lingm
 * Date: 2022/9/23
 * Time: 下午 3:13
 * Atom:现在的努力是为了小时候吹过的NB
 */
namespace app\controller;
// 引入composer依赖
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
 
class Email
{
    /*
     * SMTP配置
     * */
    private $smtp_host = 'smtp.qq.com';//SMTP服务器地址
    private $smtp_from = '小白--开发管理媛';//发送者
    private $smtp_username = '';//邮箱账号
    private $smtp_password = '';//邮箱IMAP/SMTP服务密码
 
    private $smtp_port = '465';//端口号
 
    /**
     * 发送邮件对象
     * @param $addresses
     * @param $subject
     * @param $body
     * @return PHPMailer
     * @throws Exception
     */
    public function obtainEmailSender(array $addresses, $subject, $body)
    {
        $mailSender = new PHPMailer(true);
        $mailSender->CharSet = 'UTF-8';
 
        //Server settings
        $mailSender->SMTPDebug = SMTP::DEBUG_SERVER;                       // Enable verbose debug output
        $mailSender->isSMTP();                                             // Send using SMTP
        $mailSender->Host = $this->smtp_host;                              // Set the SMTP server to send through
        $mailSender->SMTPAuth = true;                                      // Enable SMTP authentication
        $mailSender->Username = $this->smtp_username;                      // SMTP username
        $mailSender->Password = $this->smtp_password;                      // SMTP password
        $mailSender->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;             // Enable TLS encryption; `PHPMailer::ENCRYPTION_SMTPS` also accepted
        $mailSender->Port = $this->smtp_port;                              // TCP port to connect to
 
        //Recipients
        $mailSender->setFrom($this->smtp_username, $this->smtp_from);
        foreach ($addresses as $index => $address) {
            $mailSender->addAddress($address);                             // Name is optional
        }
        // Content
        $mailSender->isHTML(true);                                  // Set email format to HTML
        $mailSender->Subject = $subject;
        $mailSender->Body = $body;
        //返回邮件对象
        return $mailSender;
    }
}

2.自动化部署控制器Test.php

代码语言:javascript
复制
<?php
/**
 * Created by PhpStorm
 * User: lingm
 * Date: 2022/9/23
 * Time: 下午 4:25
 * Atom:现在的努力是为了小时候吹过的NB
 */
namespace app\controller;
use app\controller\Email;
class Test{
    public function index(){
        // 获取请求参数
        $headers = getallheaders();
        //获取webhook传递过来的数据进行数据转换
        $body = json_decode(file_get_contents("php://input"), true);
        // 请求密码
        $password = 'webhook配置的密码';
        // 验证提交分支是否为master
        if (!isset($body['ref']) || $body['ref'] !== 'refs/heads/master') {
            return error("非主分支". $body);
        }
        // 验证提交密码是否正确
        if (!isset($body['password']) || $body['password'] !== $password) {
           return error("密码错误");
        }
        $command = " cd /www/wwwroot/xnasa.cn/ && git pull origin master 2>&1";
        //执行linux命令
        $res = shell_exec($command);
        // 发送邮件
        $addresses = [
            $body['sender']['email'],// 将邮件发送给发送者
            $body['repository']['owner']['email']// 将邮件发送给仓库所有者
        ];
        // 去除重复的内容
        $addresses = array_unique($addresses);
        try {
            // 更新说明
            $title = '部署成功通知';
            // 构造邮件内容
            $message = $body['head_commit']['message'];// 提交信息
            $datetime = date('Y-m-d H:i:s', $body['timestamp'] / 1000);// 时间
            $pusher = $body['pusher']['name'];// 提交人
            $name = $body['project']['name'];// 项目名
            $path = $body['project']['path'];// 路径
            $content = <<<HTML
                <html>
                <body>
                    <h2>{$body['project']['name']}已部署成功</h2>
                    <p>
                    描述:<span style="font-size: 16px; color: cadetblue">$message</span> <br>
                    时间:<span style="font-size: 16px; color: red">$datetime</span> <br>
                    提交人:<span style="font-size: 16px; color: cadetblue">$pusher</span> <br>
                    项目名称:<span style="font-size: 16px; color: cadetblue">$name</span> <br> 
                    项目路径:<span style="font-size: 16px; color: cadetblue">$path</span> <br>
                    git命令:<span style="font-size: 16px; color: cadetblue">$res</span>
                    </p>
                </body>
                </html>
                HTML;
 
            // 发送邮件
            $emailSender = (new Email())->obtainEmailSender($addresses, $title, $content);
            $emailSender->send();
            // 返回结果
            return success("邮件发送成功,执行结果:".$res,$res);
        } catch (\PHPMailer\PHPMailer\Exception $e) {
            return error("邮件发送失败,执行结果:".$res.",\n邮件日志:".$e);
        }
    }
}

如果这里使用 exec,shell_exec,system等函数报错需要修改php.ini文件 的 disable_functions =

将此选项中的 exec,shell_exec,system 找到给删掉 重启php即可

将上述的文件提交到git以后,拉取到服务器,之后随便修改一些地方进行测试提交推送到gitee

提交完以后等待gitee响应完成后在webhook就可以看到如下

 上面就是提交代码拉取的记录

详情内容如下,也可以看自己的邮箱

我这里没有改动文件提交所以这里是没有拉取到,每次gitee仓库提交后,webhook就会去请求上面的接口,没有新文件改动就不获取.我这里是自己重新请求的

以上自动化部署的脚本就完成了.

坑点:php的shell_exec()等函数是被禁用的需要手动开启,其次执行shell_exec()函数默认用户设置的是你www下的目录,所以会执行拉取失败,我们需要手动创建个用户,再去赋予root权限,配置git.

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档