Skip to main content

基于Coding的Hook部署代码

什么是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' => '发布成功']);

点击量:9

发表评论