diff --git a/Dockerfile b/Dockerfile index 566ec47..b0ea6a5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.14-alpine3.11@sha256:6578dc0c1bde86ccef90e23da3cdaa77fe9208d23c1bb31d942c8b663a519fa5 AS builder +FROM golang:1.22-alpine3.19@sha256:5a99b4049412cd34ad6b4e0c9527ae6beb9ae82d787b4bf3f4eff7aa13fc577a AS builder LABEL "com.github.actions.icon"="bell" LABEL "com.github.actions.color"="yellow" @@ -15,8 +15,8 @@ ENV GOOS linux RUN go get -v ./... RUN go build -a -installsuffix cgo -ldflags '-w -extldflags "-static"' -o /go/bin/slack-notify . -# alpine:latest at 2023-08-23T11:48:25.468623934UTC -FROM alpine@sha256:7144f7bab3d4c2648d7e59409f15ec52a18006a128c733fcff20d3a4a54ba44a +# alpine:latest as of 2024-03-11 +FROM alpine@sha256:6457d53fb065d6f250e1504b9bc42d5b6c65941d57532c072d929dd0628977d0 COPY --from=builder /go/bin/slack-notify /usr/bin/slack-notify diff --git a/README.md b/README.md index 9cabbf6..3a04397 100644 --- a/README.md +++ b/README.md @@ -41,19 +41,25 @@ jobs: By default, action is designed to run with minimal configuration but you can alter Slack notification using following environment variables: -Variable | Default | Purpose -------------------|-------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------- -SLACK_CHANNEL | Set during Slack webhook creation | Specify Slack channel in which message needs to be sent -SLACK_USERNAME | `rtBot` | Custom Slack Username sending the message. Does not need to be a "real" username. -SLACK_MSG_AUTHOR | `$GITHUB_ACTOR` (The person who triggered action). | GitHub username of the person who has triggered the action. In case you want to modify it, please specify corrent GitHub username. -SLACK_ICON | ![rtBot Avatar](https://github.com/rtBot.png?size=32) | User/Bot icon shown with Slack message. It uses the URL supplied to this env variable to display the icon in slack message. -SLACK_ICON_EMOJI | - | User/Bot icon shown with Slack message, in case you do not wish to add a URL for slack icon as above, you can set slack emoji in this env variable. Example value: `:bell:` or any other valid slack emoji. -SLACK_COLOR | `good` (green) | You can pass `${{ job.status }}` for automatic coloring or an RGB value like `#efefef` which would change color on left side vertical line of Slack message. -SLACK_LINK_NAMES | - | If set to `true`, enable mention in Slack message. -SLACK_MESSAGE | Generated from git commit message. | The main Slack message in attachment. It is advised not to override this. -SLACK_TITLE | Message | Title to use before main Slack message. -SLACK_FOOTER | Powered By rtCamp's GitHub Actions Library | Slack message footer. -MSG_MINIMAL | - | If set to `true`, removes: `Ref`, `Event`, `Actions URL` and `Commit` from the message. You can optionally whitelist any of these 4 removed values by passing it comma separated to the variable instead of `true`. (ex: `MSG_MINIMAL: event` or `MSG_MINIMAL: ref,actions url`, etc.) +Variable | Default | Purpose +---------------------|-------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------- +SLACK_CHANNEL | Set during Slack webhook creation | Specify Slack channel in which message needs to be sent +SLACK_USERNAME | `rtBot` | Custom Slack Username sending the message. Does not need to be a "real" username. +SLACK_MSG_AUTHOR | `$GITHUB_ACTOR` (The person who triggered action). | GitHub username of the person who has triggered the action. In case you want to modify it, please specify corrent GitHub username. +SLACK_ICON | ![rtBot Avatar](https://github.com/rtBot.png?size=32) | User/Bot icon shown with Slack message. It uses the URL supplied to this env variable to display the icon in slack message. +SLACK_ICON_EMOJI | - | User/Bot icon shown with Slack message, in case you do not wish to add a URL for slack icon as above, you can set slack emoji in this env variable. Example value: `:bell:` or any other valid slack emoji. +SLACK_COLOR | `good` (green) | You can pass `${{ job.status }}` for automatic coloring or an RGB value like `#efefef` which would change color on left side vertical line of Slack message. +SLACK_LINK_NAMES | - | If set to `true`, enable mention in Slack message. +SLACK_MESSAGE | Generated from git commit message. | The main Slack message in attachment. It is advised not to override this. +SLACK_TITLE | Message | Title to use before main Slack message. +SLACK_FOOTER | Powered By rtCamp's GitHub Actions Library | Slack message footer. +MSG_MINIMAL | - | If set to `true`, removes: `Ref`, `Event`, `Actions URL` and `Commit` from the message. You can optionally whitelist any of these 4 removed values by passing it comma separated to the variable instead of `true`. (ex: `MSG_MINIMAL: event` or `MSG_MINIMAL: ref,actions url`, etc.) +SLACKIFY_MARKDOWN | - | If set to `true`, it will convert markdown to slack format. (ex: `*bold*` to `bold`) Note: This only works for custom messages and not for the default message generated by the action. Credits: [slackify-markdown-action](https://github.com/marketplace/actions/slack-markdown-converter) +SLACK_THREAD_TS | - | If you want to send message in a thread, you can pass the timestamp of the parent message to this variable. You can get the timestamp of the parent message from the message URL in Slack. (ex: `SLACK_THREAD_TS: 1586130833.000100`) +SLACK_ON_SUCCESS | - | If set, will send the provided message instead of the default message when the passed status (through ``SLACK_COLOR``) is `success`. +SLACK_ON_FAILURE | - | If set, will send the provided message instead of the default message when the passed status (through ``SLACK_COLOR``) is `failure`. +SLACK_ON_CANCEL | - | If set, will send the provided message instead of the default message when the passed status (through ``SLACK_COLOR``) is `cancelled`. +SLACK_CUSTOM_PAYLOAD | - | If you want to send a custom payload to slack, you can pass it as a string to this variable. This will override all other variables and send the custom payload to slack. Example: `SLACK_CUSTOM_PAYLOAD: '{"text": "Hello, World!"}'`, Note: This payload should be in JSON format, and is not validated by the action. You can see the action block with all variables as below: diff --git a/action.yml b/action.yml index 5f36fca..f3cb06f 100644 --- a/action.yml +++ b/action.yml @@ -2,8 +2,28 @@ name: 'Slack Notify' description: 'This action will send a notification to Slack' author: 'rtCamp' runs: - using: 'docker' - image: 'docker://ghcr.io/rtcamp/action-slack-notify:v2.2.1' + using: 'composite' + steps: + - name: "Slack-Markdown Conversion" + if: env.SLACKIFY_MARKDOWN == 'true' + id: slackify + uses: LoveToKnow/slackify-markdown-action@v1.0.2 + with: + text: ${{ env.SLACK_MESSAGE }} + + - name: "Slack Notification (Formatted)" + if: env.SLACKIFY_MARKDOWN == 'true' + env: + SLACK_MESSAGE: "${{ steps.slackify.outputs.text }}" + GITHUB_RUN: "${{ github.event.repository.html_url }}/actions/runs/${{ github.run_id }}" + ENABLE_ESCAPES: "true" + uses: "docker://ghcr.io/rtcamp/action-slack-notify:v2.2.1" + + - name: "Slack Notification (Unformatted)" + if: env.SLACKIFY_MARKDOWN != 'true' + uses: "docker://ghcr.io/rtcamp/action-slack-notify:v2.2.1" + env: + GITHUB_RUN: "${{ github.event.repository.html_url }}/actions/runs/${{ github.run_id }}" branding: icon: 'bell' - color: 'yellow' + color: 'yellow' \ No newline at end of file diff --git a/main.go b/main.go index e1d5d8f..12cf590 100644 --- a/main.go +++ b/main.go @@ -11,19 +11,25 @@ import ( const ( EnvSlackWebhook = "SLACK_WEBHOOK" + EnvSlackCustom = "SLACK_CUSTOM_PAYLOAD" EnvSlackIcon = "SLACK_ICON" EnvSlackIconEmoji = "SLACK_ICON_EMOJI" EnvSlackChannel = "SLACK_CHANNEL" EnvSlackTitle = "SLACK_TITLE" EnvSlackMessage = "SLACK_MESSAGE" + EnvSlackOnSuccess = "SLACK_MESSAGE_ON_SUCCESS" + EnvSlackOnFailure = "SLACK_MESSAGE_ON_FAILURE" + EnvSlackOnCancel = "SLACK_MESSAGE_ON_CANCEL" EnvSlackColor = "SLACK_COLOR" EnvSlackUserName = "SLACK_USERNAME" EnvSlackFooter = "SLACK_FOOTER" EnvGithubActor = "GITHUB_ACTOR" + EnvGithubRun = "GITHUB_RUN" EnvSiteName = "SITE_NAME" EnvHostName = "HOST_NAME" EnvMinimal = "MSG_MINIMAL" EnvSlackLinkNames = "SLACK_LINK_NAMES" + EnvThreadTs = "SLACK_THREAD_TS" ) type Webhook struct { @@ -35,6 +41,7 @@ type Webhook struct { LinkNames string `json:"link_names,omitempty"` UnfurlLinks bool `json:"unfurl_links"` Attachments []Attachment `json:"attachments,omitempty"` + ThreadTs string `json:"thread_ts,omitempty"` } type Attachment struct { @@ -56,165 +63,186 @@ type Field struct { func main() { endpoint := os.Getenv(EnvSlackWebhook) - if endpoint == "" { - fmt.Fprintln(os.Stderr, "URL is required") - os.Exit(1) - } - text := os.Getenv(EnvSlackMessage) - if text == "" { - fmt.Fprintln(os.Stderr, "Message is required") - os.Exit(1) - } - if strings.HasPrefix(os.Getenv("GITHUB_WORKFLOW"), ".github") { - os.Setenv("GITHUB_WORKFLOW", "Link to action run") - } - - long_sha := os.Getenv("GITHUB_SHA") - commit_sha := long_sha[0:6] - - minimal := os.Getenv(EnvMinimal) - fields := []Field{} - if minimal == "true" { - mainFields := []Field{ - { - Title: os.Getenv(EnvSlackTitle), - Value: envOr(EnvSlackMessage, "EOM"), - Short: false, - }, + custom_payload := envOr(EnvSlackCustom, "") + if custom_payload != "" { + if err := send_raw(endpoint, []byte(custom_payload)); err != nil { + fmt.Fprintf(os.Stderr, "Error sending message: %s\n", err) + os.Exit(2) } - fields = append(mainFields, fields...) - } else if minimal != "" { - requiredFields := strings.Split(minimal, ",") - mainFields := []Field{ - { - Title: os.Getenv(EnvSlackTitle), - Value: envOr(EnvSlackMessage, "EOM"), - Short: false, - }, + } else { + if endpoint == "" { + fmt.Fprintln(os.Stderr, "URL is required") + os.Exit(2) } - for _, requiredField := range requiredFields { - switch strings.ToLower(requiredField) { - case "ref": - field := []Field{ - { - Title: "Ref", - Value: os.Getenv("GITHUB_REF"), - Short: true, - }, - } - mainFields = append(field, mainFields...) - case "event": - field := []Field{ - { - Title: "Event", - Value: os.Getenv("GITHUB_EVENT_NAME"), - Short: true, - }, - } - mainFields = append(field, mainFields...) - case "actions url": - field := []Field{ - { - Title: "Actions URL", - Value: "<" + os.Getenv("GITHUB_SERVER_URL") + "/" + os.Getenv("GITHUB_REPOSITORY") + "/commit/" + os.Getenv("GITHUB_SHA") + "/checks|" + os.Getenv("GITHUB_WORKFLOW") + ">", - Short: true, - }, - } - mainFields = append(field, mainFields...) - case "commit": - field := []Field{ - { - Title: "Commit", - Value: "<" + os.Getenv("GITHUB_SERVER_URL") + "/" + os.Getenv("GITHUB_REPOSITORY") + "/commit/" + os.Getenv("GITHUB_SHA") + "|" + commit_sha + ">", - Short: true, - }, - } - mainFields = append(field, mainFields...) + text := os.Getenv(EnvSlackMessage) + if text == "" { + fmt.Fprintln(os.Stderr, "Message is required") + os.Exit(3) + } + if strings.HasPrefix(os.Getenv("GITHUB_WORKFLOW"), ".github") { + err := os.Setenv("GITHUB_WORKFLOW", "Link to action run.yaml") + if err != nil { + fmt.Fprintf(os.Stderr, "Unable to update the workflow's variables: %s\n\n", err) + os.Exit(4) } } - fields = append(mainFields, fields...) - } else { - mainFields := []Field{ - { - Title: "Ref", - Value: os.Getenv("GITHUB_REF"), - Short: true, - }, { - Title: "Event", - Value: os.Getenv("GITHUB_EVENT_NAME"), - Short: true, - }, - { - Title: "Actions URL", - Value: "<" + os.Getenv("GITHUB_SERVER_URL") + "/" + os.Getenv("GITHUB_REPOSITORY") + "/commit/" + os.Getenv("GITHUB_SHA") + "/checks|" + os.Getenv("GITHUB_WORKFLOW") + ">", - Short: true, - }, - { - Title: "Commit", - Value: "<" + os.Getenv("GITHUB_SERVER_URL") + "/" + os.Getenv("GITHUB_REPOSITORY") + "/commit/" + os.Getenv("GITHUB_SHA") + "|" + commit_sha + ">", - Short: true, - }, - { - Title: os.Getenv(EnvSlackTitle), - Value: envOr(EnvSlackMessage, "EOM"), - Short: false, - }, + + long_sha := os.Getenv("GITHUB_SHA") + commit_sha := long_sha[0:6] + + color := "" + switch os.Getenv(EnvSlackColor) { + case "success": + color = "good" + text = envOr(EnvSlackOnSuccess, text) // If exists, override with on success + case "cancelled": + color = "#808080" + text = envOr(EnvSlackOnCancel, text) // If exists, override with on cancelled + case "failure": + color = "danger" + text = envOr(EnvSlackOnFailure, text) // If exists, override with on failure + default: + color = envOr(EnvSlackColor, "good") } - fields = append(mainFields, fields...) - } - hostName := os.Getenv(EnvHostName) - if hostName != "" { - newfields := []Field{ - { - Title: os.Getenv("SITE_TITLE"), - Value: os.Getenv(EnvSiteName), - Short: true, - }, - { - Title: os.Getenv("HOST_TITLE"), - Value: os.Getenv(EnvHostName), - Short: true, - }, + if text == "" { + text = "EOM" } - fields = append(newfields, fields...) - } - color := "" - switch os.Getenv(EnvSlackColor) { - case "success": - color = "good" - case "cancelled": - color = "#808080" - case "failure": - color = "danger" - default: - color = envOr(EnvSlackColor, "good") - } + minimal := os.Getenv(EnvMinimal) + fields := []Field{} + if minimal == "true" { + mainFields := []Field{ + { + Title: os.Getenv(EnvSlackTitle), + Value: text, + Short: false, + }, + } + fields = append(mainFields, fields...) + } else if minimal != "" { + requiredFields := strings.Split(minimal, ",") + mainFields := []Field{ + { + Title: os.Getenv(EnvSlackTitle), + Value: text, + Short: false, + }, + } + for _, requiredField := range requiredFields { + switch strings.ToLower(requiredField) { + case "ref": + field := []Field{ + { + Title: "Ref", + Value: os.Getenv("GITHUB_REF"), + Short: true, + }, + } + mainFields = append(field, mainFields...) + case "event": + field := []Field{ + { + Title: "Event", + Value: os.Getenv("GITHUB_EVENT_NAME"), + Short: true, + }, + } + mainFields = append(field, mainFields...) + case "actions url": + field := []Field{ + { + Title: "Actions URL", + Value: "<" + os.Getenv("GITHUB_SERVER_URL") + "/" + os.Getenv("GITHUB_REPOSITORY") + "/commit/" + os.Getenv("GITHUB_SHA") + "/checks|" + os.Getenv("GITHUB_WORKFLOW") + ">", + Short: true, + }, + } + mainFields = append(field, mainFields...) + case "commit": + field := []Field{ + { + Title: "Commit", + Value: "<" + os.Getenv("GITHUB_SERVER_URL") + "/" + os.Getenv("GITHUB_REPOSITORY") + "/commit/" + os.Getenv("GITHUB_SHA") + "|" + commit_sha + ">", + Short: true, + }, + } + mainFields = append(field, mainFields...) + } + } + fields = append(mainFields, fields...) + } else { + mainFields := []Field{ + { + Title: "Ref", + Value: os.Getenv("GITHUB_REF"), + Short: true, + }, { + Title: "Event", + Value: os.Getenv("GITHUB_EVENT_NAME"), + Short: true, + }, + { + Title: "Actions URL", + Value: "<" + os.Getenv("GITHUB_SERVER_URL") + "/" + os.Getenv("GITHUB_REPOSITORY") + "/commit/" + os.Getenv("GITHUB_SHA") + "/checks|" + os.Getenv("GITHUB_WORKFLOW") + ">", + Short: true, + }, + { + Title: "Commit", + Value: "<" + os.Getenv("GITHUB_SERVER_URL") + "/" + os.Getenv("GITHUB_REPOSITORY") + "/commit/" + os.Getenv("GITHUB_SHA") + "|" + commit_sha + ">", + Short: true, + }, + { + Title: os.Getenv(EnvSlackTitle), + Value: text, + Short: false, + }, + } + fields = append(mainFields, fields...) + } - msg := Webhook{ - UserName: os.Getenv(EnvSlackUserName), - IconURL: os.Getenv(EnvSlackIcon), - IconEmoji: os.Getenv(EnvSlackIconEmoji), - Channel: os.Getenv(EnvSlackChannel), - LinkNames: os.Getenv(EnvSlackLinkNames), - Attachments: []Attachment{ - { - Fallback: envOr(EnvSlackMessage, "GITHUB_ACTION="+os.Getenv("GITHUB_ACTION")+" \n GITHUB_ACTOR="+os.Getenv("GITHUB_ACTOR")+" \n GITHUB_EVENT_NAME="+os.Getenv("GITHUB_EVENT_NAME")+" \n GITHUB_REF="+os.Getenv("GITHUB_REF")+" \n GITHUB_REPOSITORY="+os.Getenv("GITHUB_REPOSITORY")+" \n GITHUB_WORKFLOW="+os.Getenv("GITHUB_WORKFLOW")), - Color: color, - AuthorName: envOr(EnvGithubActor, ""), - AuthorLink: os.Getenv("GITHUB_SERVER_URL") + "/" + os.Getenv(EnvGithubActor), - AuthorIcon: os.Getenv("GITHUB_SERVER_URL") + "/" + os.Getenv(EnvGithubActor) + ".png?size=32", - Footer: envOr(EnvSlackFooter, ""), - Fields: fields, + hostName := os.Getenv(EnvHostName) + if hostName != "" { + newfields := []Field{ + { + Title: os.Getenv("SITE_TITLE"), + Value: os.Getenv(EnvSiteName), + Short: true, + }, + { + Title: os.Getenv("HOST_TITLE"), + Value: os.Getenv(EnvHostName), + Short: true, + }, + } + fields = append(newfields, fields...) + } + + msg := Webhook{ + UserName: os.Getenv(EnvSlackUserName), + IconURL: os.Getenv(EnvSlackIcon), + IconEmoji: os.Getenv(EnvSlackIconEmoji), + Channel: os.Getenv(EnvSlackChannel), + LinkNames: os.Getenv(EnvSlackLinkNames), + ThreadTs: os.Getenv(EnvThreadTs), + Attachments: []Attachment{ + { + Fallback: envOr(EnvSlackMessage, "GITHUB_ACTION="+os.Getenv("GITHUB_ACTION")+" \n GITHUB_ACTOR="+os.Getenv("GITHUB_ACTOR")+" \n GITHUB_EVENT_NAME="+os.Getenv("GITHUB_EVENT_NAME")+" \n GITHUB_REF="+os.Getenv("GITHUB_REF")+" \n GITHUB_REPOSITORY="+os.Getenv("GITHUB_REPOSITORY")+" \n GITHUB_WORKFLOW="+os.Getenv("GITHUB_WORKFLOW")), + Color: color, + AuthorName: envOr(EnvGithubActor, ""), + AuthorLink: os.Getenv("GITHUB_SERVER_URL") + "/" + os.Getenv(EnvGithubActor), + AuthorIcon: os.Getenv("GITHUB_SERVER_URL") + "/" + os.Getenv(EnvGithubActor) + ".png?size=32", + Footer: envOr(EnvSlackFooter, " | <"+os.Getenv(EnvGithubRun)+"|Triggered on this workflow run>"), + Fields: fields, + }, }, - }, - } + } - if err := send(endpoint, msg); err != nil { - fmt.Fprintf(os.Stderr, "Error sending message: %s\n", err) - os.Exit(2) + if err := send(endpoint, msg); err != nil { + fmt.Fprintf(os.Stderr, "Error sending message: %s\n", err) + os.Exit(1) + } } + fmt.Fprintf(os.Stdout, "Successfully sent the message!") } func envOr(name, def string) string { @@ -229,7 +257,11 @@ func send(endpoint string, msg Webhook) error { if err != nil { return err } - b := bytes.NewBuffer(enc) + return send_raw(endpoint, enc) +} + +func send_raw(endpoint string, payload []byte) error { + b := bytes.NewBuffer(payload) res, err := http.Post(endpoint, "application/json", b) if err != nil { return err diff --git a/main.sh b/main.sh index 0deb77b..caa30e2 100644 --- a/main.sh +++ b/main.sh @@ -1,12 +1,14 @@ #!/usr/bin/env bash -export GITHUB_BRANCH=${GITHUB_REF##*heads/} -export SLACK_ICON=${SLACK_ICON:-"https://avatars0.githubusercontent.com/u/43742164"} -export SLACK_USERNAME=${SLACK_USERNAME:-"rtBot"} +export GITHUB_BRANCH="${GITHUB_REF##*heads/}" +export SLACK_ICON="${SLACK_ICON:-"https://avatars0.githubusercontent.com/u/43742164"}" +export SLACK_USERNAME="${SLACK_USERNAME:-"rtBot"}" export CI_SCRIPT_OPTIONS="ci_script_options" -export SLACK_TITLE=${SLACK_TITLE:-"Message"} -export COMMIT_MESSAGE=$(cat "$GITHUB_EVENT_PATH" | jq -r '.commits[-1].message') -export GITHUB_ACTOR=${SLACK_MSG_AUTHOR:-"$GITHUB_ACTOR"} +export SLACK_TITLE="${SLACK_TITLE:-"Message"}" +export GITHUB_ACTOR="${SLACK_MSG_AUTHOR:-"$GITHUB_ACTOR"}" + +COMMIT_MESSAGE="$(cat "$GITHUB_EVENT_PATH" | jq -r '.commits[-1].message')" +export COMMIT_MESSAGE hosts_file="$GITHUB_WORKSPACE/.github/hosts.yml" @@ -30,7 +32,8 @@ if [[ -z "$SLACK_WEBHOOK" ]]; then fi if [[ -n "$VAULT_GITHUB_TOKEN" ]] || [[ -n "$VAULT_TOKEN" ]]; then - export SLACK_WEBHOOK=$(vault read -field=webhook secret/slack) + SLACK_WEBHOOK="$(vault read -field=webhook secret/slack)" + export SLACK_WEBHOOK fi fi @@ -38,15 +41,16 @@ if [[ -f "$hosts_file" ]]; then hostname=$(cat "$hosts_file" | shyaml get-value "$GITHUB_BRANCH.hostname") user=$(cat "$hosts_file" | shyaml get-value "$GITHUB_BRANCH.user") export HOST_NAME="\`$user@$hostname\`" - export DEPLOY_PATH=$(cat "$hosts_file" | shyaml get-value "$GITHUB_BRANCH.deploy_path") + DEPLOY_PATH="$(cat "$hosts_file" | shyaml get-value "$GITHUB_BRANCH.deploy_path")" + export DEPLOY_PATH - temp_url=${DEPLOY_PATH%%/app*} + temp_url="${DEPLOY_PATH%%/app*}" export SITE_NAME="${temp_url##*sites/}" export HOST_TITLE="SSH Host" fi -PR_SHA=$(cat $GITHUB_EVENT_PATH | jq -r .pull_request.head.sha) -[[ 'null' != $PR_SHA ]] && export GITHUB_SHA="$PR_SHA" +PR_SHA="$(cat "$GITHUB_EVENT_PATH" | jq -r .pull_request.head.sha)" +[[ 'null' != "$PR_SHA" ]] && export GITHUB_SHA="$PR_SHA" if [[ -n "$SITE_NAME" ]]; then export SITE_TITLE="Site" @@ -54,7 +58,13 @@ fi if [[ -z "$SLACK_MESSAGE" ]]; then - export SLACK_MESSAGE="$COMMIT_MESSAGE" + SLACK_MESSAGE="$COMMIT_MESSAGE" +fi + +if [[ "true" == "$ENABLE_ESCAPES" ]]; then + SLACK_MESSAGE="$(echo -e "$SLACK_MESSAGE")" fi +export SLACK_MESSAGE + slack-notify "$@"