Compare commits

..

49 Commits

Author SHA1 Message Date
dependabot[bot] 4db9815ece build(deps): bump github.com/urfave/cli from 1.22.14 to 1.22.15
Bumps [github.com/urfave/cli](https://github.com/urfave/cli) from 1.22.14 to 1.22.15.
- [Release notes](https://github.com/urfave/cli/releases)
- [Changelog](https://github.com/urfave/cli/blob/main/docs/CHANGELOG.md)
- [Commits](https://github.com/urfave/cli/compare/v1.22.14...v1.22.15)

---
updated-dependencies:
- dependency-name: github.com/urfave/cli
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-27 07:11:55 +08:00
lddsb eed2f0fae1 fix: Fix release failure caused by deprecated archives->replacements 2024-04-14 07:48:52 +08:00
lddsb ca944a4a26 fix: Fix issues that do not exist in Golang version 1.15.6
Replace specific version numbers with stable versions
2024-04-13 19:28:05 +08:00
lddsb 07310794cb perf: Optimize color setting logic
Allow color code strings to start with #
2024-04-13 18:32:09 +08:00
lddsb a165a28c60 fix: README typo 2024-04-13 18:21:15 +08:00
dependabot[bot] 43222b966a build(deps): bump github.com/urfave/cli from 1.22.5 to 1.22.14
Bumps [github.com/urfave/cli](https://github.com/urfave/cli) from 1.22.5 to 1.22.14.
- [Release notes](https://github.com/urfave/cli/releases)
- [Changelog](https://github.com/urfave/cli/blob/main/docs/CHANGELOG.md)
- [Commits](https://github.com/urfave/cli/compare/v1.22.5...v1.22.14)

---
updated-dependencies:
- dependency-name: github.com/urfave/cli
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-13 18:09:19 +08:00
dependabot[bot] 530b471503 build(deps): bump github.com/joho/godotenv from 1.4.0 to 1.5.1
Bumps [github.com/joho/godotenv](https://github.com/joho/godotenv) from 1.4.0 to 1.5.1.
- [Release notes](https://github.com/joho/godotenv/releases)
- [Commits](https://github.com/joho/godotenv/compare/v1.4.0...v1.5.1)

---
updated-dependencies:
- dependency-name: github.com/joho/godotenv
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-11 20:31:25 +08:00
internelp 3a0957f479 Use exec instead of Docker for execution 2024-04-11 20:31:13 +08:00
dependabot[bot] c9a57df515 build(deps): bump github.com/joho/godotenv from 1.3.0 to 1.4.0
Bumps [github.com/joho/godotenv](https://github.com/joho/godotenv) from 1.3.0 to 1.4.0.
- [Release notes](https://github.com/joho/godotenv/releases)
- [Commits](https://github.com/joho/godotenv/compare/v1.3.0...v1.4.0)

---
updated-dependencies:
- dependency-name: github.com/joho/godotenv
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-09-28 09:41:01 +08:00
lddsb d0a4fc64e4 feat: support string as a tpl 2021-08-26 09:29:12 +08:00
lddsb 526b8eec46 docs: update README for at mobiles 2021-07-02 23:13:05 +08:00
lddsb 8729ae05b4 feat: add at mobiles tpl 2021-07-02 23:01:24 +08:00
dependabot[bot] cec9f81f52 build(deps): bump github.com/lddsb/dingtalk-webhook from 0.0.4 to 0.0.5
Bumps [github.com/lddsb/dingtalk-webhook](https://github.com/lddsb/dingtalk-webhook) from 0.0.4 to 0.0.5.
- [Release notes](https://github.com/lddsb/dingtalk-webhook/releases)
- [Commits](https://github.com/lddsb/dingtalk-webhook/compare/v0.0.4...v0.0.5)

---
updated-dependencies:
- dependency-name: github.com/lddsb/dingtalk-webhook
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-07-02 22:01:57 +08:00
dependabot-preview[bot] 428577470d Upgrade to GitHub-native Dependabot 2021-06-26 23:30:42 +08:00
lddsb 7c8a85bcc4 fix: release.yaml go-version error 2020-12-19 15:53:16 +08:00
lddsb ecf4f89e0a feat: use goreleaser for release tool 2020-12-19 15:39:10 +08:00
lddsb e7ef2de488 feat: support custom started at and finished at 2020-12-19 11:59:45 +08:00
lddsb acd708ada3 docs: update readme and changelog for 1.2.5 2020-12-16 17:48:07 +08:00
lddsb 5bcf803346 fix: docker image tags missing 2020-12-16 14:58:38 +08:00
lddsb 1b219624cd feat: GitHub Actions for build and push docker image 2020-12-16 14:14:51 +08:00
lddsb d409acce48 feat: use os.Getenv() read environment variables for tpl 2020-12-16 11:58:09 +08:00
dependabot-preview[bot] 2e94325c0e Bump github.com/urfave/cli from 1.22.4 to 1.22.5 (#27)
Bumps [github.com/urfave/cli](https://github.com/urfave/cli) from 1.22.4 to 1.22.5.
- [Release notes](https://github.com/urfave/cli/releases)
- [Changelog](https://github.com/urfave/cli/blob/master/docs/CHANGELOG.md)
- [Commits](https://github.com/urfave/cli/compare/v1.22.4...v1.22.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-11-28 13:36:40 +08:00
lddsb 1622a2beaa perf: update readme and changelog 2020-04-29 18:40:45 +08:00
dependabot-preview[bot] d2ab02e29c Bump github.com/urfave/cli from 1.22.3 to 1.22.4 (#23)
Bumps [github.com/urfave/cli](https://github.com/urfave/cli) from 1.22.3 to 1.22.4.
- [Release notes](https://github.com/urfave/cli/releases)
- [Changelog](https://github.com/urfave/cli/blob/master/docs/CHANGELOG.md)
- [Commits](https://github.com/urfave/cli/compare/v1.22.3...v1.22.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-04-29 11:09:42 +08:00
lddsb d0284b2434 Merge tag 'v1.2.4'
patch for k8s missing env
2020-04-29 11:08:21 +08:00
lddsb c8bc5d889d fix: patch for k8s missing env 2020-04-29 10:59:46 +08:00
Dee Luo d4dc439671 Create CHANGELOG.md 2020-03-10 22:43:40 +08:00
dependabot-preview[bot] 8d0434b308 Bump github.com/urfave/cli from 1.22.2 to 1.22.3 (#20)
Bumps [github.com/urfave/cli](https://github.com/urfave/cli) from 1.22.2 to 1.22.3.
- [Release notes](https://github.com/urfave/cli/releases)
- [Changelog](https://github.com/urfave/cli/blob/master/docs/CHANGELOG.md)
- [Commits](https://github.com/urfave/cli/compare/v1.22.2...v1.22.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-03-10 18:13:02 +08:00
Dee Luo 8aafd04b82 fix: default image cdn url (#17) 2020-01-20 11:51:20 +08:00
lddsb a651a73cbd fix: default image cdn url 2020-01-20 11:36:34 +08:00
Dee Luo 7c68447d1d feat: support sign (#13) 2019-12-02 18:07:13 +08:00
Dee Luo 183999881b Merge pull request #12 from lddsb/dependabot/go_modules/github.com/lddsb/dingtalk-webhook-0.0.2
Bump github.com/lddsb/dingtalk-webhook from 0.0.1 to 0.0.2
2019-11-30 15:07:55 +08:00
dependabot-preview[bot] 4c52115e2a Bump github.com/lddsb/dingtalk-webhook from 0.0.1 to 0.0.2
Bumps [github.com/lddsb/dingtalk-webhook](https://github.com/lddsb/dingtalk-webhook) from 0.0.1 to 0.0.2.
- [Release notes](https://github.com/lddsb/dingtalk-webhook/releases)
- [Commits](https://github.com/lddsb/dingtalk-webhook/compare/v0.0.1...0.0.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-11-30 02:41:16 +00:00
lddsb fb601a0d6c feat: add dependabot badge 2019-11-26 08:55:49 +08:00
Dee Luo 8bd745becf Merge pull request #10 from lddsb/dependabot/go_modules/github.com/urfave/cli-1.22.2
Bump github.com/urfave/cli from 1.20.0 to 1.22.2
2019-11-26 08:43:38 +08:00
dependabot-preview[bot] e9aea90aac Bump github.com/urfave/cli from 1.20.0 to 1.22.2
Bumps [github.com/urfave/cli](https://github.com/urfave/cli) from 1.20.0 to 1.22.2.
- [Release notes](https://github.com/urfave/cli/releases)
- [Changelog](https://github.com/urfave/cli/blob/master/docs/CHANGELOG.md)
- [Commits](https://github.com/urfave/cli/compare/v1.20.0...v1.22.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-11-26 00:40:21 +00:00
Dee Luo c77b865a43 fix: read me adjustment 2019-11-25 23:19:23 +08:00
Dee Luo fbfbec3bde Merge pull request #9 from lddsb/feature/readme-zh
feat: add readme_zh
2019-11-25 23:03:10 +08:00
lddsb 30c2324f4e feat: add readme_zh 2019-11-25 22:49:34 +08:00
Dee Luo 11d34af11a Merge pull request #6 from lddsb/bugfix/tips-title-support
add tips title option, and add exit code for exception
2019-11-07 22:04:09 +08:00
lddsb f9aff987bb add tips title option, and add exit code for exception 2019-11-07 21:43:57 +08:00
Dee Luo 8164de1292 Merge pull request #4 from lddsb/feature/msg-tpl
complete tpl feature
2019-09-20 17:13:42 +08:00
lddsb 9cb8a9b160 fix dry run keyword 2019-09-20 17:04:05 +08:00
lddsb 9eed74739b fix docker build dry run 2019-09-20 16:20:04 +08:00
lddsb 664c2e90c2 complete tpl feature 2019-09-20 10:20:35 +08:00
lddsb 8d080c3b0c remove codebeat badge and drone ci badge, add new badge for docker cloud auto build status 2019-09-09 11:54:07 +08:00
lddsb 0734cc50ff transfer automatic build to DockerHub 2019-09-09 11:35:20 +08:00
lddsb 00fb440336 update readme.md about development 2019-09-08 10:28:53 +08:00
lddsb 580a43e7a1 add editorconfig file 2019-09-07 22:19:32 +08:00
20 changed files with 1162 additions and 320 deletions
+11 -37
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,9 +37,13 @@ volumes:
- name: gopath - name: gopath
temp: {} temp: {}
trigger:
event:
- pull_request
--- ---
kind: pipeline kind: pipeline
name: build name: dryrun
steps: steps:
- name: build - name: build
@@ -49,13 +53,7 @@ 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
@@ -63,39 +61,15 @@ steps:
settings: settings:
cache_from: lddsb/drone-dingtalk-message cache_from: lddsb/drone-dingtalk-message
dockerfile: Dockerfile dockerfile: Dockerfile
dryrun: true dry_run: 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:
ref: event:
- refs/heads/master - pull_request
- 'refs/pull/**'
- 'refs/tags/**'
depends_on: depends_on:
- testing - testing
+2
View File
@@ -0,0 +1,2 @@
[*.y*ml]
indent_size = 2
+8
View File
@@ -0,0 +1,8 @@
version: 2
updates:
- package-ecosystem: gomod
directory: "/"
schedule:
interval: daily
time: "10:00"
open-pull-requests-limit: 10
+55
View File
@@ -0,0 +1,55 @@
name: Publish to DockerHub and Github Package
on:
push:
tags:
- "v*"
jobs:
dockerhub:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Repo metadata
id: repo
uses: actions/github-script@v3
with:
script: |
const repo = await github.repos.get(context.repo)
return repo.data
- name: Prepare
id: prep
run: |
DOCKER_IMAGE=lddsb/drone-dingtalk-message
GITHUB_IMAGE=ghcr.io/lddsb/drone-dingtalk-message
VERSION=${GITHUB_REF#refs/tags/v}
TAGS="${DOCKER_IMAGE}:${VERSION}"
if [[ $VERSION =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
MINOR=${VERSION%.*}
MAJOR=${MINOR%.*}
TAGS="$TAGS,${DOCKER_IMAGE}:${MINOR},${DOCKER_IMAGE}:${MAJOR},${DOCKER_IMAGE}:latest"
TAGS="$TAGS,${GITHUB_IMAGE}:${VERSION},${GITHUB_IMAGE}:${MINOR},${GITHUB_IMAGE}:${MAJOR},${GITHUB_IMAGE}:latest"
fi
echo ::set-output name=tags::${TAGS}
- name: Setup Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GitHub Container Register
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.CR_PAT }}
- name: Build and push
id: docker_build
uses: docker/build-push-action@v2
with:
context: .
file: ./Dockerfile
push: true
tags: ${{ steps.prep.outputs.tags }}
+25
View File
@@ -0,0 +1,25 @@
name: Publish release
on:
push:
tags:
- "v*"
jobs:
release:
name: publish release, upload asset
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: stable
- name: Run GoReleaser
uses: goreleaser/goreleaser-action@v5
with:
version: latest
args: release --clean
env:
GITHUB_TOKEN: ${{ secrets.CR_PAT }}
+3 -1
View File
@@ -2,4 +2,6 @@ dive.log
drone-dingtalk-message drone-dingtalk-message
.idea .idea
vendor vendor
coverage.txt coverage.txt
coverage.out
env.list
+49
View File
@@ -0,0 +1,49 @@
env:
- GO111MODULE=on
before:
hooks:
- go mod download
builds:
- env:
- CGO_ENABLED=0
goos:
- linux
- darwin
- windows
goarch:
- 386
- amd64
- arm
- arm64
mod_timestamp: '{{ .CommitTimestamp }}'
binary: dingtalk-message
flags:
- -trimpath
ldflags:
- -s -w -X main.version={{.Version}} -X main.commit={{.Commit}} -X main.date={{ .CommitDate }} -X main.builtBy=goreleaser
checksum:
name_template: '{{ .ProjectName }}_checksums.txt'
changelog:
sort: asc
filters:
exclude:
- '^docs:'
- '^test:'
- Merge pull request
- Merge branch
- go mod tidy
archives:
- name_template: >-
{{- .ProjectName }}_
{{- title .Os }}_
{{- if eq .Arch "amd64" }}x86_64
{{- else if eq .Arch "386" }}i386
{{- else }}{{ .Arch }}{{ end }}
{{- if .Arm }}v{{ .Arm }}{{ end -}}
format_overrides:
- goos: windows
format: zip
files:
- README.md
- LICENSE
- tpls/*
+72
View File
@@ -0,0 +1,72 @@
# Changelog
## [Unreleased]
## [1.2.5] - 2020-12-16
### Added:
* The TPL can use environment variables.
* Debug mode.
* Use GitHub Actions for automation.
## [1.2.4] - 2020-04-28
### Fixed:
* kubernetes runner missing env, [details](https://docs.drone.io/runner/kubernetes/overview)
## [1.2.3] - 2020-01-20
### Fixed:
* CDN url of default image.
## [1.2.2] - 2019-12-07
### Added:
* Support DingTalk `sign secret`, please see the [README](README.md) for instructions.
## [1.2.1] - 2019-11-07
### Added:
* Support customize message tips title by `tips_title` option.
## [1.2.0] - 2019-09-24
### Added:
* Support custom TPL.
## [1.1.4] - 2020-04-28
### Fixed:
* kubernetes runner missing env, [details](https://docs.drone.io/runner/kubernetes/overview)
## [1.1.3] - 2020-01-20
### Fixed:
* CDN url of default image.
## [1.1.2] - 2019-11-07
### Added:
* Support customize message tips title by `tips_title` option.
## [1.1.1] - 2019-09-24
### Added:
* Support full token url as `token`.
## [1.1.0] - 2019-03-09
### Added:
* Package management tools migrate from dep to go mod, 1.0.x version stopped supporting new features.
## [1.0.2] - 2020-01-20
### Fixed:
* CDN url of default image.
## [1.0.1] - 2019-03-09
### Added:
* Auto publish image to DockerHub.
[Unreleased]: https://github.com/lddsb/drone-dingtalk-message/compare/v1.2.5...HEAD
[1.2.5]: https://github.com/lddsb/drone-dingtalk-message/compare/v1.2.4...v1.2.5
[1.2.4]: https://github.com/lddsb/drone-dingtalk-message/compare/v1.2.3...v1.2.4
[1.2.3]: https://github.com/lddsb/drone-dingtalk-message/compare/v1.2.2...v1.2.3
[1.2.2]: https://github.com/lddsb/drone-dingtalk-message/compare/v1.2.1...v1.2.2
[1.2.1]: https://github.com/lddsb/drone-dingtalk-message/compare/v1.2.0...v1.2.1
[1.2.0]: https://github.com/lddsb/drone-dingtalk-message/compare/v1.1.0...v1.2.0
[1.1.4]: https://github.com/lddsb/drone-dingtalk-message/compare/v1.1.3...v1.1.4
[1.1.3]: https://github.com/lddsb/drone-dingtalk-message/compare/v1.1.2...v1.1.3
[1.1.2]: https://github.com/lddsb/drone-dingtalk-message/compare/v1.1.1...v1.1.2
[1.1.1]: https://github.com/lddsb/drone-dingtalk-message/compare/v1.1.0...v1.1.1
[1.1.0]: https://github.com/lddsb/drone-dingtalk-message/compare/v1.0.0...v1.1.0
[1.0.2]: https://github.com/lddsb/drone-dingtalk-message/compare/v1.0.1...v1.0.2
[1.0.1]: https://github.com/lddsb/drone-dingtalk-message/compare/v1.0.0...v1.0.1
+5 -11
View File
@@ -1,17 +1,11 @@
FROM golang AS builder FROM golang AS builder
WORKDIR /app WORKDIR /app
COPY . . COPY . .
ENV GO111MODULE on RUN GO111MODULE=on CGO_ENABLED=0 GOOS=linux go build -a -o drone-dingtalk .
ENV CGO_ENABLED 0
ENV GOOS linux
RUN go build -a -o drone-dingtalk .
FROM alpine:latest FROM alpine:latest
RUN apk update && \ RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/*
apk add \ COPY --from=builder /app/drone-dingtalk /bin
ca-certificates && \ COPY --from=builder /app/tpls /app/drone/dingtalk/message/tpls
rm -rf /var/cache/apk/*
COPY --from=builder /app/drone-dingtalk /bin/ ENTRYPOINT ["/bin/drone-dingtalk"]
ENTRYPOINT ["/bin/drone-dingtalk"]
+140 -37
View File
@@ -1,30 +1,61 @@
# Drone CI DingTalk Message Plugin # Drone CI DingTalk Message Plugin
[![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) [![GitHub Actions](https://github.com/lddsb/drone-dingtalk-message/workflows/Publish%20to%20DockerHub%20and%20Github%20Package/badge.svg)](https://github.com/lddsb/drone-dingtalk-message/actions?query=workflow%3A%22Publish+to+DockerHub+and+Github+Package%22) [![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)
[中文说明](README_ZH.md)
<!-- toc -->
- [Drone CI Plugin Config](#drone-ci-plugin-config)
- [Plugin Parameter Reference](#plugin-parameter-reference)
- [TPL](#tpl)
- [Screen Shot](#screen-shot)
- [Development](#development)
- [Todo](#todo)
- [Kubernetes Users](#kubernetes-users)
<!-- tocstop -->
### Drone CI Plugin Config ### Drone CI Plugin Config
`0.8.x` `0.8.x`
```yaml ```yaml
pipeline: pipeline:
... #...
notification: notification:
image: lddsb/drone-dingtalk-message image: lddsb/drone-dingtalk-message
token: your-group-bot-token token: your-group-bot-token
type: markdown type: markdown
``` ```
`1.0.x` `1.x`
```yaml ```yaml
kind: pipeline
name: default
steps: steps:
... #...
- name: notification - name: notification
image: lddsb/drone-dingtalk-message image: lddsb/drone-dingtalk-message
settings: settings:
token: your-groupbot-token token: your-groupbot-token
type: markdown type: markdown
secret: your-secret-for-generate-sign
debug: true
```
`Use the "exec" type`
```yaml
kind: pipeline
type: exec
steps:
...
- name: notification
environment: # Using environment to pass parameters
PLUGIN_TOKEN:
from_secret: dingtalk_token
PLUGIN_TYPE: markdown
PLUGIN_DEBUG: false
PLUGIN_TPL: /data/drone/dingtalk/tpls/markdown.tpl # The actual location (absolute path) of the tpl.
commands:
- /data/drone/dingtalk/dingtalk-message # Location of the "dingtalk-message" file (absolute path)
``` ```
### Plugin Parameter Reference ### Plugin Parameter Reference
@@ -36,38 +67,103 @@ 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.
`debug`
Boolean. Debug mode.
`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.
`message_color`(when `type=markdown`) `success_color`
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`(when `message_color=true`) `failure_color`
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`.
`sha_link`(when `type=markdown`) `success_pic`
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`(when `message_pic=true`) `failure_pic`
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.
`msg_at_mobiles`
String. You want at's phone number in the group, if you need at multi phone numbers, you can use `,` to separate. (if you use markdown type, you need define the at content in your tpl file)
### TPL
> `tpl` won't work with message type `link` !!!
That's a good news, we support `tpl` now.This is an example for `markdown` message:
# [TPL_REPO_FULL_NAME] build [TPL_BUILD_STATUS], takes [TPL_BUILD_CONSUMING]s
@mobile1 @mobile2
[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
@@ -93,28 +189,35 @@ String. You can customize the picture for the `build failure` message by this op
![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.
- First get this repo - get this repo
```shell ```shell
go get github.com/lddsb/drone-dingtalk-message $ git clone https://github.com/lddsb/drone-dingtalk-message.git /path/to/you/want
```
- get dependent lib
```shell
dep ensure
``` ```
- build - build
```shell ```shell
cd $GOPATH/src/github.com/lddsb/drone-dingtalk-message && go build . $ cd /path/to/you/want && GO111MODULE=on go build .
``` ```
- run - run
```shell ```shell
./drone-dingtalk-message -h $ ./drone-dingtalk-message -h
``` ```
### TODO
It's sad, just support `text`, `markdown` and `link` type now.
- implement all message type
- i18N
- batch send
- retry(e.g., network error, etc.)
### Kubernetes Users
Attention kubernetes users, [CHANGELOG](CHANGELOG.md#124---2020-04-28).It's the available versions:
- `1.1`(always latest for `1.1.x`)
- `>=1.1.4`
- `1.2`(always latest for `1.2.x`)
- `>=1.2.4`
- latest(always latest)
+226
View File
@@ -0,0 +1,226 @@
# Drone CI的钉钉群组机器人通知插件
[![GitHub Actions](https://github.com/lddsb/drone-dingtalk-message/workflows/Publish%20to%20DockerHub%20and%20Github%20Package/badge.svg)](https://github.com/lddsb/drone-dingtalk-message/actions?query=workflow%3A%22Publish+to+DockerHub+and+Github+Package%22) [![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)
<!-- toc -->
- [怎么使用本插件](#%E6%80%8E%E4%B9%88%E4%BD%BF%E7%94%A8%E6%9C%AC%E6%8F%92%E4%BB%B6)
- [插件参数](#%E6%8F%92%E4%BB%B6%E5%8F%82%E6%95%B0)
- [模版](#%E6%A8%A1%E7%89%88)
- [截图展示](#%E6%88%AA%E5%9B%BE%E5%B1%95%E7%A4%BA)
- [贡献代码](#%E8%B4%A1%E7%8C%AE%E4%BB%A3%E7%A0%81)
- [未来计划](#%E6%9C%AA%E6%9D%A5%E8%AE%A1%E5%88%92)
- [Kubernetes 用户请注意](#kubernetes-%E7%94%A8%E6%88%B7%E8%AF%B7%E6%B3%A8%E6%84%8F)
<!-- tocstop -->
### 怎么使用本插件
添加一个`step`到你的`.drone.yml`中,下面是例子:
`0.8.x`
```yaml
pipeline:
...
notification:
image: lddsb/drone-dingtalk-message
token: your-group-bot-token
type: markdown
```
`1.x`
```yaml
steps:
...
- name: notification
image: lddsb/drone-dingtalk-message
settings:
token: your-groupbot-token
type: markdown
secret: your-secret-for-generate-sign
debug: true
```
`命令行版本`
```yaml
kind: pipeline
type: exec
steps:
...
- name: 通知
environment: # 使用 environment 传递参数
PLUGIN_TOKEN:
from_secret: dingtalk_token
PLUGIN_TYPE: markdown
PLUGIN_DEBUG: false
PLUGIN_TPL: /data/drone/dingtalk/tpls/markdown.tpl # tpl 的实际位置(绝对路径)
commands:
- /data/drone/dingtalk/dingtalk-message # dingtalk-message 文件的位置(绝对路径)
```
### 插件参数
`token`(必须)
你可以通过加入和创建一个群组来添加钉钉自定义机器人,添加自定义机器人完成后即可获得所需要的`access token`
`type`(必须)
消息类型,因个人能力有限,目前仅支持`markdown``text`,其中,使用`markdown`可以获得最好的体验。
`secret`
如果你设置了`加签`,可以把你的`加签`密钥填入此项完成`加签`操作。
`tpl`
你可以通过该字段来自定义你的消息模版。该字段可以是一个本地路径也可以是一个远程的URL。
`debug`
通过该值可以打开`debug`模式,打印所有环境变量。
`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`运行结果为失败时该值会生效)
`msg_at_mobiles`
你需要@的群成员的手机号,多个时用英文逗号(`,`)分隔。如过你使用的是 `markdown` 类型的消息,则需要在 `tpl` 文件中加入 `@手机号` 的内容。
### 模版
> `tpl` 对 `link` 类型的消息并不支持 !!!
感天动地,我们终于支持自定义模版了!下面是一个`markdown`的自定义模版例子:
# [TPL_REPO_FULL_NAME] build [TPL_BUILD_STATUS], takes [TPL_BUILD_CONSUMING]s
@mobile1 @mobile2
[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])
`mobile1``mobile2` 应该为钉钉对应的手机号码,可以放在自己想要放的位置。
你可以写自己喜欢的模版,终于不用再对默认模版发愁啦!并且模版的语法非常简单!比较可惜的是目前支持的变量还比较少,下面是当前支持的变量的列表:
| Variable | Value |
| :-------------------: | :-------------------------------------------------: |
| [TPL_REPO_SHORT_NAME] | 当前仓库的名称,比如本仓库 `drone-dingtalk-message` |
| [TPL_REPO_FULL_NAME] | 当前仓库的名称,比如本仓库 `lddsb/drone-dingtalk-message` |
| [TPL_REPO_GROUP_NAME] | 当前仓库的组织名称,比如本仓库 `lddsb` |
| [TPL_REPO_OWNER_NAME] | 当前仓库拥有者的名称 |
| [TPL_REPO_REMOTE_URL] | 当前仓库的远程地址 |
| [TPL_BUILD_STATUS] | 当前编译的状态(比如, success, failure) |
| [TPL_BUILD_LINK] | 当前编译的链接 |
| [TPL_BUILD_EVENT] | 触发当前编译的动作(比如, push, pull request等) |
| [TPL_BUILD_CONSUMING] | 当前编译耗时,单位秒 |
| [TPL_COMMIT_SHA] | 当前提交的sha |
| [TPL_COMMIT_REF] | 当前提交的ref(比如, refs/heads/master等) |
| [TPL_COMMIT_LINK] | 当前提交的远程地址 |
| [TPL_COMMIT_BRANCH] | 当前分之名称(比如, dev, master等) |
| [TPL_COMMIT_MSG] | 当前提交的信息 |
| [TPL_AUTHOR_NAME] | 当前提交作者名称 |
| [TPL_AUTHOR_EMAIL] | 当前提交作者邮箱地址 |
| [TPL_AUTHOR_USERNAME] | 当前提交作者的用户名 |
| [TPL_AUTHOR_AVATAR] | 当前提交作者的头像 |
| [TPL_STATUS_PIC] | 根据编译状态显示不同的图片 |
| [TPL_STATUS_COLOR] | 根据编译状态显示不同的颜色 |
| [TPL_STATUS_EMOTICON] | 根据编译状态显示不同的表情,比如 `:)` `:(` |
### 截图展示
- 发送成功(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
```
### 未来计划
目前仅支持 `text`, `markdown` 以及 `link` 类型的消息,建议使用`markdown`类型。
- 实现更多的消息类型
- i18N国际化直接翻译环境变量
- 批量发送给多个群机器人
- 失败重试机制
### Kubernetes 用户请注意
因为`Drone CI` [官方缺陷](https://docs.drone.io/runner/kubernetes/overview) ,所以较早版本将无法正常获取到需要用到的变量,会导致部分功能异常。为了能正常使用,所以请使用以下版本:
- `1.1`(总会是`1.1.x`的最新版本)
- `>=1.1.4`
- `1.2`(总会是`1.2.x`的最新版本)
- `>=1.2.4`
+3 -3
View File
@@ -3,7 +3,7 @@ module github.com/lddsb/drone-dingtalk-message
go 1.12 go 1.12
require ( require (
github.com/joho/godotenv v1.3.0 github.com/joho/godotenv v1.5.1
github.com/lddsb/dingtalk-webhook v0.0.1 github.com/lddsb/dingtalk-webhook v0.0.5
github.com/urfave/cli v1.20.0 github.com/urfave/cli v1.22.15
) )
+31 -6
View File
@@ -1,6 +1,31 @@
github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4=
github.com/lddsb/dingtalk-webhook v0.0.1 h1:l4FdTMaRaHnrYfByALukFWK0ru9Rttl0dANg13/SnTI= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/lddsb/dingtalk-webhook v0.0.1/go.mod h1:5E+/sOBb6m+3ztqnZl4danEY3I5FeIwb12v12s9osbw= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
github.com/lddsb/dingtalk-webhook v0.0.5 h1:EOSXvcpN4IC7fXSAheI3OLJwwOGEPlGDV7xje1fQuJo=
github.com/lddsb/dingtalk-webhook v0.0.5/go.mod h1:dwNU75Sog87wJXAFcY5mDFM7eW4hIdX7bNemrN92pH0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/urfave/cli v1.22.15 h1:nuqt+pdC/KqswQKhETJjo7pvn/k4xMUxgW6liI7XpnM=
github.com/urfave/cli v1.22.15/go.mod h1:wSan1hmo5zeyLGBjRJbzRTNk8gwoYa2B9n4q9dmRIc0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+181 -69
View File
@@ -4,19 +4,21 @@ import (
"fmt" "fmt"
"log" "log"
"os" "os"
"time"
_ "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.1.1202" var Version = "0.2.1219"
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" year := time.Now().Year()
app.Copyright = fmt.Sprintf("© 2018-%d Dee Luo", year)
app.Authors = []cli.Author{ app.Authors = []cli.Author{
{ {
Name: "Dee Luo", Name: "Dee Luo",
@@ -27,36 +29,45 @@ func main() {
app.Version = Version app.Version = Version
app.Flags = []cli.Flag{ app.Flags = []cli.Flag{
cli.BoolFlag{ cli.BoolFlag{
Name: "config.debug", Name: "config.debug,debug",
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.lang", Name: "config.secret,secret",
Value: "zh_CN", Usage: "DingTalk WebHook secret for generate sign",
Usage: "the lang display (zh_CN or en_US, zh_CN is default)", EnvVar: "PLUGIN_SECRET",
EnvVar: "PLUGIN_LANG",
}, },
cli.StringFlag{ cli.StringFlag{
Name: "config.message.type,message_type", Name: "config.message.type,message_type,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{
Name: "config.message.at.all", Name: "config.message.at.all,at.all",
Usage: "at all in a message(only text and markdown type message can at)", Usage: "at all in a message(only text and markdown type message can at)",
EnvVar: "PLUGIN_MSG_AT_ALL", EnvVar: "PLUGIN_MSG_AT_ALL",
}, },
cli.StringFlag{ cli.StringFlag{
Name: "config.message.at.mobiles", Name: "config.message.at.mobiles,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",
@@ -94,10 +105,45 @@ func main() {
EnvVar: "DRONE_COMMIT_SHA", EnvVar: "DRONE_COMMIT_SHA",
}, },
cli.StringFlag{ cli.StringFlag{
Name: "repo.fullname", Name: "commit.ref",
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.Uint64Flag{
Name: "stage.started",
Usage: "stage started ",
EnvVar: "DRONE_STAGE_STARTED",
},
cli.Uint64Flag{
Name: "stage.finished",
Usage: "stage finished",
EnvVar: "DRONE_STAGE_FINISHED",
},
cli.StringFlag{ cli.StringFlag{
Name: "build.status", Name: "build.status",
Usage: "build status", Usage: "build status",
@@ -110,45 +156,85 @@ func main() {
EnvVar: "DRONE_BUILD_LINK", EnvVar: "DRONE_BUILD_LINK",
}, },
cli.StringFlag{ cli.StringFlag{
Name: "config.success.pic.url", Name: "build.event",
Usage: "config success picture url", Usage: "build event",
EnvVar: "DRONE_BUILD_EVENT",
},
cli.Uint64Flag{
Name: "build.started",
Usage: "build started",
EnvVar: "DRONE_BUILD_STARTED",
},
cli.Uint64Flag{
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: "config.failure.pic.url", Name: "custom.pic.url.failure",
Usage: "config failure picture url", Usage: "custom failure picture url",
EnvVar: "FAILURE_PICTURE_URL,PLUGIN_FAILURE_PIC", EnvVar: "FAILURE_PICTURE_URL,PLUGIN_FAILURE_PIC",
}, },
cli.StringFlag{ cli.StringFlag{
Name: "config.success.color", Name: "custom.color.success",
Usage: "config success color for title in markdown", Usage: "custom success color for title in markdown",
EnvVar: "SUCCESS_COLOR,PLUGIN_SUCCESS_COLOR", EnvVar: "SUCCESS_COLOR,PLUGIN_SUCCESS_COLOR",
}, },
cli.StringFlag{ cli.StringFlag{
Name: "config.failure.color", Name: "custom.color.failure",
Usage: "config failure color for title in markdown", Usage: "custom failure color for title in markdown",
EnvVar: "FAILURE_COLOR,PLUGIN_FAILURE_COLOR", EnvVar: "FAILURE_COLOR,PLUGIN_FAILURE_COLOR",
}, },
cli.BoolFlag{ cli.StringFlag{
Name: "config.message.color", Name: "custom.tpl,tpl",
Usage: "configure the message with color or not", Usage: "custom tpl",
EnvVar: "PLUGIN_COLOR,PLUGIN_MESSAGE_COLOR", EnvVar: "PLUGIN_TPL,PLUGIN_CUSTOM_TPL",
},
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: "config.tips.title", Name: "tpl.repo.full.name",
Usage: "tips title, just work for markdown type message", Usage: "tpl custom repo full name",
EnvVar: "PLUGIN_TIPS_TITLE", EnvVar: "PLUGIN_TPL_REPO_FULL_NAME,TPL_REPO_FULL_NAME",
}, },
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",
},
cli.StringFlag{
Name: "custom.started,started",
Usage: "started custom env name, eg., BUILD_STARTED",
EnvVar: "PLUGIN_CUSTOM_STARTED",
},
cli.StringFlag{
Name: "custom.finished,finished",
Usage: "finished custom env name, eg., BUILD_FINISHED",
EnvVar: "PLUGIN_CUSTOM_FINISHED",
},
}
// kubernetes runner patch
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 {
@@ -162,55 +248,81 @@ func run(c *cli.Context) {
Drone: Drone{ Drone: Drone{
// repo info // repo info
Repo: Repo{ Repo: Repo{
FullName: c.String("repo.fullname"), ShortName: c.String("repo.name"),
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.Uint64("build.started"),
FinishedAt: c.Uint64("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"),
Authors: struct { Author: CommitAuthor{
Avatar string Avatar: c.String("commit.author.avatar"),
Email string Email: c.String("commit.author.email"),
Name string Name: c.String("commit.author.name"),
}{ Username: c.String("commit.author.username"),
Avatar: c.String("commit.author.avatar"),
Email: c.String("commit.author.email"),
Name: c.String("commit.author.name"),
}, },
}, },
Stage: Stage{
StartedAt: c.Uint64("stage.started"),
FinishedAt: c.Uint64("stage.finished"),
},
}, },
// custom config // custom config
Config: Config{ Config: Config{
AccessToken: c.String("config.token"), AccessToken: c.String("config.token"),
//Lang: c.String("config.lang"), Secret: c.String("config.secret"),
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"),
}, },
Extra: Extra{ Custom: Custom{
Pic: ExtraPic{ Pic: Pic{
WithPic: c.Bool("config.message.pic"), SuccessPicURL: c.String("custom.pic.url.success"),
SuccessPicURL: c.String("config.success.pic.url"), FailurePicURL: c.String("custom.pic.url.failure"),
FailurePicURL: c.String("config.failure.pic.url"),
}, },
Color: ExtraColor{ Color: Color{
SuccessColor: c.String("config.success.color"), SuccessColor: c.String("custom.color.success"),
FailureColor: c.String("config.failure.color"), FailureColor: c.String("custom.color.failure"),
WithColor: c.Bool("config.message.color"), },
Tpl: c.String("custom.tpl"),
Consuming: Consuming{
StartedEnv: c.String("custom.started"),
FinishedEnv: c.String("custom.finished"),
},
},
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)
} }
} }
+294 -135
View File
@@ -3,51 +3,74 @@ package main
import ( import (
"errors" "errors"
"fmt" "fmt"
"io/ioutil"
"log" "log"
"net/http"
"net/url"
"os"
"regexp"
"strconv"
"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 {
FullName string // repository full name ShortName string // short name
GroupName string // group name
FullName string // repository full name
OwnerName string // repo owner
RemoteURL string // repo remote url
} }
// Build `build info` // 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 uint64 // build start at ( unix timestamp )
FinishedAt uint64 // build finish at ( unix timestamp )
} }
// Commit `commit info` // 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
Authors CommitAuthors Ref string // commit ref
Author CommitAuthor
} }
// CommitAuthors `commit author info` // Stage drone stage env
CommitAuthors struct { Stage struct {
Avatar string // providers the author avatar for the current commit StartedAt uint64
Email string // providers the author email for the current commit FinishedAt uint64
Name string // providers the author name for the current commit
} }
// Drone `drone info` // CommitAuthor commit author info
CommitAuthor struct {
Avatar string // providers the author avatar for the current commit
Email string // providers the author email 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 struct { Drone struct {
Repo Repo Repo Repo
Build Build Build Build
Commit Commit Commit Commit
Stage Stage
} }
// 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
@@ -55,12 +78,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
@@ -68,60 +91,109 @@ type (
BtnOrientation bool BtnOrientation bool
} }
// Extra `extra variables` // Pic extra config for pic
Extra struct { Pic struct {
Color ExtraColor
Pic ExtraPic
LinkSha bool
}
// ExtraPic `extra config for pic`
ExtraPic struct {
WithPic bool
SuccessPicURL string SuccessPicURL string
FailurePicURL string FailurePicURL string
} }
// ExtraColor `extra config for color` // Color extra config for color
ExtraColor struct { Color struct {
WithColor bool
SuccessColor string SuccessColor string
FailureColor string FailureColor string
} }
// Plugin `plugin all config` // Plugin plugin all config
Plugin struct { Plugin struct {
Drone Drone Tpl Tpl
Config Config Drone Drone
Extra Extra Config Config
Custom Custom
Message MessageConfig
}
// Custom user custom env
Custom struct {
Tpl string
Color Color
Pic Pic
Consuming Consuming
}
// Tpl base
Tpl struct {
Repo TplRepo
Commit TplCommit
Build TplBuild
}
// TplRepo TPL repo
TplRepo struct {
FullName string
ShortName string
}
// TplCommit TPL commit
TplCommit struct {
Branch string
}
// TplBuild TPL build
TplBuild struct {
Status Status
}
// Status status
Status struct {
Success string
Failure string
}
// Consuming custom consuming env
Consuming struct {
StartedEnv string
FinishedEnv string
} }
) )
// Exec `execute webhook` // Exec execute WebHook
func (p *Plugin) Exec() error { func (p *Plugin) Exec() error {
if p.Config.Debug {
for _, e := range os.Environ() {
log.Println(e)
}
}
var err error var err error
if 0 == len(p.Config.AccessToken) { if "" == p.Config.AccessToken {
msg := "missing dingtalk access token" msg := "missing DingTalk access token"
return errors.New(msg) return errors.New(msg)
} }
if 6 > len(p.Drone.Commit.Sha) { tpl, err := p.getMessage()
return errors.New("commit sha cannot short than 6") if err != nil {
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, p.baseTpl(), p.Config.IsAtALL, mobiles...) err = newWebHook.SendMarkdownMsg(p.Config.TipsTitle, tpl, p.Config.IsAtALL, mobiles...)
case "text": case "text":
err = newWebhook.SendTextMsg(p.baseTpl(), p.Config.IsAtALL, mobiles...) err = newWebHook.SendTextMsg(tpl, p.Config.IsAtALL, mobiles...)
case "link": case "link":
err = newWebhook.SendLinkMsg(p.Drone.Build.Status, p.baseTpl(), p.Drone.Commit.Authors.Avatar, p.Drone.Build.Link) err = newWebHook.SendLinkMsg(p.Drone.Build.Status, tpl, p.Drone.Commit.Author.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)
@@ -134,90 +206,174 @@ func (p *Plugin) Exec() error {
return err return err
} }
// markdownTpl `output the tpl of markdown` // fileExists check file is exists
func (p *Plugin) markdownTpl() string { func fileExists(filePath string) bool {
var tpl string _, err := os.Stat(filePath)
if err != nil {
// title if os.IsExist(err) {
title := fmt.Sprintf(" %s *Branch Build %s*", return true
strings.Title(p.Drone.Commit.Branch), }
strings.Title(p.Drone.Build.Status)) return false
// 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
} }
func (p *Plugin) baseTpl() string { // getTpl get tpl from local file or remote file
tpl := "" func (p *Plugin) getTpl() (tpl string, err error) {
switch strings.ToLower(p.Config.MsgType) { //var tpl string
case "markdown": tplDir := "/app/drone/dingtalk/message/tpls"
tpl = p.markdownTpl() if "" == p.Custom.Tpl {
case "text": p.Custom.Tpl = fmt.Sprintf("%s/%s.tpl", tplDir, strings.ToLower(p.Config.MsgType))
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) {
// it must be a tpl stream
return p.Custom.Tpl, nil
}
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 {
// from environment
if envStr := os.Getenv(m[1]); envStr != "" {
tpl = strings.ReplaceAll(tpl, m[0], envStr)
}
// 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
get emoticon func (p *Plugin) getEnvs() map[string]interface{} {
*/ 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
var consuming uint64
// custom consuming env
if p.Custom.Consuming.FinishedEnv != "" && p.Custom.Consuming.StartedEnv != "" {
finishedAt, _ := strconv.ParseUint(os.Getenv(p.Custom.Consuming.FinishedEnv), 10, 64)
startedAt, _ := strconv.ParseUint(os.Getenv(p.Custom.Consuming.StartedEnv), 10, 64)
consuming = finishedAt - startedAt
} else {
consuming = p.Drone.Build.FinishedAt - p.Drone.Build.StartAt
if consuming == 0 {
consuming = p.Drone.Stage.FinishedAt - p.Drone.Stage.StartedAt
}
}
envs["TPL_BUILD_CONSUMING"] = fmt.Sprintf("%v", consuming)
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"] = ":)"
@@ -231,44 +387,47 @@ 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.Extra.Pic.SuccessPicURL != "" { if p.Custom.Pic.SuccessPicURL != "" {
pics["success"] = p.Extra.Pic.SuccessPicURL pics["success"] = p.Custom.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.Extra.Pic.FailurePicURL != "" { if p.Custom.Pic.FailurePicURL != "" {
pics["failure"] = p.Extra.Pic.FailurePicURL pics["failure"] = p.Custom.Pic.FailurePicURL
} }
url, ok := pics[p.Drone.Build.Status] picURL, ok := pics[p.Drone.Build.Status]
if ok { if ok {
return url return picURL
} }
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.Extra.Color.SuccessColor != "" { if p.Custom.Color.SuccessColor != "" {
colors["success"] = "#" + p.Extra.Color.SuccessColor if p.Custom.Color.SuccessColor[0] != '#' {
p.Custom.Color.SuccessColor = "#" + p.Custom.Color.SuccessColor
}
colors["success"] = p.Custom.Color.SuccessColor
} }
// failure color // failure color
colors["failure"] = "#FF0000" colors["failure"] = "#FF0000"
if p.Extra.Color.FailureColor != "" { if p.Custom.Color.FailureColor != "" {
colors["failure"] = "#" + p.Extra.Color.FailureColor if p.Custom.Color.FailureColor[0] != '#' {
p.Custom.Color.FailureColor = "#" + p.Custom.Color.FailureColor
}
colors["failure"] = p.Custom.Color.FailureColor
} }
color, ok := colors[p.Drone.Build.Status] color, ok := colors[p.Drone.Build.Status]
+23 -21
View File
@@ -12,43 +12,45 @@ func TestPlugin(t *testing.T) {
} }
p.Config.AccessToken = "example-access-token" p.Config.AccessToken = "example-access-token"
err = p.Exec() p.Custom.Tpl = "tpls/markdown.tpl"
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 = "text"
err = p.Exec()
if nil == err {
t.Error("access token invalid error should be catch!")
}
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.Extra.Color.WithColor = true p.Custom.Tpl = "https://aaa.com"
p.Extra.Color.FailureColor = "#555555" p.Config.MsgType = "text"
p.Extra.Color.SuccessColor = "#222222"
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"
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"
err = p.Exec()
if nil == err {
t.Error("access token invalid error should be catch!")
}
p.Custom.Color.FailureColor = "#555555"
p.Custom.Color.SuccessColor = "#222222"
p.Custom.Pic.FailurePicURL = "https://www.baidu.com"
p.Custom.Pic.SuccessPicURL = "https://www.baidu.com"
p.Config.MsgType = "markdown"
p.Custom.Tpl = "tpls/markdown.tpl"
err = p.Exec()
if nil == err {
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
@@ -0,0 +1,9 @@
### **[CI_PROJECT_TITLE]**'s **[CI_COMMIT_BRANCH]** build **[TPL_BUILD_STATUS]**
Message: [CI_COMMIT_MESSAGE]
Detail: [[CI_COMMIT_SHA]]([CI_PROJECT_URL]/commit/[CI_COMMIT_SHA])
Author: [[GITLAB_USER_NAME]([GITLAB_USER_EMAIL])](mailto:[GITLAB_USER_EMAIL])
[Click To The Build Detail Page [TPL_STATUS_EMOTICON]]([CI_PIPELINE_URL])
+9
View File
@@ -0,0 +1,9 @@
### [TPL_REPO_SHORT_NAME] build [TPL_BUILD_STATUS] (`takes [TPL_BUILD_CONSUMING]s`)
Message: [TPL_COMMIT_MSG]
Detail: [[TPL_COMMIT_SHA]]([TPL_COMMIT_LINK])
Author: [[TPL_AUTHOR_NAME]([TPL_AUTHOR_EMAIL])](mailto:[TPL_AUTHOR_EMAIL])
[Click To The Build Detail Page [TPL_STATUS_EMOTICON]]([TPL_BUILD_LINK])
+11
View File
@@ -0,0 +1,11 @@
### [TPL_REPO_SHORT_NAME] build [TPL_BUILD_STATUS] (`takes [TPL_BUILD_CONSUMING]s`)
@mobile1 @mobile2
Message: [TPL_COMMIT_MSG]
Detail: [[TPL_COMMIT_SHA]]([TPL_COMMIT_LINK])
Author: [[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
@@ -0,0 +1,5 @@
[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])