2020年11月30日

基于Coding的Hook部署代码

点击数:1

什么是WebHook

Coding.net的解释:Webhook 允许第三方应用监听 Coding.net 上的特定事件,在这些事件发生时通过 HTTP POST 方式通知( 超时5秒) 到第三方应用指定的 Web URL。 例如项目有新的内容 Push,或是 Merge Request 有更新等。 WebHook 可方便用户实现自动部署,自动测试,自动打包,监控项目变化等。

触发事件

Event 说明
Push 任何时间项目内的 Push 操作
MR/PR 任何时间项目内的 Merge Request 和 Pull Request 操作
Topic 任何时间项目内的讨论创建,评论
Task 任何时间项目内的任务操作
Document 任何时间项目内的文档操作
Watch 任何时间第三方用户关注你的项目(限公开项目)
Star 任何时间对项目的收藏(限公开项目)

Show My Code

$project = \'newProject\';
$path = \'/home/web/service/wwwroot/\';
$token = \'newProject_dev\';
$verify = true;

if ($_GET && isset($_GET[\'version\'])) {
    if (file_exists($path . $project .\'/version\')) {
        $content = var_export(file_get_contents($path . $project .\'/version\'), true);

        if (is_array($content) && !empty($content[\'after\'])) {
            echo substr($content[\'after\'], 0, 6);
        } else {
            echo \'Unknown Version\';
        }
    }
    die;
}
$data = file_get_contents(\'php://input\');
if (strlen(trim($data)) > 0) {
    // 检测字符串是否为空
    $data = json_decode($data, true);
}

if (is_array($data) && !empty($data)) {
    if ($verify == true && (!isset($data[\'token\']) || isset($data[\'token\']) && $data[\'token\'] != $token)) {
        echo json_encode([\'code\' => 302, \'msg\' => \'token错误\']);
        die;
    }
} else {
    echo json_encode([\'code\' => 302, \'msg\' => \'数据为空!\']);
    die;
}

$type = \'\';
if (isset($data[\'ref\'])) {
    if (($start = strrpos($data[\'ref\'], \'/\')) === false) {
        $type = substr($data[\'ref\'], $start);
    } else {
        $type = substr($data[\'ref\'], $start + 1);
    }
}

// 推送
if (isset($_SERVER[\'X-Coding-Event\']) && $_SERVER[\'X-Coding-Event\'] == \'push\' || isset($_SERVER[\'HTTP_X_CODING_EVENT\']) && $_SERVER[\'HTTP_X_CODING_EVENT\'] = \'push\') {
    $isPublish = false;
    switch ($type) {
        case \'dev\':
            $project .= \'_dev/\';
            $isPublish = true;
            break;
        case \'test\':
            $project .= \'_test/\';
            $isPublish = true;
            break;
        case \'master\':
            $project .= \'/\';
            $isPublish = true;
            break;
    }
    if ($isPublish === true) {
        $command = \'cd \' . $path . $project . \' & git pull 2>&1\';
        $output = shell_exec($command);
        file_put_contents(\'/home/web/cammand.log\', var_export($command .PHP_EOL . $output, true));
    }
}

file_put_contents($path. $project . \'/version\', var_export($data, true));
echo json_encode([\'code\' => 200, \'msg\' => \'发布成功\']);

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据