diff --git a/.drone.yml b/.drone.yml index de8452b..4cf3743 100644 --- a/.drone.yml +++ b/.drone.yml @@ -4,22 +4,20 @@ workspace: pipeline: deps: - image: golang:1.10 + image: golang:1.13 pull: true commands: - go get -u github.com/golang/dep/cmd/dep - dep ensure - dep status - test: - image: golang:1.10 + image: golang:1.13 pull: true commands: - go vet ./... - go test -cover ./... - build_linux_amd64: - image: golang:1.10 + image: golang:1.13 pull: true group: build environment: @@ -35,7 +33,7 @@ pipeline: fi build_linux_i386: - image: golang:1.10 + image: golang:1.13 pull: true group: build environment: @@ -51,7 +49,7 @@ pipeline: fi build_linux_arm64: - image: golang:1.10 + image: golang:1.13 pull: true group: build environment: @@ -67,7 +65,7 @@ pipeline: fi build_linux_arm: - image: golang:1.10 + image: golang:1.13 pull: true group: build environment: diff --git a/.gitignore b/.gitignore index ccf8328..8c8d65d 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,5 @@ vendor/ coverage.out drone-slack +run.sh +ghtoslack.json diff --git a/Dockerfile b/Dockerfile index d2ec668..c5d2746 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,8 @@ FROM plugins/base:multiarch -LABEL maintainer="Drone.IO Community " \ +LABEL maintainer="Talky OPS " \ org.label-schema.name="Drone Slack" \ - org.label-schema.vendor="Drone.IO Community" \ - org.label-schema.schema-version="1.0" + org.label-schema.schema-version="2.1.0" ADD release/linux/amd64/drone-slack /bin/ ENTRYPOINT ["/bin/drone-slack"] diff --git a/Gopkg.lock b/Gopkg.lock index 13adf74..af2b99c 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -14,7 +14,7 @@ [[projects]] branch = "master" - name = "github.com/bluele/slack" + name = "github.com/wraithgar/slack" packages = ["."] revision = "7f3862e374f157ad3f23c3092fa23b744d87c68d" @@ -31,7 +31,7 @@ version = "v0.8.0" [[projects]] - name = "github.com/urfave/cli" + name = "github.com/urfave/cli/v2" packages = ["."] revision = "cfb38830724cc34fedffe9a2a29fb54fa9169cd1" version = "v1.20.0" diff --git a/Gopkg.toml b/Gopkg.toml index 4329a89..6c89075 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -1,13 +1,13 @@ [[constraint]] branch = "master" - name = "github.com/bluele/slack" + name = "github.com/wraithgar/slack" [[constraint]] branch = "master" name = "github.com/drone/drone-template-lib" [[constraint]] - name = "github.com/urfave/cli" + name = "github.com/urfave/cli/v2" version = "1.20.0" [prune] diff --git a/README.md b/README.md index f478cb9..fb58f86 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,13 @@ # drone-slack -[![Build Status](http://beta.drone.io/api/badges/drone-plugins/drone-slack/status.svg)](http://beta.drone.io/drone-plugins/drone-slack) -[![Join the discussion at https://discourse.drone.io](https://img.shields.io/badge/discourse-forum-orange.svg)](https://discourse.drone.io) -[![Drone questions at https://stackoverflow.com](https://img.shields.io/badge/drone-stackoverflow-orange.svg)](https://stackoverflow.com/questions/tagged/drone.io) -[![Go Doc](https://godoc.org/github.com/drone-plugins/drone-slack?status.svg)](http://godoc.org/github.com/drone-plugins/drone-slack) -[![Go Report](https://goreportcard.com/badge/github.com/drone-plugins/drone-slack)](https://goreportcard.com/report/github.com/drone-plugins/drone-slack) -[![](https://images.microbadger.com/badges/image/plugins/slack.svg)](https://microbadger.com/images/plugins/slack "Get your own image badge on microbadger.com") - Drone plugin for sending Slack notifications. For the usage information and a listing of the available options please take a look at [the docs](http://plugins.drone.io/drone-plugins/drone-slack/). +## NOTE: + +This is a fork of the original project, customized for Talky Inc. deploy +pipeline. + + ## Build Build the binary with the following commands: diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..19e67a6 --- /dev/null +++ b/build.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -a -tags netgo -o release/linux/amd64/drone-slack \ +&& docker build --rm -t one000mph/drone-slack:$1 . diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..788336f --- /dev/null +++ b/go.mod @@ -0,0 +1,16 @@ +module github.com/one000mph/drone-slack + +go 1.13 + +require ( + github.com/aymerick/raymond v2.0.2+incompatible // indirect + github.com/bluele/slack v0.0.0-20180222052941-7f3862e374f1 // indirect + github.com/drone/drone-template-lib v0.0.0-20180401170447-5748d3149f48 + github.com/google/go-github v17.0.0+incompatible + github.com/google/go-querystring v1.0.0 // indirect + github.com/pkg/errors v0.8.0 // indirect + github.com/urfave/cli v1.20.0 // indirect + github.com/urfave/cli/v2 v2.1.1 + github.com/wraithgar/slack v0.0.0-20181102160856-1cbcbe076455 + golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..c21e173 --- /dev/null +++ b/go.sum @@ -0,0 +1,40 @@ +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/aymerick/raymond v2.0.2+incompatible h1:VEp3GpgdAnv9B2GFyTvqgcKvY+mfKMjPOA3SbKLtnU0= +github.com/aymerick/raymond v2.0.2+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= +github.com/bluele/slack v0.0.0-20180222052941-7f3862e374f1/go.mod h1:W679Ri2W93VLD8cVpEY/zLH1ow4zhJcCyjzrKxfM3QM= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/drone/drone-template-lib v0.0.0-20180401170447-5748d3149f48 h1:hP2l5isqaiJVvOUM8X/1WDNeeJKlVmM8I1B9aDNT/xw= +github.com/drone/drone-template-lib v0.0.0-20180401170447-5748d3149f48/go.mod h1:u34woe41m58Whrf21iH6z/xLOIRM3650LhWAyUc7Oik= +github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY= +github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= +github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= +github.com/urfave/cli/v2 v2.1.1 h1:Qt8FeAtxE/vfdrLmR3rxR6JRE0RoVmbXu8+6kZtYU4k= +github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= +github.com/wraithgar/slack v0.0.0-20181102160856-1cbcbe076455 h1:O0vqZyvv6It15xkN5PAdHuA27DsMvIOZkd8CcO83nPU= +github.com/wraithgar/slack v0.0.0-20181102160856-1cbcbe076455/go.mod h1:+CvmelyVX0sGu36WYIM9Jrl11pgsNlk9qkIIruw+52o= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e h1:bRhVy7zSSasaqNksaRZiA5EEI+Ei4I1nO5Jh72wfHlg= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/main.go b/main.go index 32a0231..1add5cd 100644 --- a/main.go +++ b/main.go @@ -2,158 +2,185 @@ package main import ( "fmt" - "os" "log" + "os" - "github.com/urfave/cli" + "github.com/urfave/cli/v2" ) var ( - version = "0.0.0" - build = "0" + version = "2.1.0" + build = "5" ) func main() { + app := cli.NewApp() app.Name = "slack plugin" app.Usage = "slack plugin" app.Action = run app.Version = fmt.Sprintf("%s+%s", version, build) app.Flags = []cli.Flag{ - cli.StringFlag{ - Name: "webhook", - Usage: "slack webhook url", - EnvVar: "SLACK_WEBHOOK,PLUGIN_WEBHOOK", - }, - cli.StringFlag{ - Name: "channel", - Usage: "slack channel", - EnvVar: "PLUGIN_CHANNEL", - }, - cli.StringFlag{ - Name: "recipient", - Usage: "slack recipient", - EnvVar: "PLUGIN_RECIPIENT", - }, - cli.StringFlag{ - Name: "username", - Usage: "slack username", - EnvVar: "PLUGIN_USERNAME", - }, - cli.StringFlag{ - Name: "template", - Usage: "slack template", - EnvVar: "PLUGIN_TEMPLATE", - }, - cli.BoolFlag{ - Name: "link-names", - Usage: "slack link names", - EnvVar: "PLUGIN_LINK_NAMES", - }, - cli.StringFlag{ - Name: "image", - Usage: "slack image url", - EnvVar: "PLUGIN_IMAGE_URL", - }, - cli.StringFlag{ - Name: "icon.url", - Usage: "slack icon url", - EnvVar: "PLUGIN_ICON_URL", - }, - cli.StringFlag{ - Name: "icon.emoji", - Usage: "slack emoji url", - EnvVar: "PLUGIN_ICON_EMOJI", - }, - cli.StringFlag{ - Name: "repo.owner", - Usage: "repository owner", - EnvVar: "DRONE_REPO_OWNER", - }, - cli.StringFlag{ - Name: "repo.name", - Usage: "repository name", - EnvVar: "DRONE_REPO_NAME", - }, - cli.StringFlag{ - Name: "commit.sha", - Usage: "git commit sha", - EnvVar: "DRONE_COMMIT_SHA", - Value: "00000000", - }, - cli.StringFlag{ - Name: "commit.ref", - Value: "refs/heads/master", - Usage: "git commit ref", - EnvVar: "DRONE_COMMIT_REF", - }, - cli.StringFlag{ - Name: "commit.branch", - Value: "master", - Usage: "git commit branch", - EnvVar: "DRONE_COMMIT_BRANCH", - }, - cli.StringFlag{ - Name: "commit.author", - Usage: "git author name", - EnvVar: "DRONE_COMMIT_AUTHOR", - }, - cli.StringFlag{ - Name: "commit.pull", - Usage: "git pull request", - EnvVar: "DRONE_PULL_REQUEST", - }, - cli.StringFlag{ - Name: "commit.message", - Usage: "commit message", - EnvVar: "DRONE_COMMIT_MESSAGE", - }, - cli.StringFlag{ - Name: "build.event", - Value: "push", - Usage: "build event", - EnvVar: "DRONE_BUILD_EVENT", - }, - cli.IntFlag{ - Name: "build.number", - Usage: "build number", - EnvVar: "DRONE_BUILD_NUMBER", - }, - cli.StringFlag{ - Name: "build.status", - Usage: "build status", - Value: "success", - EnvVar: "DRONE_BUILD_STATUS", - }, - cli.StringFlag{ - Name: "build.link", - Usage: "build link", - EnvVar: "DRONE_BUILD_LINK", - }, - cli.Int64Flag{ - Name: "build.started", - Usage: "build started", - EnvVar: "DRONE_BUILD_STARTED", - }, - cli.Int64Flag{ - Name: "build.created", - Usage: "build created", - EnvVar: "DRONE_BUILD_CREATED", - }, - cli.StringFlag{ - Name: "build.tag", - Usage: "build tag", - EnvVar: "DRONE_TAG", - }, - cli.StringFlag{ - Name: "build.deployTo", - Usage: "environment deployed to", - EnvVar: "DRONE_DEPLOY_TO", - }, - cli.Int64Flag{ - Name: "job.started", - Usage: "job started", - EnvVar: "DRONE_JOB_STARTED", + &cli.StringFlag{ + Name: "webhook", + Usage: "slack webhook url", + EnvVars: []string{"SLACK_WEBHOOK", "PLUGIN_SLACK_WEBHOOK,"}, + }, + &cli.StringFlag{ + Name: "ghtoken", + Usage: "github access token", + EnvVars: []string{"GITHUB_ACCESS_TOKEN", "PLUGIN_GITHUB_ACCESS_TOKEN"}, + }, + &cli.StringFlag{ + Name: "ghtoslacks", + Usage: "github_slack_lookup", + EnvVars: []string{"GITHUB_SLACK_LOOKUP", "PLUGIN_GITHUB_SLACK_LOOKUP"}, + }, + &cli.StringFlag{ + Name: "channel", + Usage: "slack channel", + EnvVars: []string{"PLUGIN_CHANNEL"}, + }, + &cli.StringFlag{ + Name: "recipient", + Usage: "slack recipient", + EnvVars: []string{"PLUGIN_RECIPIENT"}, + }, + &cli.StringFlag{ + Name: "username", + Usage: "slack username", + EnvVars: []string{"PLUGIN_USERNAME"}, + }, + &cli.StringFlag{ + Name: "template", + Usage: "slack template", + EnvVars: []string{"PLUGIN_TEMPLATE"}, + }, + &cli.BoolFlag{ + Name: "link-names", + Usage: "slack link names", + EnvVars: []string{"PLUGIN_LINK_NAMES"}, + }, + &cli.StringFlag{ + Name: "image", + Usage: "slack image url", + EnvVars: []string{"PLUGIN_IMAGE_URL"}, + }, + &cli.StringFlag{ + Name: "icon.url", + Usage: "slack icon url", + EnvVars: []string{"PLUGIN_ICON_URL"}, + }, + &cli.StringFlag{ + Name: "icon.emoji", + Usage: "slack emoji url", + EnvVars: []string{"PLUGIN_ICON_EMOJI"}, + }, + &cli.StringFlag{ + Name: "repo.owner", + Usage: "repository owner", + EnvVars: []string{"DRONE_REPO_OWNER"}, + }, + &cli.StringFlag{ + Name: "repo.name", + Usage: "repository name", + EnvVars: []string{"DRONE_REPO_NAME"}, + }, + &cli.StringFlag{ + Name: "commit.sha", + Usage: "git commit sha", + EnvVars: []string{"DRONE_COMMIT_SHA"}, + Value: "00000000", + }, + &cli.StringFlag{ + Name: "commit.link", + Usage: "git commit link", + EnvVars: []string{"DRONE_COMMIT_LINK"}, + }, + &cli.StringFlag{ + Name: "commit.ref", + Value: "refs/heads/master", + Usage: "git commit ref", + EnvVars: []string{"DRONE_COMMIT_REF"}, + }, + &cli.StringFlag{ + Name: "commit.branch", + Value: "master", + Usage: "git commit branch", + EnvVars: []string{"DRONE_COMMIT_BRANCH"}, + }, + &cli.StringFlag{ + Name: "commit.author", + Usage: "git author name", + EnvVars: []string{"DRONE_COMMIT_AUTHOR"}, + }, + &cli.StringFlag{ + Name: "commit.pull", + Usage: "git pull request", + EnvVars: []string{"DRONE_PULL_REQUEST"}, + }, + &cli.StringFlag{ + Name: "commit.message", + Usage: "commit message", + EnvVars: []string{"DRONE_COMMIT_MESSAGE"}, + }, + &cli.StringFlag{ + Name: "build.event", + Value: "push", + Usage: "build event", + EnvVars: []string{"DRONE_BUILD_EVENT"}, + }, + &cli.IntFlag{ + Name: "build.number", + Usage: "build number", + EnvVars: []string{"DRONE_BUILD_NUMBER"}, + }, + &cli.StringFlag{ + Name: "build.status", + Usage: "build status", + Value: "success", + EnvVars: []string{"DRONE_BUILD_STATUS"}, + }, + &cli.StringFlag{ + Name: "build.prevstatus", + Usage: "build previous status", + Value: "success", + EnvVars: []string{"DRONE_PREV_BUILD_STATUS"}, + }, + &cli.StringFlag{ + Name: "build.link", + Usage: "build link", + EnvVars: []string{"DRONE_BUILD_LINK"}, + }, + &cli.Int64Flag{ + Name: "build.started", + Usage: "build started", + EnvVars: []string{"DRONE_BUILD_STARTED"}, + }, + &cli.Int64Flag{ + Name: "build.created", + Usage: "build created", + EnvVars: []string{"DRONE_BUILD_CREATED"}, + }, + &cli.StringFlag{ + Name: "build.tag", + Usage: "build tag", + EnvVars: []string{"DRONE_TAG"}, + }, + &cli.StringFlag{ + Name: "build.deployTo", + Usage: "environment deployed to", + EnvVars: []string{"DRONE_DEPLOY_TO"}, + }, + &cli.StringFlag{ + Name: "build.deployID", + Usage: "github deployment id", + EnvVars: []string{"DRONE_DEPLOY_ID"}, + }, + &cli.Int64Flag{ + Name: "job.started", + Usage: "job started", + EnvVars: []string{"DRONE_JOB_STARTED"}, }, } @@ -169,34 +196,39 @@ func run(c *cli.Context) error { Name: c.String("repo.name"), }, Build: Build{ - Tag: c.String("build.tag"), - Number: c.Int("build.number"), - Event: c.String("build.event"), - Status: c.String("build.status"), - Commit: c.String("commit.sha"), - Ref: c.String("commit.ref"), - Branch: c.String("commit.branch"), - Author: c.String("commit.author"), - Pull: c.String("commit.pull"), - Message: c.String("commit.message"), - DeployTo: c.String("build.deployTo"), - Link: c.String("build.link"), - Started: c.Int64("build.started"), - Created: c.Int64("build.created"), + Tag: c.String("build.tag"), + Number: c.Int("build.number"), + Event: c.String("build.event"), + Status: c.String("build.status"), + PrevStatus: c.String("build.prevstatus"), + Commit: c.String("commit.sha"), + CommitLink: c.String("commit.link"), + Ref: c.String("commit.ref"), + Branch: c.String("commit.branch"), + Author: c.String("commit.author"), + Pull: c.String("commit.pull"), + Message: c.String("commit.message"), + DeployTo: c.String("build.deployTo"), + DeployID: c.Int64("build.deployID"), + Link: c.String("build.link"), + Started: c.Int64("build.started"), + Created: c.Int64("build.created"), }, Job: Job{ Started: c.Int64("job.started"), }, Config: Config{ - Webhook: c.String("webhook"), - Channel: c.String("channel"), - Recipient: c.String("recipient"), - Username: c.String("username"), - Template: c.String("template"), - ImageURL: c.String("image"), - IconURL: c.String("icon.url"), - IconEmoji: c.String("icon.emoji"), - LinkNames: c.Bool("link_names"), + GhToken: c.String("ghtoken"), + GhToSlackJSON: c.String("ghtoslacks"), + Webhook: c.String("webhook"), + Channel: c.String("channel"), + Recipient: c.String("recipient"), + Username: c.String("username"), + Template: c.String("template"), + ImageURL: c.String("image"), + IconURL: c.String("icon.url"), + IconEmoji: c.String("icon.emoji"), + LinkNames: c.Bool("link_names"), }, } diff --git a/plugin.go b/plugin.go index f9f8c1b..4311021 100644 --- a/plugin.go +++ b/plugin.go @@ -1,11 +1,15 @@ package main import ( + "context" + "encoding/json" "fmt" "strings" - "github.com/bluele/slack" "github.com/drone/drone-template-lib/template" + "github.com/google/go-github/github" + "github.com/wraithgar/slack" + "golang.org/x/oauth2" ) type ( @@ -15,32 +19,37 @@ type ( } Build struct { - Tag string - Event string - Number int - Commit string - Ref string - Branch string - Author string - Pull string - Message string - DeployTo string - Status string - Link string - Started int64 - Created int64 + Tag string + Event string + Number int + Commit string + CommitLink string + Ref string + Branch string + Author string + Pull string + Message string + DeployTo string + DeployID int64 + Status string + PrevStatus string + Link string + Started int64 + Created int64 } Config struct { - Webhook string - Channel string - Recipient string - Username string - Template string - ImageURL string - IconURL string - IconEmoji string - LinkNames bool + Webhook string + Channel string + Recipient string + Username string + Template string + ImageURL string + IconURL string + IconEmoji string + LinkNames bool + GhToken string + GhToSlackJSON string } Job struct { @@ -53,9 +62,21 @@ type ( Config Config Job Job } + + //Custom payload object from andbang deploy event + DeploymentPayload struct { + ResponseURL string `json:"response_url,omitempty"` + Person string `json:"person,omitempty"` + } + + GhToSlack struct { + Github string `json:"github"` + Slack string `json:"slack"` + } ) func (p Plugin) Exec() error { + fmt.Printf("talky custom drone-slack version %s build %s\n", version, build) attachment := slack.Attachment{ Text: message(p.Repo, p.Build), Fallback: fallback(p.Repo, p.Build), @@ -64,32 +85,83 @@ func (p Plugin) Exec() error { ImageURL: p.Config.ImageURL, } + if p.Config.Template != "" { + txt, err := template.RenderTrim(p.Config.Template, p) + + if err != nil { + return err + } + + attachment.Text = txt + } + + fmt.Printf("Build event: %s\n", p.Build.Event) + if p.Build.Event == "promote" { + //Send a delayed response if we have a response url + deployPayload, err := getDeploymentPayload(p.Config, p.Repo, p.Build) + if err != nil { + return err + } + response := slack.ResponsePayload{} + + response.Attachments = []*slack.Attachment{&attachment} + if p.Config.LinkNames == true { + response.LinkNames = "1" + } + fmt.Printf("%+v\n", response.Attachments) + // return err + delayedClient := slack.NewDelayedResponse(deployPayload.ResponseURL) + return delayedClient.PostDelayedResponse(&response) + } + + //Send a webhook message payload := slack.WebHookPostPayload{} payload.Username = p.Config.Username payload.Attachments = []*slack.Attachment{&attachment} payload.IconUrl = p.Config.IconURL payload.IconEmoji = p.Config.IconEmoji + payload.Attachments = []*slack.Attachment{&attachment} - if p.Config.Recipient != "" { - payload.Channel = prepend("@", p.Config.Recipient) - } else if p.Config.Channel != "" { - payload.Channel = prepend("#", p.Config.Channel) - } - if p.Config.LinkNames == true { - payload.LinkNames = "1" - } - if p.Config.Template != "" { - txt, err := template.RenderTrim(p.Config.Template, p) + //These are the only cases we care about + if p.Build.Event == "tag" || p.Build.Status == "failure" || p.Build.PrevStatus == "failure" { + if p.Config.GhToSlackJSON != "" { + var ghtoslacks []GhToSlack + jsonerr := json.Unmarshal([]byte(p.Config.GhToSlackJSON), &ghtoslacks) + if jsonerr != nil { + fmt.Println(jsonerr) + } else { + for _, v := range ghtoslacks { + if v.Github == p.Build.Author { + payload.Channel = prepend("@", v.Slack) + fmt.Printf("%s", payload.Channel) + } + } + } + } else { + fmt.Println("GhToSlackJSON not found") + } - if err != nil { - return err + if payload.Channel == "" { + if p.Config.Recipient != "" { + fmt.Printf("%s", p.Config.Recipient) + payload.Channel = prepend("@", p.Config.Recipient) + } else if p.Config.Channel != "" { + payload.Channel = prepend("#", p.Config.Channel) + } } - attachment.Text = txt + if p.Config.LinkNames == true { + payload.LinkNames = "1" + } + + fmt.Printf("sending webhook message to %s\n", payload.Channel) + client := slack.NewWebHook(p.Config.Webhook) + return client.PostMessage(&payload) } - client := slack.NewWebHook(p.Config.Webhook) - return client.PostMessage(&payload) + fmt.Println("Not sending this one to slack") + fmt.Println(attachment.Text) + return nil } func message(repo Repo, build Build) string { @@ -133,3 +205,29 @@ func prepend(prefix, s string) string { return s } + +func getDeploymentPayload(config Config, repo Repo, build Build) (DeploymentPayload, error) { + var payload DeploymentPayload + ctx := context.Background() + ts := oauth2.StaticTokenSource( + &oauth2.Token{AccessToken: config.GhToken}, + ) + tc := oauth2.NewClient(ctx, ts) + client := github.NewClient(tc) + parts := strings.Split(build.Link, "/") + owner := parts[3] + name := parts[4] + id := build.DeployID + + deployment, _, gherr := client.Repositories.GetDeployment(ctx, owner, name, id) + if gherr != nil { + fmt.Println(gherr) + return payload, gherr + } + jsonerr := json.Unmarshal(deployment.Payload, &payload) + if jsonerr != nil { + fmt.Println(jsonerr) + return payload, jsonerr + } + return payload, nil +}