Compare commits

..

4 Commits

Author SHA1 Message Date
lddsb b54a0fc981 fix: patch for k8s missing env 2020-04-29 11:04:24 +08:00
lddsb b7390525e1 fix: default image cdn url 2020-01-20 11:34:31 +08:00
lddsb 9df9c9aa37 add tips title option 2019-11-07 21:40:28 +08:00
lddsb f931e70cc7 compatible full token url as token parameter 2019-09-24 09:26:28 +08:00
13 changed files with 304 additions and 713 deletions
+37 -11
View File
@@ -9,7 +9,7 @@ steps:
commands: commands:
- make vet - make vet
environment: environment:
GO111MODULE: "on" GO111MODULE: on
volumes: volumes:
- name: gopath - name: gopath
path: /go path: /go
@@ -21,7 +21,7 @@ steps:
- make test - make test
- make coverage - make coverage
environment: environment:
GO111MODULE: "on" GO111MODULE: on
volumes: volumes:
- name: gopath - name: gopath
path: /go path: /go
@@ -37,13 +37,9 @@ volumes:
- name: gopath - name: gopath
temp: {} temp: {}
trigger:
event:
- pull_request
--- ---
kind: pipeline kind: pipeline
name: dryrun name: build
steps: steps:
- name: build - name: build
@@ -53,7 +49,13 @@ steps:
- go build -a -o drone-dingtalk-message . - go build -a -o drone-dingtalk-message .
environment: environment:
CGO_ENABLED: 0 CGO_ENABLED: 0
GO111MODULE: "on" GO111MODULE: on
- name: executable
pull: always
image: golang
commands:
- ./drone-dingtalk-message -h
- name: dryrun - name: dryrun
pull: always pull: always
@@ -61,15 +63,39 @@ steps:
settings: settings:
cache_from: lddsb/drone-dingtalk-message cache_from: lddsb/drone-dingtalk-message
dockerfile: Dockerfile dockerfile: Dockerfile
dry_run: true dryrun: true
repo: lddsb/drone-dingtalk-message repo: lddsb/drone-dingtalk-message
tags: tags:
- latest - latest
- 1.0.0 - 1.0.0
when:
event:
- pull_request
- name: publish
pull: always
image: plugins/docker
settings:
repo: lddsb/drone-dingtalk-message
dockerfile: Dockerfile
tags:
- latest
- 1.0.0
username:
from_secret: docker_username
password:
from_secret: docker_password
when:
status:
- success
event:
- tag
trigger: trigger:
event: ref:
- pull_request - refs/heads/master
- 'refs/pull/**'
- 'refs/tags/**'
depends_on: depends_on:
- testing - testing
-2
View File
@@ -1,2 +0,0 @@
[*.y*ml]
indent_size = 2
+1 -3
View File
@@ -2,6 +2,4 @@ dive.log
drone-dingtalk-message drone-dingtalk-message
.idea .idea
vendor vendor
coverage.txt coverage.txt
coverage.out
env.list
+11 -5
View File
@@ -1,11 +1,17 @@
FROM golang AS builder FROM golang AS builder
WORKDIR /app WORKDIR /app
COPY . . COPY . .
RUN GO111MODULE=on CGO_ENABLED=0 GOOS=linux go build -a -o drone-dingtalk . ENV GO111MODULE on
ENV CGO_ENABLED 0
ENV GOOS linux
RUN go build -a -o drone-dingtalk .
FROM alpine:latest FROM alpine:latest
RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/* RUN apk update && \
COPY --from=builder /app/drone-dingtalk /bin apk add \
COPY --from=builder /app/tpls /app/tpls ca-certificates && \
rm -rf /var/cache/apk/*
ENTRYPOINT ["/bin/drone-dingtalk"] COPY --from=builder /app/drone-dingtalk /bin/
ENTRYPOINT ["/bin/drone-dingtalk"]
+31 -86
View File
@@ -1,9 +1,6 @@
# Drone CI DingTalk Message Plugin # Drone CI DingTalk Message Plugin
[![Docker Cloud Build Status](https://img.shields.io/docker/cloud/build/lddsb/drone-dingtalk-message)](https://hub.docker.com/r/lddsb/drone-dingtalk-message) [![Go Report Card](https://goreportcard.com/badge/github.com/lddsb/drone-dingtalk-message)](https://goreportcard.com/report/github.com/lddsb/drone-dingtalk-message) [![codecov](https://codecov.io/gh/lddsb/drone-dingtalk-message/branch/master/graph/badge.svg)](https://codecov.io/gh/lddsb/drone-dingtalk-message) [![Dependabot](https://api.dependabot.com/badges/status?host=github&repo=lddsb/drone-dingtalk-message&identifier=159822771)](https://app.dependabot.com/accounts/lddsb/repos/159822771) [![LICENSE: MIT](https://img.shields.io/github/license/lddsb/drone-dingtalk-message.svg?style=flat-square)](LICENSE) [![Build Status](https://drone.lddsb.com/api/badges/lddsb/drone-dingtalk-message/status.svg)](https://drone.lddsb.com/lddsb/drone-dingtalk-message) [![Go Report Card](https://goreportcard.com/badge/github.com/lddsb/drone-dingtalk-message)](https://goreportcard.com/report/github.com/lddsb/drone-dingtalk-message) [![codecov](https://codecov.io/gh/lddsb/drone-dingtalk-message/branch/master/graph/badge.svg)](https://codecov.io/gh/lddsb/drone-dingtalk-message) [![codebeat badge](https://codebeat.co/badges/23f68b84-1fd2-4f29-8467-9285c1e0facc)](https://codebeat.co/projects/github-com-lddsb-drone-dingtalk-message-master) [![LICENSE: MIT](https://img.shields.io/github/license/lddsb/drone-dingtalk-message.svg?style=flat-square)](LICENSE)
[中文说明](README_ZH.md)
just support `text`, `markdown` and `link` type now
### Drone CI Plugin Config ### Drone CI Plugin Config
`0.8.x` `0.8.x`
```yaml ```yaml
@@ -27,7 +24,6 @@ steps:
settings: settings:
token: your-groupbot-token token: your-groupbot-token
type: markdown type: markdown
secret: your-secret-for-generate-sign
``` ```
@@ -40,95 +36,38 @@ String. Access token for group bot. (you can get the access token when you add a
String. Message type, plan support text, markdown, link and action card, but due to time issue, it's only support `markdown` and `text` now, and you can get the best experience by use markdown. String. Message type, plan support text, markdown, link and action card, but due to time issue, it's only support `markdown` and `text` now, and you can get the best experience by use markdown.
`secret`
String. Secret for generate sign.
`tpl`
String. Your custom `tpl`, it can be a local path or a remote http link.
`tips_title` `tips_title`
String. You can customize the title for the message tips, just work when message type is markdown. String. You can customize the title for the message tips, just work when message type is markdown.
`success_color` `message_color`(when `type=markdown`)
Boolean value. This option can change the title and commit message color if turn on.
`success_color`(when `message_color=true`)
String. You can customize the color for the `build success` message by this option, you should input a hex color, example: `008000`. String. You can customize the color for the `build success` message by this option, you should input a hex color, example: `008000`.
`failure_color` `failure_color`(when `message_color=true`)
String. You can customize the color for the `build success` message by this option, you should input a hex color, example: `FF0000`. String. You can customize the color for the `build success` message by this option, you should input a hex color, example: `FF0000`.
`success_pic` `sha_link`(when `type=markdown`)
Boolean value. This option can link the sha to your source page when it turn on.
`message_pic`(when `type=markdown`)
Boolean value. If this option turn on, it will embed a image into the message.
`success_pic`(when `message_pic=true`)
String. You can customize the picture for the `build success` message by this option. String. You can customize the picture for the `build success` message by this option.
`failure_pic` `failure_pic`(when `message_pic=true`)
String. You can customize the picture for the `build failure` message by this option. String. You can customize the picture for the `build failure` message by this option.
`tpl_commit_branch_name`
String. You can customize the [TPL_COMMIT_BRANCH] by this configuration item.
`tpl_repo_short_name`
String. You can customize the [TPL_REPO_SHORT_NAME] by this configuration item.
`tpl_repo_full_name`
String. You can customize the [TPL_REPO_FULL_NAME] by this configuration item.
`tpl_build_status_success`
String. You can customize the [TPL_BUILD_STATUS] (when status=`success`) by this configuration item.
`tpl_build_status_failure`
String. You can customize the [TPL_BUILD_STATUS] (when status=`failure`) by this configuration item.
### TPL
> `tpl` won't work with message type `link` !!!
That's a good news, we support `tpl` now.This is a example for `markdown` message:
# [TPL_REPO_FULL_NAME] build [TPL_BUILD_STATUS], takes [TPL_BUILD_CONSUMING]s
[TPL_COMMIT_MSG]
[TPL_COMMIT_SHA]([TPL_COMMIT_LINK])
[[TPL_AUTHOR_NAME]([TPL_AUTHOR_EMAIL])](mailto:[TPL_AUTHOR_EMAIL])
[Click To The Build Detail Page [TPL_STATUS_EMOTICON)]]([TPL_BUILD_LINK])
You can write your own `tpl` what you want. The syntax of `tpl` is very simple, you can fill `tpl` with preset variables. It's a list of currently supported preset variables:
| Variable | Value |
| :-------------------: | :-------------------------------------------------: |
| [TPL_REPO_SHORT_NAME] | current repo name(bare name) |
| [TPL_REPO_FULL_NAME] | the full name(with group name) of current repo |
| [TPL_REPO_GROUP_NAME] | the group name of current repo |
| [TPL_REPO_OWNER_NAME] | the owner name of current repo |
| [TPL_REPO_REMOTE_URL] | the remote url of current repo |
| [TPL_BUILD_STATUS] | current build status(e.g., success, failure) |
| [TPL_BUILD_LINK] | current build link |
| [TPL_BUILD_EVENT] | current build event(e.g., push, pull request, etc.) |
| [TPL_BUILD_CONSUMING] | current build consuming, second |
| [TPL_COMMIT_SHA] | current commit sha |
| [TPL_COMMIT_REF] | current commit ref(e.g., refs/heads/master, etc.) |
| [TPL_COMMIT_LINK] | current commit remote url link |
| [TPL_COMMIT_BRANCH] | current branch name(e.g., dev, etc) |
| [TPL_COMMIT_MSG] | current commit message |
| [TPL_AUTHOR_NAME] | current commit author name |
| [TPL_AUTHOR_EMAIL] | current commit author email |
| [TPL_AUTHOR_USERNAME] | current commit author username |
| [TPL_AUTHOR_AVATAR] | current commit author avatar |
| [TPL_STATUS_PIC] | custom pic for build status |
| [TPL_STATUS_COLOR] | custom color for build status |
| [TPL_STATUS_EMOTICON] | custom emoticon for build status |
### Screen Shot ### Screen Shot
- Send Success - Send Success
@@ -154,22 +93,28 @@ You can write your own `tpl` what you want. The syntax of `tpl` is very simple,
![markdown-massage-customize](https://i.imgur.com/xFrCTZp.jpg) ![markdown-massage-customize](https://i.imgur.com/xFrCTZp.jpg)
### Todo
- Multi-Type
- Multi-Lang
- More User Customization
### Development ### Development
We use `go mod` to manage dependencies, so it's easy to build.
- get this repo - First get this repo
```shell ```shell
$ git clone https://github.com/lddsb/drone-dingtalk-message.git /path/to/you/want go get github.com/lddsb/drone-dingtalk-message
```
- get dependent lib
```shell
dep ensure
``` ```
- build - build
```shell ```shell
$ cd /path/to/you/want && GO111MODULE=on go build . cd $GOPATH/src/github.com/lddsb/drone-dingtalk-message && go build .
``` ```
- run - run
```shell ```shell
$ ./drone-dingtalk-message -h ./drone-dingtalk-message -h
``` ```
### Todo
- implement all message type
-176
View File
@@ -1,176 +0,0 @@
# Drone CI的钉钉群组机器人通知插件
[![Docker Cloud Build Status](https://img.shields.io/docker/cloud/build/lddsb/drone-dingtalk-message)](https://hub.docker.com/r/lddsb/drone-dingtalk-message) [![Go Report Card](https://goreportcard.com/badge/github.com/lddsb/drone-dingtalk-message)](https://goreportcard.com/report/github.com/lddsb/drone-dingtalk-message) [![codecov](https://codecov.io/gh/lddsb/drone-dingtalk-message/branch/master/graph/badge.svg)](https://codecov.io/gh/lddsb/drone-dingtalk-message) [![Dependabot](https://api.dependabot.com/badges/status?host=github&repo=lddsb/drone-dingtalk-message&identifier=159822771)](https://app.dependabot.com/accounts/lddsb/repos/159822771) [![LICENSE: MIT](https://img.shields.io/github/license/lddsb/drone-dingtalk-message.svg?style=flat-square)](LICENSE)
目前仅支持 `text`, `markdown` 以及 `link` 类型的消息,建议使用`markdown`类型。
### 怎么使用本插件
添加一个`step`到你的`.drone.yml`中,下面是简单的例子:
`0.8.x`
```yaml
pipeline:
...
notification:
image: lddsb/drone-dingtalk-message
token: your-group-bot-token
type: markdown
```
`1.0.x`
```yaml
kind: pipeline
name: default
steps:
...
- name: notification
image: lddsb/drone-dingtalk-message
settings:
token: your-groupbot-token
type: markdown
secret: your-secret-for-generate-sign
```
### 插件参数
`token`(必须)
你可以通过加入和创建一个群组来添加钉钉自定义机器人,添加自定义机器人完成后即可获得所需要的`access token`
`type`(必须)
消息类型,因个人能力有限,目前仅支持`markdown``text`,其中,使用`markdown`可以获得最好的体验。
`secret`
如果你设置了`加签`,可以把你的`加签`密钥填入此项完成`加签`操作。
`tpl`
你可以通过该字段来自定义你的消息模版。该字段可以是一个本地路径也可以是一个远程的URL。
`tips_title`
你可以通过该字段自定义钉钉机器人的消息通知提醒标题。(注意,不是消息内容的标题,是收到钉钉机器人发的消息后,会有一个外显的标题)
`success_color`
你可以通过该字段自定义打包成功的颜色。比如:`008000`
`failure_color`
你可以通过该字段自定义打包失败的颜色。比如:`FF0000`
`success_pic`
你可以通过该字段自定义打包成功的图片。
`failure_pic`
字符串,你可以通过该字段自定义打包失败的图片。
`tpl_commit_branch_name`
你可以通过该字段自定义分支的名称,可以在模版中通过[TPL_COMMIT_BRANCH]来使用该值。
`tpl_repo_short_name`
你可以通过该字段自定义仓库的名字,可以在模版中通过[TPL_REPO_SHORT_NAME]来使用该值。
`tpl_repo_full_name`
你可以通过该字段自定义仓库的全名(包含组织名称),可以在模版中通过[TPL_REPO_FULL_NAME]来使用该值。
`tpl_build_status_success`
你可以通过该字段自定义运行成功状态的值,可以在模版中通过[TPL_BUILD_STATUS]来使用该值。(仅当前方`step`运行结果为成功时该值会生效)
`tpl_build_status_failure`
你可以通过该字段自定义运行失败状态的值,可以在模版中通过[TPL_BUILD_STATUS]来使用该值。(仅当前方`step`运行结果为失败时该值会生效)
### 模版
> `tpl` 对 `link` 类型的消息并不支持 !!!
感天动地,我们终于支持自定义模版了!下面是一个`markdown`的自定义模版例子:
# [TPL_REPO_FULL_NAME] build [TPL_BUILD_STATUS], takes [TPL_BUILD_CONSUMING]s
[TPL_COMMIT_MSG]
[TPL_COMMIT_SHA]([TPL_COMMIT_LINK])
[[TPL_AUTHOR_NAME]([TPL_AUTHOR_EMAIL])](mailto:[TPL_AUTHOR_EMAIL])
[Click To The Build Detail Page [TPL_STATUS_EMOTICON)]]([TPL_BUILD_LINK])
你可以写自己喜欢的模版,终于不用再对着默认模版发愁啦!并且模版的语法非常简单!比较可惜的是目前支持的变量还比较少,下面是当前支持的变量的列表:
| Variable | Value |
| :-------------------: | :-------------------------------------------------: |
| [TPL_REPO_SHORT_NAME] | current repo name(bare name) |
| [TPL_REPO_FULL_NAME] | the full name(with group name) of current repo |
| [TPL_REPO_GROUP_NAME] | the group name of current repo |
| [TPL_REPO_OWNER_NAME] | the owner name of current repo |
| [TPL_REPO_REMOTE_URL] | the remote url of current repo |
| [TPL_BUILD_STATUS] | current build status(e.g., success, failure) |
| [TPL_BUILD_LINK] | current build link |
| [TPL_BUILD_EVENT] | current build event(e.g., push, pull request, etc.) |
| [TPL_BUILD_CONSUMING] | current build consuming, second |
| [TPL_COMMIT_SHA] | current commit sha |
| [TPL_COMMIT_REF] | current commit ref(e.g., refs/heads/master, etc.) |
| [TPL_COMMIT_LINK] | current commit remote url link |
| [TPL_COMMIT_BRANCH] | current branch name(e.g., dev, etc) |
| [TPL_COMMIT_MSG] | current commit message |
| [TPL_AUTHOR_NAME] | current commit author name |
| [TPL_AUTHOR_EMAIL] | current commit author email |
| [TPL_AUTHOR_USERNAME] | current commit author username |
| [TPL_AUTHOR_AVATAR] | current commit author avatar |
| [TPL_STATUS_PIC] | custom pic for build status |
| [TPL_STATUS_COLOR] | custom color for build status |
| [TPL_STATUS_EMOTICON] | custom emoticon for build status |
### 截图展示
- 发送成功(Drone Web
![send-success](https://i.imgur.com/cECppkW.jpg)
- 忘记填写Access TokenDrone Web
![missing-access-token](https://i.imgur.com/Su7iiyw.jpg)
- 忘记填写消息类型或者不支持的消息类型
![message-type-error](https://i.imgur.com/qtJ4DsA.jpg)
- 默认的`markdown`消息
![markdown-message-default](https://i.imgur.com/Bl7cT1y.jpg)
- 带颜色和链接的`markdown`消息
![markdown-massage-customize](https://i.imgur.com/pzdFzIw.jpg)
- 带颜色、链接和图片的`markdown`消息
![markdown-massage-customize](https://i.imgur.com/xFrCTZp.jpg)
### 贡献代码
本项目使用了`go mod`来管理依赖,因此要编译本项目相当简单。
- 先把项目代码拷贝到本地
```shell
$ git clone https://github.com/lddsb/drone-dingtalk-message.git /path/to/you/want
```
- 然后直接执行编译即可
```shell
$ cd /path/to/you/want && GO111MODULE=on go build .
```
- 跑个`help`
```shell
$ ./drone-dingtalk-message -h
```
### 待办
- 实现更多的消息类型
+2 -2
View File
@@ -4,6 +4,6 @@ go 1.12
require ( require (
github.com/joho/godotenv v1.3.0 github.com/joho/godotenv v1.3.0
github.com/lddsb/dingtalk-webhook v0.0.4 github.com/lddsb/dingtalk-webhook v0.0.1
github.com/urfave/cli v1.22.2 github.com/urfave/cli v1.20.0
) )
+4 -15
View File
@@ -1,17 +1,6 @@
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
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/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc=
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
github.com/lddsb/dingtalk-webhook v0.0.4 h1:gAJFy66L2gZ5j6kDrHRoz/zQFaNamcObtetNonq76RA= github.com/lddsb/dingtalk-webhook v0.0.1 h1:l4FdTMaRaHnrYfByALukFWK0ru9Rttl0dANg13/SnTI=
github.com/lddsb/dingtalk-webhook v0.0.4/go.mod h1:dwNU75Sog87wJXAFcY5mDFM7eW4hIdX7bNemrN92pH0= github.com/lddsb/dingtalk-webhook v0.0.1/go.mod h1:5E+/sOBb6m+3ztqnZl4danEY3I5FeIwb12v12s9osbw=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
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.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo=
github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
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=
+69 -141
View File
@@ -5,17 +5,17 @@ import (
"log" "log"
"os" "os"
_ "github.com/joho/godotenv/autoload" "github.com/joho/godotenv"
"github.com/urfave/cli" "github.com/urfave/cli"
) )
// Version of cli // Version of cli
var Version = "0.2.1130" var Version = "0.1.1202"
func main() { func main() {
app := cli.NewApp() app := cli.NewApp()
app.Name = "Drone DingTalk Message Plugin" app.Name = "Drone Dingtalk Message Plugin"
app.Usage = "Sending message to DingTalk group by robot using WebHook" app.Usage = "Sending message to Dingtalk group by robot using webhook"
app.Copyright = "© 2018 Dee Luo" app.Copyright = "© 2018 Dee Luo"
app.Authors = []cli.Author{ app.Authors = []cli.Author{
{ {
@@ -31,24 +31,20 @@ func main() {
Usage: "debug mode", Usage: "debug mode",
EnvVar: "PLUGIN_DEBUG", EnvVar: "PLUGIN_DEBUG",
}, },
cli.StringFlag{
Name: "config.tips.title",
Usage: "customize the tips title",
EnvVar: "PLUGIN_TIPS_TITLE",
},
cli.StringFlag{ cli.StringFlag{
Name: "config.token,access_token,token", Name: "config.token,access_token,token",
Usage: "DingTalk webhook access token", Usage: "dingtalk webhook access token",
EnvVar: "PLUGIN_ACCESS_TOKEN,PLUGIN_TOKEN", EnvVar: "PLUGIN_ACCESS_TOKEN,PLUGIN_TOKEN",
}, },
cli.StringFlag{ cli.StringFlag{
Name: "config.secret,secret", Name: "config.lang",
Usage: "DingTalk WebHook secret for generate sign", Value: "zh_CN",
EnvVar: "PLUGIN_SECRET", Usage: "the lang display (zh_CN or en_US, zh_CN is default)",
EnvVar: "PLUGIN_LANG",
}, },
cli.StringFlag{ cli.StringFlag{
Name: "config.message.type,message_type", Name: "config.message.type,message_type",
Usage: "DingTalk message type, like text, markdown, action card, link and feed card...", Usage: "dingtalk message type, like text, markdown, action card, link and feed card...",
EnvVar: "PLUGIN_MSG_TYPE,PLUGIN_TYPE,PLUGIN_MESSAGE_TYPE", EnvVar: "PLUGIN_MSG_TYPE,PLUGIN_TYPE,PLUGIN_MESSAGE_TYPE",
}, },
cli.StringFlag{ cli.StringFlag{
@@ -58,14 +54,9 @@ func main() {
}, },
cli.StringFlag{ cli.StringFlag{
Name: "config.message.at.mobiles", Name: "config.message.at.mobiles",
Usage: "at someone in a DingTalk group need this guy bind's mobile", Usage: "at someone in a dingtalk group need this guy bind's mobile",
EnvVar: "PLUGIN_MSG_AT_MOBILES", EnvVar: "PLUGIN_MSG_AT_MOBILES",
}, },
cli.StringFlag{
Name: "commit.author.username",
Usage: "providers the author username for the current commit",
EnvVar: "DRONE_COMMIT_AUTHOR",
},
cli.StringFlag{ cli.StringFlag{
Name: "commit.author.avatar", Name: "commit.author.avatar",
Usage: "providers the author avatar url for the current commit", Usage: "providers the author avatar url for the current commit",
@@ -103,35 +94,10 @@ func main() {
EnvVar: "DRONE_COMMIT_SHA", EnvVar: "DRONE_COMMIT_SHA",
}, },
cli.StringFlag{ cli.StringFlag{
Name: "commit.ref", Name: "repo.fullname",
Usage: "provider the commit ref for the current build",
EnvVar: "DRONE_COMMIT_REF",
},
cli.StringFlag{
Name: "repo.full.name",
Usage: "providers the full name of the repository", Usage: "providers the full name of the repository",
EnvVar: "DRONE_REPO", EnvVar: "DRONE_REPO",
}, },
cli.StringFlag{
Name: "repo.name",
Usage: "provider the name of the repository",
EnvVar: "DRONE_REPO_NAME",
},
cli.StringFlag{
Name: "repo.group",
Usage: "provider the group of the repository",
EnvVar: "DRONE_REPO_NAMESPACE",
},
cli.StringFlag{
Name: "repo.remote.url",
Usage: "provider the remote url of the repository",
EnvVar: "DRONE_REMOTE_URL",
},
cli.StringFlag{
Name: "repo.owner",
Usage: "provider the owner of the repository",
EnvVar: "DRONE_REPO_OWNER",
},
cli.StringFlag{ cli.StringFlag{
Name: "build.status", Name: "build.status",
Usage: "build status", Usage: "build status",
@@ -144,72 +110,52 @@ func main() {
EnvVar: "DRONE_BUILD_LINK", EnvVar: "DRONE_BUILD_LINK",
}, },
cli.StringFlag{ cli.StringFlag{
Name: "build.event", Name: "config.success.pic.url",
Usage: "build event", Usage: "config success picture url",
EnvVar: "DRONE_BUILD_EVENT",
},
cli.StringFlag{
Name: "build.started",
Usage: "build started",
EnvVar: "DRONE_BUILD_STARTED",
},
cli.StringFlag{
Name: "build.finished",
Usage: "build finished",
EnvVar: "DRONE_BUILD_FINISHED",
},
cli.StringFlag{
Name: "tpl.build.status.success",
Usage: "tpl.build status for replace success",
EnvVar: "TPL_BUILD_STATUS_SUCCESS, PLUGIN_TPL_BUILD_STATUS_SUCCESS",
},
cli.StringFlag{
Name: "tpl.build.status.failure",
Usage: "tpl.build status for replace failure",
EnvVar: "TPL_BUILD_STATUS_FAILURE, PLUGIN_TPL_BUILD_STATUS_FAILURE",
},
cli.StringFlag{
Name: "custom.pic.url.success",
Usage: "custom success picture url",
EnvVar: "SUCCESS_PICTURE_URL,PLUGIN_SUCCESS_PIC", EnvVar: "SUCCESS_PICTURE_URL,PLUGIN_SUCCESS_PIC",
}, },
cli.StringFlag{ cli.StringFlag{
Name: "custom.pic.url.failure", Name: "config.failure.pic.url",
Usage: "custom failure picture url", Usage: "config failure picture url",
EnvVar: "FAILURE_PICTURE_URL,PLUGIN_FAILURE_PIC", EnvVar: "FAILURE_PICTURE_URL,PLUGIN_FAILURE_PIC",
}, },
cli.StringFlag{ cli.StringFlag{
Name: "custom.color.success", Name: "config.success.color",
Usage: "custom success color for title in markdown", Usage: "config success color for title in markdown",
EnvVar: "SUCCESS_COLOR,PLUGIN_SUCCESS_COLOR", EnvVar: "SUCCESS_COLOR,PLUGIN_SUCCESS_COLOR",
}, },
cli.StringFlag{ cli.StringFlag{
Name: "custom.color.failure", Name: "config.failure.color",
Usage: "custom failure color for title in markdown", Usage: "config failure color for title in markdown",
EnvVar: "FAILURE_COLOR,PLUGIN_FAILURE_COLOR", EnvVar: "FAILURE_COLOR,PLUGIN_FAILURE_COLOR",
}, },
cli.StringFlag{ cli.BoolFlag{
Name: "custom.tpl", Name: "config.message.color",
Usage: "custom tpl", Usage: "configure the message with color or not",
EnvVar: "PLUGIN_TPL,PLUGIN_CUSTOM_TPL", EnvVar: "PLUGIN_COLOR,PLUGIN_MESSAGE_COLOR",
},
cli.BoolFlag{
Name: "config.message.pic",
Usage: "configure the message with picture or not",
EnvVar: "PLUGIN_PIC,PLUGIN_MESSAGE_PIC",
},
cli.BoolFlag{
Name: "config.message.sha.link",
Usage: "link sha source page or not",
EnvVar: "PLUGIN_SHA_LINK,PLUGIN_MESSAGE_SHA_LINK",
}, },
cli.StringFlag{ cli.StringFlag{
Name: "tpl.repo.full.name", Name: "config.tips.title",
Usage: "tpl custom repo full name", Usage: "tips title, just work for markdown type message",
EnvVar: "PLUGIN_TPL_REPO_FULL_NAME,TPL_REPO_FULL_NAME", EnvVar: "PLUGIN_TIPS_TITLE",
},
cli.StringFlag{
Name: "tpl.repo.short.name",
Usage: "tpl custom repo short name",
EnvVar: "PLUGIN_TPL_REPO_SHORT_NAME,TPL_REPO_SHORT_NAME",
},
cli.StringFlag{
Name: "tpl.commit.branch.name",
Usage: "tpl custom commit branch name",
EnvVar: "PLUGIN_TPL_COMMIT_BRANCH_NAME,TPL_COMMIT_BRANCH_NAME",
}, },
} }
// patch for k8s missing env
if _, err := os.Stat("/run/drone/env"); err == nil {
godotenv.Overload("/run/drone/env")
}
if err := app.Run(os.Args); nil != err { if err := app.Run(os.Args); nil != err {
log.Println(err) log.Println(err)
} }
@@ -221,73 +167,55 @@ func run(c *cli.Context) {
Drone: Drone{ Drone: Drone{
// repo info // repo info
Repo: Repo{ Repo: Repo{
ShortName: c.String("repo.name"), FullName: c.String("repo.fullname"),
GroupName: c.String("repo.group"),
OwnerName: c.String("repo.owner"),
RemoteURL: c.String("repo.remote.url"),
FullName: c.String("repo.full.name"),
}, },
// build info // build info
Build: Build{ Build: Build{
Status: c.String("build.status"), Status: c.String("build.status"),
Link: c.String("build.link"), Link: c.String("build.link"),
Event: c.String("build.event"),
StartAt: c.Int64("build.started"),
FinishedAt: c.Int64("build.finished"),
}, },
Commit: Commit{ Commit: Commit{
Sha: c.String("commit.sha"), Sha: c.String("commit.sha"),
Branch: c.String("commit.branch"), Branch: c.String("commit.branch"),
Message: c.String("commit.message"), Message: c.String("commit.message"),
Link: c.String("commit.link"), Link: c.String("commit.link"),
Author: CommitAuthor{ Authors: struct {
Avatar: c.String("commit.author.avatar"), Avatar string
Email: c.String("commit.author.email"), Email string
Name: c.String("commit.author.name"), Name string
Username: c.String("commit.author.username"), }{
Avatar: c.String("commit.author.avatar"),
Email: c.String("commit.author.email"),
Name: c.String("commit.author.name"),
}, },
}, },
}, },
// custom config // custom config
Config: Config{ Config: Config{
AccessToken: c.String("config.token"), AccessToken: c.String("config.token"),
Secret: c.String("config.secret"), //Lang: c.String("config.lang"),
IsAtALL: c.Bool("config.message.at.all"), IsAtALL: c.Bool("config.message.at.all"),
MsgType: c.String("config.message.type"), MsgType: c.String("config.message.type"),
Mobiles: c.String("config.message.at.mobiles"), Mobiles: c.String("config.message.at.mobiles"),
Debug: c.Bool("config.debug"), Debug: c.Bool("config.debug"),
TipsTitle: c.String("config.tips.title"), TipsTitle: c.String("config.tips.title"),
}, },
Custom: Custom{ Extra: Extra{
Pic: Pic{ Pic: ExtraPic{
SuccessPicURL: c.String("custom.pic.url.success"), WithPic: c.Bool("config.message.pic"),
FailurePicURL: c.String("custom.pic.url.failure"), SuccessPicURL: c.String("config.success.pic.url"),
FailurePicURL: c.String("config.failure.pic.url"),
}, },
Color: Color{ Color: ExtraColor{
SuccessColor: c.String("custom.color.success"), SuccessColor: c.String("config.success.color"),
FailureColor: c.String("custom.color.failure"), FailureColor: c.String("config.failure.color"),
}, WithColor: c.Bool("config.message.color"),
Tpl: c.String("custom.tpl"),
},
Tpl: Tpl{
Repo: TplRepo{
FullName: c.String("tpl.repo.full.name"),
ShortName: c.String("tpl.repo.short.name"),
},
Commit: TplCommit{
Branch: c.String("tpl.commit.branch.name"),
},
Build: TplBuild{
Status: Status{
Success: c.String("tpl.build.status.success"),
Failure: c.String("tpl.build.status.failure"),
},
}, },
LinkSha: c.Bool("config.message.sha.link"),
}, },
} }
if err := plugin.Exec(); nil != err { if err := plugin.Exec(); nil != err {
fmt.Println(err) fmt.Println(err)
os.Exit(1)
} }
} }
+135 -242
View File
@@ -3,66 +3,51 @@ package main
import ( import (
"errors" "errors"
"fmt" "fmt"
"io/ioutil"
"log" "log"
"net/http"
"net/url"
"os"
"regexp"
"strings" "strings"
webhook "github.com/lddsb/dingtalk-webhook" webhook "github.com/lddsb/dingtalk-webhook"
) )
type ( type (
// Repo repo base info // Repo `repo base info`
Repo struct { Repo struct {
ShortName string // short name FullName string // repository full name
GroupName string // group name
FullName string // repository full name
OwnerName string // repo owner
RemoteURL string // repo remote url
} }
// Build build info // Build `build info`
Build struct { Build struct {
Status string // providers the current build status Status string // providers the current build status
Link string // providers the current build link Link string // providers the current build link
Event string // trigger event
StartAt int64 // build start at ( unix timestamp )
FinishedAt int64 // build finish at ( unix timestamp )
} }
// Commit commit info // Commit `commit info`
Commit struct { Commit struct {
Branch string // providers the branch for the current commit Branch string // providers the branch for the current commit
Link string // providers the http link to the current commit in the remote source code management system(e.g.GitHub) Link string // providers the http link to the current commit in the remote source code management system(e.g.GitHub)
Message string // providers the commit message for the current build Message string // providers the commit message for the current build
Sha string // providers the commit sha for the current build Sha string // providers the commit sha for the current build
Ref string // commit ref Authors CommitAuthors
Author CommitAuthor
} }
// CommitAuthor commit author info // CommitAuthors `commit author info`
CommitAuthor struct { CommitAuthors struct {
Avatar string // providers the author avatar for the current commit Avatar string // providers the author avatar for the current commit
Email string // providers the author email for the current commit Email string // providers the author email for the current commit
Name string // providers the author name for the current commit Name string // providers the author name for the current commit
Username string // the author username for the current commit
} }
// Drone drone info // Drone `drone info`
Drone struct { Drone struct {
Repo Repo Repo Repo
Build Build Build Build
Commit Commit Commit Commit
} }
// Config plugin private config // Config `plugin private config`
Config struct { Config struct {
Debug bool Debug bool
AccessToken string AccessToken string
Secret string
IsAtALL bool IsAtALL bool
Mobiles string Mobiles string
Username string Username string
@@ -70,12 +55,12 @@ type (
TipsTitle string TipsTitle string
} }
// MessageConfig DingTalk message struct // MessageConfig `DingTalk message struct`
MessageConfig struct { MessageConfig struct {
ActionCard ActionCard ActionCard ActionCard
} }
// ActionCard action card message struct // ActionCard `action card message struct`
ActionCard struct { ActionCard struct {
LinkUrls string LinkUrls string
LinkTitles string LinkTitles string
@@ -83,90 +68,60 @@ type (
BtnOrientation bool BtnOrientation bool
} }
// Pic extra config for pic // Extra `extra variables`
Pic struct { Extra struct {
Color ExtraColor
Pic ExtraPic
LinkSha bool
}
// ExtraPic `extra config for pic`
ExtraPic struct {
WithPic bool
SuccessPicURL string SuccessPicURL string
FailurePicURL string FailurePicURL string
} }
// Color extra config for color // ExtraColor `extra config for color`
Color struct { ExtraColor struct {
WithColor bool
SuccessColor string SuccessColor string
FailureColor string FailureColor string
} }
// Plugin plugin all config // Plugin `plugin all config`
Plugin struct { Plugin struct {
Tpl Tpl Drone Drone
Drone Drone Config Config
Config Config Extra Extra
Custom Custom
Message MessageConfig
}
Custom struct {
Tpl string
Color Color
Pic Pic
}
Tpl struct {
Repo TplRepo
Commit TplCommit
Build TplBuild
}
TplRepo struct {
FullName string
ShortName string
}
TplCommit struct {
Branch string
}
TplBuild struct {
Status Status
}
Status struct {
Success string
Failure string
} }
) )
// Exec execute WebHook // Exec `execute webhook`
func (p *Plugin) Exec() error { func (p *Plugin) Exec() error {
var err error var err error
if "" == p.Config.AccessToken { if 0 == len(p.Config.AccessToken) {
msg := "missing DingTalk access token" msg := "missing dingtalk access token"
return errors.New(msg) return errors.New(msg)
} }
tpl, err := p.getMessage() if 6 > len(p.Drone.Commit.Sha) {
if err != nil { return errors.New("commit sha cannot short than 6")
return err
} }
if p.Config.TipsTitle == "" { if p.Config.TipsTitle == "" {
p.Config.TipsTitle = "you have a new message" p.Config.TipsTitle = "you have a new message"
} }
newWebHook := webhook.NewWebHook(p.Config.AccessToken) newWebhook := webhook.NewWebHook(p.Config.AccessToken)
// add sign
if "" != p.Config.Secret {
newWebHook.Secret = p.Config.Secret
}
mobiles := strings.Split(p.Config.Mobiles, ",") mobiles := strings.Split(p.Config.Mobiles, ",")
switch strings.ToLower(p.Config.MsgType) { switch strings.ToLower(p.Config.MsgType) {
case "markdown": case "markdown":
err = newWebHook.SendMarkdownMsg(p.Config.TipsTitle, tpl, p.Config.IsAtALL, mobiles...) err = newWebhook.SendMarkdownMsg(p.Config.TipsTitle, p.baseTpl(), p.Config.IsAtALL, mobiles...)
case "text": case "text":
err = newWebHook.SendTextMsg(tpl, p.Config.IsAtALL, mobiles...) err = newWebhook.SendTextMsg(p.baseTpl(), p.Config.IsAtALL, mobiles...)
case "link": case "link":
err = newWebHook.SendLinkMsg(p.Drone.Build.Status, tpl, p.Drone.Commit.Author.Avatar, p.Drone.Build.Link) err = newWebhook.SendLinkMsg(p.Drone.Build.Status, p.baseTpl(), p.Drone.Commit.Authors.Avatar, p.Drone.Build.Link)
default: default:
msg := "not support message type" msg := "not support message type"
err = errors.New(msg) err = errors.New(msg)
@@ -179,155 +134,90 @@ func (p *Plugin) Exec() error {
return err return err
} }
// fileExists check file is exists // markdownTpl `output the tpl of markdown`
func fileExists(filePath string) bool { func (p *Plugin) markdownTpl() string {
_, err := os.Stat(filePath) var tpl string
if err != nil {
if os.IsExist(err) { // title
return true title := fmt.Sprintf(" %s *Branch Build %s*",
} strings.Title(p.Drone.Commit.Branch),
return false strings.Title(p.Drone.Build.Status))
// with color on title
if p.Extra.Color.WithColor {
title = fmt.Sprintf("<font color=%s>%s</font>", p.getColor(), title)
} }
return true
tpl = fmt.Sprintf("# %s \n", title)
// with pic
if p.Extra.Pic.WithPic {
tpl += fmt.Sprintf("![%s](%s)\n\n",
p.Drone.Build.Status,
p.getPicURL())
}
// commit message
commitMsg := fmt.Sprintf("%s", p.Drone.Commit.Message)
if p.Extra.Color.WithColor {
commitMsg = fmt.Sprintf("<font color=%s>%s</font>", p.getColor(), commitMsg)
}
tpl += commitMsg + "\n\n"
// sha info
commitSha := p.Drone.Commit.Sha
if p.Extra.LinkSha {
commitSha = fmt.Sprintf("[Click To %s Commit Detail Page](%s)", commitSha[:6], p.Drone.Commit.Link)
}
tpl += commitSha + "\n\n"
// author info
authorInfo := fmt.Sprintf("`%s(%s)`", p.Drone.Commit.Authors.Name, p.Drone.Commit.Authors.Email)
tpl += authorInfo + "\n\n"
// build detail link
buildDetail := fmt.Sprintf("[Click To The Build Detail Page %s](%s)",
p.getEmoticon(),
p.Drone.Build.Link)
tpl += buildDetail
return tpl
} }
// getTpl get tpl from local file or remote file func (p *Plugin) baseTpl() string {
func (p *Plugin) getTpl() (tpl string, err error) { tpl := ""
//var tpl string switch strings.ToLower(p.Config.MsgType) {
tplDir := "/app/tpls" case "markdown":
if "" == p.Custom.Tpl { tpl = p.markdownTpl()
p.Custom.Tpl = fmt.Sprintf("%s/%s.tpl", tplDir, strings.ToLower(p.Config.MsgType)) case "text":
} tpl = fmt.Sprintf(`[%s] %s
%s (%s)
@%s
%s (%s)
`,
p.Drone.Build.Status,
strings.TrimSpace(p.Drone.Commit.Message),
p.Drone.Repo.FullName,
p.Drone.Commit.Branch,
p.Drone.Commit.Sha,
p.Drone.Commit.Authors.Name,
p.Drone.Commit.Authors.Email)
case "link":
tpl = fmt.Sprintf(`%s(%s) @%s %s(%s)`,
p.Drone.Repo.FullName,
p.Drone.Commit.Branch,
p.Drone.Commit.Sha[:6],
p.Drone.Commit.Authors.Name,
p.Drone.Commit.Authors.Email)
case "actionCard":
// coming soon
u, err := url.Parse(p.Custom.Tpl)
if err != nil {
return "", err
}
if u.Scheme != "" {
resp, err := http.Get(p.Custom.Tpl)
if err != nil {
return "", err
}
// check response
if u.Path != resp.Request.URL.Path {
return "", errors.New("cannot get tpl from url")
}
// defer close
defer func() {
_ = resp.Body.Close()
}()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return "", err
}
tpl = string(body)
} else {
if !fileExists(p.Custom.Tpl) {
return "", errors.New("tpl file not exists")
}
tplStr, err := ioutil.ReadFile(p.Custom.Tpl)
if err != nil {
return "", err
}
tpl = string(tplStr)
}
return tpl, nil
}
// fillTpl fill the tpl by valid keyword
func (p *Plugin) fillTpl(tpl string) string {
envs := p.getEnvs()
// replace regex
reg := regexp.MustCompile(`\[([^\[\]]*)]`)
match := reg.FindAllStringSubmatch(tpl, -1)
for _, m := range match {
// check if the keyword is legal
if _, ok := envs[m[1]]; ok {
// replace keyword
tpl = strings.ReplaceAll(tpl, m[0], envs[m[1]].(string))
}
} }
return tpl return tpl
} }
// getEnvs get available envs /**
func (p *Plugin) getEnvs() map[string]interface{} { get emoticon
var envs map[string]interface{} */
envs = make(map[string]interface{})
envs["TPL_REPO_FULL_NAME"] = p.Drone.Repo.FullName
if p.Tpl.Repo.FullName != "" {
envs["TPL_REPO_FULL_NAME"] = p.Tpl.Repo.FullName
}
envs["TPL_REPO_SHORT_NAME"] = p.Drone.Repo.ShortName
if p.Tpl.Repo.ShortName != "" {
envs["TPL_REPO_SHORT_NAME"] = p.Tpl.Repo.ShortName
}
envs["TPL_REPO_GROUP_NAME"] = p.Drone.Repo.GroupName
envs["TPL_REPO_OWNER_NAME"] = p.Drone.Repo.OwnerName
envs["TPL_REPO_REMOTE_URL"] = p.Drone.Repo.RemoteURL
envs["TPL_BUILD_STATUS"] = p.getStatus()
envs["TPL_BUILD_LINK"] = p.Drone.Build.Link
envs["TPL_BUILD_EVENT"] = p.Drone.Build.Event
envs["TPL_BUILD_CONSUMING"] = fmt.Sprintf("%v", p.Drone.Build.FinishedAt-p.Drone.Build.StartAt)
envs["TPL_COMMIT_SHA"] = p.Drone.Commit.Sha
envs["TPL_COMMIT_REF"] = p.Drone.Commit.Ref
envs["TPL_COMMIT_LINK"] = p.Drone.Commit.Link
envs["TPL_COMMIT_MSG"] = p.Drone.Commit.Message
envs["TPL_COMMIT_BRANCH"] = p.Drone.Commit.Branch
if p.Tpl.Commit.Branch != "" {
envs["TPL_COMMIT_BRANCH"] = p.Tpl.Commit.Branch
}
envs["TPL_AUTHOR_NAME"] = p.Drone.Commit.Author.Name
envs["TPL_AUTHOR_USERNAME"] = p.Drone.Commit.Author.Username
envs["TPL_AUTHOR_EMAIL"] = p.Drone.Commit.Author.Email
envs["TPL_AUTHOR_AVATAR"] = p.Drone.Commit.Author.Avatar
envs["TPL_STATUS_PIC"] = p.getPicURL()
envs["TPL_STATUS_COLOR"] = p.getColor()
envs["TPL_STATUS_EMOTICON"] = p.getEmoticon()
return envs
}
// getMessage get message tpl
func (p *Plugin) getMessage() (tpl string, err error) {
tpl, err = p.getTpl()
if err != nil {
return "", err
}
return p.fillTpl(tpl), nil
}
// getStatus
func (p *Plugin) getStatus() string {
if p.Drone.Build.Status == "success" {
if p.Tpl.Build.Status.Success != "" {
return p.Tpl.Build.Status.Success
}
return p.Drone.Build.Status
}
if p.Tpl.Build.Status.Failure != "" {
return p.Tpl.Build.Status.Failure
}
return p.Drone.Build.Status
}
// get emoticon
func (p *Plugin) getEmoticon() string { func (p *Plugin) getEmoticon() string {
emoticons := make(map[string]string) emoticons := make(map[string]string)
emoticons["success"] = ":)" emoticons["success"] = ":)"
@@ -341,41 +231,44 @@ func (p *Plugin) getEmoticon() string {
return ":(" return ":("
} }
// get picture url /**
get picture url
*/
func (p *Plugin) getPicURL() string { func (p *Plugin) getPicURL() string {
pics := make(map[string]string) pics := make(map[string]string)
// success picture url // success picture url
pics["success"] = "https://ws4.sinaimg.cn/large/006tNc79gy1fz05g5a7utj30he0bfjry.jpg" pics["success"] = "https://wx1.sinaimg.cn/large/006tNc79gy1fz05g5a7utj30he0bfjry.jpg"
if p.Custom.Pic.SuccessPicURL != "" { if p.Extra.Pic.SuccessPicURL != "" {
pics["success"] = p.Custom.Pic.SuccessPicURL pics["success"] = p.Extra.Pic.SuccessPicURL
} }
// failure picture url // failure picture url
pics["failure"] = "https://ws1.sinaimg.cn/large/006tNc79gy1fz0b4fghpnj30hd0bdmxn.jpg" pics["failure"] = "https://wx1.sinaimg.cn/large/006tNc79gy1fz0b4fghpnj30hd0bdmxn.jpg"
if p.Custom.Pic.FailurePicURL != "" { if p.Extra.Pic.FailurePicURL != "" {
pics["failure"] = p.Custom.Pic.FailurePicURL pics["failure"] = p.Extra.Pic.FailurePicURL
} }
picURL, ok := pics[p.Drone.Build.Status] url, ok := pics[p.Drone.Build.Status]
if ok { if ok {
return picURL return url
} }
return "" return ""
} }
// get color for message title /**
get color for message title
*/
func (p *Plugin) getColor() string { func (p *Plugin) getColor() string {
colors := make(map[string]string) colors := make(map[string]string)
// success color // success color
colors["success"] = "#008000" colors["success"] = "#008000"
if p.Custom.Color.SuccessColor != "" { if p.Extra.Color.SuccessColor != "" {
colors["success"] = "#" + p.Custom.Color.SuccessColor colors["success"] = "#" + p.Extra.Color.SuccessColor
} }
// failure color // failure color
colors["failure"] = "#FF0000" colors["failure"] = "#FF0000"
if p.Custom.Color.FailureColor != "" { if p.Extra.Color.FailureColor != "" {
colors["failure"] = "#" + p.Custom.Color.FailureColor colors["failure"] = "#" + p.Extra.Color.FailureColor
} }
color, ok := colors[p.Drone.Build.Status] color, ok := colors[p.Drone.Build.Status]
+14 -16
View File
@@ -12,45 +12,43 @@ func TestPlugin(t *testing.T) {
} }
p.Config.AccessToken = "example-access-token" p.Config.AccessToken = "example-access-token"
p.Custom.Tpl = "tpls/markdown.tpl" err = p.Exec()
if nil == err {
t.Error("commit sha length error should be catch!")
}
p.Drone.Commit.Sha = "53729847dfksj"
err = p.Exec() err = p.Exec()
if nil == err { if nil == err {
t.Error("not support message type error should be catch!") t.Error("not support message type error should be catch!")
} }
p.Config.MsgType = "link"
err = p.Exec()
if nil == err {
t.Error("access token invalid error should be catch!")
}
p.Custom.Tpl = "https://aaa.com"
p.Config.MsgType = "text" p.Config.MsgType = "text"
err = p.Exec() err = p.Exec()
if nil == err { if nil == err {
t.Error("access token invalid error should be catch!") t.Error("access token invalid error should be catch!")
} }
p.Custom.Tpl = ""
p.Config.MsgType = "link" p.Config.MsgType = "link"
err = p.Exec() err = p.Exec()
if nil == err { if nil == err {
t.Error("access token invalid error should be catch!") t.Error("access token invalid error should be catch!")
} }
p.Custom.Color.FailureColor = "#555555" p.Extra.Color.WithColor = true
p.Custom.Color.SuccessColor = "#222222" p.Extra.Color.FailureColor = "#555555"
p.Custom.Pic.FailurePicURL = "https://www.baidu.com" p.Extra.Color.SuccessColor = "#222222"
p.Custom.Pic.SuccessPicURL = "https://www.baidu.com" p.Extra.Pic.WithPic = true
p.Extra.Pic.FailurePicURL = "https://www.baidu.com"
p.Extra.Pic.SuccessPicURL = "https://www.baidu.com"
p.Extra.LinkSha = true
// p.Drone.Build.Status = "failure"
p.Config.MsgType = "markdown" p.Config.MsgType = "markdown"
p.Custom.Tpl = "tpls/markdown.tpl"
err = p.Exec() err = p.Exec()
if nil == err { if nil == err {
t.Error("access token invalid error should be catch!") t.Error("access token invalid error should be catch!")
} }
p.Custom.Tpl = "https://gist.githubusercontent.com/lddsb/87065e73678dcf56cd222a3c2f1f32b0/raw/fce9fb28b2c8c768eb93df5598beee8c98cba610/md.tpl"
p.Drone.Build.Status = "failure" p.Drone.Build.Status = "failure"
err = p.Exec() err = p.Exec()
if nil == err { if nil == err {
-9
View File
@@ -1,9 +0,0 @@
### [TPL_REPO_SHORT_NAME] build [TPL_BUILD_STATUS] (`takes [TPL_BUILD_CONSUMING]s`)
[TPL_COMMIT_MSG]
[[TPL_COMMIT_SHA]]([TPL_COMMIT_LINK])
[[TPL_AUTHOR_NAME]([TPL_AUTHOR_EMAIL])](mailto:[TPL_AUTHOR_EMAIL])
[Click To The Build Detail Page [TPL_STATUS_EMOTICON]]([TPL_BUILD_LINK])
-5
View File
@@ -1,5 +0,0 @@
[TPL_REPO_NAME] build [TPL_BUILD_STATUS] (takes [TPL_BUILD_CONSUMING]s)
[TPL_COMMIT_MSG]
[TPL_COMMIT_SHA] ([TPL_COMMIT_LINK])
[TPL_AUTHOR_NAME] ([TPL_AUTHOR_EMAIL])
Click To The Build Detail Page [TPL_STATUS_EMOTICON] ([TPL_BUILD_LINK])