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

View File

@ -6,6 +6,7 @@
"php": ">=7.4"
},
"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);
}