added slack support

This commit is contained in:
Bimmy 2022-08-04 14:59:17 +03:00
parent a6b8fd6228
commit a1807b9ae9
3 changed files with 288 additions and 107 deletions

View File

@ -2,7 +2,6 @@
namespace taskman; namespace taskman;
use Amp; use Amp;
use ClickHouseDB; use ClickHouseDB;
use Exception;
interface IATFDevicePool interface IATFDevicePool
{ {
@ -259,7 +258,7 @@ class ATFSession
$version = taskman_prop('GAME_VERSION'); $version = taskman_prop('GAME_VERSION');
$rev_hash = taskman_prop('GAME_REVISION_HASH'); $rev_hash = taskman_prop('GAME_REVISION_HASH');
$msg = "version $version($rev_hash) size: $apk_sizeMb Mb ($apk_sizeB B)"; $msg = "version $version($rev_hash) size: $apk_sizeMb Mb ($apk_sizeB B)";
// atf_slack_post($msg, array('channel' => _atf_slack_chan_qa())); atf_slack_post($msg, array('channel' => _atf_slack_chan_qa()));
$data['guid'] = $this->guid; $data['guid'] = $this->guid;
$data['time'] = time(); $data['time'] = time();
@ -314,22 +313,22 @@ class ATFSession
); );
} }
// function tryShareToQAChannel($msg_slack_id, $error) function tryShareToQAChannel($msg_slack_id, $error)
// { {
// if(!$this->share_with_qa_chan) if(!$this->share_with_qa_chan)
// return; return;
// //let's skip similar already shared errors //let's skip similar already shared errors
// if($this->_calcSharedErrorSimilarity($error) > 80) if($this->_calcSharedErrorSimilarity($error) > 80)
// return; return;
// $this->shared_qa_errors[] = $error; $this->shared_qa_errors[] = $error;
// //let's share an exception message to goh-qa channel //let's share an exception message to goh-qa channel
// $resp = atf_slack_get_permalink($msg_slack_id); $resp = atf_slack_get_permalink($msg_slack_id);
// if(isset($resp['permalink'])) if(isset($resp['permalink']))
// atf_slack_post($resp['permalink'], array('channel' => _atf_slack_chan_qa())); atf_slack_post($resp['permalink'], array('channel' => _atf_slack_chan_qa()));
// } }
function _calcSharedErrorSimilarity($error) function _calcSharedErrorSimilarity($error)
{ {
@ -368,62 +367,62 @@ class ATFPlan
return "Testing plan '{$this->name}' devices:".sizeof($this->getDevices())."(n/a:".sizeof($this->session->ignored_devices).")"; return "Testing plan '{$this->name}' devices:".sizeof($this->getDevices())."(n/a:".sizeof($this->session->ignored_devices).")";
} }
// function createSlackThread() function createSlackThread()
// { {
// for($i=0;$i<5;++$i) for($i=0;$i<5;++$i)
// { {
// $resp = atf_slack_post($this->getTitle()); $resp = atf_slack_post($this->getTitle());
// if(isset($resp['ok'])) if(isset($resp['ok']))
// { {
// $this->slack_thread_ts = $resp['ts']; $this->slack_thread_ts = $resp['ts'];
// return; return;
// } }
// sleep(1); sleep(1);
// } }
// throw new Exception("Could not create Slack thread"); throw new Exception("Could not create Slack thread");
// } }
// function updateSlackThread() function updateSlackThread()
// { {
// $issues_summary = ''; $issues_summary = '';
// foreach($this->getProblemsHistogram() as $code => $count) foreach($this->getProblemsHistogram() as $code => $count)
// { {
// if($code == ATFTask::CODE_GONE) if($code == ATFTask::CODE_GONE)
// $issues_summary .= " gones:$count"; $issues_summary .= " gones:$count";
// else if($code == ATFTask::CODE_NSTART) else if($code == ATFTask::CODE_NSTART)
// $issues_summary .= " nstrts:$count"; $issues_summary .= " nstrts:$count";
// else if($code == ATFTask::CODE_STUCK) else if($code == ATFTask::CODE_STUCK)
// $issues_summary .= " stucks:$count"; $issues_summary .= " stucks:$count";
// else if($code == ATFTask::CODE_HUNG) else if($code == ATFTask::CODE_HUNG)
// $issues_summary .= " hungs:$count"; $issues_summary .= " hungs:$count";
// else if($code == ATFTask::CODE_EXCEPTION) else if($code == ATFTask::CODE_EXCEPTION)
// $issues_summary .= " excepts:$count"; $issues_summary .= " excepts:$count";
// else if($code == ATFTask::CODE_WARN) else if($code == ATFTask::CODE_WARN)
// $issues_summary .= " warns:$count"; $issues_summary .= " warns:$count";
// } }
// $running_count = 0; $running_count = 0;
// $over_count = 0; $over_count = 0;
// $total_progress = 0; $total_progress = 0;
// foreach($this->tasks as $task) foreach($this->tasks as $task)
// { {
// $total_progress += $task->getProgress(); $total_progress += $task->getProgress();
// if($task->isOver()) if($task->isOver())
// $over_count++; $over_count++;
// if($task->device) if($task->device)
// $running_count++; $running_count++;
// } }
// $progress_txt = ' tasks:' . ($running_count > 0 ? $running_count . '/' : '') . $over_count . '/' . sizeof($this->tasks) . ' (' . round($total_progress/sizeof($this->tasks)*100, 2) . '%)'; $progress_txt = ' tasks:' . ($running_count > 0 ? $running_count . '/' : '') . $over_count . '/' . sizeof($this->tasks) . ' (' . round($total_progress/sizeof($this->tasks)*100, 2) . '%)';
// atf_slack_update($this->slack_thread_ts, atf_slack_update($this->slack_thread_ts,
// array(array( array(array(
// "text" => $this->getTitle() . $issues_summary . $progress_txt, "text" => $this->getTitle() . $issues_summary . $progress_txt,
// "color" => $this->_getThreadColor(), "color" => $this->_getThreadColor(),
// "mrkdwn_in" => array("text") "mrkdwn_in" => array("text")
// )) ))
// ); );
// } }
function getProblemsHistogram() function getProblemsHistogram()
{ {
@ -486,7 +485,7 @@ class ATFPlan
{ {
$this->session->ignored_devices[] = $device; $this->session->ignored_devices[] = $device;
atf_log("Ignoring device *$device*: $reason"); atf_log("Ignoring device *$device*: $reason");
// atf_slack_post("Ignoring device *$device*: $reason", array('thread_ts' => $this->slack_thread_ts)); atf_slack_post("Ignoring device *$device*: $reason", array('thread_ts' => $this->slack_thread_ts));
} }
function getDevices() function getDevices()
@ -544,7 +543,7 @@ class ATFPlan
function runAsync(ATFApkInstaller $install, $sleep_time, $hung_threshold, $gone_threshold, $stuck_threshold) function runAsync(ATFApkInstaller $install, $sleep_time, $hung_threshold, $gone_threshold, $stuck_threshold)
{ {
// $this->createSlackThread(); $this->createSlackThread();
$this->session->resetBogusDevices(); $this->session->resetBogusDevices();
@ -562,7 +561,7 @@ class ATFPlan
return Amp\call(function() use($task, $install, $sleep_time, $hung_threshold, $gone_threshold, $stuck_threshold) { return Amp\call(function() use($task, $install, $sleep_time, $hung_threshold, $gone_threshold, $stuck_threshold) {
while(!$this->isOver() && !$task->isOver()) while(!$this->isOver() && !$task->isOver())
{ {
// $this->updateSlackThread(); $this->updateSlackThread();
yield Amp\delay((int)$sleep_time*1000); yield Amp\delay((int)$sleep_time*1000);
@ -596,7 +595,7 @@ class ATFPlan
} }
} }
// $this->updateSlackThread(); $this->updateSlackThread();
}); });
} }
@ -612,7 +611,7 @@ class ATFPlan
$task->device = $device; $task->device = $device;
try try
{ {
// atf_slack_post("Preparing *{$task->device}*", array('thread_ts' => $this->slack_thread_ts)); atf_slack_post("Preparing *{$task->device}*", array('thread_ts' => $this->slack_thread_ts));
yield $install->installAsync($device); yield $install->installAsync($device);
yield atf_start_ext_cmd_on_device_async($device, $task->getCmd(), $task->getCmdArgs()); yield atf_start_ext_cmd_on_device_async($device, $task->getCmd(), $task->getCmdArgs());
@ -634,20 +633,20 @@ class ATFPlan
{ {
return Amp\call(function() use($task) { return Amp\call(function() use($task) {
// $this->_postScreenToSlack($task); $this->_postScreenToSlack($task);
$fatal_msg = "Fatal problem ({$task->last_fatal_problem} - ".ATFTask::code2string($task->last_fatal_problem)."), attempt:{$task->attempts} *{$task->device}*"; $fatal_msg = "Fatal problem ({$task->last_fatal_problem} - ".ATFTask::code2string($task->last_fatal_problem)."), attempt:{$task->attempts} *{$task->device}*";
atf_log("[FTL] $fatal_msg"); atf_log("[FTL] $fatal_msg");
// atf_slack_post($fatal_msg, array('thread_ts' => $task->slack_thread_ts)); atf_slack_post($fatal_msg, array('thread_ts' => $task->slack_thread_ts));
if($task->last_fatal_problem == ATFTask::CODE_GONE || if($task->last_fatal_problem == ATFTask::CODE_GONE ||
$task->last_fatal_problem == ATFTask::CODE_HUNG) $task->last_fatal_problem == ATFTask::CODE_HUNG)
{ {
$app_log = atf_get_logcat_unity($task->device, 300); $app_log = atf_get_logcat_unity($task->device, 300);
$app_log = _atf_trim_start($app_log, 2000); $app_log = _atf_trim_start($app_log, 2000);
// atf_slack_post("Last logs: ```$app_log``` *{$task->device}*", array('thread_ts' => $task->slack_thread_ts)); atf_slack_post("Last logs: ```$app_log``` *{$task->device}*", array('thread_ts' => $task->slack_thread_ts));
} }
if (!taskman_prop('EXT_BOT_ERROR_PAUSE')) if (!taskman_prop('EXT_BOT_ERROR_PAUSE'))
@ -787,7 +786,7 @@ class ATFPlan
if($device_is_bogus) if($device_is_bogus)
{ {
// $this->_reportErrorFromLogcatToSlack($task, 1000); $this->_reportErrorFromLogcatToSlack($task, 1000);
$this->_incAndCheckBogusDevice($task->device); $this->_incAndCheckBogusDevice($task->device);
} }
@ -827,21 +826,21 @@ class ATFPlan
atf_log($shell_msg); atf_log($shell_msg);
} }
// function _postToSlackExtStatusItem(ATFTask $task, array $item) function _postToSlackExtStatusItem(ATFTask $task, array $item)
// { {
// $orig_msg = _atf_trim($item['message'], 3000); $orig_msg = _atf_trim($item['message'], 3000);
// $slack_msg = $orig_msg; $slack_msg = $orig_msg;
// if($item['error'] == ATFTask::CODE_EXCEPTION) if($item['error'] == ATFTask::CODE_EXCEPTION)
// $slack_msg = "```$slack_msg```"; $slack_msg = "```$slack_msg```";
// $slack_msg = '('.round($item['time'],1).'s) '.$slack_msg.' *'.$task->device.'*'; $slack_msg = '('.round($item['time'],1).'s) '.$slack_msg.' *'.$task->device.'*';
// $resp = atf_slack_post($slack_msg, array('thread_ts' => $task->slack_thread_ts)); $resp = atf_slack_post($slack_msg, array('thread_ts' => $task->slack_thread_ts));
// if(isset($resp['ok']) && $item['error'] == ATFTask::CODE_EXCEPTION) if(isset($resp['ok']) && $item['error'] == ATFTask::CODE_EXCEPTION)
// $this->session->tryShareToQAChannel($resp['ts'], $orig_msg); $this->session->tryShareToQAChannel($resp['ts'], $orig_msg);
// } }
function _analyzeExtStatusItemAsync(ATFTask $task, array $item) function _analyzeExtStatusItemAsync(ATFTask $task, array $item)
{ {
@ -890,34 +889,34 @@ class ATFPlan
else if($msg_type === '[WRN]') else if($msg_type === '[WRN]')
{ {
$task->addStatusCode(ATFTask::CODE_WARN); $task->addStatusCode(ATFTask::CODE_WARN);
// $this->_postToSlackExtStatusItem($task, $item); $this->_postToSlackExtStatusItem($task, $item);
} }
else if($msg_type === null) else if($msg_type === null)
{ {
// $this->_postToSlackExtStatusItem($task, $item); $this->_postToSlackExtStatusItem($task, $item);
} }
}); });
} }
// function _reportErrorFromLogcatToSlack(ATFTask $task, $limit) function _reportErrorFromLogcatToSlack(ATFTask $task, $limit)
// { {
// $errors_log = _atf_trim(atf_get_logcat_errors($task->device, $limit), 3000); $errors_log = _atf_trim(atf_get_logcat_errors($task->device, $limit), 3000);
// if($errors_log) if($errors_log)
// atf_slack_post("```$errors_log``` *{$task->device}*", array('thread_ts' => $task->slack_thread_ts)); atf_slack_post("```$errors_log``` *{$task->device}*", array('thread_ts' => $task->slack_thread_ts));
// } }
// function _postScreenToSlack(ATFTask $task) function _postScreenToSlack(ATFTask $task)
// { {
// global $GAME_ROOT; global $GAME_ROOT;
// $png_data = atf_screen($task->device); $png_data = atf_screen($task->device);
// if($png_data) if($png_data)
// { {
// ensure_write("$GAME_ROOT/build/atf/screen.png", $png_data); ensure_write("$GAME_ROOT/build/atf/screen.png", $png_data);
// atf_slack_post_png("screen", "$GAME_ROOT/build/atf/screen.png", array('thread_ts' => $task->slack_thread_ts)); atf_slack_post_png("screen", "$GAME_ROOT/build/atf/screen.png", array('thread_ts' => $task->slack_thread_ts));
// } }
// } }
} }
@ -1309,10 +1308,11 @@ function _atf_db()
return $db; return $db;
} }
function atf_stats_send($table, array $data) function atf_stats_send($table, array $data)
{ {
$db = _atf_db();
return; return;
$db = _atf_db();
$db->insert($table, array(array_values($data)), array_keys($data)); $db->insert($table, array(array_values($data)), array_keys($data));
} }

View File

@ -6,6 +6,7 @@
"php": ">=7.4" "php": ">=7.4"
}, },
"autoload": { "autoload": {
"classmap": ["atf.inc.php"] "classmap": ["atf.inc.php"],
"classmap": ["slack.inc.php"]
} }
} }

180
slack.inc.php Normal file
View File

@ -0,0 +1,180 @@
<?php
namespace taskman;
use Amp;
use Exception;
use CURLFile;
function slack_msg($token, $channel, $msg, $fields = [])
{
$ch = curl_init("https://slack.com/api/chat.postMessage");
$fields["token"] = $token;
if(!isset($fields['channel']))
$fields["channel"] = $channel;
$fields["text"] = $msg;
$fields["as_user"] = "bitgames bot";
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
//curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
//curl_setopt($ch, CURLOPT_VERBOSE, true);
$result = curl_exec($ch);
curl_close($ch);
return json_decode($result, true);
}
function slack_upload_image($token, array $channels, $filepath)
{
$url = "https://slack.com/api/files.upload";
$cfile = new CURLFile(realpath($filepath), 'image/jpg', 'test.jpg');
$fields = array(
'token' => $token,
'channels' => implode(",", $channels),
'file' => $cfile,
'filename' => "test.jpg",
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);
$result = curl_exec($ch);
curl_close($ch);
$arr = json_decode($result, true);
if(isset($arr['ok']) && $arr['ok'] == 1)
{
if(isset($arr['file']['permalink_public']))
return $arr['file']['permalink_public'];
}
return "";
}
function _atf_slack_chan()
{
return get("ATF_SLACK_CHANNEL");
}
function _atf_slack_chan_qa()
{
return get("ATF_SLACK_CHANNEL");
}
function _atf_slack_token()
{
$token = "xoxb-141599046048-1567053090644-2gDAoWGiZxFTtXGLMOOeLG2u";
return $token;
}
task('slack_test', function()
{
// createSlackThread();
// atf_slack_post('hi', array('channel' => _atf_slack_chan_qa()));
});
function atf_slack_post($message, $fields = array())
{
if(!get("ATF_SLACK"))
return array('ok' => true, 'ts' => 0);
$ch = curl_init("https://slack.com/api/chat.postMessage");
$fields["token"] = _atf_slack_token();
if(!isset($fields['channel']))
$fields["channel"] = _atf_slack_chan();
$fields["text"] = $message;
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($ch);
curl_close($ch);
return json_decode($result, true);
}
function atf_slack_get_permalink($message_ts, $channel = null)
{
if(!get("ATF_SLACK"))
return array('permalink' => '');
$ch = curl_init("https://slack.com/api/chat.getPermalink");
$fields["token"] = _atf_slack_token();
if($channel === null)
$channel = _atf_slack_chan();
$fields["channel"] = $channel;
$fields["message_ts"] = $message_ts;
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($ch);
curl_close($ch);
return json_decode($result, true);
}
function atf_slack_update($ts, array $attachments)
{
if(!get("ATF_SLACK"))
return array('ok' => true);
$ch = curl_init("https://slack.com/api/chat.update");
$fields["token"] = _atf_slack_token();
$fields["channel"] = _atf_slack_chan();
$fields["ts"] = $ts;
$fields["attachments"] = json_encode($attachments);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($ch);
curl_close($ch);
return json_decode($result, true);
}
function atf_slack_post_png($title, $png_file, $fields = array())
{
if(!get("ATF_SLACK"))
return array('ok' => true);
$file = new CurlFile($png_file, 'image/png');
$header = array();
$header[] = 'Content-Type: multipart/form-data';
$fields["token"] = _atf_slack_token();
$fields["channels"] = _atf_slack_chan();
$fields['file'] = $file;
$fields['title'] = $title;
$ch = curl_init("https://slack.com/api/files.upload");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
$result = curl_exec($ch);
curl_close($ch);
return json_decode($result, true);
}