Merged in feature/from-pantheon (pull request #16)
code from pantheon * code from pantheon
This commit is contained in:
183
wp/private/scripts/slack_notification.php
Executable file
183
wp/private/scripts/slack_notification.php
Executable file
@@ -0,0 +1,183 @@
|
||||
<?php
|
||||
|
||||
// Important constants :)
|
||||
$pantheon_yellow = '#EFD01B';
|
||||
|
||||
// Default values for parameters - this will assume the channel you define the webhook for.
|
||||
// The full Slack Message API allows you to specify other channels and enhance the messagge further
|
||||
// if you like: https://api.slack.com/docs/messages/builder
|
||||
$defaults = array(
|
||||
'slack_username' => 'Pantheon-Quicksilver',
|
||||
'always_show_text' => false,
|
||||
);
|
||||
|
||||
// Load our hidden credentials.
|
||||
// See the README.md for instructions on storing secrets.
|
||||
$secrets = _get_secrets(array('slack_url'), $defaults);
|
||||
|
||||
// Build an array of fields to be rendered with Slack Attachments as a table
|
||||
// attachment-style formatting:
|
||||
// https://api.slack.com/docs/attachments
|
||||
$fields = array(
|
||||
array(
|
||||
'title' => 'Site',
|
||||
'value' => $_ENV['PANTHEON_SITE_NAME'],
|
||||
'short' => 'true'
|
||||
),
|
||||
array( // Render Environment name with link to site, <http://{ENV}-{SITENAME}.pantheon.io|{ENV}>
|
||||
'title' => 'Environment',
|
||||
'value' => '<http://' . $_ENV['PANTHEON_ENVIRONMENT'] . '-' . $_ENV['PANTHEON_SITE_NAME'] . '.pantheonsite.io|' . $_ENV['PANTHEON_ENVIRONMENT'] . '>',
|
||||
'short' => 'true'
|
||||
),
|
||||
array( // Render Name with link to Email from Commit message
|
||||
'title' => 'By',
|
||||
'value' => $_POST['user_email'],
|
||||
'short' => 'true'
|
||||
),
|
||||
array( // Render workflow phase that the message was sent
|
||||
'title' => 'Workflow',
|
||||
'value' => ucfirst($_POST['stage']) . ' ' . str_replace('_', ' ', $_POST['wf_type']),
|
||||
'short' => 'true'
|
||||
),
|
||||
array(
|
||||
'title' => 'View Dashboard',
|
||||
'value' => '<https://dashboard.pantheon.io/sites/'. PANTHEON_SITE .'#'. PANTHEON_ENVIRONMENT .'/deploys|View Dashboard>',
|
||||
'short' => 'true'
|
||||
),
|
||||
);
|
||||
|
||||
// Customize the message based on the workflow type. Note that slack_notification.php
|
||||
// must appear in your pantheon.yml for each workflow type you wish to send notifications on.
|
||||
switch($_POST['wf_type']) {
|
||||
case 'deploy':
|
||||
// Find out what tag we are on and get the annotation.
|
||||
$deploy_tag = `git describe --tags`;
|
||||
$deploy_message = $_POST['deploy_message'];
|
||||
|
||||
// Prepare the slack payload as per:
|
||||
// https://api.slack.com/incoming-webhooks
|
||||
$text = 'Deploy to the '. $_ENV['PANTHEON_ENVIRONMENT'];
|
||||
$text .= ' environment of '. $_ENV['PANTHEON_SITE_NAME'] .' by '. $_POST['user_email'] .' complete!';
|
||||
$text .= ' <https://dashboard.pantheon.io/sites/'. PANTHEON_SITE .'#'. PANTHEON_ENVIRONMENT .'/deploys|View Dashboard>';
|
||||
// Build an array of fields to be rendered with Slack Attachments as a table
|
||||
// attachment-style formatting:
|
||||
// https://api.slack.com/docs/attachments
|
||||
$fields[] = array(
|
||||
'title' => 'Details',
|
||||
'value' => $text,
|
||||
'short' => 'false'
|
||||
);
|
||||
$fields[] = array(
|
||||
'title' => 'Deploy Note',
|
||||
'value' => $deploy_message,
|
||||
'short' => 'false'
|
||||
);
|
||||
break;
|
||||
|
||||
case 'sync_code':
|
||||
// Get the committer, hash, and message for the most recent commit.
|
||||
$committer = `git log -1 --pretty=%cn`;
|
||||
$email = `git log -1 --pretty=%ce`;
|
||||
$message = `git log -1 --pretty=%B`;
|
||||
$hash = `git log -1 --pretty=%h`;
|
||||
|
||||
// Prepare the slack payload as per:
|
||||
// https://api.slack.com/incoming-webhooks
|
||||
$text = 'Code sync to the ' . $_ENV['PANTHEON_ENVIRONMENT'] . ' environment of ' . $_ENV['PANTHEON_SITE_NAME'] . ' by ' . $_POST['user_email'] . "!\n";
|
||||
$text .= 'Most recent commit: ' . rtrim($hash) . ' by ' . rtrim($committer) . ': ' . $message;
|
||||
// Build an array of fields to be rendered with Slack Attachments as a table
|
||||
// attachment-style formatting:
|
||||
// https://api.slack.com/docs/attachments
|
||||
$fields += array(
|
||||
array(
|
||||
'title' => 'Commit',
|
||||
'value' => rtrim($hash),
|
||||
'short' => 'true'
|
||||
),
|
||||
array(
|
||||
'title' => 'Commit Message',
|
||||
'value' => $message,
|
||||
'short' => 'false'
|
||||
)
|
||||
);
|
||||
break;
|
||||
|
||||
case 'clear_cache':
|
||||
$fields[] = array(
|
||||
'title' => 'Cleared caches',
|
||||
'value' => 'Cleared caches on the ' . $_ENV['PANTHEON_ENVIRONMENT'] . ' environment of ' . $_ENV['PANTHEON_SITE_NAME'] . "!\n",
|
||||
'short' => 'false'
|
||||
);
|
||||
break;
|
||||
|
||||
default:
|
||||
$text = $_POST['qs_description'];
|
||||
break;
|
||||
}
|
||||
|
||||
$attachment = array(
|
||||
'fallback' => $text,
|
||||
'pretext' => ($_POST['wf_type'] == 'clear_cache') ? 'Caches cleared :construction:' : 'Deploying :rocket:',
|
||||
'color' => $pantheon_yellow, // Can either be one of 'good', 'warning', 'danger', or any hex color code
|
||||
'fields' => $fields
|
||||
);
|
||||
|
||||
_slack_notification($secrets['slack_url'], $secrets['slack_channel'], $secrets['slack_username'], $text, $attachment, $secrets['always_show_text']);
|
||||
|
||||
|
||||
/**
|
||||
* Get secrets from secrets file.
|
||||
*
|
||||
* @param array $requiredKeys List of keys in secrets file that must exist.
|
||||
*/
|
||||
function _get_secrets($requiredKeys, $defaults)
|
||||
{
|
||||
$secretsFile = $_SERVER['HOME'] . '/files/private/secrets.json';
|
||||
if (!file_exists($secretsFile)) {
|
||||
die('No secrets file found. Aborting!');
|
||||
}
|
||||
$secretsContents = file_get_contents($secretsFile);
|
||||
$secrets = json_decode($secretsContents, 1);
|
||||
if ($secrets == false) {
|
||||
die('Could not parse json in secrets file. Aborting!');
|
||||
}
|
||||
$secrets += $defaults;
|
||||
$missing = array_diff($requiredKeys, array_keys($secrets));
|
||||
if (!empty($missing)) {
|
||||
die('Missing required keys in json secrets file: ' . implode(',', $missing) . '. Aborting!');
|
||||
}
|
||||
return $secrets;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a notification to slack
|
||||
*/
|
||||
function _slack_notification($slack_url, $channel, $username, $text, $attachment, $alwaysShowText = false)
|
||||
{
|
||||
$attachment['fallback'] = $text;
|
||||
$post = array(
|
||||
'username' => $username,
|
||||
'channel' => $channel,
|
||||
'icon_emoji' => ':lightning_cloud:',
|
||||
'attachments' => array($attachment)
|
||||
);
|
||||
if ($alwaysShowText) {
|
||||
$post['text'] = $text;
|
||||
}
|
||||
$payload = json_encode($post);
|
||||
$ch = curl_init();
|
||||
curl_setopt($ch, CURLOPT_URL, $slack_url);
|
||||
curl_setopt($ch, CURLOPT_POST, 1);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||||
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
|
||||
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
|
||||
// Watch for messages with `terminus workflows watch --site=SITENAME`
|
||||
print("\n==== Posting to Slack ====\n");
|
||||
$result = curl_exec($ch);
|
||||
print("RESULT: $result");
|
||||
// $payload_pretty = json_encode($post,JSON_PRETTY_PRINT); // Uncomment to debug JSON
|
||||
// print("JSON: $payload_pretty"); // Uncomment to Debug JSON
|
||||
print("\n===== Post Complete! =====\n");
|
||||
curl_close($ch);
|
||||
}
|
||||
Reference in New Issue
Block a user