From fd78cc6662ea8e123d9faa213697e465c52651a2 Mon Sep 17 00:00:00 2001 From: Ricardo N Feliciano Date: Fri, 13 Nov 2020 23:15:23 -0500 Subject: [PATCH] Initial commit --- .circleci/config.yml | 38 +++++++++++++++++++++ .circleci/int-testing.yml | 38 +++++++++++++++++++++ .gitignore | 1 + LICENSE | 21 ++++++++++++ README.md | 33 ++++++++++++++++++ img/header.png | Bin 0 -> 29441 bytes src/@orb.yml | 11 ++++++ src/commands/notify-mattermost.yml | 52 +++++++++++++++++++++++++++++ src/commands/status.yml.bak | 46 +++++++++++++++++++++++++ src/examples/audit.yml | 22 ++++++++++++ 10 files changed, 262 insertions(+) create mode 100644 .circleci/config.yml create mode 100644 .circleci/int-testing.yml create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 img/header.png create mode 100644 src/@orb.yml create mode 100644 src/commands/notify-mattermost.yml create mode 100644 src/commands/status.yml.bak create mode 100644 src/examples/audit.yml diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000..5836978 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,38 @@ +version: 2.1 + +setup: true + +orbs: + orb-tools: circleci/orb-tools@11.5 + shellcheck: circleci/shellcheck@3.1 + +filters: &filters + tags: + only: /.*/ + +workflows: + main-wf: + jobs: + - orb-tools/pack: + filters: *filters + - orb-tools/review: + exclude: "RC009" + filters: *filters + - shellcheck/check: + filters: *filters + - orb-tools/publish: + orb-name: hubci/notify + vcs-type: << pipeline.project.type >> + requires: + - orb-tools/review + - orb-tools/pack + - shellcheck/check + context: circleci-ctx + filters: *filters + - orb-tools/continue: + pipeline-number: << pipeline.number >> + vcs-type: << pipeline.project.type >> + config-path: ".circleci/int-testing.yml" + requires: + - orb-tools/publish + filters: *filters diff --git a/.circleci/int-testing.yml b/.circleci/int-testing.yml new file mode 100644 index 0000000..b98e2e0 --- /dev/null +++ b/.circleci/int-testing.yml @@ -0,0 +1,38 @@ +version: 2.1 + +filters: &filters + tags: + only: /.*/ + +orbs: + orb-tools: circleci/orb-tools@11.5 + orb: hubci/notify@dev:<< pipeline.git.revision >> + +workflows: + int-testing-wf: + jobs: + - int-test-notify-mattermost: + filters: *filters + - orb-tools/pack: + filters: *filters + - orb-tools/publish: + orb-name: hubci/notify + vcs-type: << pipeline.project.type >> + pub-type: production + requires: + - orb-tools/pack + - int-test-notify-mattermost + context: circleci-ctx + filters: + branches: + ignore: /.*/ + tags: + only: /^v[0-9]+\.[0-9]+\.[0-9]+$/ + +jobs: + int-test-notify-mattermost: + docker: + - image: cimg/base:2023.01 + steps: + - orb/notify-mattermost: + text: "This message is from testing the Mattermost CircleCI orb. It can be found here: ${CIRCLE_BUILD_URL}." diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..adc61bb --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +orb.yml diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..969acdd --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright © 2023 Ricardo N Feliciano + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..e387391 --- /dev/null +++ b/README.md @@ -0,0 +1,33 @@ +![Notify Orb Logo](./img/header.png) + +# Notify Orb [![CircleCI Build Status](https://circleci.com/gh/hubci/notify-orb.svg?style=shield "CircleCI Build Status")](https://app.circleci.com/pipelines/github/hubci/notify-orb) [![CircleCI Orb Version](https://badges.circleci.com/orbs/hubci/notify.svg)][reg-page] [![GitHub License](https://img.shields.io/badge/license-MIT-lightgrey.svg)](https://github.com/hubci/notify-orb/blob/trunk/LICENSE) + + +An orb to send messages from within a CircleCI job to to a chat platform. +The only platform supported at the moment is Mattermost. + +Executor support is a Linux or macOS based system on amd64 or arm64. + + +## Usage + +Example usage as well as a list of available executors, commands, and jobs are available on this orb's [registry page][reg-page]. + + +## Resources + +[CircleCI Orb Registry Page][reg-page] - The official registry page for this orb will all versions, executors, commands, and jobs described. +[CircleCI Orb Docs](https://circleci.com/docs/2.0/orb-intro/#section=configuration) - Docs for using and creating CircleCI Orbs. + + +## Contributing + +I welcome [issues](https://github.com/hubci/notify-orb/issues) and [pull requests](https://github.com/hubci/notify-orb/pulls) against this repository! +For further questions/comments about this or other orbs, visit the Orb Category of [CircleCI Discuss](https://discuss.circleci.com/c/orbs). + +### Publishing +New versions of this orb are published by pushing a SemVer git tag. + + + +[reg-page]: https://circleci.com/developer/orbs/orb/hubci/notify diff --git a/img/header.png b/img/header.png new file mode 100644 index 0000000000000000000000000000000000000000..ca3edf22fad1d361c2f572092972b2e9f821d35c GIT binary patch literal 29441 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 F{{a%ucY*)_ literal 0 HcmV?d00001 diff --git a/src/@orb.yml b/src/@orb.yml new file mode 100644 index 0000000..f4cdeb9 --- /dev/null +++ b/src/@orb.yml @@ -0,0 +1,11 @@ +version: 2.1 + +description: | + Send notifications from a CircleCI Pipeline to a Mattermost channel. + + Bash is required on the executor image. This orb supports Linux and macOS + based images on both the amd64 and arm64 architectures. + +display: + home_url: "https://circleci.com/developer/orbs/orb/hubci/notify" + source_url: "https://github.com/hubci/notify-orb" diff --git a/src/commands/notify-mattermost.yml b/src/commands/notify-mattermost.yml new file mode 100644 index 0000000..77ee559 --- /dev/null +++ b/src/commands/notify-mattermost.yml @@ -0,0 +1,52 @@ +description: | + Send a message to a Mattermost channel or user (DM). +parameters: + text: + description: | + Markdown-formatted message to send to Mattermost. To trigger + notifications, use @, @channel, and @here like you would in + other Mattermost messages. + type: string + channel: + description: | + Mattermost webhooks have a default channel. Use this to send the text to + a channel other than the default. Use the channel’s name and not the + display name, e.g. use town-square, not Town Square. Use an "@" followed + by a username to send to a Direct Message. + type: string + default: "" + webhook: + description: | + The name of the environment variable to use to read in the webhook. The + default value should be fine for most people. + type: env_var_name + default: MM_WEBHOOK +steps: + - run: + name: "Check Dependencies" + command: | + if ! echo $0 | grep --quiet "bash"; then + echo "The running shell is not Bash and it is a requirement." + exit 2 + fi + + if ! command -v curl &> /dev/null; then + echo "The running shell is not Bash and it is a requirement." + exit 3 + fi + + if [ -z ${<< parameters.webhook >>}]; then + echo "The Mattermost webhook needs to be set." + exit 4 + fi + - run: + name: "Send Message" + command: | + HTTP_STATUS=$( curl --write-out "%{http_code}\n" --request POST --header "Content-Type: application/json" --data "{\"text\": \"<< parameters.text >>\"}" ${<< parameters.webhook>>} ) + + if [ "$HTTP_STATUS" -ne "200" ]; then + echo "There was an error sending the webhook. The return code was ${HTTP_STATUS}" + exit 5 + fi + + echo "Message sent." diff --git a/src/commands/status.yml.bak b/src/commands/status.yml.bak new file mode 100644 index 0000000..02b7ff4 --- /dev/null +++ b/src/commands/status.yml.bak @@ -0,0 +1,46 @@ +description: | + Notify a Mattermost channel on the final status of a CircleCI job. Only + notifies on failure by default. This command should be the final + command/step in a job in order to work correctly. +parameters: + success-message: + description: | + Markdown-formatted message to send to Mattermost to indicate a successful + job. This parameter is only needed to customize the default message. + type: string + default: | + The CircleCI job ${CIRCLE_JOB} has completed successfully. You can view + it here: CIRCLE_BUILD_URL + failed-message: + description: | + Markdown-formatted message to send to Mattermost to indicate a failed job + . This parameter is only needed to customize the default message. + type: string + default: | + The CircleCI job ${CIRCLE_JOB} has failed. You can view it here: + CIRCLE_BUILD_URL + channel: + description: | + Mattermost webhooks have a default channel. Use this to send the text to + a channel other than the default. Use the channel’s name and not the + display name, e.g. use town-square, not Town Square. Use an "@" followed + by a username to send to a Direct Message. + type: string + default: "" + webhook: + description: | + The name of the environment variable to use to read in the webhook. The + default value should be fine for most people. + type: env_var_name + default: MM_WEBHOOK +steps: + - message: + text: << parameters.success-message >> + channel: << parameters.channel >> + webhook: << parameters.webhook >> + when: on_success + - message: + text: << parameters.failed-message >> + channel: << parameters.channel >> + webhook: << parameters.webhook >> + #when: on_fail diff --git a/src/examples/audit.yml b/src/examples/audit.yml new file mode 100644 index 0000000..038a7a6 --- /dev/null +++ b/src/examples/audit.yml @@ -0,0 +1,22 @@ +description: | + An extremely simple example of sending a notification. + +usage: + version: 2.1 + + orbs: + notify: hubci/notify@x.y + + workflows: + main-wf: + jobs: + - build + + jobs: + build: + docker: + - image: cimg/base:2023.01 + steps: + - checkout + - notify/notify-mattermost: + text: "Hi friends!"