diff --git a/Dockerfile b/Dockerfile index 9773fb0..5f3a96f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,23 +2,23 @@ FROM golang:1.11-alpine3.9@sha256:7a0bf914dd581a35afb054bc02c6b7a3fa31ed6398adf9 LABEL "com.github.actions.icon"="bell" LABEL "com.github.actions.color"="yellow" -LABEL "com.github.actions.name"="Slack Notify" -LABEL "com.github.actions.description"="This action will send notification to Slack" +LABEL "com.github.actions.name"="Flowdockk Notify" +LABEL "com.github.actions.description"="This action will send notification to Flowdockk" -WORKDIR ${GOPATH}/src/github.com/rtcamp/action-slack-notify -COPY main.go ${GOPATH}/src/github.com/rtcamp/action-slack-notify +WORKDIR ${GOPATH}/src/github.com/UN-OCHA/gha-flowdock-notify +COPY main.go ${GOPATH}/src/github.com/UN-OCHA/gha-flowdock-notify ENV CGO_ENABLED 0 ENV GOOS linux RUN go get -v ./... -RUN go build -a -installsuffix cgo -ldflags '-w -extldflags "-static"' -o /go/bin/slack-notify . +RUN go build -a -installsuffix cgo -ldflags '-w -extldflags "-static"' -o /go/bin/flowdock-notify . # alpine:latest at 2019-01-04T21:27:39IST FROM alpine@sha256:46e71df1e5191ab8b8034c5189e325258ec44ea739bba1e5645cff83c9048ff1 -COPY --from=builder /go/bin/slack-notify /usr/bin/slack-notify +COPY --from=builder /go/bin/flowdock-notify /usr/bin/flowdock-notify ENV VAULT_VERSION 1.0.2 diff --git a/README.md b/README.md index 4b20237..f7e4712 100644 --- a/README.md +++ b/README.md @@ -1,76 +1,60 @@ > **⚠️ Note:** To use this GitHub Action, you must have access to GitHub Actions. GitHub Actions are currently only available in public beta (you must apply for access). -This action is a part of [GitHub Actions Library](https://github.com/rtCamp/github-actions-library/) created by [rtCamp](https://github.com/rtCamp/). +This action is a modified version of the Slack Notify action, which is part of [GitHub Actions Library](https://github.com/rtCamp/github-actions-library/) created by [rtCamp](https://github.com/rtCamp/). -# Slack Notify - GitHub Action +# Flowdock Notify - GitHub Action -A [GitHub Action](https://github.com/features/actions) to send a message to a Slack channel. - -**Screenshot** - -action-slack-notify-rtcamp - -The `Site` and `SSH Host` details are only available if this action is run after [Deploy WordPress GitHub action](https://github.com/rtCamp/action-deploy-wordpress). +A [GitHub Action](https://github.com/features/actions) to send a message to a Flowdock channel. ## Usage You can use this action after any other action. Here is an example setup of this action: -1. Create a `.github/workflows/slack-notify.yml` file in your GitHub repo. -2. Add the following code to the `slack-notify.yml` file. +1. Create a `.github/workflows/flowdock-notify.yml` file in your GitHub repo. +2. Add the following code to the `flowdock-notify.yml` file. ```yml on: push -name: Slack Notification Demo +name: Flowdock Notification Demo jobs: - slackNotification: - name: Slack Notification + flowdockNotification: + name: Flowdock Notification runs-on: ubuntu-latest steps: - uses: actions/checkout@master - - name: Slack Notification - uses: rtCamp/action-slack-notify@master + - name: Flowdock Notification + uses: UN-OCHA/gha-flowdock-notify@master env: - SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} + FLOWDOCK_TOKEN: ${{ secrets.FLOWDOCK_TOKEN }} ``` -3. Create `SLACK_WEBHOOK` secret using [GitHub Action's Secret](https://developer.github.com/actions/creating-workflows/storing-secrets). You can [generate a Slack incoming webhook token from here](https://slack.com/apps/A0F7XDUAZ-incoming-webhooks). +3. Create `FLOWDOCK_TOKEN` secret using [GitHub Action's Secret](https://developer.github.com/actions/creating-workflows/storing-secrets). ## Environment Variables 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` | The name of the sender of the message. Does not need to be a "real" username -SLACK_ICON | ![rtBot Avatar](https://github.com/rtBot.png?size=32) | User/Bot icon shown with Slack message -SLACK_COLOR | `good` (green) | You can pass an RGB value like `#efefef` which would change color on left side vertical line of 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 +Variable | Default | Purpose +------------------|-------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------- +FLOWDOCK_USERNAME | `fdBot` | The name of the sender of the message. Does not need to be a "real" username +FLOWDOCK_THREAD | Empty | The thread ID you wnt to post the message to +FLOWDOCK_MESSAGE | Generated from git commit message. | The main Flowdock message. +FLOWDOCK_TAGS | Empty | Hash tags to tag the message You can see the action block with all variables as below: ```yml - - name: Slack Notification - uses: rtCamp/action-slack-notify@master + - name: Flowdock Notification + uses: UN-OCHA/gha-flowdock-notify@master env: - SLACK_CHANNEL: general - SLACK_COLOR: '#3278BD' - SLACK_ICON: https://github.com/rtCamp.png?size=48 - SLACK_MESSAGE: 'Post Content :rocket:' - SLACK_TITLE: Post Title - SLACK_USERNAME: rtCamp - SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} + FLOWDOCK_USERNAME: 'Jebb' + FLOWDOCK_THREAD: 'Owc8UJJ5773F-PIdEwK8LtT5QM7' + FLOWDOCK_MESSAGE: 'Post Content :rocket:' + FLOWDOCK_TAGS: 'lol,spam' + FLOWDOCK_TOKEN: ${{ secrets.FLOWDOCK_TOKEN }} ``` -Below screenshot help you visualize message part controlled by different variables: - -Screenshot_2019-03-26_at_5_56_05_PM - -The `Site` and `SSH Host` details are only available if this action is run after [Deploy WordPress GitHub action](https://github.com/rtCamp/action-deploy-wordpress). - ## Hashicorp Vault (Optional) This GitHub action supports [Hashicorp Vault](https://www.vaultproject.io/). @@ -82,31 +66,31 @@ Variable | Purpose `VAULT_ADDR` | [Vault server address](https://www.vaultproject.io/docs/commands/#vault_addr) | `https://example.com:8200` `VAULT_TOKEN` | [Vault token](https://www.vaultproject.io/docs/concepts/tokens.html) | `s.gIX5MKov9TUp7iiIqhrP1HgN` -You will need to change `secrets` line in `slack-notify.yml` file to look like below. +You will need to change `secrets` line in `flowdock-notify.yml` file to look like below. ```yml on: push -name: Slack Notification Demo +name: Flowdock Notification Demo jobs: - slackNotification: - name: Slack Notification + flowdockNotification: + name: Flowdock Notification runs-on: ubuntu-latest steps: - uses: actions/checkout@master - - name: Slack Notification - uses: rtCamp/action-slack-notify@master + - name: Flowdock Notification + uses: UN-OCHA/gha-flowdock-notify@master env: VAULT_ADDR: ${{ secrets.VAULT_ADDR }} VAULT_TOKEN: ${{ secrets.VAULT_TOKEN }} ``` -GitHub action uses `VAULT_TOKEN` to connect to `VAULT_ADDR` to retrieve slack webhook from Vault. +GitHub action uses `VAULT_TOKEN` to connect to `VAULT_ADDR` to retrieve Flowdock token from Vault. -In the Vault, the Slack webhook should be setup as field `webhook` on path `secret/slack`. +In the Vault, the Flowdock token should be setup as field `token` on path `secret/flowdock`. ## License -[MIT](LICENSE) © 2019 rtCamp +[MIT](LICENSE) © 2019 UN-OCHA ## Does this interest you? diff --git a/entrypoint.sh b/entrypoint.sh index a6c6663..76682e6 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash # custom path for files to override default files -custom_path="$GITHUB_WORKSPACE/.github/slack" +custom_path="$GITHUB_WORKSPACE/.github/flowdock" main_script="/main.sh" if [[ -d "$custom_path" ]]; then @@ -9,4 +9,4 @@ if [[ -d "$custom_path" ]]; then chmod +x /*.sh fi -bash "$main_script" \ No newline at end of file +bash "$main_script" diff --git a/main.go b/main.go index d9d560d..3cbb03b 100644 --- a/main.go +++ b/main.go @@ -6,116 +6,48 @@ import ( "fmt" "net/http" "os" + "strings" ) const ( - EnvSlackWebhook = "SLACK_WEBHOOK" - EnvSlackIcon = "SLACK_ICON" - EnvSlackChannel = "SLACK_CHANNEL" - EnvSlackTitle = "SLACK_TITLE" - EnvSlackMessage = "SLACK_MESSAGE" - EnvSlackColor = "SLACK_COLOR" - EnvSlackUserName = "SLACK_USERNAME" - EnvGithubActor = "GITHUB_ACTOR" - EnvSiteName = "SITE_NAME" - EnvHostName = "HOST_NAME" - EnvDepolyPath = "DEPLOY_PATH" + EnvFlowdockToken = "FLOWDOCK_TOKEN" + EnvFlowdockMessage = "FLOWDOCK_MESSAGE" + EnvFlowdockThread = "FLOWDOCK_THREAD" + EnvFlowdockUserName = "FLOWDOCK_USERNAME" + EnvFlowdockTags = "FLOWDOCK_TAGS" + EnvGithubActor = "GITHUB_ACTOR" ) type Webhook struct { - Text string `json:"text,omitempty"` - UserName string `json:"username,omitempty"` - IconURL string `json:"icon_url,omitempty"` - IconEmoji string `json:"icon_emoji,omitempty"` - Channel string `json:"channel,omitempty"` - UnfurlLinks bool `json:"unfurl_links"` - Attachments []Attachment `json:"attachments,omitmepty"` -} - -type Attachment struct { - Fallback string `json:"fallback"` - Pretext string `json:"pretext,omitempty"` - Color string `json:"color,omitempty"` - AuthorName string `json:"author_name,omitempty"` - AuthorLink string `json:"author_link,omitempty"` - AuthorIcon string `json:"author_icon,omitempty"` - Footer string `json:"footer,omitempty"` - Fields []Field `json:"fields,omitempty"` - -} - -type Field struct { - Title string `json:"title,omitempty"` - Value string `json:"value,omitempty"` - Short bool `json:"short,omitempty"` + Event string `json:"event"` + UserName string `json:"external_user_name,omitempty"` + Content string `json:"content,omitempty"` + Thread string `json:"thread_id,omitempty"` + Tags []string `json:"tags,omitempty"` } func main() { - endpoint := os.Getenv(EnvSlackWebhook) - if endpoint == "" { - fmt.Fprintln(os.Stderr, "URL is required") + token := os.Getenv(EnvFlowdockToken) + if token == "" { + fmt.Fprintln(os.Stderr, "Token is required") os.Exit(1) } - text := os.Getenv(EnvSlackMessage) + + endpoint := "https://api.flowdock.com/messages/chat/" + endpoint += token + + text := os.Getenv(EnvFlowdockMessage) if text == "" { fmt.Fprintln(os.Stderr, "Message is required") os.Exit(1) } - fields:= []Field{ - { - Title: "Ref", - Value: os.Getenv("GITHUB_REF"), - Short: true, - }, { - Title: "Event", - Value: os.Getenv("GITHUB_EVENT_NAME"), - Short: true, - }, - { - Title: "Repo Action URL", - Value: "https://github.com/" + os.Getenv("GITHUB_REPOSITORY") + "/actions", - Short: false, - }, - { - Title: os.Getenv(EnvSlackTitle), - Value: envOr(EnvSlackMessage, "EOM"), - Short: false, - }, - } - - 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), - Channel: os.Getenv(EnvSlackChannel), - 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: envOr(EnvSlackColor, "good"), - AuthorName: envOr(EnvGithubActor, ""), - AuthorLink: "http://github.com/" + os.Getenv(EnvGithubActor), - AuthorIcon: "http://github.com/" + os.Getenv(EnvGithubActor) + ".png?size=32", - Footer: "", - Fields: fields, - }, - }, + Event: "message", + UserName: os.Getenv(EnvFlowdockUserName), + Thread: os.Getenv(EnvFlowdockThread), + Content: text, + Tags: strings.Split(os.Getenv(EnvFlowdockTags), ","), } if err := send(endpoint, msg); err != nil { diff --git a/main.sh b/main.sh index dc65597..21dee0a 100644 --- a/main.sh +++ b/main.sh @@ -1,22 +1,13 @@ #!/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 FLOWDOCK_USERNAME=${FLOWDOCK_USERNAME:-"fdBot"} export CI_SCRIPT_OPTIONS="ci_script_options" -export SLACK_TITLE=${SLACK_TITLE:-"Message"} +export FLOWDOCK_MESSAGE=${FLOWDOCK_MESSAGE:-"Message"} export COMMIT_MESSAGE=$(cat "/github/workflow/event.json" | jq .commits | jq '.[0].message' -r) hosts_file="$GITHUB_WORKSPACE/.github/hosts.yml" -if [[ -z "$SLACK_CHANNEL" ]]; then - user_slack_channel=$(cat "$hosts_file" | shyaml get-value "$CI_SCRIPT_OPTIONS.slack-channel" | tr '[:upper:]' '[:lower:]') -fi - -if [[ -n "$user_slack_channel" ]]; then - export SLACK_CHANNEL="$user_slack_channel" -fi - # Login to vault using GH Token if [[ -n "$VAULT_GITHUB_TOKEN" ]]; then unset VAULT_TOKEN @@ -24,7 +15,7 @@ if [[ -n "$VAULT_GITHUB_TOKEN" ]]; then fi if [[ -n "$VAULT_GITHUB_TOKEN" ]] || [[ -n "$VAULT_TOKEN" ]]; then - export SLACK_WEBHOOK=$(vault read -field=webhook secret/slack) + export FLOWDOCK_TOKEN=$(vault read -field=token secret/flowdock) fi if [[ -f "$hosts_file" ]]; then @@ -51,8 +42,8 @@ if [[ -n "$SITE_NAME" ]]; then fi -if [[ -z "$SLACK_MESSAGE" ]]; then - export SLACK_MESSAGE="$COMMIT_MESSAGE" +if [[ -z "$FLOWDOCK_MESSAGE" ]]; then + export FLOWDOCK_MESSAGE="$COMMIT_MESSAGE" fi -slack-notify "$@" +flowdock-notify "$@"