Compare commits

...

62 Commits

Author SHA1 Message Date
Bo-Yi Wu cd7b8b4656 chore(docker): bump alpine base image to 3.23
- Upgrade FROM alpine:3.17 to alpine:3.23
- Resolve Trivy CRITICAL/HIGH CVE findings from EOL alpine 3.17
2026-05-08 23:55:41 +08:00
Bo-Yi Wu 530ced4f2a chore: bump go directive to 1.25.10
- Update go.mod go directive from 1.25.9 to 1.25.10
2026-05-08 21:19:20 +08:00
Bo-Yi Wu 072876987d ci: bump golangci-lint to v2.12
- Upgrade golangci-lint version from v2.11 to v2.12
2026-05-08 20:13:40 +08:00
Bo-Yi Wu caaf39fc08 ci(actions): bump trivy-action to v0.36.0 and codecov-action to v6 2026-04-25 16:51:03 +08:00
Bo-Yi Wu d746084872 ci(docker): fail push when trivy finds CRITICAL/HIGH issues 2026-04-16 23:01:15 +08:00
Bo-Yi Wu 6379123ca3 ci: enable check-latest in docker and goreleaser workflows 2026-04-16 22:42:55 +08:00
Bo-Yi Wu cff7d4e183 fix: skip integration tests without telegram secrets; apply modernize fix 2026-04-16 22:39:48 +08:00
Bo-Yi Wu 7007692d2e ci: enable check-latest for setup-go to fetch newest patch 2026-04-16 21:15:46 +08:00
Bo-Yi Wu 23f0958c87 ci: pin golangci-lint to v2.11 2026-04-16 21:11:25 +08:00
Bo-Yi Wu c8c37942c1 ci: bump GitHub Actions and add Go 1.25/1.26 to test matrix 2026-04-16 21:03:32 +08:00
Bo-Yi Wu a7daa0df80 chore: bump go directive to 1.25.9 2026-04-16 20:58:04 +08:00
Bo-Yi Wu f3ace6f519 ci: add Trivy security scanning for source code and Docker image
- Add independent trivy.yml workflow with repo scan and image scan jobs
- Add Trivy image scan step in docker.yml before pushing Docker image
- Add security-events permission for SARIF upload
- Add Trivy Security Scan badge to README
2026-04-16 18:10:12 +08:00
Bo-Yi Wu 4de983b4ef fix(deps): upgrade golang.org/x/crypto to fix CVE vulnerabilities
- bump golang.org/x/crypto to v0.45.0 (fixes CVE-2024-45337 CRITICAL,
  CVE-2025-22869 HIGH, CVE-2025-47914 MEDIUM, CVE-2025-58181 MEDIUM)
- bump golang.org/x/sys to v0.38.0
2026-04-16 12:13:16 +08:00
Bo-Yi Wu b4a51bd6b6 ci(actions): upgrade GitHub Actions to latest versions
- bump actions/checkout to v6
- bump actions/setup-go to v6
- bump actions/cache to v5
- bump goreleaser/goreleaser-action to v7
- bump golangci/golangci-lint-action to v9
- bump github/codeql-action/* to v4
- bump codecov/codecov-action to v5
- bump docker/build-push-action to v7
- bump docker/login-action to v4
- bump docker/metadata-action to v6
- bump docker/setup-buildx-action to v4
- bump docker/setup-qemu-action to v4
- bump hadolint/hadolint-action to v3.3.0
- bump aquasecurity/trivy-action to v0.35.0
2026-04-16 12:06:53 +08:00
Bo-Yi Wu 30b9c501ff perf(plugin): hoist repeated work out of per-user loop
- Pre-render message templates before iterating users
- Pre-parse locations and venues before iterating users
- Inline trivial templateMessage wrapper into call site
- Extract escapeMarkdownFields variadic helper for bulk field escaping
- Use strings.TrimSpace instead of strings.Trim(" ") for robustness
- Pre-allocate slices in trimElement, escapeMarkdown, and globList
- Fix comment typo and inconsistent audio caption trailing period
2026-04-08 23:10:59 +08:00
Bo-Yi Wu cbae1a3737 chore: migrate golangci-lint config to v2
- Add version field and migrate to v2 config format
- Replace deprecated linters with modern equivalents
- Add new linters: bidichk, depguard, forbidigo, revive, testifylint, etc.
- Move gofmt, gofumpt, golines to formatters section
- Configure revive rules, depguard deny list, and exclusion presets
2026-04-08 23:00:38 +08:00
Bo-Yi Wu 0bc6220388 fix: resolve all golangci-lint issues
- Replace fmt.Printf with log.Printf to satisfy forbidigo
- Fix ineffectual assignment to err in proxy block by avoiding variable shadowing
- Format long lines with golines
- Use assert.Error/NoError instead of NotNil/Nil for error assertions
- Use assert.True/False instead of Equal for boolean assertions
- Use assert.Empty instead of Equal with len check
- Use require for mid-test error assertions that guard subsequent operations
- Add testify/require import
2026-04-08 22:47:32 +08:00
Bo-Yi Wu 8587a97ab1 refactor: simplify plugin code and fix minor issues
- Replace os.Open/bufio/io.ReadAll with os.ReadFile in loadTextFromFile
- Guard proxy URL parsing inside socks5 check to avoid false errors
- Remove redundant trimElement wrapping around globList calls
- Remove dead title assignment in convertLocation
- Switch Plugin methods to pointer receivers to avoid struct copying
- Use %w for error wrapping in fmt.Errorf calls
- Fix "unmarshall" typos to "unmarshal" in error messages
- Fix duplicate DIST variable and GXZ_PAGAGE typo in Makefile
2026-04-08 22:40:06 +08:00
Gianluca Boiano 893f3c30bf chore: add DOCS.md metadata for woodpecker plugins (#136) 2024-10-17 23:10:22 +08:00
appleboy 1f66667a65 ci: update Go version in workflow to 1.23
- Update the Go version in the workflow to include 1.23

Signed-off-by: appleboy <appleboy.tw@gmail.com>
2024-09-06 16:03:56 +08:00
appleboy 47c90ae600 chore: update dependencies to latest versions
- Update the version of `dario.cat/mergo` to `v1.0.1`
- Remove `github.com/Masterminds/semver/v3` version `v3.2.1` and update to `v3.3.0`
- Remove `github.com/Masterminds/sprig/v3` version `v3.2.3` and update to `v3.3.0`
- Remove `github.com/imdario/mergo` version `v0.3.16`
- Update `golang.org/x/crypto` to version `v0.27.0`
- Update `golang.org/x/sys` to version `v0.25.0`

Signed-off-by: appleboy <appleboy.tw@gmail.com>
2024-09-06 15:59:58 +08:00
Bo-Yi Wu 65d453bece ci: enhance CI workflow with matrix testing and caching
- Replace the testing job with a more structured test job using a matrix strategy for different OS and Go versions.
- Update the Go setup action to version 5.
- Add caching for Go build and module paths to improve build performance.
- Include a step to check out the code with the specific GitHub reference.
- Remove the previous setup tools step and replace it with the new structure.

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2024-08-14 23:10:22 +08:00
Bo-Yi Wu 45cfcd8bb1 chore: configure Goreleaser for multi-OS builds and hooks
- Add a new configuration file for Goreleaser
- Define build settings for multiple operating systems and architectures
- Specify hooks for pre- and post-build processes
- Include options for generating checksums and handling snapshots
- Set up changelog grouping for features, bug fixes, enhancements, and more

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2024-08-13 23:20:32 +08:00
Bo-Yi Wu a82484f5d7 docs: remove unnecessary badges from the README
- Remove build status badges from the README
- Delete Docker pulls badge from the README

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2024-08-13 23:18:14 +08:00
Bo-Yi Wu 4b48840e98 chore: upgrade Go version and linting container
- Update Go version from 1.20 to 1.22 in go.mod
- Change the linting container from golang:1.21-alpine to golang:1.22-alpine in the GitHub workflow

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2024-08-13 23:17:00 +08:00
Bo-Yi Wu 3660832535 chore: remove gocyclo linter from project configuration
- Remove the gocyclo linter from the configuration

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2024-08-13 23:16:21 +08:00
Bo-Yi Wu 104ffc4fe7 chore: update Dockerfile and Hadolint configuration
- Add a new configuration file for Hadolint with specific ignored rules
- Change the Dockerfile maintainer label from SSH Plugin to Telegram Plugin
- Update the Dockerfile to remove the specific version of ca-certificates and install the latest version instead

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2024-08-13 23:14:25 +08:00
Bo-Yi Wu 80e7a36e5e ci: update CI workflows for improved build processes
- Update Docker workflow to use version 6 of the build-push-action
- Remove the build_linux_arm step from the Docker workflow
- Update Goreleaser workflow to use version 6 of the goreleaser-action
- Change the args in the Goreleaser workflow from release --rm-dist to release --clean
- Update lint workflow to use version 6 of the golangci-lint-action

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2024-08-13 23:13:51 +08:00
Bo-Yi Wu 6fdd0872fb chore: upgrade multiple dependencies to latest versions
- Update `github.com/urfave/cli` from version `1.22.14` to `1.22.15`
- Update `github.com/cpuguy83/go-md2man/v2` from version `2.0.3` to `2.0.4`
- Update `github.com/huandu/xstrings` from version `1.4.0` to `1.5.0`
- Update `github.com/shopspring/decimal` from version `1.3.1` to `1.4.0`
- Update `github.com/spf13/cast` from version `1.6.0` to `1.7.0`
- Update `golang.org/x/crypto` from version `0.21.0` to `0.26.0`
- Update `golang.org/x/sys` from version `0.18.0` to `0.24.0`

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2024-08-13 23:12:18 +08:00
Bo-Yi Wu d0cc2a2774 refactor: refactor code and update linter config
- Add a new `.golangci.yml` configuration file with a list of enabled linters
- Exclude `lll` linter for lines starting with `//go:generate`
- Replace `strings.Replace` with `strings.ReplaceAll` in `plugin.go` for markdown escaping and error message sanitization
- Simplify time addition expressions in `plugin_test.go` by removing unnecessary `time.Duration` conversions

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2024-03-05 21:51:11 +08:00
Bo-Yi Wu 69c7f9efd1 chore: update dependencies and CI configurations
- Update `github.com/stretchr/testify` dependency from version `1.8.4` to `1.9.0`

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2024-03-05 21:39:40 +08:00
Bo-Yi Wu 9d6dcccab5 ci: refactor CI workflows and update Go version management
- Update CodeQL GitHub Action from version 2 to version 3 in codeql.yml
- Replace static Go version with dynamic version from go.mod and enable check for latest Go version in goreleaser.yml
- Add Checkout repository step to lint.yml workflow
- Replace static Go version with dynamic version from go.mod and enable check for latest Go version in lint.yml workflow

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2024-03-05 21:39:02 +08:00
Bo-Yi Wu 58c63ee76a ci: update GitHub Actions workflows to v4
- Update the GitHub Actions workflow to use version 4 of the `golangci-lint-action`
- Update the GitHub Actions workflow to use version 4 of the `codecov-action`

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2024-03-05 21:37:56 +08:00
Bo-Yi Wu ce010e6672 chore: update dependencies to latest versions
- Update `github.com/google/uuid` dependency from `v1.5.0` to `v1.6.0`
- Upgrade `golang.org/x/crypto` from `v0.18.0` to `v0.21.0`
- Upgrade `golang.org/x/sys` from `v0.16.0` to `v0.18.0`

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2024-03-05 21:36:27 +08:00
appleboy 3b9ad40520 chore: update dependencies to latest versions
- Update the version of `golang.org/x/crypto` to `v0.18.0`
- Update the version of `golang.org/x/sys` to `v0.16.0`

Signed-off-by: appleboy <appleboy.tw@gmail.com>
2024-01-12 21:24:30 +08:00
appleboy f103b43735 chore: update CodeQL initialization action to v3
- Update the CodeQL initialization action from v2 to v3

Signed-off-by: appleboy <appleboy.tw@gmail.com>
2023-12-24 19:01:12 +08:00
appleboy 361d59920c chore: update dependencies in go.mod file
- Update the version of `github.com/google/uuid` from `v1.4.0` to `v1.5.0` in the `go.mod` file
- Update the version of `golang.org/x/crypto` from `v0.16.0` to `v0.17.0` in the `go.mod` file

Signed-off-by: appleboy <appleboy.tw@gmail.com>
2023-12-24 18:58:08 +08:00
Bo-Yi Wu a77434ffeb chore: update dependencies to latest versions
- Update `github.com/google/uuid` from v1.3.1 to v1.4.0
- Update `github.com/spf13/cast` from v1.5.1 to v1.6.0
- Update `golang.org/x/crypto` from v0.14.0 to v0.16.0
- Update `golang.org/x/sys` from v0.13.0 to v0.15.0

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2023-12-12 20:43:48 +08:00
Bo-Yi Wu a8e9c83c55 chore: update actions to version 5 in relevant files
- Update the `setup-go` action from version 4 to version 5 in `docker.yml`
- Update the `docker/build-push-action` action from version 4 to version 5 in `docker.yml`
- Update the `setup-go` action from version 4 to version 5 in `goreleaser.yml`
- Update the `goreleaser/goreleaser-action` action from version 4 to version 5 in `goreleaser.yml`
- Update the `setup-go` action from version 4 to version 5 in `lint.yml`

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2023-12-11 22:47:40 +08:00
Bo-Yi Wu 3c91807166 build: update container and package dependencies
- Change the container from `golang:1.19-alpine` to `golang:1.21-alpine`
- Add `build-base`, `zlib-dev`, and `ucl-dev` to the list of packages to be installed

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2023-10-25 15:58:58 +08:00
Bo-Yi Wu 8239f0f8b1 chore: add setup step for related tools in lint workflow
- Add a step to setup related tools in the lint workflow

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2023-10-25 15:49:47 +08:00
Bo-Yi Wu de446823b7 refactor: refactor file handling to use os package
- Remove the import of `io/ioutil`
- Replace `ioutil.ReadFile` with `os.ReadFile`

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2023-10-25 15:46:56 +08:00
Bo-Yi Wu d8db8b8eea chore: update docker/setup-qemu-action to version v3
- Update the version of `docker/setup-qemu-action` from `v2` to `v3`

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2023-10-25 15:41:25 +08:00
Bo-Yi Wu 49d1464e69 refactor: refactor file handling and imports
- Change in main.go: Replaced `godotenv.Load(filename)` with `_ = godotenv.Load(filename)`
- Change in main.go: Replaced `godotenv.Overload("/run/drone/env")` with `_ = godotenv.Overload("/run/drone/env")`
- Change in plugin.go: Added import for "io"
- Change in plugin.go: Replaced `ioutil.ReadAll(r)` with `io.ReadAll(r)`

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2023-10-25 15:40:16 +08:00
Bo-Yi Wu 99974ef0e7 chore: update docker/setup-buildx-action to v3
- Update the version of `docker/setup-buildx-action` from `v2` to `v3`

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2023-10-25 15:38:51 +08:00
Bo-Yi Wu dc775b15ea chore: update workflow action versions
- Fix a typo in the cron expression for the codeql.yml workflow
- Update the version of the actions/checkout action in the codeql.yml workflow
- Update the version of the docker/login-action in the docker.yml workflow
- Update the version of the docker/metadata-action in the docker.yml workflow
- Update the version of the actions/checkout action in the goreleaser.yml workflow
- Update the version of the actions/checkout action in the lint.yml workflow

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2023-10-25 15:36:36 +08:00
Bo-Yi Wu 571987a1f0 chore: update dependencies in go.mod file
- Update the version of Go to 1.20 in the go.mod file
- Update the version of github.com/appleboy/drone-template-lib to v1.3.0 in the go.mod file
- Update the version of github.com/joho/godotenv to v1.5.1 in the go.mod file
- Update the version of github.com/stretchr/testify to v1.8.4 in the go.mod file
- Update the version of github.com/urfave/cli to v1.22.14 in the go.mod file

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2023-10-25 10:50:56 +08:00
Bo-Yi Wu 92b96294c4 build: add GitHub workflows and Dockerfile
- Add a new file `.github/FUNDING.yml`
- Add a new file `.github/dependabot.yml`
- Add a new file `.github/workflows/codeql.yml`
- Add a new file `.github/workflows/docker.yml`
- Add a new file `.github/workflows/goreleaser.yml`
- Add a new file `.github/workflows/lint.yml`
- Add a new file `docker/Dockerfile`
- Delete the file `docker/Dockerfile.linux.amd64`
- Delete the file `docker/Dockerfile.linux.arm`
- Delete the file `docker/Dockerfile.linux.arm64`
- Delete the file `docker/Dockerfile.windows.amd64`
- Delete the file `docker/manifest.tmpl`

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2023-10-25 10:47:34 +08:00
Bo-Yi Wu 81d4eb4d8f chore: remove unnecessary configuration files
- Deleted file: `.appveyor.yml`
- Deleted file: `.drone.jsonnet`
- Deleted file: `.drone.yml`
- Deleted file: `.editorconfig`
- Deleted file: `.revive.toml`
- Deleted file: `pipeline.libsonnet`

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2023-10-25 10:42:46 +08:00
Alex 8ca83919d2 fix: {{since build.started}} does not reflect the actual build time in a p… (#114) 2023-10-25 07:27:16 +08:00
Bo-Yi Wu ab44454733 chore: remove trim \n from message (#105) 2021-07-12 15:17:02 +08:00
Bo-Yi Wu 2dfbc98fdd chore: remove badge
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2021-07-03 12:46:47 +08:00
Bo-Yi Wu 24f5558e9e chore: update go module
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2021-07-03 12:46:31 +08:00
Bo-Yi Wu ca270b33c8 Fix can't call duration helper func (#104)
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2021-07-03 12:39:54 +08:00
Bo-Yi Wu 882afee629 chore: upgrade drone template (#103) 2021-07-03 11:56:16 +08:00
Bo-Yi Wu d5d27734b0 chore: revert to go1.15 2021-04-03 07:08:13 +08:00
Bo-Yi Wu e0f4e9a9e4 chore: upgrade go module 2021-04-03 06:54:55 +08:00
Bo-Yi Wu d6c3514a66 chore: upgrade to go1.16 2021-04-03 06:39:46 +08:00
vaaski 6dbb4b1735 add disable_notification parameter (#99) 2021-04-03 06:38:16 +08:00
Bo-Yi Wu a91d132e3f chore: upgrade go module 2021-03-20 13:00:05 +08:00
Bo-Yi Wu 91cd4c1be5 chore(makefile): change gofmt toll to gofumpt 2021-01-14 21:15:06 +08:00
Bo-Yi Wu 7abe52fd7d chore: update to 1.15 2020-10-03 16:19:54 +08:00
34 changed files with 1119 additions and 1112 deletions
-63
View File
@@ -1,63 +0,0 @@
version: '{build}'
image: 'Visual Studio 2017'
platform: x64
max_jobs: 1
environment:
GOPATH: c:\go
docker_username:
secure: em/TNLUXxG19O/HvbvfJuQ==
docker_password:
secure: Yo9FJJqihaNz5q8T4Jz8tQ==
GO111MODULE: on
branches:
only:
- master
install:
- ps: |
docker version
go version
go env
build_script:
- ps: |
go mod download
if ( $env:APPVEYOR_REPO_TAG -eq 'false' ) {
$version = $env:APPVEYOR_REPO_COMMIT
} else {
$version = $env:APPVEYOR_REPO_TAG_NAME
}
go build -ldflags "-X main.Version=$version" -a -o release/drone-telegram.exe .
docker pull microsoft/nanoserver:10.0.14393.1884
docker build -f docker/Dockerfile.windows.amd64 -t appleboy/drone-telegram:windows-amd64 .
test_script:
- ps: |
docker run --rm appleboy/drone-telegram:windows-amd64 --version
deploy_script:
- ps: |
$ErrorActionPreference = 'Stop';
if ( $env:APPVEYOR_PULL_REQUEST_NUMBER ) {
Write-Host Nothing to deploy.
} else {
echo $env:DOCKER_PASSWORD | docker login --username $env:DOCKER_USERNAME --password-stdin
if ( $env:APPVEYOR_REPO_TAG -eq 'true' ) {
$major,$minor,$patch = $env:APPVEYOR_REPO_TAG_NAME.split('.')
docker push appleboy/drone-telegram:windows-amd64
docker tag appleboy/drone-telegram:windows-amd64 appleboy/drone-telegram:$major.$minor.$patch-windows-amd64
docker push appleboy/drone-telegram:$major.$minor.$patch-windows-amd64
docker tag appleboy/drone-telegram:windows-amd64 appleboy/drone-telegram:$major.$minor-windows-amd64
docker push appleboy/drone-telegram:$major.$minor-windows-amd64
docker tag appleboy/drone-telegram:windows-amd64 appleboy/drone-telegram:$major-windows-amd64
docker push appleboy/drone-telegram:$major-windows-amd64
} else {
if ( $env:APPVEYOR_REPO_BRANCH -eq 'master' ) {
docker push appleboy/drone-telegram:windows-amd64
}
}
}
-17
View File
@@ -1,17 +0,0 @@
local pipeline = import 'pipeline.libsonnet';
local name = 'drone-telegram';
[
pipeline.test,
pipeline.build(name, 'linux', 'amd64'),
pipeline.build(name, 'linux', 'arm64'),
pipeline.build(name, 'linux', 'arm'),
pipeline.release,
pipeline.notifications(depends_on=[
'linux-amd64',
'linux-arm64',
'linux-arm',
'release-binary',
]),
pipeline.signature('9a4dcc3659b6f2cb98486e40e4cb0c16d6fc19ad783d3bca13d30c476daf8213'),
]
-382
View File
@@ -1,382 +0,0 @@
---
kind: pipeline
name: testing
platform:
os: linux
arch: amd64
steps:
- name: vet
pull: always
image: golang:1.15
commands:
- make vet
volumes:
- name: gopath
path: /go
- name: lint
pull: always
image: golang:1.15
commands:
- make lint
volumes:
- name: gopath
path: /go
- name: misspell
pull: always
image: golang:1.15
commands:
- make misspell-check
volumes:
- name: gopath
path: /go
- name: test
pull: always
image: golang:1.15
commands:
- make test
- make coverage
environment:
TELEGRAM_TO:
from_secret: telegram_to
TELEGRAM_TOKEN:
from_secret: telegram_token
volumes:
- name: gopath
path: /go
- name: codecov
pull: always
image: robertstettner/drone-codecov
settings:
token:
from_secret: codecov_token
volumes:
- name: gopath
temp: {}
---
kind: pipeline
name: linux-amd64
platform:
os: linux
arch: amd64
steps:
- name: build-push
pull: always
image: golang:1.15
commands:
- "go build -v -ldflags '-X main.build=${DRONE_BUILD_NUMBER}' -a -o release/linux/amd64/drone-telegram"
environment:
CGO_ENABLED: 0
when:
event:
exclude:
- tag
- name: build-tag
pull: always
image: golang:1.15
commands:
- "go build -v -ldflags '-X main.version=${DRONE_TAG##v} -X main.build=${DRONE_BUILD_NUMBER}' -a -o release/linux/amd64/drone-telegram"
environment:
CGO_ENABLED: 0
when:
event:
- tag
- name: executable
pull: always
image: golang:1.15
commands:
- ./release/linux/amd64/drone-telegram --help
- name: dryrun
pull: always
image: plugins/docker:linux-amd64
settings:
cache_from: appleboy/drone-telegram
dockerfile: docker/Dockerfile.linux.amd64
dry_run: true
repo: appleboy/drone-telegram
tags: linux-amd64
when:
event:
- pull_request
- name: publish
pull: always
image: plugins/docker:linux-amd64
settings:
auto_tag: true
auto_tag_suffix: linux-amd64
cache_from: appleboy/drone-telegram
daemon_off: false
dockerfile: docker/Dockerfile.linux.amd64
password:
from_secret: docker_password
repo: appleboy/drone-telegram
username:
from_secret: docker_username
when:
event:
exclude:
- pull_request
trigger:
ref:
- refs/heads/master
- "refs/pull/**"
- "refs/tags/**"
depends_on:
- testing
---
kind: pipeline
name: linux-arm64
platform:
os: linux
arch: arm64
steps:
- name: build-push
pull: always
image: golang:1.15
commands:
- "go build -v -ldflags '-X main.build=${DRONE_BUILD_NUMBER}' -a -o release/linux/arm64/drone-telegram"
environment:
CGO_ENABLED: 0
when:
event:
exclude:
- tag
- name: build-tag
pull: always
image: golang:1.15
commands:
- "go build -v -ldflags '-X main.version=${DRONE_TAG##v} -X main.build=${DRONE_BUILD_NUMBER}' -a -o release/linux/arm64/drone-telegram"
environment:
CGO_ENABLED: 0
when:
event:
- tag
- name: executable
pull: always
image: golang:1.15
commands:
- ./release/linux/arm64/drone-telegram --help
- name: dryrun
pull: always
image: plugins/docker:linux-arm64
settings:
cache_from: appleboy/drone-telegram
dockerfile: docker/Dockerfile.linux.arm64
dry_run: true
repo: appleboy/drone-telegram
tags: linux-arm64
when:
event:
- pull_request
- name: publish
pull: always
image: plugins/docker:linux-arm64
settings:
auto_tag: true
auto_tag_suffix: linux-arm64
cache_from: appleboy/drone-telegram
daemon_off: false
dockerfile: docker/Dockerfile.linux.arm64
password:
from_secret: docker_password
repo: appleboy/drone-telegram
username:
from_secret: docker_username
when:
event:
exclude:
- pull_request
trigger:
ref:
- refs/heads/master
- "refs/pull/**"
- "refs/tags/**"
depends_on:
- testing
---
kind: pipeline
name: linux-arm
platform:
os: linux
arch: arm
steps:
- name: build-push
pull: always
image: golang:1.15
commands:
- "go build -v -ldflags '-X main.build=${DRONE_BUILD_NUMBER}' -a -o release/linux/arm/drone-telegram"
environment:
CGO_ENABLED: 0
when:
event:
exclude:
- tag
- name: build-tag
pull: always
image: golang:1.15
commands:
- "go build -v -ldflags '-X main.version=${DRONE_TAG##v} -X main.build=${DRONE_BUILD_NUMBER}' -a -o release/linux/arm/drone-telegram"
environment:
CGO_ENABLED: 0
when:
event:
- tag
- name: executable
pull: always
image: golang:1.15
commands:
- ./release/linux/arm/drone-telegram --help
- name: dryrun
pull: always
image: plugins/docker:linux-arm
settings:
cache_from: appleboy/drone-telegram
dockerfile: docker/Dockerfile.linux.arm
dry_run: true
repo: appleboy/drone-telegram
tags: linux-arm
when:
event:
- pull_request
- name: publish
pull: always
image: plugins/docker:linux-arm
settings:
auto_tag: true
auto_tag_suffix: linux-arm
cache_from: appleboy/drone-telegram
daemon_off: false
dockerfile: docker/Dockerfile.linux.arm
password:
from_secret: docker_password
repo: appleboy/drone-telegram
username:
from_secret: docker_username
when:
event:
exclude:
- pull_request
trigger:
ref:
- refs/heads/master
- "refs/pull/**"
- "refs/tags/**"
depends_on:
- testing
---
kind: pipeline
name: release-binary
platform:
os: linux
arch: amd64
steps:
- name: build-all-binary
pull: always
image: golang:1.15
commands:
- make release
when:
event:
- tag
- name: deploy-all-binary
pull: always
image: plugins/github-release
settings:
api_key:
from_secret: github_release_api_key
files:
- "dist/release/*"
when:
event:
- tag
trigger:
ref:
- "refs/tags/**"
depends_on:
- testing
---
kind: pipeline
name: notifications
platform:
os: linux
arch: amd64
steps:
- name: telegram
pull: always
image: appleboy/drone-telegram:linux-amd64
settings:
message: "{{#success build.status}} ✅ Build #{{build.number}} of `{{repo.name}}` succeeded.\n\n📝 Commit by {{commit.author}} on `{{commit.branch}}`:\n``` {{commit.message}} ```\n\n🌐 {{ build.link }} {{else}} ❌ Build #{{build.number}} of `{{repo.name}}` failed.\n\n📝 Commit by {{commit.author}} on `{{commit.branch}}`:\n``` {{commit.message}} ```\n\n🌐 {{ build.link }} {{/success}}\n\n timecost: {{since build.started}}\n"
to:
from_secret: telegram_to
token:
from_secret: telegram_token
- name: manifest
pull: always
image: plugins/manifest
settings:
ignore_missing: true
password:
from_secret: docker_password
spec: docker/manifest.tmpl
username:
from_secret: docker_username
trigger:
ref:
- refs/heads/master
- "refs/tags/**"
depends_on:
- linux-amd64
- linux-arm64
- linux-arm
- release-binary
---
kind: signature
hmac: 9a4dcc3659b6f2cb98486e40e4cb0c16d6fc19ad783d3bca13d30c476daf8213
...
-42
View File
@@ -1,42 +0,0 @@
# unifying the coding style for different editors and IDEs => editorconfig.org
; indicate this is the root of the project
root = true
###########################################################
; common
###########################################################
[*]
charset = utf-8
end_of_line = LF
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space
indent_size = 2
###########################################################
; make
###########################################################
[Makefile]
indent_style = tab
[makefile]
indent_style = tab
###########################################################
; markdown
###########################################################
[*.md]
trim_trailing_whitespace = false
###########################################################
; golang
###########################################################
[*.go]
indent_style = tab
+13
View File
@@ -0,0 +1,13 @@
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
custom: ['https://www.paypal.me/appleboy46']
+10
View File
@@ -0,0 +1,10 @@
version: 2
updates:
- package-ecosystem: github-actions
directory: /
schedule:
interval: weekly
- package-ecosystem: gomod
directory: /
schedule:
interval: weekly
+54
View File
@@ -0,0 +1,54 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
on:
push:
branches: [master]
pull_request:
# The branches below must be a subset of the branches above
branches: [master]
schedule:
- cron: "41 23 * * 6"
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: ["go"]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
# Learn more about CodeQL language support at https://git.io/codeql-language-support
steps:
- name: Checkout repository
uses: actions/checkout@v6
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v4
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v4
+102
View File
@@ -0,0 +1,102 @@
name: Docker Image
on:
push:
branches:
- master
tags:
- "v*"
pull_request:
branches:
- "master"
permissions:
contents: read
packages: write
security-events: write
jobs:
build-docker:
runs-on: ubuntu-latest
steps:
- name: Setup go
uses: actions/setup-go@v6
with:
go-version: "^1"
check-latest: true
- name: Checkout repository
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Build binary
run: |
make build_linux_amd64
make build_linux_arm64
- name: Set up QEMU
uses: docker/setup-qemu-action@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4
- name: Login to Docker Hub
uses: docker/login-action@v4
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v4
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Docker meta
id: docker-meta
uses: docker/metadata-action@v6
with:
images: |
${{ github.repository }}
ghcr.io/${{ github.repository }}
tags: |
type=raw,value=latest,enable={{is_default_branch}}
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
- name: Build image for scanning
uses: docker/build-push-action@v7
with:
context: .
file: docker/Dockerfile
platforms: linux/amd64
push: false
load: true
tags: drone-telegram:scan
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@v0.36.0
with:
image-ref: "drone-telegram:scan"
format: "sarif"
output: "trivy-image-results.sarif"
severity: "CRITICAL,HIGH"
exit-code: '1'
- name: Upload Trivy scan results to GitHub Security tab
uses: github/codeql-action/upload-sarif@v4
if: always()
with:
sarif_file: "trivy-image-results.sarif"
category: "trivy-docker-image"
- name: Build and push
uses: docker/build-push-action@v7
with:
context: .
platforms: linux/amd64,linux/arm64
file: docker/Dockerfile
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.docker-meta.outputs.tags }}
labels: ${{ steps.docker-meta.outputs.labels }}
+33
View File
@@ -0,0 +1,33 @@
name: Goreleaser
on:
push:
tags:
- "*"
permissions:
contents: write
jobs:
goreleaser:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Setup go
uses: actions/setup-go@v6
with:
go-version-file: go.mod
check-latest: true
- name: Run GoReleaser
uses: goreleaser/goreleaser-action@v7
with:
# either 'goreleaser' (default) or 'goreleaser-pro'
distribution: goreleaser
version: latest
args: release --clean
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+70
View File
@@ -0,0 +1,70 @@
name: Lint and Testing
on:
push:
pull_request:
jobs:
lint:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Setup go
uses: actions/setup-go@v6
with:
go-version-file: go.mod
check-latest: true
- name: Setup golangci-lint
uses: golangci/golangci-lint-action@v9
with:
version: v2.12
args: --verbose
- uses: hadolint/hadolint-action@v3.3.0
name: hadolint for Dockerfile
with:
dockerfile: docker/Dockerfile
test:
strategy:
matrix:
os: [ubuntu-latest]
go: [1.25, 1.26]
include:
- os: ubuntu-latest
go-build: ~/.cache/go-build
name: ${{ matrix.os }} @ Go ${{ matrix.go }}
runs-on: ${{ matrix.os }}
env:
GO111MODULE: on
GOPROXY: https://proxy.golang.org
steps:
- name: Set up Go ${{ matrix.go }}
uses: actions/setup-go@v6
with:
go-version: ${{ matrix.go }}
check-latest: true
- name: Checkout Code
uses: actions/checkout@v6
with:
ref: ${{ github.ref }}
- uses: actions/cache@v5
with:
path: |
${{ matrix.go-build }}
~/go/pkg/mod
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-go-
- name: Run Tests
run: |
make test
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v6
with:
flags: ${{ matrix.os }},go-${{ matrix.go }}
+85
View File
@@ -0,0 +1,85 @@
name: Trivy Security Scan
on:
push:
branches:
- master
pull_request:
branches:
- master
schedule:
# Run daily at 00:00 UTC
- cron: "0 0 * * *"
workflow_dispatch:
permissions:
contents: read
security-events: write
jobs:
trivy-repo-scan:
name: Trivy Repository Scan
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Run Trivy vulnerability scanner (repo)
uses: aquasecurity/trivy-action@v0.36.0
with:
scan-type: "fs"
scan-ref: "."
format: "sarif"
output: "trivy-repo-results.sarif"
severity: "CRITICAL,HIGH"
- name: Upload Trivy scan results to GitHub Security tab
uses: github/codeql-action/upload-sarif@v4
if: always()
with:
sarif_file: "trivy-repo-results.sarif"
trivy-image-scan:
name: Trivy Image Scan
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Setup go
uses: actions/setup-go@v6
with:
go-version-file: go.mod
check-latest: true
- name: Build binary
run: |
make build_linux_amd64
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4
- name: Build Docker image for scanning
uses: docker/build-push-action@v7
with:
context: .
file: docker/Dockerfile
platforms: linux/amd64
push: false
load: true
tags: drone-telegram:scan
- name: Run Trivy vulnerability scanner (image)
uses: aquasecurity/trivy-action@v0.36.0
with:
image-ref: "drone-telegram:scan"
format: "sarif"
output: "trivy-image-results.sarif"
severity: "CRITICAL,HIGH"
- name: Upload Trivy image scan results to GitHub Security tab
uses: github/codeql-action/upload-sarif@v4
if: always()
with:
sarif_file: "trivy-image-results.sarif"
category: "trivy-image"
+1
View File
@@ -26,3 +26,4 @@ drone-telegram
coverage.txt
.env
release
bin
+114
View File
@@ -0,0 +1,114 @@
version: "2"
output:
sort-order:
- file
linters:
default: none
enable:
- bidichk
- bodyclose
- depguard
- errcheck
- forbidigo
- gocheckcompilerdirectives
- gocritic
- govet
- ineffassign
- mirror
- modernize
- nakedret
- nilnil
- nolintlint
- perfsprint
- revive
- staticcheck
- testifylint
- unconvert
- unparam
- unused
- usestdlibvars
- usetesting
- wastedassign
settings:
depguard:
rules:
main:
deny:
- pkg: io/ioutil
desc: use os or io instead
- pkg: golang.org/x/exp
desc: it's experimental and unreliable
- pkg: github.com/pkg/errors
desc: use builtin errors package instead
nolintlint:
allow-unused: false
require-explanation: true
require-specific: true
gocritic:
enabled-checks:
- equalFold
disabled-checks: []
revive:
severity: error
rules:
- name: blank-imports
- name: constant-logical-expr
- name: context-as-argument
- name: context-keys-type
- name: dot-imports
- name: empty-lines
- name: error-return
- name: error-strings
- name: exported
- name: identical-branches
- name: if-return
- name: increment-decrement
- name: modifies-value-receiver
- name: package-comments
- name: redefines-builtin-id
- name: superfluous-else
- name: time-naming
- name: unexported-return
- name: var-declaration
- name: var-naming
disabled: true
staticcheck:
checks:
- all
testifylint: {}
usetesting:
os-temp-dir: true
perfsprint:
concat-loop: false
govet:
enable:
- nilness
- unusedwrite
exclusions:
generated: lax
presets:
- comments
- common-false-positives
- legacy
- std-error-handling
rules:
- linters:
- errcheck
- staticcheck
- unparam
path: _test\.go
issues:
max-issues-per-linter: 0
max-same-issues: 0
formatters:
enable:
- gofmt
- gofumpt
- golines
settings:
gofumpt:
extra-rules: true
exclusions:
generated: lax
run:
timeout: 10m
+123
View File
@@ -0,0 +1,123 @@
before:
hooks:
- go mod tidy
builds:
- env:
- CGO_ENABLED=0
goos:
- darwin
- linux
- windows
- freebsd
goarch:
- amd64
- arm
- arm64
goarm:
- "5"
- "6"
- "7"
ignore:
- goos: darwin
goarch: arm
- goos: darwin
goarch: ppc64le
- goos: darwin
goarch: s390x
- goos: windows
goarch: ppc64le
- goos: windows
goarch: s390x
- goos: windows
goarch: arm
goarm: "5"
- goos: windows
goarch: arm
goarm: "6"
- goos: windows
goarch: arm
goarm: "7"
- goos: windows
goarch: arm64
- goos: freebsd
goarch: ppc64le
- goos: freebsd
goarch: s390x
- goos: freebsd
goarch: arm
goarm: "5"
- goos: freebsd
goarch: arm
goarm: "6"
- goos: freebsd
goarch: arm
goarm: "7"
- goos: freebsd
goarch: arm64
flags:
- -trimpath
ldflags:
- -s -w
- -X main.Version={{.Version}}
binary: >-
{{ .ProjectName }}-
{{- if .IsSnapshot }}{{ .Branch }}-
{{- else }}{{- .Version }}-{{ end }}
{{- .Os }}-
{{- if eq .Arch "amd64" }}amd64
{{- else if eq .Arch "amd64_v1" }}amd64
{{- else if eq .Arch "386" }}386
{{- else }}{{ .Arch }}{{ end }}
{{- if .Arm }}-{{ .Arm }}{{ end }}
no_unique_dist_dir: true
hooks:
post:
- cmd: xz -k -9 {{ .Path }}
dir: ./dist/
archives:
- format: binary
name_template: "{{ .Binary }}"
allow_different_binary_count: true
checksum:
name_template: "checksums.txt"
extra_files:
- glob: ./**.xz
snapshot:
name_template: "{{ incpatch .Version }}"
release:
# You can add extra pre-existing files to the release.
# The filename on the release will be the last part of the path (base).
# If another file with the same name exists, the last one found will be used.
#
# Templates: allowed
extra_files:
- glob: ./**.xz
changelog:
use: github
groups:
- title: Features
regexp: "^.*feat[(\\w)]*:+.*$"
order: 0
- title: "Bug fixes"
regexp: "^.*fix[(\\w)]*:+.*$"
order: 1
- title: "Enhancements"
regexp: "^.*chore[(\\w)]*:+.*$"
order: 2
- title: "Refactor"
regexp: "^.*refactor[(\\w)]*:+.*$"
order: 3
- title: "Build process updates"
regexp: ^.*?(build|ci)(\(.+\))??!?:.+$
order: 4
- title: "Documentation updates"
regexp: ^.*?docs?(\(.+\))??!?:.+$
order: 4
- title: Others
order: 999
+3
View File
@@ -0,0 +1,3 @@
ignored:
- DL3018
- DL3008
-25
View File
@@ -1,25 +0,0 @@
ignoreGeneratedHeader = false
severity = "warning"
confidence = 0.8
errorCode = 1
warningCode = 1
[rule.blank-imports]
[rule.context-as-argument]
[rule.context-keys-type]
[rule.dot-imports]
[rule.error-return]
[rule.error-strings]
[rule.error-naming]
[rule.exported]
[rule.if-return]
[rule.increment-decrement]
[rule.var-naming]
[rule.var-declaration]
[rule.package-comments]
[rule.range]
[rule.receiver-naming]
[rule.time-naming]
[rule.unexported-return]
[rule.indent-error-flow]
[rule.errorf]
+25 -7
View File
@@ -1,11 +1,17 @@
---
date: 2019-10-19T00:00:00+00:00
title: Telegram
author: appleboy
tags: [ notifications, chat ]
repo: appleboy/drone-telegram
logo: telegram.svg
containerImage: docker.io/appleboy/drone-telegram
containerImageUrl: https://hub.docker.com/r/appleboy/drone-telegram
description: Plugin for sending Telegram notifications
icon: https://raw.githubusercontent.com/appleboy/drone-telegram/refs/heads/master/images/logo.svg
image: appleboy/drone-telegram
logo: telegram.svg
name: Telegram
repo: appleboy/drone-telegram
tags: [ notifications, chat ]
title: Telegram
url: https://github.com/appleboy/drone-telegram
---
The Telegram plugin posts build status messages to your account. The below pipeline configuration demonstrates simple usage:
@@ -122,7 +128,7 @@ Example configuration with video message:
+ - tests/video2.mp4
```
Example configuration with message format:
Example configuration with message format (`Markdown` or `HTML`), default as `Markdown`:
```diff
- name: send telegram notification
@@ -130,7 +136,7 @@ Example configuration with message format:
settings:
token: xxxxxxxxxx
to: telegram_user_id
+ format: markdown
+ format: Markdown
```
Example configuration with a custom message template:
@@ -233,10 +239,22 @@ Disables link previews for links in this message
settings:
token: xxxxxxxxxx
to: telegram_user_id
message: send message using custom socks5 URL
message: send message without a link preview
+ disable_web_page_preview: true
```
Disables notifications for this message
```diff
- name: send telegram notification
image: appleboy/drone-telegram
settings:
token: xxxxxxxxxx
to: telegram_user_id
message: send message message silently
+ disable_notification: true
```
## Parameter Reference
token
+105 -66
View File
@@ -1,16 +1,18 @@
DIST := dist
EXECUTABLE := drone-telegram
GOFMT ?= gofmt "-s"
GOFMT ?= gofumpt -l
DIST := dist
DIST_DIRS := $(DIST)/binaries $(DIST)/release
GO ?= go
SHASUM ?= shasum -a 256
GOFILES := $(shell find . -name "*.go" -type f)
HAS_GO = $(shell hash $(GO) > /dev/null 2>&1 && echo "GO" || echo "NOGO" )
XGO_PACKAGE ?= src.techknowlogick.com/xgo@latest
XGO_VERSION := go-1.19.x
GXZ_PACKAGE ?= github.com/ulikunitz/xz/cmd/gxz@v0.5.11
# for dockerhub
DEPLOY_ACCOUNT := appleboy
DEPLOY_IMAGE := $(EXECUTABLE)
TARGETS ?= linux windows
SOURCES ?= $(shell find . -name "*.go" -type f)
TAGS ?=
LDFLAGS ?= -X 'main.Version=$(VERSION)'
LINUX_ARCHS ?= linux/amd64,linux/arm64
DARWIN_ARCHS ?= darwin-10.12/amd64,darwin-10.12/arm64
WINDOWS_ARCHS ?= windows/*
ifneq ($(shell uname), Darwin)
EXTLDFLAGS = -extldflags "-static" $(null)
@@ -18,76 +20,67 @@ else
EXTLDFLAGS =
endif
ifeq ($(HAS_GO), GO)
GOPATH ?= $(shell $(GO) env GOPATH)
export PATH := $(GOPATH)/bin:$(PATH)
CGO_EXTRA_CFLAGS := -DSQLITE_MAX_VARIABLE_NUMBER=32766
CGO_CFLAGS ?= $(shell $(GO) env CGO_CFLAGS) $(CGO_EXTRA_CFLAGS)
endif
ifeq ($(OS), Windows_NT)
GOFLAGS := -v -buildmode=exe
EXECUTABLE ?= $(EXECUTABLE).exe
else ifeq ($(OS), Windows)
GOFLAGS := -v -buildmode=exe
EXECUTABLE ?= $(EXECUTABLE).exe
else
GOFLAGS := -v
EXECUTABLE ?= $(EXECUTABLE)
endif
ifneq ($(DRONE_TAG),)
VERSION ?= $(DRONE_TAG)
else
VERSION ?= $(shell git describe --tags --always || git rev-parse --short HEAD)
endif
TAGS ?=
LDFLAGS ?= -X 'main.Version=$(VERSION)'
all: build
fmt:
$(GOFMT) -w $(SOURCES)
@hash gofumpt > /dev/null 2>&1; if [ $$? -ne 0 ]; then \
$(GO) install mvdan.cc/gofumpt; \
fi
$(GOFMT) -w $(GOFILES)
vet:
$(GO) vet ./...
lint:
@hash revive > /dev/null 2>&1; if [ $$? -ne 0 ]; then \
$(GO) get -u github.com/mgechev/revive; \
fi
revive -config .revive.toml ./... || exit 1
.PHONY: misspell-check
misspell-check:
@hash misspell > /dev/null 2>&1; if [ $$? -ne 0 ]; then \
$(GO) get -u github.com/client9/misspell/cmd/misspell; \
fi
misspell -error $(SOURCES)
.PHONY: misspell
misspell:
@hash misspell > /dev/null 2>&1; if [ $$? -ne 0 ]; then \
$(GO) get -u github.com/client9/misspell/cmd/misspell; \
fi
misspell -w $(SOURCES)
.PHONY: fmt-check
fmt-check:
@diff=$$($(GOFMT) -d $(SOURCES)); \
@hash gofumpt > /dev/null 2>&1; if [ $$? -ne 0 ]; then \
$(GO) install mvdan.cc/gofumpt; \
fi
@diff=$$($(GOFMT) -d $(GOFILES)); \
if [ -n "$$diff" ]; then \
echo "Please run 'make fmt' and commit the result:"; \
echo "$${diff}"; \
exit 1; \
fi;
test: fmt-check
test:
@$(GO) test -v -cover -coverprofile coverage.txt ./... && echo "\n==>\033[32m Ok\033[m\n" || exit 1
install: $(SOURCES)
install: $(GOFILES)
$(GO) install -v -tags '$(TAGS)' -ldflags '$(EXTLDFLAGS)-s -w $(LDFLAGS)'
build: $(EXECUTABLE)
$(EXECUTABLE): $(SOURCES)
$(GO) build -v -tags '$(TAGS)' -ldflags '$(EXTLDFLAGS)-s -w $(LDFLAGS)' -o $@
release: release-dirs release-build release-copy release-check
release-dirs:
mkdir -p $(DIST)/binaries $(DIST)/release
release-build:
@which gox > /dev/null; if [ $$? -ne 0 ]; then \
$(GO) get -u github.com/mitchellh/gox; \
fi
gox -os="$(TARGETS)" -arch="amd64 386" -tags="$(TAGS)" -ldflags="-s -w $(LDFLAGS)" -output="$(DIST)/binaries/$(EXECUTABLE)-$(VERSION)-{{.OS}}-{{.Arch}}"
release-copy:
$(foreach file,$(wildcard $(DIST)/binaries/$(EXECUTABLE)-*),cp $(file) $(DIST)/release/$(notdir $(file));)
release-check:
cd $(DIST)/release; $(foreach file,$(wildcard $(DIST)/release/$(EXECUTABLE)-*),sha256sum $(notdir $(file)) > $(notdir $(file)).sha256;)
$(EXECUTABLE): $(GOFILES)
$(GO) build -v -tags '$(TAGS)' -ldflags '$(EXTLDFLAGS)-s -w $(LDFLAGS)' -o bin/$@
build_linux_amd64:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GO) build -a -tags '$(TAGS)' -ldflags '$(EXTLDFLAGS)-s -w $(LDFLAGS)' -o release/linux/amd64/$(DEPLOY_IMAGE)
@@ -101,23 +94,69 @@ build_linux_arm64:
build_linux_arm:
CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=7 $(GO) build -a -tags '$(TAGS)' -ldflags '$(EXTLDFLAGS)-s -w $(LDFLAGS)' -o release/linux/arm/$(DEPLOY_IMAGE)
docker_image:
docker build -t $(DEPLOY_ACCOUNT)/$(DEPLOY_IMAGE) .
docker: docker_image
docker_deploy:
ifeq ($(tag),)
@echo "Usage: make $@ tag=<tag>"
@exit 1
endif
# deploy image
docker tag $(DEPLOY_ACCOUNT)/$(DEPLOY_IMAGE):latest $(DEPLOY_ACCOUNT)/$(DEPLOY_IMAGE):$(tag)
docker push $(DEPLOY_ACCOUNT)/$(DEPLOY_IMAGE):$(tag)
ssh-server:
adduser -h /home/drone-scp -s /bin/sh -D -S drone-scp
echo drone-scp:1234 | chpasswd
mkdir -p /home/drone-scp/.ssh
chmod 700 /home/drone-scp/.ssh
cat tests/.ssh/id_rsa.pub >> /home/drone-scp/.ssh/authorized_keys
cat tests/.ssh/test.pub >> /home/drone-scp/.ssh/authorized_keys
chmod 600 /home/drone-scp/.ssh/authorized_keys
chown -R drone-scp /home/drone-scp/.ssh
apk add --update openssh openrc
rm -rf /etc/ssh/ssh_host_rsa_key /etc/ssh/ssh_host_dsa_key
sed -i 's/^#PubkeyAuthentication yes/PubkeyAuthentication yes/g' /etc/ssh/sshd_config
sed -i 's/AllowTcpForwarding no/AllowTcpForwarding yes/g' /etc/ssh/sshd_config
./tests/entrypoint.sh /usr/sbin/sshd -D &
coverage:
sed -i '/main.go/d' coverage.txt
.PHONY: deps-backend
deps-backend:
$(GO) mod download
$(GO) install $(GXZ_PACKAGE)
$(GO) install $(XGO_PACKAGE)
.PHONY: release
release: release-linux release-darwin release-windows release-copy release-compress release-check
$(DIST_DIRS):
mkdir -p $(DIST_DIRS)
.PHONY: release-windows
release-windows: | $(DIST_DIRS)
CGO_CFLAGS="$(CGO_CFLAGS)" $(GO) run $(XGO_PACKAGE) -go $(XGO_VERSION) -buildmode exe -dest $(DIST)/binaries -tags 'netgo osusergo $(TAGS)' -ldflags '-linkmode external -extldflags "-static" $(LDFLAGS)' -targets '$(WINDOWS_ARCHS)' -out $(EXECUTABLE)-$(VERSION) .
ifeq ($(CI),true)
cp -r /build/* $(DIST)/binaries/
endif
.PHONY: release-linux
release-linux: | $(DIST_DIRS)
CGO_CFLAGS="$(CGO_CFLAGS)" $(GO) run $(XGO_PACKAGE) -go $(XGO_VERSION) -dest $(DIST)/binaries -tags 'netgo osusergo $(TAGS)' -ldflags '-linkmode external -extldflags "-static" $(LDFLAGS)' -targets '$(LINUX_ARCHS)' -out $(EXECUTABLE)-$(VERSION) .
ifeq ($(CI),true)
cp -r /build/* $(DIST)/binaries/
endif
.PHONY: release-darwin
release-darwin: | $(DIST_DIRS)
CGO_CFLAGS="$(CGO_CFLAGS)" $(GO) run $(XGO_PACKAGE) -go $(XGO_VERSION) -dest $(DIST)/binaries -tags 'netgo osusergo $(TAGS)' -ldflags '$(LDFLAGS)' -targets '$(DARWIN_ARCHS)' -out $(EXECUTABLE)-$(VERSION) .
ifeq ($(CI),true)
cp -r /build/* $(DIST)/binaries/
endif
.PHONY: release-copy
release-copy: | $(DIST_DIRS)
cd $(DIST); for file in `find . -type f -name "*"`; do cp $${file} ./release/; done;
.PHONY: release-check
release-check: | $(DIST_DIRS)
cd $(DIST)/release/; for file in `find . -type f -name "*"`; do echo "checksumming $${file}" && $(SHASUM) `echo $${file} | sed 's/^..//'` > $${file}.sha256; done;
.PHONY: release-compress
release-compress: | $(DIST_DIRS)
cd $(DIST)/release/; for file in `find . -type f -name "*"`; do echo "compressing $${file}" && $(GO) run $(GXZ_PACKAGE) -k -9 $${file}; done;
clean:
$(GO) clean -x -i ./...
rm -rf coverage.txt $(EXECUTABLE) $(DIST)
+1 -4
View File
@@ -3,12 +3,9 @@
![logo](./images/logo.png)
[![GoDoc](https://godoc.org/github.com/appleboy/drone-telegram?status.svg)](https://godoc.org/github.com/appleboy/drone-telegram)
[![Build Status](https://cloud.drone.io/api/badges/appleboy/drone-telegram/status.svg)](https://cloud.drone.io/appleboy/drone-telegram)
[![Build status](https://ci.appveyor.com/api/projects/status/cm4l9udn8ywkif42?svg=true)](https://ci.appveyor.com/project/appleboy/drone-telegram-cd47y)
[![Trivy Security Scan](https://github.com/appleboy/drone-telegram/actions/workflows/trivy.yml/badge.svg?branch=master)](https://github.com/appleboy/drone-telegram/actions/workflows/trivy.yml)
[![codecov](https://codecov.io/gh/appleboy/drone-telegram/branch/master/graph/badge.svg)](https://codecov.io/gh/appleboy/drone-telegram)
[![Go Report Card](https://goreportcard.com/badge/github.com/appleboy/drone-telegram)](https://goreportcard.com/report/github.com/appleboy/drone-telegram)
[![Docker Pulls](https://img.shields.io/docker/pulls/appleboy/drone-telegram.svg)](https://hub.docker.com/r/appleboy/drone-telegram/)
[![microbadger](https://images.microbadger.com/badges/image/appleboy/drone-telegram.svg)](https://microbadger.com/images/appleboy/drone-telegram "Get your own image badge on microbadger.com")
[Drone](https://github.com/drone/drone) plugin for sending telegram notifications. For the usage
information and a listing of the available options please take a look at [the docs](http://plugins.drone.io/appleboy/drone-telegram/).
+20
View File
@@ -0,0 +1,20 @@
FROM alpine:3.23
ARG TARGETOS
ARG TARGETARCH
LABEL maintainer="Bo-Yi Wu <appleboy.tw@gmail.com>" \
org.label-schema.name="Telegram Plugin" \
org.label-schema.vendor="Bo-Yi Wu" \
org.label-schema.schema-version="1.0"
LABEL org.opencontainers.image.source=https://github.com/appleboy/drone-telegram
LABEL org.opencontainers.image.description="plugin for sending telegram notifications"
LABEL org.opencontainers.image.licenses=MIT
RUN apk add --no-cache ca-certificates && \
rm -rf /var/cache/apk/*
COPY release/${TARGETOS}/${TARGETARCH}/drone-telegram /bin/
ENTRYPOINT ["/bin/drone-telegram"]
-10
View File
@@ -1,10 +0,0 @@
FROM plugins/base:linux-amd64
LABEL maintainer="Bo-Yi Wu <appleboy.tw@gmail.com>" \
org.label-schema.name="Drone telegram" \
org.label-schema.vendor="Bo-Yi Wu" \
org.label-schema.schema-version="1.0"
COPY release/linux/amd64/drone-telegram /bin/
ENTRYPOINT ["/bin/drone-telegram"]
-10
View File
@@ -1,10 +0,0 @@
FROM plugins/base:linux-arm
LABEL maintainer="Bo-Yi Wu <appleboy.tw@gmail.com>" \
org.label-schema.name="Drone telegram" \
org.label-schema.vendor="Bo-Yi Wu" \
org.label-schema.schema-version="1.0"
COPY release/linux/arm/drone-telegram /bin/
ENTRYPOINT ["/bin/drone-telegram"]
-10
View File
@@ -1,10 +0,0 @@
FROM plugins/base:linux-arm64
LABEL maintainer="Bo-Yi Wu <appleboy.tw@gmail.com>" \
org.label-schema.name="Drone telegram" \
org.label-schema.vendor="Bo-Yi Wu" \
org.label-schema.schema-version="1.0"
COPY release/linux/arm64/drone-telegram /bin/
ENTRYPOINT ["/bin/drone-telegram"]
-10
View File
@@ -1,10 +0,0 @@
FROM microsoft/nanoserver:10.0.14393.1884
LABEL maintainer="Bo-Yi Wu <appleboy.tw@gmail.com>" \
org.label-schema.name="Drone telegram" \
org.label-schema.vendor="Bo-Yi Wu" \
org.label-schema.schema-version="1.0"
COPY release/drone-telegram.exe /drone-telegram.exe
ENTRYPOINT [ "\\drone-telegram.exe" ]
-25
View File
@@ -1,25 +0,0 @@
image: appleboy/drone-telegram:{{#if build.tag}}{{trimPrefix "v" build.tag}}{{else}}latest{{/if}}
{{#if build.tags}}
tags:
{{#each build.tags}}
- {{this}}
{{/each}}
{{/if}}
manifests:
-
image: appleboy/drone-telegram:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-amd64
platform:
architecture: amd64
os: linux
-
image: appleboy/drone-telegram:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-arm64
platform:
architecture: arm64
os: linux
variant: v8
-
image: appleboy/drone-telegram:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-arm
platform:
architecture: arm
os: linux
variant: v7
+28 -6
View File
@@ -1,12 +1,34 @@
module github.com/appleboy/drone-telegram
go 1.11
go 1.25.10
require (
github.com/drone/drone-template-lib v1.0.1-0.20200922172814-d25f0a0b9a0e
github.com/appleboy/drone-template-lib v1.3.0
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible
github.com/joho/godotenv v1.3.0
github.com/stretchr/testify v1.6.1
github.com/technoweenie/multipartstreamer v1.0.1 // indirect
github.com/urfave/cli v1.20.0
github.com/joho/godotenv v1.5.1
github.com/stretchr/testify v1.9.0
github.com/urfave/cli v1.22.15
)
require (
dario.cat/mergo v1.0.1 // indirect
github.com/Masterminds/goutils v1.1.1 // indirect
github.com/Masterminds/semver/v3 v3.3.0 // indirect
github.com/Masterminds/sprig/v3 v3.3.0 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/huandu/xstrings v1.5.0 // indirect
github.com/mailgun/raymond/v2 v2.0.48 // indirect
github.com/mitchellh/copystructure v1.2.0 // indirect
github.com/mitchellh/reflectwalk v1.0.2 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/shopspring/decimal v1.4.0 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/spf13/cast v1.7.0 // indirect
github.com/technoweenie/multipartstreamer v1.0.1 // indirect
golang.org/x/crypto v0.45.0 // indirect
golang.org/x/sys v0.38.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
+68 -33
View File
@@ -1,44 +1,79 @@
github.com/Masterminds/goutils v1.1.0 h1:zukEsf/1JZwCMgHiK3GZftabmxiCw4apj3a28RPBiVg=
github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
github.com/Masterminds/semver v1.4.2 h1:WBLTQ37jOCzSLtXNdoo8bNM8876KhNqOKvrlGITgsTc=
github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
github.com/Masterminds/sprig v2.20.0+incompatible h1:dJTKKuUkYW3RMFdQFXPU/s6hg10RgctmTjRcbZ98Ap8=
github.com/Masterminds/sprig v2.20.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o=
github.com/aymerick/raymond v2.0.2+incompatible h1:VEp3GpgdAnv9B2GFyTvqgcKvY+mfKMjPOA3SbKLtnU0=
github.com/aymerick/raymond v2.0.2+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g=
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s=
dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0=
github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
github.com/Masterminds/sprig/v3 v3.3.0 h1:mQh0Yrg1XPo6vjYXgtf5OtijNAKJRNcTdOOGZe3tPhs=
github.com/Masterminds/sprig/v3 v3.3.0/go.mod h1:Zy1iXRYNqNLUolqCpL4uhk6SHUMAOSCzdgBfDb35Lz0=
github.com/appleboy/drone-template-lib v1.3.0 h1:aX36/1za3v8JsEyBeMY1Bp/VNRtZa8qPYkfkjBszW+A=
github.com/appleboy/drone-template-lib v1.3.0/go.mod h1:edlmXkFMKYAVypff8r2oN7aFlHfOZE5sLyPEnRHONeA=
github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4=
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/drone/drone-template-lib v1.0.1-0.20200922172814-d25f0a0b9a0e h1:bLkZECOin8f6dSQVEI86nTI0RfVJY5vFfFHcdBTR1gY=
github.com/drone/drone-template-lib v1.0.1-0.20200922172814-d25f0a0b9a0e/go.mod h1:DXH8xmwW5t/hGZ+ALTF/Se934PKkwhurscDD2RRqREk=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible h1:2cauKuaELYAEARXRkq2LrJ0yDDv1rW7+wrTEdVL3uaU=
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible/go.mod h1:qf9acutJ8cwBUhm1bqgz6Bei9/C/c93FPDljKWwsOgM=
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/huandu/xstrings v1.2.0 h1:yPeWdRnmynF7p+lLYz0H2tthW9lqhMJrQV/U7yy4wX0=
github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4=
github.com/imdario/mergo v0.3.7 h1:Y+UAYTZ7gDEuOfhxKWy+dvb5dRQ6rJjFSdX2HZY1/gI=
github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
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/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI=
github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/mailgun/raymond/v2 v2.0.48 h1:5dmlB680ZkFG2RN/0lvTAghrSxIESeu9/2aeDqACtjw=
github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18=
github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
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/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
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/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k=
github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME=
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w=
github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
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.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
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/technoweenie/multipartstreamer v1.0.1 h1:XRztA5MXiR1TIRHxH2uNxXxaIkKQDeX7m2XsSOlQEnM=
github.com/technoweenie/multipartstreamer v1.0.1/go.mod h1:jNVxdtShOxzAsukZwTSw6MDx5eUJoiEBsSvzDU9uzog=
github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw=
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc=
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
github.com/urfave/cli v1.22.15 h1:nuqt+pdC/KqswQKhETJjo7pvn/k4xMUxgW6liI7XpnM=
github.com/urfave/cli v1.22.15/go.mod h1:wSan1hmo5zeyLGBjRJbzRTNk8gwoYa2B9n4q9dmRIc0=
golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q=
golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
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.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
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=
+10 -4
View File
@@ -16,11 +16,11 @@ var (
func main() {
// Load env-file if it exists first
if filename, found := os.LookupEnv("PLUGIN_ENV_FILE"); found {
godotenv.Load(filename)
_ = godotenv.Load(filename)
}
if _, err := os.Stat("/run/drone/env"); err == nil {
godotenv.Overload("/run/drone/env")
_ = godotenv.Overload("/run/drone/env")
}
app := cli.NewApp()
@@ -114,10 +114,15 @@ func main() {
Usage: "disables link previews for links in this message",
EnvVar: "PLUGIN_DISABLE_WEB_PAGE_PREVIEW,INPUT_DISABLE_WEB_PAGE_PREVIEW",
},
cli.BoolFlag{
Name: "disable.notification",
Usage: "sends the message silently. users will receive a notification with no sound.",
EnvVar: "PLUGIN_DISABLE_NOTIFICATION,INPUT_DISABLE_NOTIFICATION",
},
cli.StringFlag{
Name: "format",
Value: formatMarkdown,
Usage: "telegram message format",
Usage: "telegram message format (Markdown or HTML)",
EnvVar: "PLUGIN_FORMAT,FORMAT,INPUT_FORMAT",
},
cli.StringFlag{
@@ -211,7 +216,7 @@ func main() {
cli.Int64Flag{
Name: "build.started",
Usage: "build started",
EnvVar: "DRONE_BUILD_STARTED",
EnvVar: "DRONE_STAGE_STARTED",
},
cli.Int64Flag{
Name: "build.finished",
@@ -322,6 +327,7 @@ func run(c *cli.Context) error {
Socks5: c.String("socks5"),
DisableWebPagePreview: c.Bool("disable.webpage.preview"),
DisableNotification: c.Bool("disable.notification"),
},
}
-268
View File
@@ -1,268 +0,0 @@
{
test:: {
kind: 'pipeline',
name: 'testing',
platform: {
os: 'linux',
arch: 'amd64',
},
steps: [
{
name: 'vet',
image: 'golang:1.15',
pull: 'always',
commands: [
'make vet',
],
volumes: [
{
name: 'gopath',
path: '/go',
},
],
},
{
name: 'lint',
image: 'golang:1.15',
pull: 'always',
commands: [
'make lint',
],
volumes: [
{
name: 'gopath',
path: '/go',
},
],
},
{
name: 'misspell',
image: 'golang:1.15',
pull: 'always',
commands: [
'make misspell-check',
],
volumes: [
{
name: 'gopath',
path: '/go',
},
],
},
{
name: 'test',
image: 'golang:1.15',
pull: 'always',
environment: {
TELEGRAM_TOKEN: { 'from_secret': 'telegram_token' },
TELEGRAM_TO: { 'from_secret': 'telegram_to' },
},
commands: [
'make test',
'make coverage',
],
volumes: [
{
name: 'gopath',
path: '/go',
},
],
},
{
name: 'codecov',
image: 'robertstettner/drone-codecov',
pull: 'always',
settings: {
token: { 'from_secret': 'codecov_token' },
},
},
],
volumes: [
{
name: 'gopath',
temp: {},
},
],
},
build(name, os='linux', arch='amd64'):: {
kind: 'pipeline',
name: os + '-' + arch,
platform: {
os: os,
arch: arch,
},
steps: [
{
name: 'build-push',
image: 'golang:1.15',
pull: 'always',
environment: {
CGO_ENABLED: '0',
},
commands: [
'go build -v -ldflags \'-X main.build=${DRONE_BUILD_NUMBER}\' -a -o release/' + os + '/' + arch + '/' + name,
],
when: {
event: {
exclude: [ 'tag' ],
},
},
},
{
name: 'build-tag',
image: 'golang:1.15',
pull: 'always',
environment: {
CGO_ENABLED: '0',
},
commands: [
'go build -v -ldflags \'-X main.version=${DRONE_TAG##v} -X main.build=${DRONE_BUILD_NUMBER}\' -a -o release/' + os + '/' + arch + '/' + name,
],
when: {
event: [ 'tag' ],
},
},
{
name: 'executable',
image: 'golang:1.15',
pull: 'always',
commands: [
'./release/' + os + '/' + arch + '/' + name + ' --help',
],
},
{
name: 'dryrun',
image: 'plugins/docker:' + os + '-' + arch,
pull: 'always',
settings: {
daemon_off: false,
dry_run: true,
tags: os + '-' + arch,
dockerfile: 'docker/Dockerfile.' + os + '.' + arch,
repo: 'appleboy/' + name,
cache_from: 'appleboy/' + name,
},
when: {
event: [ 'pull_request' ],
},
},
{
name: 'publish',
image: 'plugins/docker:' + os + '-' + arch,
pull: 'always',
settings: {
daemon_off: 'false',
auto_tag: true,
auto_tag_suffix: os + '-' + arch,
dockerfile: 'docker/Dockerfile.' + os + '.' + arch,
repo: 'appleboy/' + name,
cache_from: 'appleboy/' + name,
username: { 'from_secret': 'docker_username' },
password: { 'from_secret': 'docker_password' },
},
when: {
event: {
exclude: [ 'pull_request' ],
},
},
},
],
depends_on: [
'testing',
],
trigger: {
ref: [
'refs/heads/master',
'refs/pull/**',
'refs/tags/**',
],
},
},
release:: {
kind: 'pipeline',
name: 'release-binary',
platform: {
os: 'linux',
arch: 'amd64',
},
steps: [
{
name: 'build-all-binary',
image: 'golang:1.15',
pull: 'always',
commands: [
'make release'
],
when: {
event: [ 'tag' ],
},
},
{
name: 'deploy-all-binary',
image: 'plugins/github-release',
pull: 'always',
settings: {
files: [ 'dist/release/*' ],
api_key: { 'from_secret': 'github_release_api_key' },
},
when: {
event: [ 'tag' ],
},
},
],
depends_on: [
'testing',
],
trigger: {
ref: [
'refs/tags/**',
],
},
},
notifications(os='linux', arch='amd64', depends_on=[]):: {
kind: 'pipeline',
name: 'notifications',
platform: {
os: os,
arch: arch,
},
steps: [
{
name: 'telegram',
image: 'appleboy/drone-telegram:linux-amd64',
pull: 'always',
settings: {
to: { from_secret: 'telegram_to' },
token: { from_secret: 'telegram_token' },
message: '{{#success build.status}} Build #{{build.number}} of `{{repo.name}}` succeeded.\n\n📝 Commit by {{commit.author}} on `{{commit.branch}}`:\n``` {{commit.message}} ```\n\n🌐 {{ build.link }} {{else}} Build #{{build.number}} of `{{repo.name}}` failed.\n\n📝 Commit by {{commit.author}} on `{{commit.branch}}`:\n``` {{commit.message}} ```\n\n🌐 {{ build.link }} {{/success}}\n\n timecost: {{since build.started}}\n',
},
},
{
name: 'manifest',
image: 'plugins/manifest',
pull: 'always',
settings: {
username: { from_secret: 'docker_username' },
password: { from_secret: 'docker_password' },
spec: 'docker/manifest.tmpl',
ignore_missing: true,
},
},
],
depends_on: depends_on,
trigger: {
ref: [
'refs/heads/master',
'refs/tags/**',
],
},
},
signature(key):: {
kind: 'signature',
hmac: key,
}
}
+113 -95
View File
@@ -1,13 +1,12 @@
package main
import (
"bufio"
"encoding/json"
"errors"
"fmt"
"html"
"io/ioutil"
"log"
"maps"
"net/http"
"net/url"
"os"
@@ -15,12 +14,13 @@ import (
"strconv"
"strings"
"github.com/drone/drone-template-lib/template"
"github.com/appleboy/drone-template-lib/template"
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api"
)
const (
formatMarkdown = "markdown"
formatMarkdown = "Markdown"
formatHTML = "HTML"
)
type (
@@ -88,6 +88,7 @@ type (
Socks5 string
DisableWebPagePreview bool
DisableNotification bool
}
// Plugin values.
@@ -116,10 +117,10 @@ var icons = map[string]string{
}
func trimElement(keys []string) []string {
var newKeys []string
newKeys := make([]string, 0, len(keys))
for _, value := range keys {
value = strings.Trim(value, " ")
value = strings.TrimSpace(value)
if len(value) == 0 {
continue
}
@@ -130,7 +131,7 @@ func trimElement(keys []string) []string {
}
func escapeMarkdown(keys []string) []string {
var newKeys []string
newKeys := make([]string, 0, len(keys))
for _, value := range keys {
value = escapeMarkdownOne(value)
@@ -144,20 +145,26 @@ func escapeMarkdown(keys []string) []string {
}
func escapeMarkdownOne(str string) string {
str = strings.Replace(str, `\_`, `_`, -1)
str = strings.Replace(str, `_`, `\_`, -1)
str = strings.ReplaceAll(str, `\_`, `_`)
str = strings.ReplaceAll(str, `_`, `\_`)
return str
}
func escapeMarkdownFields(fields ...*string) {
for _, f := range fields {
*f = escapeMarkdownOne(*f)
}
}
func globList(keys []string) []string {
var newKeys []string
newKeys := make([]string, 0, len(keys))
for _, pattern := range keys {
pattern = strings.Trim(pattern, " ")
pattern = strings.TrimSpace(pattern)
matches, err := filepath.Glob(pattern)
if err != nil {
fmt.Printf("Glob error for %q: %s\n", pattern, err)
log.Printf("Glob error for %q: %s", pattern, err)
continue
}
newKeys = append(newKeys, matches...)
@@ -181,19 +188,16 @@ func convertLocation(value string) (Location, bool) {
}
if len(values) > 3 {
title = values[2]
address = values[3]
}
latitude, err = strconv.ParseFloat(values[0], 64)
if err != nil {
log.Println(err.Error())
return Location{}, true
}
longitude, err = strconv.ParseFloat(values[1], 64)
if err != nil {
log.Println(err.Error())
return Location{}, true
@@ -208,13 +212,7 @@ func convertLocation(value string) (Location, bool) {
}
func loadTextFromFile(filename string) ([]string, error) {
f, err := os.Open(filename)
if err != nil {
return nil, err
}
defer f.Close()
r := bufio.NewReader(f)
content, err := ioutil.ReadAll(r)
content, err := os.ReadFile(filename)
if err != nil {
return nil, err
}
@@ -259,7 +257,7 @@ func parseTo(to []string, authorEmail string, matchEmail bool) []int64 {
}
// Exec executes the plugin.
func (p Plugin) Exec() (err error) {
func (p *Plugin) Exec() (err error) {
if len(p.Config.Token) == 0 || len(p.Config.To) == 0 {
return errors.New("missing telegram token or user list")
}
@@ -269,7 +267,7 @@ func (p Plugin) Exec() (err error) {
case len(p.Config.MessageFile) > 0:
message, err = loadTextFromFile(p.Config.MessageFile)
if err != nil {
return fmt.Errorf("error loading message file '%s': %v", p.Config.MessageFile, err)
return fmt.Errorf("error loading message file '%s': %w", p.Config.MessageFile, err)
}
case len(p.Config.Message) > 0:
message = []string{p.Config.Message}
@@ -281,36 +279,46 @@ func (p Plugin) Exec() (err error) {
if p.Config.TemplateVars != "" {
p.Tpl = make(map[string]string)
if err = json.Unmarshal([]byte(p.Config.TemplateVars), &p.Tpl); err != nil {
return fmt.Errorf("unable to unmarshall template vars from JSON string '%s': %v", p.Config.TemplateVars, err)
return fmt.Errorf(
"unable to unmarshal template vars from JSON string '%s': %w",
p.Config.TemplateVars,
err,
)
}
}
if p.Config.TemplateVarsFile != "" {
content, err := ioutil.ReadFile(p.Config.TemplateVarsFile)
content, err := os.ReadFile(p.Config.TemplateVarsFile)
if err != nil {
return fmt.Errorf("unable to read file with template vars '%s': %v", p.Config.TemplateVarsFile, err)
return fmt.Errorf(
"unable to read file with template vars '%s': %w",
p.Config.TemplateVarsFile,
err,
)
}
var vars = make(map[string]string)
vars := make(map[string]string)
if err = json.Unmarshal(content, &vars); err != nil {
return fmt.Errorf("unable to unmarshall template vars from JSON file '%s': %v", p.Config.TemplateVarsFile, err)
return fmt.Errorf(
"unable to unmarshal template vars from JSON file '%s': %w",
p.Config.TemplateVarsFile,
err,
)
}
// Merging templates variables from file to the variables form plugin settings (variables from file takes precedence)
// File variables take precedence over inline variables
if p.Tpl == nil {
p.Tpl = vars
} else {
for k, v := range vars {
p.Tpl[k] = v
}
maps.Copy(p.Tpl, vars)
}
}
var proxyURL *url.URL
if proxyURL, err = url.Parse(p.Config.Socks5); err != nil {
return fmt.Errorf("unable to unmarshall socks5 proxy url from string '%s': %v", p.Config.Socks5, err)
}
var bot *tgbotapi.BotAPI
if len(p.Config.Socks5) > 0 {
var proxyURL *url.URL
proxyURL, err = url.Parse(p.Config.Socks5)
if err != nil {
return fmt.Errorf("unable to parse socks5 proxy URL '%s': %w", p.Config.Socks5, err)
}
proxyClient := &http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(proxyURL)}}
bot, err = tgbotapi.NewBotAPIWithClient(p.Config.Token, proxyClient)
} else {
@@ -324,12 +332,12 @@ func (p Plugin) Exec() (err error) {
bot.Debug = p.Config.Debug
ids := parseTo(p.Config.To, p.Commit.Email, p.Config.MatchEmail)
photos := globList(trimElement(p.Config.Photo))
documents := globList(trimElement(p.Config.Document))
stickers := globList(trimElement(p.Config.Sticker))
audios := globList(trimElement(p.Config.Audio))
voices := globList(trimElement(p.Config.Voice))
videos := globList(trimElement(p.Config.Video))
photos := globList(p.Config.Photo)
documents := globList(p.Config.Document)
stickers := globList(p.Config.Sticker)
audios := globList(p.Config.Audio)
voices := globList(p.Config.Voice)
videos := globList(p.Config.Video)
locations := trimElement(p.Config.Location)
venues := trimElement(p.Config.Venue)
@@ -338,33 +346,47 @@ func (p Plugin) Exec() (err error) {
if p.Config.Format == formatMarkdown {
message = escapeMarkdown(message)
p.Commit.Message = escapeMarkdownOne(p.Commit.Message)
p.Commit.Branch = escapeMarkdownOne(p.Commit.Branch)
p.Commit.Link = escapeMarkdownOne(p.Commit.Link)
p.Commit.Author = escapeMarkdownOne(p.Commit.Author)
p.Commit.Email = escapeMarkdownOne(p.Commit.Email)
p.Build.Tag = escapeMarkdownOne(p.Build.Tag)
p.Build.Link = escapeMarkdownOne(p.Build.Link)
p.Build.PR = escapeMarkdownOne(p.Build.PR)
p.Repo.Namespace = escapeMarkdownOne(p.Repo.Namespace)
p.Repo.Name = escapeMarkdownOne(p.Repo.Name)
escapeMarkdownFields(
&p.Commit.Message, &p.Commit.Branch, &p.Commit.Link,
&p.Commit.Author, &p.Commit.Email,
&p.Build.Tag, &p.Build.Link, &p.Build.PR,
&p.Repo.Namespace, &p.Repo.Name,
)
}
// pre-render message templates (identical for all users)
var renderedMessages []string
for _, value := range message {
txt, err := template.RenderTrim(value, p)
if err != nil {
return err
}
renderedMessages = append(renderedMessages, html.UnescapeString(txt))
}
// pre-parse locations and venues (identical for all users)
var parsedLocations []Location
for _, value := range locations {
loc, empty := convertLocation(value)
if !empty {
parsedLocations = append(parsedLocations, loc)
}
}
var parsedVenues []Location
for _, value := range venues {
loc, empty := convertLocation(value)
if !empty {
parsedVenues = append(parsedVenues, loc)
}
}
// send message.
for _, user := range ids {
for _, value := range message {
txt, err := template.RenderTrim(value, p)
if err != nil {
return err
}
txt = html.UnescapeString(txt)
for _, txt := range renderedMessages {
msg := tgbotapi.NewMessage(user, txt)
msg.ParseMode = p.Config.Format
msg.DisableWebPagePreview = p.Config.DisableWebPagePreview
msg.DisableNotification = p.Config.DisableNotification
if err := p.Send(bot, msg); err != nil {
return err
}
@@ -393,7 +415,7 @@ func (p Plugin) Exec() (err error) {
for _, value := range audios {
msg := tgbotapi.NewAudioUpload(user, value)
msg.Title = "Audio Message."
msg.Title = "Audio Message"
if err := p.Send(bot, msg); err != nil {
return err
}
@@ -414,27 +436,21 @@ func (p Plugin) Exec() (err error) {
}
}
for _, value := range locations {
location, empty := convertLocation(value)
if empty {
continue
}
msg := tgbotapi.NewLocation(user, location.Latitude, location.Longitude)
for _, loc := range parsedLocations {
msg := tgbotapi.NewLocation(user, loc.Latitude, loc.Longitude)
if err := p.Send(bot, msg); err != nil {
return err
}
}
for _, value := range venues {
location, empty := convertLocation(value)
if empty {
continue
}
msg := tgbotapi.NewVenue(user, location.Title, location.Address, location.Latitude, location.Longitude)
for _, loc := range parsedVenues {
msg := tgbotapi.NewVenue(
user,
loc.Title,
loc.Address,
loc.Latitude,
loc.Longitude,
)
if err := p.Send(bot, msg); err != nil {
return err
}
@@ -445,7 +461,7 @@ func (p Plugin) Exec() (err error) {
}
// Send bot message.
func (p Plugin) Send(bot *tgbotapi.BotAPI, msg tgbotapi.Chattable) error {
func (p *Plugin) Send(bot *tgbotapi.BotAPI, msg tgbotapi.Chattable) error {
message, err := bot.Send(msg)
if p.Config.Debug {
@@ -458,11 +474,11 @@ func (p Plugin) Send(bot *tgbotapi.BotAPI, msg tgbotapi.Chattable) error {
return nil
}
return errors.New(strings.Replace(err.Error(), p.Config.Token, "<token>", -1))
return errors.New(strings.ReplaceAll(err.Error(), p.Config.Token, "<token>"))
}
// Message is plugin default message.
func (p Plugin) Message() []string {
func (p *Plugin) Message() []string {
icon := icons[strings.ToLower(p.Build.Status)]
if p.Config.GitHub {
@@ -480,14 +496,16 @@ func (p Plugin) Message() []string {
// chore: update default template
//
// 🌐 https://cloud.drone.io/appleboy/drone-telegram/106
return []string{fmt.Sprintf("%s Build #%d of `%s` %s.\n\n📝 Commit by %s on `%s`:\n``` %s ```\n\n🌐 %s",
icon,
p.Build.Number,
p.Repo.FullName,
p.Build.Status,
p.Commit.Author,
p.Commit.Branch,
p.Commit.Message,
p.Build.Link,
)}
return []string{
fmt.Sprintf("%s Build #%d of `%s` %s.\n\n📝 Commit by %s on `%s`:\n``` %s ```\n\n🌐 %s",
icon,
p.Build.Number,
p.Repo.FullName,
p.Build.Status,
p.Commit.Author,
p.Commit.Branch,
p.Commit.Message,
p.Build.Link,
),
}
}
+134 -35
View File
@@ -3,16 +3,26 @@ package main
import (
"os"
"testing"
"time"
"github.com/appleboy/drone-template-lib/template"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func skipIfNoTelegramSecrets(t *testing.T) {
t.Helper()
if os.Getenv("TELEGRAM_TOKEN") == "" || os.Getenv("TELEGRAM_TO") == "" {
t.Skip("TELEGRAM_TOKEN/TELEGRAM_TO not set; skipping integration test")
}
}
func TestMissingDefaultConfig(t *testing.T) {
var plugin Plugin
err := plugin.Exec()
assert.NotNil(t, err)
assert.Error(t, err)
}
func TestMissingUserConfig(t *testing.T) {
@@ -24,7 +34,7 @@ func TestMissingUserConfig(t *testing.T) {
err := plugin.Exec()
assert.NotNil(t, err)
assert.Error(t, err)
}
func TestDefaultMessageFormat(t *testing.T) {
@@ -49,7 +59,13 @@ func TestDefaultMessageFormat(t *testing.T) {
message := plugin.Message()
assert.Equal(t, []string{"✅ Build #101 of `appleboy/go-hello` success.\n\n📝 Commit by Bo-Yi Wu on `master`:\n``` update travis ```\n\n🌐 https://github.com/appleboy/go-hello"}, message)
assert.Equal(
t,
[]string{
"✅ Build #101 of `appleboy/go-hello` success.\n\n📝 Commit by Bo-Yi Wu on `master`:\n``` update travis ```\n\n🌐 https://github.com/appleboy/go-hello",
},
message,
)
}
func TestDefaultMessageFormatFromGitHub(t *testing.T) {
@@ -71,7 +87,11 @@ func TestDefaultMessageFormatFromGitHub(t *testing.T) {
message := plugin.Message()
assert.Equal(t, []string{"appleboy/go-hello/test-workflow triggered by appleboy (push)"}, message)
assert.Equal(
t,
[]string{"appleboy/go-hello/test-workflow triggered by appleboy (push)"},
message,
)
}
func TestSendMessage(t *testing.T) {
@@ -95,8 +115,13 @@ func TestSendMessage(t *testing.T) {
},
Config: Config{
Token: os.Getenv("TELEGRAM_TOKEN"),
To: []string{os.Getenv("TELEGRAM_TO"), os.Getenv("TELEGRAM_TO") + ":appleboy@gmail.com", "中文ID", "1234567890"},
Token: os.Getenv("TELEGRAM_TOKEN"),
To: []string{
os.Getenv("TELEGRAM_TO"),
os.Getenv("TELEGRAM_TO") + ":appleboy@gmail.com",
"中文ID",
"1234567890",
},
Message: "Test Telegram Chat Bot From Travis or Local, commit message: 『{{ build.message }}』",
Photo: []string{"tests/github.png", "1234", " "},
Document: []string{"tests/gophercolor.png", "1234", " "},
@@ -104,27 +129,33 @@ func TestSendMessage(t *testing.T) {
Audio: []string{"tests/audio.mp3", "1234", " "},
Voice: []string{"tests/voice.ogg", "1234", " "},
Location: []string{"24.9163213 121.1424972", "1", " "},
Venue: []string{"35.661777 139.704051 竹北體育館 新竹縣竹北市", "24.9163213 121.1424972", "1", " "},
Video: []string{"tests/video.mp4", "1234", " "},
Debug: false,
Venue: []string{
"35.661777 139.704051 竹北體育館 新竹縣竹北市",
"24.9163213 121.1424972",
"1",
" ",
},
Video: []string{"tests/video.mp4", "1234", " "},
Debug: false,
},
}
err := plugin.Exec()
assert.NotNil(t, err)
require.Error(t, err)
plugin.Config.Format = formatMarkdown
plugin.Config.Message = "Test escape under_score"
err = plugin.Exec()
assert.NotNil(t, err)
require.Error(t, err)
// disable message
plugin.Config.Message = ""
err = plugin.Exec()
assert.NotNil(t, err)
assert.Error(t, err)
}
func TestDisableWebPagePreviewMessage(t *testing.T) {
skipIfNoTelegramSecrets(t)
plugin := Plugin{
Config: Config{
Token: os.Getenv("TELEGRAM_TOKEN"),
@@ -136,13 +167,35 @@ func TestDisableWebPagePreviewMessage(t *testing.T) {
plugin.Config.Message = "DisableWebPagePreview https://www.google.com.tw"
err := plugin.Exec()
assert.Nil(t, err)
require.NoError(t, err)
// disable message
plugin.Config.DisableWebPagePreview = false
plugin.Config.Message = "EnableWebPagePreview https://www.google.com.tw"
err = plugin.Exec()
assert.Nil(t, err)
assert.NoError(t, err)
}
func TestDisableNotificationMessage(t *testing.T) {
skipIfNoTelegramSecrets(t)
plugin := Plugin{
Config: Config{
Token: os.Getenv("TELEGRAM_TOKEN"),
To: []string{os.Getenv("TELEGRAM_TO")},
DisableNotification: true,
Debug: false,
},
}
plugin.Config.Message = "DisableNotification https://www.google.com.tw"
err := plugin.Exec()
require.NoError(t, err)
// disable message
plugin.Config.DisableNotification = false
plugin.Config.Message = "EnableNotification https://www.google.com.tw"
err = plugin.Exec()
assert.NoError(t, err)
}
func TestBotError(t *testing.T) {
@@ -171,7 +224,7 @@ func TestBotError(t *testing.T) {
}
err := plugin.Exec()
assert.NotNil(t, err)
assert.Error(t, err)
}
func TestTrimElement(t *testing.T) {
@@ -247,7 +300,7 @@ func TestParseTo(t *testing.T) {
// test empty ids
ids = parseTo([]string{"", " ", " "}, "a@gmail.com", true)
assert.Equal(t, 0, len(ids))
assert.Empty(t, ids)
}
func TestGlobList(t *testing.T) {
@@ -271,27 +324,27 @@ func TestConvertLocation(t *testing.T) {
input = "1"
result, empty = convertLocation(input)
assert.Equal(t, true, empty)
assert.True(t, empty)
assert.Equal(t, Location{}, result)
// strconv.ParseInt: parsing "測試": invalid syntax
input = "測試 139.704051"
result, empty = convertLocation(input)
assert.Equal(t, true, empty)
assert.True(t, empty)
assert.Equal(t, Location{}, result)
// strconv.ParseInt: parsing "測試": invalid syntax
input = "35.661777 測試"
result, empty = convertLocation(input)
assert.Equal(t, true, empty)
assert.True(t, empty)
assert.Equal(t, Location{}, result)
input = "35.661777 139.704051"
result, empty = convertLocation(input)
assert.Equal(t, false, empty)
assert.False(t, empty)
assert.Equal(t, Location{
Latitude: float64(35.661777),
Longitude: float64(139.704051),
@@ -300,7 +353,7 @@ func TestConvertLocation(t *testing.T) {
input = "35.661777 139.704051 title"
result, empty = convertLocation(input)
assert.Equal(t, false, empty)
assert.False(t, empty)
assert.Equal(t, Location{
Title: "title",
Address: "",
@@ -311,7 +364,7 @@ func TestConvertLocation(t *testing.T) {
input = "35.661777 139.704051 title address"
result, empty = convertLocation(input)
assert.Equal(t, false, empty)
assert.False(t, empty)
assert.Equal(t, Location{
Title: "title",
Address: "address",
@@ -321,6 +374,7 @@ func TestConvertLocation(t *testing.T) {
}
func TestHTMLMessage(t *testing.T) {
skipIfNoTelegramSecrets(t)
plugin := Plugin{
Repo: Repo{
Name: "go-hello",
@@ -330,7 +384,7 @@ func TestHTMLMessage(t *testing.T) {
Sha: "e7c4f0a63ceeb42a39ac7806f7b51f3f0d204fd2",
Author: "Bo-Yi Wu",
Branch: "master",
Message: "Freakin' macOS isn't fully case-sensitive..",
Message: "test",
},
Build: Build{
Number: 101,
@@ -341,14 +395,24 @@ func TestHTMLMessage(t *testing.T) {
Config: Config{
Token: os.Getenv("TELEGRAM_TOKEN"),
To: []string{os.Getenv("TELEGRAM_TO")},
Message: `
Test HTML Format
<a href='https://google.com'>Google .com 1</a>
<a href='https://google.com'>Google .com 2</a>
<a href='https://google.com'>Google .com 3</a>
`,
Format: formatHTML,
},
}
err := plugin.Exec()
assert.Nil(t, err)
assert.NoError(t, plugin.Exec())
plugin.Config.MessageFile = "tests/message_html.txt"
assert.NoError(t, plugin.Exec())
}
func TestMessageFile(t *testing.T) {
skipIfNoTelegramSecrets(t)
plugin := Plugin{
Repo: Repo{
Name: "go-hello",
@@ -361,9 +425,11 @@ func TestMessageFile(t *testing.T) {
Message: "Freakin' macOS isn't fully case-sensitive..",
},
Build: Build{
Number: 101,
Status: "success",
Link: "https://github.com/appleboy/go-hello",
Number: 101,
Status: "success",
Link: "https://github.com/appleboy/go-hello",
Started: time.Now().Unix(),
Finished: time.Now().Add(180 * time.Second).Unix(),
},
Config: Config{
@@ -374,10 +440,11 @@ func TestMessageFile(t *testing.T) {
}
err := plugin.Exec()
assert.Nil(t, err)
assert.NoError(t, err)
}
func TestTemplateVars(t *testing.T) {
skipIfNoTelegramSecrets(t)
plugin := Plugin{
Repo: Repo{
Name: "go-hello",
@@ -390,9 +457,11 @@ func TestTemplateVars(t *testing.T) {
Message: "This is a test commit msg",
},
Build: Build{
Number: 101,
Status: "success",
Link: "https://github.com/appleboy/go-hello",
Number: 101,
Status: "success",
Link: "https://github.com/appleboy/go-hello",
Started: time.Now().Unix(),
Finished: time.Now().Add(180 * time.Second).Unix(),
},
Config: Config{
@@ -405,10 +474,11 @@ func TestTemplateVars(t *testing.T) {
}
err := plugin.Exec()
assert.Nil(t, err)
assert.NoError(t, err)
}
func TestTemplateVarsFile(t *testing.T) {
skipIfNoTelegramSecrets(t)
plugin := Plugin{
Repo: Repo{
Name: "go-hello",
@@ -436,10 +506,11 @@ func TestTemplateVarsFile(t *testing.T) {
}
err := plugin.Exec()
assert.Nil(t, err)
assert.NoError(t, err)
}
func TestProxySendMessage(t *testing.T) {
skipIfNoTelegramSecrets(t)
plugin := Plugin{
Repo: Repo{
Name: "go-hello",
@@ -469,5 +540,33 @@ func TestProxySendMessage(t *testing.T) {
}
err := plugin.Exec()
assert.Nil(t, err)
assert.NoError(t, err)
}
func TestBuildTemplate(t *testing.T) {
plugin := Plugin{
Commit: Commit{
Sha: "e7c4f0a63ceeb42a39ac7806f7b51f3f0d204fd2",
Author: "Bo-Yi Wu",
Branch: "master",
Message: "This is a test commit msg",
},
Build: Build{
Number: 101,
Status: "success",
Link: "https://github.com/appleboy/go-hello",
Started: time.Now().Unix(),
Finished: time.Now().Add(180 * time.Second).Unix(),
},
}
_, err := template.RenderTrim(
`
Sample message loaded from file.
Commit msg: {{uppercasefirst commit.message}}
duration: {{duration build.started build.finished}}
`, plugin)
assert.NoError(t, err)
}
+1
View File
@@ -2,3 +2,4 @@ Sample message loaded from file.
Commit msg: {{commit.message}}
duration: {{duration build.started build.finished}}
+5
View File
@@ -0,0 +1,5 @@
Test HTML Format from file
<a href='https://google.com'>Google .com 1</a>
<a href='https://google.com'>Google .com 2</a>
<a href='https://google.com'>Google .com 3</a>
<a href='https://google.com'>Google .com 4</a>
+1
View File
@@ -5,3 +5,4 @@ Sample message template loaded from file.
Commit msg: {{commit.message}}
duration: {{duration build.started build.finished}}