From 1e56584036d75fd4c2f588e94c167fcb2393d95c Mon Sep 17 00:00:00 2001 From: Rob Percival Date: Wed, 13 Nov 2019 11:16:42 +0000 Subject: [PATCH] Create Slack integration for Google Cloud Build Posts notifications to a Slack channel whenever a Google Cloud Build completes. --- scripts/gcb2slack/.gcloudignore | 16 + scripts/gcb2slack/.gitignore | 1 + scripts/gcb2slack/README.md | 43 ++ scripts/gcb2slack/failure.png | Bin 0 -> 29913 bytes scripts/gcb2slack/index.js | 112 +++++ scripts/gcb2slack/package-lock.json | 655 ++++++++++++++++++++++++++++ scripts/gcb2slack/package.json | 11 + scripts/gcb2slack/success.png | Bin 0 -> 31729 bytes 8 files changed, 838 insertions(+) create mode 100644 scripts/gcb2slack/.gcloudignore create mode 100644 scripts/gcb2slack/.gitignore create mode 100644 scripts/gcb2slack/README.md create mode 100644 scripts/gcb2slack/failure.png create mode 100644 scripts/gcb2slack/index.js create mode 100644 scripts/gcb2slack/package-lock.json create mode 100644 scripts/gcb2slack/package.json create mode 100644 scripts/gcb2slack/success.png diff --git a/scripts/gcb2slack/.gcloudignore b/scripts/gcb2slack/.gcloudignore new file mode 100644 index 0000000000..ccc4eb240e --- /dev/null +++ b/scripts/gcb2slack/.gcloudignore @@ -0,0 +1,16 @@ +# This file specifies files that are *not* uploaded to Google Cloud Platform +# using gcloud. It follows the same syntax as .gitignore, with the addition of +# "#!include" directives (which insert the entries of the given .gitignore-style +# file at that point). +# +# For more information, run: +# $ gcloud topic gcloudignore +# +.gcloudignore +# If you would like to upload your .git directory, .gitignore file or files +# from your .gitignore file, remove the corresponding line +# below: +.git +.gitignore + +node_modules diff --git a/scripts/gcb2slack/.gitignore b/scripts/gcb2slack/.gitignore new file mode 100644 index 0000000000..2ccbe4656c --- /dev/null +++ b/scripts/gcb2slack/.gitignore @@ -0,0 +1 @@ +/node_modules/ diff --git a/scripts/gcb2slack/README.md b/scripts/gcb2slack/README.md new file mode 100644 index 0000000000..115fdb5e9f --- /dev/null +++ b/scripts/gcb2slack/README.md @@ -0,0 +1,43 @@ +# Slack Notifications for Google Cloud Build + +> This is not an officially supported Google product. + +This Google Cloud Function sends a notification to a Slack channel whenever a +Google Cloud Build completes. + +![Success notification](success.png) +![Failure notification](failure.png) + +## Installation + +### Create a Slack Webhook + +Follow +[Slack's "Getting Started with Incoming Webhooks" instructions](https://api.slack.com/messaging/webhooks) +to create a Slack app and incoming webhook URL. This URL will be required in the +next installation step. + +### Deploy Google Cloud Function + +If you don't already have a Google Cloud project, [create one now](https://cloud.google.com/resource-manager/docs/creating-managing-projects). Ensure that you have the [Google Cloud SDK](https://cloud.google.com/sdk/) installed as well. + +Run the following command to deploy this Google Cloud Function, after changing +`$PROJECT` to your +[Google Cloud project ID](https://cloud.google.com/resource-manager/docs/creating-managing-projects#identifying_projects) +and `$SLACK_WEBHOOK_URL` to the webhook URL you created in the previous +installation step. You may also customise `$FUNC_NAME` and `$STAGE_BUCKET`. + +```shell +# Required parameters +$ PROJECT="YOUR-GOOGLE-CLOUD-PROJECT-ID" +$ SLACK_WEBHOOK_URL="YOUR-SLACK-WEBHOOK-URL" +# Customisable parameters +$ FUNC_NAME="cloudbuild2slack" +$ STAGE_BUCKET="${PROJECT}-cloudbuild2slack" + +$ gcloud --project="${PROJECT}" functions deploy "${FUNC_NAME}" \ + --stage-bucket="${STAGE_BUCKET}" \ + --trigger-topic="cloud-builds" \ + --runtime="nodejs10" \ + --set-env-vars="SLACK_WEBHOOK_URL=${SLACK_WEBHOOK_URL}" +``` diff --git a/scripts/gcb2slack/failure.png b/scripts/gcb2slack/failure.png new file mode 100644 index 0000000000000000000000000000000000000000..835641037c1fd9f7f4b321a4d5f613f2f0faa362 GIT binary patch literal 29913 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 Kx=zw8^#1?{(F))I literal 0 HcmV?d00001 diff --git a/scripts/gcb2slack/index.js b/scripts/gcb2slack/index.js new file mode 100644 index 0000000000..65e13cafe6 --- /dev/null +++ b/scripts/gcb2slack/index.js @@ -0,0 +1,112 @@ +const { + IncomingWebhook +} = require('@slack/webhook'); + +const { + auth +} = require('google-auth-library'); + +const webhook = new IncomingWebhook(process.env.SLACK_WEBHOOK_URL); + +// Add additional statues to list if you'd like: +// QUEUED, WORKING, CANCELLED +const interestingStatuses = ['SUCCESS', 'FAILURE', 'INTERNAL_ERROR', 'TIMEOUT']; + +// cloudbuildToSlack reads from a Google Cloud Build Pub/Sub topic and writes +// to a Slack webhook. +module.exports.cloudbuildToSlack = async (pubSubEvent, context) => { + if (!pubSubEvent.data) { + console.info("No `data` field in pubSubEvent"); + return; + } + const build = eventToBuild(pubSubEvent.data); + + // Skip if the current status is not in the status list. + if (interestingStatuses.indexOf(build.status) === -1) { + console.log("Build status %s is ignored", build.status); + return; + } + + // Send message to Slack. + const message = await createSlackMessage(build); + await webhook.send(message); +}; + +// eventToBuild transforms pubsub event message to a build object. +const eventToBuild = (data) => { + return JSON.parse(Buffer.from(data, 'base64').toString()); +} + +const getTrigger = async (triggerId) => { + const client = await auth.getClient({ + scopes: 'https://www.googleapis.com/auth/cloud-platform', + }); + const projectId = await auth.getProjectId(); + const res = await client.request({ + url: `https://cloudbuild.googleapis.com/v1/projects/${projectId}/triggers/${triggerId}`, + }); + return res.data; +} + +// createSlackMessage creates a message from a build object. +const createSlackMessage = async (build) => { + const buildStatus = build.statusDetail || build.status; + const trigger = await getTrigger(build.buildTriggerId); + + let { + REPO_NAME: repo, + BRANCH_NAME: branch, + } = build.substitutions; + + // If there was no substitution containing the repository name, + // take it from build.source. Unfortunately, this name will be the name + // used by Google Cloud Source Repositories, not the name on GitHub. + if (!repo && build.source.repoSource) { + repo = build.source.repoSource.repoName; + } + + let messagePrefix, color; + switch (build.status) { + case 'TIMEOUT': + messagePrefix = "Timeout of "; + color = 'danger'; + break; + case 'FAILURE': + messagePrefix = "Failed to "; + color = 'danger'; + break; + case 'INTERNAL_ERROR': + messagePrefix = "Internal error while trying to "; + color = 'warning'; + break; + case 'SUCCESS': + messagePrefix = "Completed "; + color = 'good'; + break; + } + + let message = { + text: `${messagePrefix}'${trigger.description}' for ${repo} repo`, + attachments: [{ + fallback: buildStatus, + color: color, + fields: [{ + title: 'Status', + value: buildStatus, + short: true, + }, { + title: 'Build Logs', + value: build.logUrl, + }], + }], + }; + + if (branch) { + message.attachments[0].fields.push({ + title: 'Branch', + value: branch, + }) + } + + return message +} diff --git a/scripts/gcb2slack/package-lock.json b/scripts/gcb2slack/package-lock.json new file mode 100644 index 0000000000..3a10a4bd05 --- /dev/null +++ b/scripts/gcb2slack/package-lock.json @@ -0,0 +1,655 @@ +{ + "name": "google-build-slack", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@google-cloud/functions-framework": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@google-cloud/functions-framework/-/functions-framework-1.3.2.tgz", + "integrity": "sha512-xRBokqMNLTK70dWoRJ0AYPGkm9W6IKoZgUArcRhR0idPJa9US8qolhHM7CDMs2sROiMNSSNdmsc+tnsPjzFcEA==", + "requires": { + "body-parser": "^1.18.3", + "express": "^4.16.4", + "minimist": "^1.2.0", + "on-finished": "^2.3.0" + } + }, + "@slack/types": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@slack/types/-/types-1.2.1.tgz", + "integrity": "sha512-NyGh7MibW+a0OHkwwOPlv63hC639dzQdkFy4dj0tl4sAdZR4OBaE/OhXixKhCzcT3kJsPXaQmvkUN7sqSf52iA==" + }, + "@slack/webhook": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@slack/webhook/-/webhook-5.0.2.tgz", + "integrity": "sha512-Ns35+KC//EWu+g+Bzp5m18V7qsCBdqAdvV4FJi2ng8+jto4rH2Bv2vUMmMioRn9LIiZ38LPsX/InrFjaO5XwGA==", + "requires": { + "@slack/types": "^1.1.0", + "@types/node": ">=8.9.0", + "axios": "^0.18.0" + } + }, + "@types/node": { + "version": "12.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.7.tgz", + "integrity": "sha512-E6Zn0rffhgd130zbCbAr/JdXfXkoOUFAKNs/rF8qnafSJ8KYaA/j3oz7dcwal+lYjLA7xvdd5J4wdYpCTlP8+w==" + }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" + }, + "axios": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", + "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", + "requires": { + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "bignumber.js": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", + "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "fast-text-encoding": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.0.tgz", + "integrity": "sha512-R9bHCvweUxxwkDwhjav5vxpFvdPGlVngtqmx4pIZfSUhM/Q4NiIUHB456BAf+Q1Nwu3HEZYONtu+Rya+af4jiQ==" + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "requires": { + "debug": "=3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "gaxios": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-2.1.0.tgz", + "integrity": "sha512-Gtpb5sdQmb82sgVkT2GnS2n+Kx4dlFwbeMYcDlD395aEvsLCSQXJJcHt7oJ2LrGxDEAeiOkK79Zv2A8Pzt6CFg==", + "requires": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^3.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.3.0" + } + }, + "gcp-metadata": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-2.0.4.tgz", + "integrity": "sha512-p1lXhJvcKvJHWfQXhkd4Za1kyXRsGZA0JH7Cjs07W9hrg84d/j5tqQhbGewlSLx9gNyuQUid69uLux48YbggLg==", + "requires": { + "gaxios": "^2.0.1", + "json-bigint": "^0.3.0" + } + }, + "google-auth-library": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-4.2.6.tgz", + "integrity": "sha512-oJ6tCA9rbsYeIVY+mcLPFHa2hatz3XO6idYIrlI/KhhlMxZrO3tKyU8O2Pxu5KnSBBP7Wj4HtbM1LLKngNFaFw==", + "requires": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "fast-text-encoding": "^1.0.0", + "gaxios": "^2.0.0", + "gcp-metadata": "^2.0.0", + "gtoken": "^3.0.0", + "jws": "^3.1.5", + "lru-cache": "^5.0.0" + } + }, + "google-p12-pem": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-2.0.2.tgz", + "integrity": "sha512-UfnEARfJKI6pbmC1hfFFm+UAcZxeIwTiEcHfqKe/drMsXD/ilnVjF7zgOGpHXyhuvX6jNJK3S8A0hOQjwtFxEw==", + "requires": { + "node-forge": "^0.9.0" + } + }, + "gtoken": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-3.0.2.tgz", + "integrity": "sha512-BOBi6Zz31JfxhSHRZBIDdbwIbOPyux10WxJHdx8wz/FMP1zyN1xFrsAWsgcLe5ww5v/OZu/MePUEZAjgJXSauA==", + "requires": { + "gaxios": "^2.0.0", + "google-p12-pem": "^2.0.0", + "jws": "^3.1.5", + "mime": "^2.2.0" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" + } + } + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "https-proxy-agent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz", + "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==", + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" + }, + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + }, + "json-bigint": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-0.3.0.tgz", + "integrity": "sha1-DM2RLEuCcNBfBW+9E4FLU9OCWx4=", + "requires": { + "bignumber.js": "^7.0.0" + } + }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.42.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", + "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==" + }, + "mime-types": { + "version": "2.1.25", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz", + "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==", + "requires": { + "mime-db": "1.42.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, + "node-forge": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.1.tgz", + "integrity": "sha512-G6RlQt5Sb4GMBzXvhfkeFmbqR6MzhtnT7VTHuLadjkii3rdYHNdw0m8zA4BTxVIh68FicCQ2NSUANpsqkr9jvQ==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "proxy-addr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + } + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } +} diff --git a/scripts/gcb2slack/package.json b/scripts/gcb2slack/package.json new file mode 100644 index 0000000000..1cee394982 --- /dev/null +++ b/scripts/gcb2slack/package.json @@ -0,0 +1,11 @@ +{ + "name": "google-build-slack", + "version": "1.0.0", + "description": "Slack integration for Google Cloud Build.", + "main": "index.js", + "dependencies": { + "@google-cloud/functions-framework": "^1.3.2", + "@slack/webhook": "^5.0.2", + "google-auth-library": "^4.2.6" + } +} diff --git a/scripts/gcb2slack/success.png b/scripts/gcb2slack/success.png new file mode 100644 index 0000000000000000000000000000000000000000..1000a67e68188b78ed2a03eb5674286683efc744 GIT binary patch literal 31729 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�xJ?#wLm zsp^-Zovy7AzHU7!=gH>Jx?sTd~^_!8Et4Nzd95(7*I3 zoEL*qLGm0oc>257C8L)=@|^!5k#|ckoijJe+@H^SZf^Zh1HT5mdN}0R9sOzdNhW(; zA3ZF9VX}(^p52UZtO!et`#2z_+KkM#f|MIfJ<;99A$u;TXi1u_BJn(7K z-0aS4Hn{Og|5~PV;v{LcVDCPw)YIRFG_}O}b5w&J0{?@Uth~AJC*|USduHY_pMxw|Q^{D;>Q}_^-X5)v8n?q7t6^K zp(1WPlXRIAK9y~k z{yXPlba;BdK z@kn>=Ht~QXo~yAUt9h%VYwqX4XT7Kv$oC0NSh6p}6-J(%K2i*yezq^((5*gPiFqEa zPveKF5083W9HF-F`1nu0I%gsb+7^W7!Ootv{w8!CQr#LCF7d9Z{rBS{fYSCP!gJ){mgOsZ?QIAXf`v1v^d z68kk`VxG0h*%wI|YlX3?5jD-y@o|1ffwk$708>b?Q9NE8y%t9=HJz{@P&DS1;J=UL zeqe=kpd?Ofbx+*r>lYMmTN9}-GJ#!TwhUx*wQ2}6L@N2T zLXQ&OuLpSd8<#bjPq$g^JD%IuqfWaEi8E&pZZ{5h2v&E`s}HcZZ|Ytj=8~OfqLBgM zoW%PNE$}Z;SXOFo)+0G(S7>zCCi?HR0_1Qwj9YLIhX>WfCGZl%b@kfC3CHyH1#scB zTj=BZO+)(Sio!JGH3CE_FG3#w()ljCL_obT3qvNjt(g_-j)P2jr)z>g$#7G@eS|ji z6=`7KP2=(sIeN)0u36Q(iwGD>>6K;dluytqFY*n$7C?zpetd;~+GPbJ>vANx)VEtw zYQf>K5lZ|JCRd9}Vo*<+XMKQCcr$0<9pd~!;L@d-s#lpqsFH~f7)(_Rrbg~M90mf7GGUC8jQuA#!m2BoZ995Euu~e zi|f}sud@~vUTwKB6-)Q|?8)=c>68wK^RPAVg|9%0A}9`(kVtFBBBCBrHNPTl@_5j`D8 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 literal 0 HcmV?d00001