Compare commits

...

124 Commits
v2.0.0 ... main

Author SHA1 Message Date
b0a5eb3cfb
add deprecation notice 2023-08-29 21:37:13 +02:00
renovate[bot]
7c04e02a19 chore(deps): update dependency golangci/golangci-lint to v1.54.2 2023-08-28 04:39:13 +00:00
renovate[bot]
598aaefe37 chore(docker): update golang:1.20 docker digest to 741d6f9 2023-08-17 14:40:31 +00:00
renovate[bot]
ac8cbcf43b chore(docker): update golang:1.20 docker digest to ee18a70 2023-08-17 04:41:06 +00:00
renovate[bot]
6f82fbf1a6 chore(docker): update golang:1.20 docker digest to 2db0b25 2023-08-16 16:49:55 +00:00
renovate[bot]
ee27a13d13 chore(deps): update dependency golangci/golangci-lint to v1.54.1 2023-08-14 03:07:19 +00:00
renovate[bot]
f2e3686917 chore(docker): update golang:1.20 docker digest to 37c7d85 2023-08-10 08:09:42 +00:00
renovate[bot]
15ea5ff95d chore(docker): update alpine:3.18 docker digest to 7144f7b 2023-08-08 00:12:51 +00:00
renovate[bot]
504b283b4f chore(docker): update golang:1.20 docker digest to bc5f0b5 2023-08-02 04:04:07 +00:00
renovate[bot]
f3bf86afdd chore(docker): update golang:1.20 docker digest to 010a0ff 2023-07-30 00:18:56 +00:00
renovate[bot]
d01d2d0fe8 chore(docker): update golang:1.20 docker digest to 3952625 2023-07-29 07:20:42 +00:00
renovate[bot]
5fa1fa506f chore(docker): update golang:1.20 docker digest to cfc9d1b 2023-07-14 01:10:20 +00:00
renovate[bot]
96a91376d7 chore(docker): update golang:1.20 docker digest to 8e5a006 2023-07-12 00:24:29 +00:00
renovate[bot]
986e86cee5 chore(docker): update golang:1.20 docker digest to fd9306e 2023-07-06 04:32:34 +00:00
renovate[bot]
ecc6dda490 chore(docker): update golang:1.20 docker digest to 20ee7c8 2023-07-05 13:18:24 +00:00
renovate[bot]
78df1a4ce4 chore(docker): update golang:1.20 docker digest to ff2cca5 2023-07-05 06:34:03 +00:00
renovate[bot]
18b82c9804 chore(docker): update golang:1.20 docker digest to 7954299 2023-07-05 00:30:38 +00:00
renovate[bot]
0fe87a4729 chore(docker): update golang:1.20 docker digest to 344193a 2023-06-24 06:40:40 +00:00
renovate[bot]
c81d1c44f2 chore(docker): update golang:1.20 docker digest to 8f958bf 2023-06-22 13:09:46 +00:00
renovate[bot]
1ca8198b59 chore(docker): update golang:1.20 docker digest to 9d0422f 2023-06-22 07:11:57 +00:00
renovate[bot]
ebfc9f11de chore(deps): update dependency golangci/golangci-lint to v1.53.3 2023-06-19 04:52:59 +00:00
renovate[bot]
1145757f42 chore(docker): update docker digests 2023-06-18 09:31:49 +00:00
renovate[bot]
a55ac2050b chore(docker): update golang:1.20 docker digest to e7bb4d1 2023-06-14 17:45:01 +00:00
renovate[bot]
c8783227c4 chore(docker): update golang:1.20 docker digest to f28300f 2023-06-14 06:25:40 +00:00
renovate[bot]
9b065af36f chore(docker): update golang:1.20 docker digest to 02d4d88 2023-06-14 00:29:20 +00:00
renovate[bot]
bf048f2a5a chore(docker): update golang:1.20 docker digest to 4b1fc02 2023-06-07 01:36:58 +00:00
renovate[bot]
03b2f49618
chore(deps): update dependency golangci/golangci-lint to v1.53.2 (#99)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Robert Kaussow <mail@thegeeklab.de>
2023-06-05 09:54:50 +02:00
renovate[bot]
3379b5ccd3
chore(deps): update alpine docker tag to v3.18 (#95)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-05-28 15:27:19 +02:00
renovate[bot]
c319b82cae chore(docker): update golang:1.20 docker digest to 690e413 2023-05-24 10:10:15 +00:00
renovate[bot]
978ebb76a2 chore(docker): update golang:1.20 docker digest to 3f1f050 2023-05-24 02:21:48 +00:00
renovate[bot]
29384cc52d chore(docker): update golang:1.20 docker digest to 685a22e 2023-05-10 06:17:39 +00:00
renovate[bot]
28e1df0957 chore(docker): update golang:1.20 docker digest to 31a8f92 2023-05-05 05:37:04 +00:00
renovate[bot]
b6a8d2c928 chore(docker): update golang:1.20 docker digest to 4dd688d 2023-05-04 22:22:17 +00:00
renovate[bot]
8df21d3626 chore(docker): update golang:1.20 docker digest to 3b2c96d 2023-05-04 14:40:33 +00:00
19635f6632
fix bare url in contribution file (#92) 2023-05-03 11:51:10 +02:00
renovate[bot]
833840583c chore(docker): update golang:1.20 docker digest to 403f486 2023-04-13 11:08:49 +00:00
renovate[bot]
07901e9cc0 chore(deps): update dependency mvdan/gofumpt to v0.5.0 2023-04-10 03:30:44 +00:00
renovate[bot]
c839f0a7a6 chore(docker): update golang:1.20 docker digest to 23050c2 2023-04-04 23:49:21 +00:00
renovate[bot]
3709ad0d7a chore(docker): update alpine:3.17 docker digest to 124c7d2 2023-03-30 00:14:50 +00:00
renovate[bot]
9733fd36b0 chore(docker): update golang:1.20 docker digest to f709934 2023-03-28 03:52:16 +00:00
renovate[bot]
1d64536029 chore(deps): update dependency golangci/golangci-lint to v1.52.2 2023-03-27 06:11:39 +00:00
renovate[bot]
34a1934b80 chore(docker): update golang:1.20 docker digest to 1724dc3 2023-03-25 16:20:24 +00:00
renovate[bot]
52ae1c4213 chore(docker): update golang:1.20 docker digest to 80950aa 2023-03-24 08:27:32 +00:00
renovate[bot]
cab01fd26c chore(docker): update golang:1.20 docker digest to 41a6cb5 2023-03-24 05:09:38 +00:00
renovate[bot]
9ee03bad29 chore(docker): update golang:1.20 docker digest to 8114f4a 2023-03-24 01:48:02 +00:00
renovate[bot]
ba6db81342 chore(docker): update golang:1.20 docker digest to a13b5e3 2023-03-23 20:21:29 +00:00
renovate[bot]
b6c1f75962
chore(deps): update dependency golangci/golangci-lint to v1.52.0 (#79) 2023-03-20 09:38:05 +01:00
renovate[bot]
7b56824286 chore(docker): update golang:1.20 docker digest to 5990c4f 2023-03-16 05:57:58 +00:00
renovate[bot]
c45094d386 chore(docker): update alpine:3.17 docker digest to ff6bdca 2023-03-14 02:00:37 +00:00
renovate[bot]
09506cb399
fix(deps): update module github.com/alecthomas/kingpin/v2 to v2.3.2 (#75) 2023-03-09 20:48:05 +01:00
renovate[bot]
4a75f56246 chore(docker): update golang:1.20 docker digest to 74a3829 2023-03-08 07:31:01 +00:00
renovate[bot]
64fe3a8527 chore(docker): update golang:1.20 docker digest to 52921e6 2023-03-02 12:45:55 +00:00
renovate[bot]
539b8f1c6f chore(deps): update dependency golangci/golangci-lint to v1.51.2 2023-02-27 06:12:31 +00:00
renovate[bot]
2eeddf7736 chore(docker): update golang:1.20 docker digest to 2edf6aa 2023-02-16 07:03:00 +00:00
renovate[bot]
690445b801 chore(docker): update golang:1.20 docker digest to 9911e93 2023-02-15 09:36:14 +00:00
renovate[bot]
d3d4c80762 chore(docker): update docker digests 2023-02-11 12:35:04 +00:00
renovate[bot]
c325f59327 chore(docker): update golang:1.20 docker digest to 53b7958 2023-02-10 05:25:23 +00:00
714851521e
ci: bump container build plugin to drone-docker-buildx:23 (#67) 2023-02-09 08:54:18 +01:00
27cfe30021
fix drone-matrix template 2023-02-08 17:04:31 +01:00
renovate[bot]
0c8a5488b2
fix(deps): update module gopkg.in/alecthomas/kingpin.v2 to v2.3.1 (#66) 2023-02-08 16:46:00 +01:00
renovate[bot]
82890b52a1
chore(deps): update golang docker tag to v1.20 (#60) 2023-02-08 10:23:40 +01:00
4cb5a900e3
refactor: add more linters and fix findings (#65) 2023-02-08 10:14:20 +01:00
renovate[bot]
dabaa3fd18 chore(deps): update dependency golangci/golangci-lint to v1.51.1 2023-02-06 05:40:35 +00:00
renovate[bot]
909946d6ee chore(docker): update golang:1.19 docker digest to 09009d4 2023-02-05 15:30:44 +00:00
renovate[bot]
64f8fb575e chore(docker): update golang:1.19 docker digest to 0ff9c06 2023-02-05 10:07:27 +00:00
renovate[bot]
9c687e6311 chore(docker): update golang:1.19 docker digest to 9e577b0 2023-02-04 15:41:51 +00:00
41cade01be
ci: replace outdated gh-pages plugin (#59) 2023-01-14 23:21:12 +01:00
d688fd4d4d
unify makefile syntax (#58) 2023-01-14 22:58:52 +01:00
959bcd3d49
refactor: use buildx for multiarch container builds (#57) 2023-01-14 22:44:00 +01:00
renovate[bot]
bb76752374 chore(docker): update docker digests 2023-01-10 01:00:53 +00:00
07b274d525
ci: switch to buildx plugin (#55) 2023-01-08 15:44:33 +01:00
renovate[bot]
947f9e52f0
fix(deps): update module github.com/bmatcuk/doublestar/v4 to v4.6.0 (#53) 2023-01-08 15:12:51 +01:00
47b1ddb8fd
BREAKING CHANGE: remove support for arm32 (#54) 2023-01-08 15:05:55 +01:00
8826a216b5
Revert "fix(deps): update module gopkg.in/yaml.v2 to v3 (#50)"
This reverts commit 5f7ce1d9b6.
2022-12-20 21:24:47 +01:00
renovate[bot]
5f7ce1d9b6
fix(deps): update module gopkg.in/yaml.v2 to v3 (#50) 2022-12-20 20:59:25 +01:00
renovate[bot]
6f3f7dd10a
fix(deps): update module github.com/bmatcuk/doublestar/v4 to v4.4.0 (#43) 2022-11-24 10:29:25 +01:00
renovate[bot]
28631207db
chore(deps): update alpine docker tag to v3.17 (#46) 2022-11-24 10:29:13 +01:00
renovate[bot]
ad852be3d8
chore(deps): update arm32v7/alpine docker tag to v3.17 (#47) 2022-11-24 10:29:04 +01:00
renovate[bot]
ebe36970ab
chore(deps): update arm64v8/alpine docker tag to v3.17 (#48) 2022-11-24 10:28:50 +01:00
9fd40fa58c
ci: create symlink for xgo source directory (#49) 2022-11-24 09:43:55 +01:00
renovate[bot]
cc5ee85862 chore(docker): update docker digests 2022-11-12 08:03:07 +00:00
renovate[bot]
cb316696c5 chore(docker): update docker digests 2022-11-11 02:04:52 +00:00
renovate[bot]
19cd763033
fix(deps): update module github.com/bmatcuk/doublestar/v4 to v4.3.0 (#42) 2022-10-31 12:40:22 +01:00
renovate[bot]
8e70f719cd chore(deps): update dependency golangci/golangci-lint to v1.50.1 2022-10-24 03:32:04 +00:00
renovate[bot]
f68cd45e5f chore(deps): update golang dev tools (non-major) 2022-10-10 04:59:16 +00:00
renovate[bot]
806b348cbf
fix(deps): update module github.com/google/go-cmp to v0.5.9 (#39) 2022-09-13 09:08:29 +02:00
renovate[bot]
10512ec38a
fix(deps): update module github.com/docker/go-units to v0.5.0 (#38) 2022-09-06 09:25:48 +02:00
renovate[bot]
217d5a8cbd chore(deps): update dependency golangci/golangci-lint to v1.49.0 2022-08-29 03:49:24 +00:00
renovate[bot]
2e242fcf9c chore(docker): update docker digests to bc41182 2022-08-09 23:17:11 +00:00
renovate[bot]
ea139833b7 chore(deps): update dependency golangci/golangci-lint to v1.48.0 2022-08-08 04:20:15 +00:00
033f9e1c73
chore: switch to go1.19 (#34) 2022-08-05 13:18:41 +02:00
renovate[bot]
9f8526c07e chore(deps): update dependency golangci/golangci-lint to v1.47.2 2022-07-25 03:04:48 +00:00
99142c8a7f
fix worind in readme and adjust repo config 2022-07-21 09:47:58 +02:00
renovate[bot]
6d9fc51099 chore(docker): update docker digests to 7580ece 2022-07-19 02:45:11 +00:00
f893175ea6
ci: switch alpine-tools image 2022-07-17 20:45:26 +02:00
dd6102de09
docs: fix spelling in readme 2022-07-12 09:12:35 +02:00
renovate[bot]
602ca009a2
fix(deps): update module github.com/bmatcuk/doublestar/v4 to v4.2.0 (#30) 2022-07-11 08:49:45 +02:00
renovate[bot]
da149a28c8
chore(deps): update dependency alpine to v3.16 (#27) 2022-05-24 08:58:22 +02:00
renovate[bot]
1c056e540f
chore(deps): update dependency arm32v7/alpine to v3.16 (#28) 2022-05-24 08:58:15 +02:00
renovate[bot]
504e4e44cb
chore(deps): update dependency arm64v8/alpine to v3.16 (#29) 2022-05-24 08:58:08 +02:00
Renovate Bot
54fa451964 chore(deps): update dependency golangci/golangci-lint to v1.46.2 2022-05-23 04:34:50 +00:00
f0027a5e36
adjust readme (#25) 2022-05-03 22:47:39 +02:00
8f06b3d2cc
docs: fix hugo hint shortcode 2022-05-02 21:47:14 +02:00
renovate[bot]
fb3eb77c05
fix(deps): update module github.com/google/go-cmp to v0.5.8 (#24) 2022-04-27 08:42:17 +02:00
dd498d9592
ci: refactor build tools and ci setup (#23) 2022-04-25 12:56:05 +02:00
Renovate Bot
b44e83cdfe chore(docker): update docker digests to 4edbd2b 2022-04-05 06:27:02 +00:00
7ab60dbce3
chore: switch to go1.18 as build requirement (#20) 2022-03-30 22:42:06 +02:00
Renovate Bot
a602f4b317 chore(docker): update docker digests to f22945d 2022-03-29 05:44:51 +00:00
Renovate Bot
d22179428d chore(docker): update docker digests to ceeae28 2022-03-24 05:22:03 +00:00
Renovate Bot
0cdea57e45 chore(docker): update docker digests to 6af1b11 2022-03-23 20:53:46 +00:00
Renovate Bot
4624991f64 chore(docker): update docker digests to d6d0a0e 2022-03-17 16:34:17 +00:00
renovate[bot]
f3823ba821
fix(deps): update module github.com/google/go-cmp to v0.5.7 (#14) 2022-01-21 21:21:07 +01:00
da53bd7b90
chore: end of the year maintenance 2021-12-21 10:54:59 +01:00
eacdfc80c2
chore: adjust changelog template to link to prs instead of issues (#13) 2021-12-12 14:03:45 +01:00
renovate[bot]
cec160631e
chore(deps): update arm64v8/alpine docker tag to v3.15 (#11) 2021-11-25 08:52:31 +01:00
renovate[bot]
8ff8b166c3
chore(deps): update alpine docker tag to v3.15 (#10) 2021-11-25 08:51:08 +01:00
renovate[bot]
b545f9419b
chore(deps): update arm32v7/alpine docker tag to v3.15 (#12) 2021-11-25 08:51:01 +01:00
b09fcb86e2
fix license name in readme (#9) 2021-11-16 13:42:04 +01:00
renovate[bot]
e5b6a15cd2
fix(deps): update module honnef.co/go/tools to v0.2.2 (#6) 2021-11-15 22:16:47 +01:00
Renovate Bot
b13690c5a5 chore(docker): update alpine:3.14 docker digest to 635f0aa 2021-11-13 01:45:09 +00:00
Renovate Bot
6a0a373a70 chore(docker): update docker digests 2021-11-12 21:30:30 +00:00
bd4419e137
improve changelog template 2021-09-22 11:48:52 +02:00
b1dcf3d5dd
improve drone-matrix template 2021-09-22 09:57:48 +02:00
3bc7e88009
fix drone yaml format and switch to drone-matrix plugin (#5) 2021-09-19 20:42:27 +02:00
48 changed files with 749 additions and 1357 deletions

View File

@ -6,13 +6,9 @@
{{ range .CommitGroups -}}
### {{ .Title }}
{{ $subjects := list }}
{{ range .Commits -}}
{{ if not (has .Subject $subjects) -}}
- {{ if .Scope }}**{{ .Scope }}:** {{ end }}{{ .Subject }}
{{ $subjects = append $subjects .Subject -}}
- {{ if .Scope }}**{{ .Scope }}:** {{ end }}{{ (regexReplaceAll "(.*)/issues/(.*)" (regexReplaceAll "(Co-\\w*-by.*)" .Subject "") "${1}/pull/${2}") | trim }}
{{ end }}
{{- end }}
{{- end -}}
{{- if .NoteGroups -}}

View File

@ -1,394 +0,0 @@
local PipelineTest = {
kind: 'pipeline',
image_pull_secrets: ['docker_config'],
name: 'test',
platform: {
os: 'linux',
arch: 'amd64',
},
steps: [
{
name: 'staticcheck',
image: 'golang:1.16',
commands: [
'go run honnef.co/go/tools/cmd/staticcheck ./...',
],
volumes: [
{
name: 'gopath',
path: '/go',
},
],
},
{
name: 'lint',
image: 'golang:1.16',
commands: [
'go run golang.org/x/lint/golint -set_exit_status ./...',
],
volumes: [
{
name: 'gopath',
path: '/go',
},
],
},
{
name: 'vet',
image: 'golang:1.16',
commands: [
'go vet ./...',
],
volumes: [
{
name: 'gopath',
path: '/go',
},
],
},
{
name: 'test',
image: 'golang:1.16',
commands: [
'go test -cover ./...',
],
volumes: [
{
name: 'gopath',
path: '/go',
},
],
},
],
volumes: [
{
name: 'gopath',
temp: {},
},
],
trigger: {
ref: ['refs/heads/main', 'refs/tags/**', 'refs/pull/**'],
},
};
local PipelineBuildBinaries = {
kind: 'pipeline',
image_pull_secrets: ['docker_config'],
name: 'build-binaries',
platform: {
os: 'linux',
arch: 'amd64',
},
steps: [
{
name: 'build',
image: 'techknowlogick/xgo:go-1.16.x',
commands: [
'[ -z "${DRONE_TAG}" ] && BUILD_VERSION=${DRONE_COMMIT_SHA:0:8} || BUILD_VERSION=${DRONE_TAG##v}',
'mkdir -p release/',
"xgo -ldflags \"-s -w -X main.version=$BUILD_VERSION\" -tags netgo -targets 'linux/amd64,linux/arm-6,linux/arm-7,linux/arm64' -out drone-yaml .",
'mv /build/* /drone/src/release/',
'ls -l /drone/src/release/',
],
},
{
name: 'executable',
image: 'alpine',
commands: [
'$(find release/ -executable -type f | grep drone-yaml-linux-amd64) --help',
],
},
{
name: 'compress',
image: 'alpine',
commands: [
'apk add upx',
'find release/ -maxdepth 1 -executable -type f -exec upx {} \\;',
'ls -lh release/',
],
},
{
name: 'checksum',
image: 'alpine',
commands: [
'cd release/ && sha256sum * > sha256sum.txt',
],
},
{
name: 'changelog-generate',
image: 'thegeeklab/git-chglog',
commands: [
'git fetch -tq',
'git-chglog --no-color --no-emoji -o CHANGELOG.md ${DRONE_TAG:---next-tag unreleased unreleased}',
],
},
{
name: 'changelog-format',
image: 'thegeeklab/alpine-tools',
commands: [
'prettier CHANGELOG.md',
'prettier -w CHANGELOG.md',
],
},
{
name: 'publish',
image: 'plugins/github-release',
settings: {
overwrite: true,
api_key: {
from_secret: 'github_token',
},
files: ['release/*'],
title: '${DRONE_TAG}',
note: 'CHANGELOG.md',
},
when: {
ref: [
'refs/tags/**',
],
},
},
],
depends_on: [
'test',
],
trigger: {
ref: ['refs/heads/main', 'refs/tags/**', 'refs/pull/**'],
},
};
local PipelineBuildContainer(arch='amd64') = {
kind: 'pipeline',
image_pull_secrets: ['docker_config'],
name: 'build-container-' + arch,
platform: {
os: 'linux',
arch: arch,
},
steps: [
{
name: 'build',
image: 'golang:1.16',
commands: [
'[ -z "${DRONE_TAG}" ] && BUILD_VERSION=${DRONE_COMMIT_SHA:0:8} || BUILD_VERSION=${DRONE_TAG##v}',
'go build -v -ldflags "-X main.version=$BUILD_VERSION" -a -tags netgo -o release/' + arch + '/drone-yaml',
],
},
{
name: 'dryrun',
image: 'thegeeklab/drone-docker:19',
settings: {
config: { from_secret: 'docker_config' },
dry_run: true,
dockerfile: 'docker/Dockerfile.' + arch,
repo: 'thegeeklab/${DRONE_REPO_NAME}',
username: { from_secret: 'docker_username' },
password: { from_secret: 'docker_password' },
},
depends_on: ['build'],
when: {
ref: ['refs/pull/**'],
},
},
{
name: 'publish-dockerhub',
image: 'thegeeklab/drone-docker:19',
settings: {
config: { from_secret: 'docker_config' },
auto_tag: true,
auto_tag_suffix: arch,
dockerfile: 'docker/Dockerfile.' + arch,
repo: 'thegeeklab/${DRONE_REPO_NAME}',
username: { from_secret: 'docker_username' },
password: { from_secret: 'docker_password' },
},
when: {
ref: ['refs/heads/main', 'refs/tags/**'],
},
depends_on: ['dryrun'],
},
{
name: 'publish-quay',
image: 'thegeeklab/drone-docker:19',
settings: {
config: { from_secret: 'docker_config' },
auto_tag: true,
auto_tag_suffix: arch,
dockerfile: 'docker/Dockerfile.' + arch,
registry: 'quay.io',
repo: 'quay.io/thegeeklab/${DRONE_REPO_NAME}',
username: { from_secret: 'quay_username' },
password: { from_secret: 'quay_password' },
},
when: {
ref: ['refs/heads/main', 'refs/tags/**'],
},
depends_on: ['dryrun'],
},
],
depends_on: [
'test',
],
trigger: {
ref: ['refs/heads/main', 'refs/tags/**', 'refs/pull/**'],
},
};
local PipelineDocs = {
kind: 'pipeline',
name: 'docs',
platform: {
os: 'linux',
arch: 'amd64',
},
concurrency: {
limit: 1,
},
steps: [
{
name: 'markdownlint',
image: 'thegeeklab/markdownlint-cli',
commands: [
"markdownlint 'docs/content/**/*.md' 'README.md' 'CONTRIBUTING.md'",
],
},
{
name: 'spellcheck',
image: 'node:lts-alpine',
commands: [
'npm install -g spellchecker-cli',
"spellchecker --files '_docs/**/*.md' 'README.md' 'CONTRIBUTING.md' -d .dictionary -p spell indefinite-article syntax-urls --no-suggestions",
],
environment: {
FORCE_COLOR: true,
NPM_CONFIG_LOGLEVEL: 'error',
},
},
{
name: 'publish',
image: 'plugins/gh-pages',
settings: {
username: { from_secret: 'github_username' },
password: { from_secret: 'github_token' },
pages_directory: '_docs/',
target_branch: 'docs',
},
when: {
ref: ['refs/heads/main'],
},
},
],
depends_on: [
'build-binaries',
'build-container-amd64',
'build-container-arm64',
'build-container-arm',
],
trigger: {
ref: ['refs/heads/main', 'refs/tags/**', 'refs/pull/**'],
},
};
local PipelineNotifications = {
kind: 'pipeline',
image_pull_secrets: ['docker_config'],
name: 'notifications',
platform: {
os: 'linux',
arch: 'amd64',
},
steps: [
{
image: 'plugins/manifest',
name: 'manifest-dockerhub',
settings: {
ignore_missing: true,
auto_tag: true,
username: { from_secret: 'docker_username' },
password: { from_secret: 'docker_password' },
spec: 'docker/manifest.tmpl',
},
when: {
status: ['success'],
},
},
{
image: 'plugins/manifest',
name: 'manifest-quay',
settings: {
ignore_missing: true,
auto_tag: true,
username: { from_secret: 'quay_username' },
password: { from_secret: 'quay_password' },
spec: 'docker/manifest-quay.tmpl',
},
when: {
status: ['success'],
},
},
{
name: 'pushrm-dockerhub',
image: 'chko/docker-pushrm:1',
environment: {
DOCKER_PASS: {
from_secret: 'docker_password',
},
DOCKER_USER: {
from_secret: 'docker_username',
},
PUSHRM_FILE: 'README.md',
PUSHRM_SHORT: 'Custom Drone YAML formatter',
PUSHRM_TARGET: 'thegeeklab/${DRONE_REPO_NAME}',
},
when: {
status: ['success'],
},
},
{
name: 'pushrm-quay',
image: 'chko/docker-pushrm:1',
environment: {
APIKEY__QUAY_IO: {
from_secret: 'quay_token',
},
PUSHRM_FILE: 'README.md',
PUSHRM_TARGET: 'quay.io/thegeeklab/${DRONE_REPO_NAME}',
},
when: {
status: ['success'],
},
},
{
name: 'matrix',
image: 'plugins/matrix',
settings: {
homeserver: { from_secret: 'matrix_homeserver' },
roomid: { from_secret: 'matrix_roomid' },
template: 'Status: **{{ build.status }}**<br/> Build: [{{ repo.Owner }}/{{ repo.Name }}]({{ build.link }}) ({{ build.branch }}) by {{ build.author }}<br/> Message: {{ build.message }}',
username: { from_secret: 'matrix_username' },
password: { from_secret: 'matrix_password' },
},
when: {
status: ['success', 'failure'],
},
},
],
depends_on: [
'docs',
],
trigger: {
ref: ['refs/heads/main', 'refs/tags/**'],
status: ['success', 'failure'],
},
};
[
PipelineTest,
PipelineBuildBinaries,
PipelineBuildContainer(arch='amd64'),
PipelineBuildContainer(arch='arm64'),
PipelineBuildContainer(arch='arm'),
PipelineDocs,
PipelineNotifications,
]

View File

@ -1,534 +0,0 @@
---
kind: pipeline
name: test
platform:
os: linux
arch: amd64
steps:
- name: staticcheck
image: golang:1.16
commands:
- go run honnef.co/go/tools/cmd/staticcheck ./...
volumes:
- name: gopath
path: /go
- name: lint
image: golang:1.16
commands:
- go run golang.org/x/lint/golint -set_exit_status ./...
volumes:
- name: gopath
path: /go
- name: vet
image: golang:1.16
commands:
- go vet ./...
volumes:
- name: gopath
path: /go
- name: test
image: golang:1.16
commands:
- go test -cover ./...
volumes:
- name: gopath
path: /go
volumes:
- name: gopath
temp: {}
image_pull_secrets:
- docker_config
trigger:
ref:
- refs/heads/main
- refs/tags/**
- refs/pull/**
---
kind: pipeline
name: build-binaries
platform:
os: linux
arch: amd64
steps:
- name: build
image: techknowlogick/xgo:go-1.16.x
commands:
- "[ -z \"${DRONE_TAG}\" ] && BUILD_VERSION=${DRONE_COMMIT_SHA:0:8} || BUILD_VERSION=${DRONE_TAG##v}"
- mkdir -p release/
- xgo -ldflags "-s -w -X main.version=$BUILD_VERSION" -tags netgo -targets 'linux/amd64,linux/arm-6,linux/arm-7,linux/arm64' -out drone-yaml .
- mv /build/* /drone/src/release/
- ls -l /drone/src/release/
- name: executable
image: alpine
commands:
- $(find release/ -executable -type f | grep drone-yaml-linux-amd64) --help
- name: compress
image: alpine
commands:
- apk add upx
- find release/ -maxdepth 1 -executable -type f -exec upx {} \;
- ls -lh release/
- name: checksum
image: alpine
commands:
- cd release/ && sha256sum * > sha256sum.txt
- name: changelog-generate
image: thegeeklab/git-chglog
commands:
- git fetch -tq
- git-chglog --no-color --no-emoji -o CHANGELOG.md ${DRONE_TAG:---next-tag unreleased unreleased}
- name: changelog-format
image: thegeeklab/alpine-tools
commands:
- prettier CHANGELOG.md
- prettier -w CHANGELOG.md
- name: publish
image: plugins/github-release
settings:
api_key:
from_secret: github_token
files:
- release/*
note: CHANGELOG.md
overwrite: true
title: ${DRONE_TAG}
when:
ref:
- refs/tags/**
image_pull_secrets:
- docker_config
trigger:
ref:
- refs/heads/main
- refs/tags/**
- refs/pull/**
depends_on:
- test
---
kind: pipeline
name: build-container-amd64
platform:
os: linux
arch: amd64
steps:
- name: build
image: golang:1.16
commands:
- "[ -z \"${DRONE_TAG}\" ] && BUILD_VERSION=${DRONE_COMMIT_SHA:0:8} || BUILD_VERSION=${DRONE_TAG##v}"
- go build -v -ldflags "-X main.version=$BUILD_VERSION" -a -tags netgo -o release/amd64/drone-yaml
- name: dryrun
image: thegeeklab/drone-docker:19
settings:
config:
from_secret: docker_config
dockerfile: docker/Dockerfile.amd64
dry_run: true
password:
from_secret: docker_password
repo: thegeeklab/${DRONE_REPO_NAME}
username:
from_secret: docker_username
when:
ref:
- refs/pull/**
depends_on:
- build
- name: publish-dockerhub
image: thegeeklab/drone-docker:19
settings:
auto_tag: true
auto_tag_suffix: amd64
config:
from_secret: docker_config
dockerfile: docker/Dockerfile.amd64
password:
from_secret: docker_password
repo: thegeeklab/${DRONE_REPO_NAME}
username:
from_secret: docker_username
when:
ref:
- refs/heads/main
- refs/tags/**
depends_on:
- dryrun
- name: publish-quay
image: thegeeklab/drone-docker:19
settings:
auto_tag: true
auto_tag_suffix: amd64
config:
from_secret: docker_config
dockerfile: docker/Dockerfile.amd64
password:
from_secret: quay_password
registry: quay.io
repo: quay.io/thegeeklab/${DRONE_REPO_NAME}
username:
from_secret: quay_username
when:
ref:
- refs/heads/main
- refs/tags/**
depends_on:
- dryrun
image_pull_secrets:
- docker_config
trigger:
ref:
- refs/heads/main
- refs/tags/**
- refs/pull/**
depends_on:
- test
---
kind: pipeline
name: build-container-arm64
platform:
os: linux
arch: arm64
steps:
- name: build
image: golang:1.16
commands:
- "[ -z \"${DRONE_TAG}\" ] && BUILD_VERSION=${DRONE_COMMIT_SHA:0:8} || BUILD_VERSION=${DRONE_TAG##v}"
- go build -v -ldflags "-X main.version=$BUILD_VERSION" -a -tags netgo -o release/arm64/drone-yaml
- name: dryrun
image: thegeeklab/drone-docker:19
settings:
config:
from_secret: docker_config
dockerfile: docker/Dockerfile.arm64
dry_run: true
password:
from_secret: docker_password
repo: thegeeklab/${DRONE_REPO_NAME}
username:
from_secret: docker_username
when:
ref:
- refs/pull/**
depends_on:
- build
- name: publish-dockerhub
image: thegeeklab/drone-docker:19
settings:
auto_tag: true
auto_tag_suffix: arm64
config:
from_secret: docker_config
dockerfile: docker/Dockerfile.arm64
password:
from_secret: docker_password
repo: thegeeklab/${DRONE_REPO_NAME}
username:
from_secret: docker_username
when:
ref:
- refs/heads/main
- refs/tags/**
depends_on:
- dryrun
- name: publish-quay
image: thegeeklab/drone-docker:19
settings:
auto_tag: true
auto_tag_suffix: arm64
config:
from_secret: docker_config
dockerfile: docker/Dockerfile.arm64
password:
from_secret: quay_password
registry: quay.io
repo: quay.io/thegeeklab/${DRONE_REPO_NAME}
username:
from_secret: quay_username
when:
ref:
- refs/heads/main
- refs/tags/**
depends_on:
- dryrun
image_pull_secrets:
- docker_config
trigger:
ref:
- refs/heads/main
- refs/tags/**
- refs/pull/**
depends_on:
- test
---
kind: pipeline
name: build-container-arm
platform:
os: linux
arch: arm
steps:
- name: build
image: golang:1.16
commands:
- "[ -z \"${DRONE_TAG}\" ] && BUILD_VERSION=${DRONE_COMMIT_SHA:0:8} || BUILD_VERSION=${DRONE_TAG##v}"
- go build -v -ldflags "-X main.version=$BUILD_VERSION" -a -tags netgo -o release/arm/drone-yaml
- name: dryrun
image: thegeeklab/drone-docker:19
settings:
config:
from_secret: docker_config
dockerfile: docker/Dockerfile.arm
dry_run: true
password:
from_secret: docker_password
repo: thegeeklab/${DRONE_REPO_NAME}
username:
from_secret: docker_username
when:
ref:
- refs/pull/**
depends_on:
- build
- name: publish-dockerhub
image: thegeeklab/drone-docker:19
settings:
auto_tag: true
auto_tag_suffix: arm
config:
from_secret: docker_config
dockerfile: docker/Dockerfile.arm
password:
from_secret: docker_password
repo: thegeeklab/${DRONE_REPO_NAME}
username:
from_secret: docker_username
when:
ref:
- refs/heads/main
- refs/tags/**
depends_on:
- dryrun
- name: publish-quay
image: thegeeklab/drone-docker:19
settings:
auto_tag: true
auto_tag_suffix: arm
config:
from_secret: docker_config
dockerfile: docker/Dockerfile.arm
password:
from_secret: quay_password
registry: quay.io
repo: quay.io/thegeeklab/${DRONE_REPO_NAME}
username:
from_secret: quay_username
when:
ref:
- refs/heads/main
- refs/tags/**
depends_on:
- dryrun
image_pull_secrets:
- docker_config
trigger:
ref:
- refs/heads/main
- refs/tags/**
- refs/pull/**
depends_on:
- test
---
kind: pipeline
name: docs
platform:
os: linux
arch: amd64
concurrency:
limit: 1
steps:
- name: markdownlint
image: thegeeklab/markdownlint-cli
commands:
- markdownlint 'docs/content/**/*.md' 'README.md' 'CONTRIBUTING.md'
- name: spellcheck
image: node:lts-alpine
commands:
- npm install -g spellchecker-cli
- spellchecker --files '_docs/**/*.md' 'README.md' 'CONTRIBUTING.md' -d .dictionary -p spell indefinite-article syntax-urls --no-suggestions
environment:
FORCE_COLOR: true
NPM_CONFIG_LOGLEVEL: error
- name: publish
image: plugins/gh-pages
settings:
pages_directory: _docs/
password:
from_secret: github_token
target_branch: docs
username:
from_secret: github_username
when:
ref:
- refs/heads/main
trigger:
ref:
- refs/heads/main
- refs/tags/**
- refs/pull/**
depends_on:
- build-binaries
- build-container-amd64
- build-container-arm64
- build-container-arm
---
kind: pipeline
name: notifications
platform:
os: linux
arch: amd64
steps:
- name: manifest-dockerhub
image: plugins/manifest
settings:
auto_tag: true
ignore_missing: true
password:
from_secret: docker_password
spec: docker/manifest.tmpl
username:
from_secret: docker_username
when:
status:
- success
- name: manifest-quay
image: plugins/manifest
settings:
auto_tag: true
ignore_missing: true
password:
from_secret: quay_password
spec: docker/manifest-quay.tmpl
username:
from_secret: quay_username
when:
status:
- success
- name: pushrm-dockerhub
image: chko/docker-pushrm:1
environment:
DOCKER_PASS:
from_secret: docker_password
DOCKER_USER:
from_secret: docker_username
PUSHRM_FILE: README.md
PUSHRM_SHORT: Custom Drone YAML formatter
PUSHRM_TARGET: thegeeklab/${DRONE_REPO_NAME}
when:
status:
- success
- name: pushrm-quay
image: chko/docker-pushrm:1
environment:
APIKEY__QUAY_IO:
from_secret: quay_token
PUSHRM_FILE: README.md
PUSHRM_TARGET: quay.io/thegeeklab/${DRONE_REPO_NAME}
when:
status:
- success
- name: matrix
image: plugins/matrix
settings:
homeserver:
from_secret: matrix_homeserver
password:
from_secret: matrix_password
roomid:
from_secret: matrix_roomid
template: "Status: **{{ build.status }}**<br/> Build: [{{ repo.Owner }}/{{ repo.Name }}]({{ build.link }}) ({{ build.branch }}) by {{ build.author }}<br/> Message: {{ build.message }}"
username:
from_secret: matrix_username
when:
status:
- success
- failure
image_pull_secrets:
- docker_config
trigger:
ref:
- refs/heads/main
- refs/tags/**
status:
- success
- failure
depends_on:
- docs
---
kind: signature
hmac: c733f31cdc76fd0c9cdcf76cbb8d1688636a280554a5a93b7ca6518750c7adb7
...

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
/dist/
/release/
/drone-yaml*

103
.golangci.yml Normal file
View File

@ -0,0 +1,103 @@
linters:
enable-all: false
disable-all: true
enable:
- errcheck
- gosimple
- govet
- ineffassign
- staticcheck
- typecheck
- unused
- asasalint
- asciicheck
- bidichk
- bodyclose
- containedctx
- contextcheck
- decorder
- dogsled
- dupl
- dupword
- durationcheck
- errchkjson
- errname
- errorlint
- execinquery
- exhaustive
- exportloopref
- forcetypeassert
- ginkgolinter
- gocheckcompilerdirectives
- gochecknoglobals
- gochecknoinits
- gocognit
- goconst
- gocritic
- gocyclo
- godot
- godox
- goerr113
- gofmt
- gofumpt
- goheader
- goimports
- gomnd
- gomoddirectives
- gomodguard
- goprintffuncname
- gosec
- grouper
- importas
- interfacebloat
- ireturn
- lll
- loggercheck
- maintidx
- makezero
- misspell
- musttag
- nakedret
- nestif
- nilerr
- nilnil
- nlreturn
- noctx
- nolintlint
- nonamedreturns
- nosprintfhostport
- prealloc
- predeclared
- promlinter
- reassign
- revive
# - rowserrcheck
# - sqlclosecheck
# - structcheck
- stylecheck
- tagliatelle
- tenv
- testableexamples
- thelper
- tparallel
- unconvert
- unparam
- usestdlibvars
# - wastedassign
- whitespace
- wsl
fast: false
run:
timeout: 3m
linters-settings:
gofumpt:
extra-rules: true
lang-version: "1.20"
tagliatelle:
case:
use-field-name: true
rules:
json: snake
yaml: snake

View File

@ -1,2 +1,3 @@
.drone.yml
*.tpl.md
LICENSE

View File

@ -3,7 +3,7 @@
## Security
If you think you have found a **security issue**, please do not mention it in this repository.
Instead, send an email to security@thegeeklab.de with as many details as possible so it can be handled confidential.
Instead, send an email to `security@thegeeklab.de` with as many details as possible so it can be handled confidential.
## Bug Reports and Feature Requests

View File

@ -1,4 +1,14 @@
FROM arm64v8/alpine:3.14@sha256:b06a5cf61b2956088722c4f1b9a6f71dfe95f0b1fe285d44195452b8a1627de7
FROM --platform=$BUILDPLATFORM golang:1.20@sha256:741d6f9bcab778441efe05c8e4369d4f8ff56c9a635a97d77f55d8b0ec62f907 as build
ARG TARGETOS
ARG TARGETARCH
ADD . /src
WORKDIR /src
RUN make build
FROM alpine:3.18@sha256:7144f7bab3d4c2648d7e59409f15ec52a18006a128c733fcff20d3a4a54ba44a
LABEL maintainer="Robert Kaussow <mail@thegeeklab.de>"
LABEL org.opencontainers.image.authors="Robert Kaussow <mail@thegeeklab.de>"
@ -7,5 +17,5 @@ LABEL org.opencontainers.image.url="https://github.com/thegeeklab/drone-yaml"
LABEL org.opencontainers.image.source="https://github.com/thegeeklab/drone-yaml"
LABEL org.opencontainers.image.documentation="https://github.com/thegeeklab/drone-yaml"
ADD release/arm64/drone-yaml /bin/
COPY --from=build /src/dist/drone-yaml /bin/drone-yaml
ENTRYPOINT [ "/bin/drone-yaml" ]

View File

@ -187,7 +187,7 @@
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2021 Robert Kaussow <mail@thegeeklab.de>
Copyright 2022 Robert Kaussow <mail@thegeeklab.de>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.

101
Makefile Normal file
View File

@ -0,0 +1,101 @@
# renovate: datasource=github-releases depName=mvdan/gofumpt
GOFUMPT_PACKAGE_VERSION := v0.5.0
# renovate: datasource=github-releases depName=golangci/golangci-lint
GOLANGCI_LINT_PACKAGE_VERSION := v1.54.2
EXECUTABLE := drone-yaml
DIST := dist
DIST_DIRS := $(DIST)
IMPORT := github.com/thegeeklab/$(EXECUTABLE)
GO ?= go
CWD ?= $(shell pwd)
PACKAGES ?= $(shell go list ./...)
SOURCES ?= $(shell find . -name "*.go" -type f)
GOFUMPT_PACKAGE ?= mvdan.cc/gofumpt@$(GOFUMPT_PACKAGE_VERSION)
GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/cmd/golangci-lint@$(GOLANGCI_LINT_PACKAGE_VERSION)
XGO_PACKAGE ?= src.techknowlogick.com/xgo@latest
GENERATE ?=
XGO_VERSION := go-1.20.x
XGO_TARGETS ?= linux/amd64,linux/arm-6,linux/arm-7,linux/arm64
TARGETOS ?= linux
TARGETARCH ?= amd64
ifneq ("$(TARGETVARIANT)","")
GOARM ?= $(subst v,,$(TARGETVARIANT))
endif
TAGS ?= netgo
ifndef VERSION
ifneq ($(DRONE_TAG),)
VERSION ?= $(subst v,,$(DRONE_TAG))
else
VERSION ?= $(shell git rev-parse --short HEAD)
endif
endif
ifndef DATE
DATE := $(shell date -u +"%Y-%m-%dT%H:%M:%S%z")
endif
LDFLAGS += -s -w -X "main.BuildVersion=$(VERSION)" -X "main.BuildDate=$(DATE)"
.PHONY: all
all: clean build
.PHONY: clean
clean:
$(GO) clean -i ./...
rm -rf $(DIST_DIRS)
.PHONY: fmt
fmt:
$(GO) run $(GOFUMPT_PACKAGE) -extra -w $(SOURCES)
.PHONY: golangci-lint
golangci-lint:
$(GO) run $(GOLANGCI_LINT_PACKAGE) run
.PHONY: lint
lint: golangci-lint
.PHONY: generate
generate:
$(GO) generate $(GENERATE)
.PHONY: test
test:
$(GO) test -v -coverprofile coverage.out $(PACKAGES)
.PHONY: build
build: $(DIST)/$(EXECUTABLE)
$(DIST)/$(EXECUTABLE): $(SOURCES)
GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) GOARM=$(GOARM) $(GO) build -v -tags '$(TAGS)' -ldflags '-extldflags "-static" $(LDFLAGS)' -o $@ ./cmd/$(EXECUTABLE)
$(DIST_DIRS):
mkdir -p $(DIST_DIRS)
.PHONY: xgo
xgo: | $(DIST_DIRS)
$(GO) run $(XGO_PACKAGE) -go $(XGO_VERSION) -v -ldflags '-extldflags "-static" $(LDFLAGS)' -tags '$(TAGS)' -targets '$(XGO_TARGETS)' -out $(EXECUTABLE) --pkg cmd/$(EXECUTABLE) .
cp /build/* $(CWD)/$(DIST)
ls -l $(CWD)/$(DIST)
.PHONY: checksum
checksum:
cd $(DIST); $(foreach file,$(wildcard $(DIST)/$(EXECUTABLE)-*),sha256sum $(notdir $(file)) > $(notdir $(file)).sha256;)
ls -l $(CWD)/$(DIST)
.PHONY: release
release: xgo checksum
.PHONY: deps
deps:
$(GO) mod download
$(GO) install $(GOFUMPT_PACKAGE)
$(GO) install $(GOLANGCI_LINT_PACKAGE)
$(GO) install $(XGO_PACKAGE)

View File

@ -1,6 +1,6 @@
# drone-yaml
Custom Drone YAML formatter
DISCONTINUED: Custom Drone YAML formatter
[![Build Status](https://img.shields.io/drone/build/thegeeklab/drone-yaml?logo=drone&server=https%3A%2F%2Fdrone.thegeeklab.de)](https://drone.thegeeklab.de/thegeeklab/drone-yaml)
[![Docker Hub](https://img.shields.io/badge/dockerhub-latest-blue.svg?logo=docker&logoColor=white)](https://hub.docker.com/r/thegeeklab/drone-yaml)
@ -8,15 +8,16 @@ Custom Drone YAML formatter
[![Go Report Card](https://goreportcard.com/badge/github.com/thegeeklab/drone-yaml)](https://goreportcard.com/report/github.com/thegeeklab/drone-yaml)
[![GitHub contributors](https://img.shields.io/github/contributors/thegeeklab/drone-yaml)](https://github.com/thegeeklab/drone-yaml/graphs/contributors)
[![Source: GitHub](https://img.shields.io/badge/source-github-blue.svg?logo=github&logoColor=white)](https://github.com/thegeeklab/drone-yaml)
[![License: MIT](https://img.shields.io/github/license/thegeeklab/drone-yaml)](https://github.com/thegeeklab/drone-yaml/blob/main/LICENSE)
[![License: Apache-2.0](https://img.shields.io/github/license/thegeeklab/drone-yaml)](https://github.com/thegeeklab/drone-yaml/blob/main/LICENSE)
Custom linter and formatter for the [Drone](https://github.com/drone/drone) YAML configuration file format. You can find the full documentation at You can find the full documentation at [https://drone-plugin-index.geekdocs.de](https://drone-plugin-index.geekdocs.de/tools/drone-yaml).
> **DISCONTINUED:** As I don't use Drone CI anymore, this project is unmaintained. If you are interested in a free and open source CI system check out [Woodpecker CI](https://woodpecker-ci.org/).
Custom linter and formatter for the [Drone](https://github.com/drone/drone) YAML configuration file format. You can find the full documentation at [https://drone-plugin-index.geekdocs.de](https://drone-plugin-index.geekdocs.de/tools/drone-yaml).
## Contributors
Special thanks goes to all [contributors](https://github.com/thegeeklab/drone-yaml/graphs/contributors). If you would like to contribute,
please see the [instructions](https://github.com/thegeeklab/drone-yaml/blob/main/CONTRIBUTING.md).
Special thanks to all [contributors](https://github.com/thegeeklab/drone-yaml/graphs/contributors). If you would like to contribute, please see the [instructions](https://github.com/thegeeklab/drone-yaml/blob/main/CONTRIBUTING.md).
## License
This project is licensed under the MIT License - see the [LICENSE](https://github.com/thegeeklab/drone-yaml/blob/main/LICENSE) file for details.
This project is licensed under the Apache-2.0 License - see the [LICENSE](https://github.com/thegeeklab/drone-yaml/blob/main/LICENSE) file for details.

View File

@ -27,7 +27,7 @@ export GOARCH=amd64
export CGO_ENABLED=0
export GO111MODULE=on
go build -v -a -tags netgo -o release/linux/amd64/drone-yaml
make build
```
Build the Docker image with the following command:
@ -38,8 +38,7 @@ docker build --file docker/Dockerfile.amd64 --tag thegeeklab/drone-yaml .
## Usage
{{< hint warning >}}
**Note**\
{{< hint type=important >}}
Be aware that the tool only supports configuration files for the Drone Docker runner!
{{< /hint >}}

View File

@ -6,16 +6,15 @@ package main
import (
"bytes"
"io"
"io/ioutil"
"os"
"github.com/alecthomas/kingpin/v2"
"github.com/drone/drone-yaml/yaml"
"github.com/drone/drone-yaml/yaml/linter"
"github.com/drone/drone-yaml/yaml/pretty"
"gopkg.in/alecthomas/kingpin.v2"
)
//nolint:gochecknoglobals
var (
format = kingpin.Command("fmt", "format the yaml file")
formatSave = format.Flag("save", "save result to source").Short('s').Bool()
@ -26,6 +25,8 @@ var (
lintFile = lint.Arg("source", "source file location").Default(".drone.yml").File()
)
const DefaultFilePerm = 0o640
func main() {
switch kingpin.Parse() {
case format.FullCommand():
@ -37,6 +38,7 @@ func main() {
func runFormat() error {
f := *formatFile
m, err := yaml.Parse(f)
if err != nil {
return err
@ -46,23 +48,28 @@ func runFormat() error {
pretty.Print(b, m)
if *formatSave {
return ioutil.WriteFile(f.Name(), b.Bytes(), 0644)
return os.WriteFile(f.Name(), b.Bytes(), DefaultFilePerm)
}
_, err = io.Copy(os.Stderr, b)
return err
}
func runLint() error {
f := *lintFile
m, err := yaml.Parse(f)
if err != nil {
return err
}
for _, r := range m.Resources {
err := linter.Lint(r, *lintPriv)
if err != nil {
return err
}
}
return nil
}

View File

@ -1,11 +0,0 @@
FROM alpine:3.14@sha256:e1c082e3d3c45cccac829840a25941e679c25d438cc8412c2fa221cf1a824e6a
LABEL maintainer="Robert Kaussow <mail@thegeeklab.de>"
LABEL org.opencontainers.image.authors="Robert Kaussow <mail@thegeeklab.de>"
LABEL org.opencontainers.image.title="drone-yaml"
LABEL org.opencontainers.image.url="https://github.com/thegeeklab/drone-yaml"
LABEL org.opencontainers.image.source="https://github.com/thegeeklab/drone-yaml"
LABEL org.opencontainers.image.documentation="https://github.com/thegeeklab/drone-yaml"
ADD release/amd64/drone-yaml /bin/
ENTRYPOINT [ "/bin/drone-yaml" ]

View File

@ -1,11 +0,0 @@
FROM arm32v7/alpine:3.14@sha256:e12ff876f0075740ed3d7bdf788107ae84c1b3dd6dc98b3baea41088aba5236f
LABEL maintainer="Robert Kaussow <mail@thegeeklab.de>"
LABEL org.opencontainers.image.authors="Robert Kaussow <mail@thegeeklab.de>"
LABEL org.opencontainers.image.title="drone-yaml"
LABEL org.opencontainers.image.url="https://github.com/thegeeklab/drone-yaml"
LABEL org.opencontainers.image.source="https://github.com/thegeeklab/drone-yaml"
LABEL org.opencontainers.image.documentation="https://github.com/thegeeklab/drone-yaml"
ADD release/arm/drone-yaml /bin/
ENTRYPOINT [ "/bin/drone-yaml" ]

View File

@ -1,24 +0,0 @@
image: quay.io/thegeeklab/drone-yaml:{{#if build.tag}}{{trimPrefix "v" build.tag}}{{else}}latest{{/if}}
{{#if build.tags}}
tags:
{{#each build.tags}}
- {{this}}
{{/each}}
{{/if}}
manifests:
- image: quay.io/thegeeklab/drone-yaml:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}amd64
platform:
architecture: amd64
os: linux
- image: quay.io/thegeeklab/drone-yaml:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}arm64
platform:
architecture: arm64
os: linux
variant: v8
- image: quay.io/thegeeklab/drone-yaml:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}arm
platform:
architecture: arm
os: linux
variant: v7

View File

@ -1,24 +0,0 @@
image: thegeeklab/drone-yaml:{{#if build.tag}}{{trimPrefix "v" build.tag}}{{else}}latest{{/if}}
{{#if build.tags}}
tags:
{{#each build.tags}}
- {{this}}
{{/each}}
{{/if}}
manifests:
- image: thegeeklab/drone-yaml:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}amd64
platform:
architecture: amd64
os: linux
- image: thegeeklab/drone-yaml:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}arm64
platform:
architecture: arm64
os: linux
variant: v8
- image: thegeeklab/drone-yaml:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}arm
platform:
architecture: arm
os: linux
variant: v7

30
go.mod
View File

@ -1,22 +1,18 @@
module github.com/drone/drone-yaml
go 1.16
go 1.20
require (
github.com/BurntSushi/toml v0.4.1 // indirect
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect
github.com/alecthomas/units v0.0.0-20210912230133-d1bdfacee922 // indirect
github.com/bmatcuk/doublestar/v4 v4.0.2
github.com/buildkite/yaml v2.2.0+incompatible
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/docker/go-units v0.4.0
github.com/google/go-cmp v0.5.6
github.com/kr/pretty v0.1.0 // indirect
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616
golang.org/x/mod v0.5.0 // indirect
golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 // indirect
golang.org/x/tools v0.1.6 // indirect
gopkg.in/alecthomas/kingpin.v2 v2.2.6
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
honnef.co/go/tools v0.2.1
github.com/alecthomas/kingpin/v2 v2.3.2
github.com/bmatcuk/doublestar/v4 v4.6.0
github.com/docker/go-units v0.5.0
github.com/google/go-cmp v0.5.9
gopkg.in/yaml.v2 v2.4.0
)
require (
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect
github.com/kr/pretty v0.1.0 // indirect
github.com/xhit/go-str2duration/v2 v2.1.0 // indirect
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
)

81
go.sum
View File

@ -1,21 +1,15 @@
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/toml v0.4.1 h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw=
github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20210912230133-d1bdfacee922 h1:8ypNbf5sd3Sm3cKJ9waOGoQv6dKAFiFty9L6NP1AqJ4=
github.com/alecthomas/units v0.0.0-20210912230133-d1bdfacee922/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE=
github.com/bmatcuk/doublestar/v4 v4.0.2 h1:X0krlUVAVmtr2cRoTqR8aDMrDqnB36ht8wpWTiQ3jsA=
github.com/bmatcuk/doublestar/v4 v4.0.2/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc=
github.com/buildkite/yaml v2.2.0+incompatible h1:udgEsIWzNhX05fZpRt0wTjtMVwp1PYFQnuu5l7ivOZ8=
github.com/buildkite/yaml v2.2.0+incompatible/go.mod h1:5hCug3EZaHXU3FdCA3gJm0YTNi+V+ooA2qNTiVpky4A=
github.com/alecthomas/kingpin/v2 v2.3.2 h1:H0aULhgmSzN8xQ3nX1uxtdlTHYoPLu5AhHxWrKI6ocU=
github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE=
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc=
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE=
github.com/bmatcuk/doublestar/v4 v4.6.0 h1:HTuxyug8GyFbRkrffIpzNCSK4luc0TY3wzXvzIZhEXc=
github.com/bmatcuk/doublestar/v4 v4.6.0/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
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/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
@ -24,57 +18,14 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
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/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug=
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.5.0 h1:UG21uOlmZabA4fW5i7ZX6bjw1xELEGg/ZLgZq9auk/Q=
golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
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/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 h1:J27LZFQBFoihqXoegpscI10HpjZ7B5WQLLKL2FZXQKw=
golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
golang.org/x/tools v0.1.6 h1:SIasE1FVIQOWz2GEAHFOmoW7xchJcqlucjSULTL0Ag4=
golang.org/x/tools v0.1.6/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc=
github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
honnef.co/go/tools v0.2.1 h1:/EPr//+UMMXwMTkXvCCoaJDq8cpjMO80Ou+L4PDo2mY=
honnef.co/go/tools v0.2.1/go.mod h1:lPVVZ2BS5TfnjLyizF7o7hv7j9/L+8cZY2hLyjP9cGY=
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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=

View File

@ -1,4 +0,0 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": ["github>thegeeklab/renovate-presets:golang"]
}

View File

@ -1,8 +0,0 @@
// +build tools
package tools
import (
_ "golang.org/x/lint/golint"
_ "honnef.co/go/tools/cmd/staticcheck"
)

View File

@ -29,15 +29,18 @@ type (
// UnmarshalYAML implements yaml unmarshalling.
func (b *Build) UnmarshalYAML(unmarshal func(interface{}) error) error {
d := new(build)
err := unmarshal(&d.Image)
if err != nil {
err = unmarshal(d)
}
b.Args = d.Args
b.CacheFrom = d.CacheFrom
b.Context = d.Context
b.Dockerfile = d.Dockerfile
b.Labels = d.Labels
b.Image = d.Image
return err
}

View File

@ -32,12 +32,15 @@ func (c *Condition) Match(v string) bool {
if c.Excludes(v) {
return false
}
if c.Includes(v) {
return true
}
if len(c.Include) == 0 {
return true
}
return false
}
@ -49,6 +52,7 @@ func (c *Condition) Includes(v string) bool {
return true
}
}
return false
}
@ -60,14 +64,18 @@ func (c *Condition) Excludes(v string) bool {
return true
}
}
return false
}
// UnmarshalYAML implements yml unmarshalling.
func (c *Condition) UnmarshalYAML(unmarshal func(interface{}) error) error {
var out1 string
var out2 []string
var out3 = struct {
var (
out1 string
out2 []string
)
out3 := struct {
Include []string
Exclude []string
}{}
@ -75,17 +83,20 @@ func (c *Condition) UnmarshalYAML(unmarshal func(interface{}) error) error {
err := unmarshal(&out1)
if err == nil {
c.Include = []string{out1}
return nil
}
unmarshal(&out2)
unmarshal(&out3)
_ = unmarshal(&out2)
_ = unmarshal(&out3)
c.Exclude = out3.Exclude
c.Include = append(
out3.Include = append(
out3.Include,
out2...,
)
c.Exclude = out3.Exclude
c.Include = out3.Include
return nil
}

View File

@ -5,6 +5,8 @@ package yaml
import "errors"
var ErrInvlaidCronBranch = errors.New("yaml: invalid cron branch")
type (
// Cron is a resource that defines a cron job, used
// to execute pipelines at scheduled intervals.
@ -19,9 +21,9 @@ type (
// CronSpec defines the cron job.
CronSpec struct {
Schedule string `json:"schedule,omitempty"`
Branch string `json:"branch,omitempty"`
Deploy CronDeployment `json:"deployment,omitempty" yaml:"deployment"`
Schedule string `json:"schedule,omitempty"`
Branch string `json:"branch,omitempty"`
Deployment CronDeployment `json:"deployment,omitempty" yaml:"deployment"`
}
// CronDeployment defines a cron job deployment.
@ -40,7 +42,7 @@ func (c *Cron) GetKind() string { return c.Kind }
func (c Cron) Validate() error {
switch {
case c.Spec.Branch == "":
return errors.New("yaml: invalid cron branch")
return ErrInvlaidCronBranch
default:
return nil
}

View File

@ -8,39 +8,46 @@ type (
// can be defined as a string literal or as a reference
// to a secret.
Variable struct {
Value string `json:"value,omitempty"`
Secret string `json:"from_secret,omitempty" yaml:"from_secret"`
Value string `json:"value,omitempty"`
FromSecret string `json:"from_secret,omitempty" yaml:"from_secret"`
}
// variable is a tempoary type used to unmarshal
// variables with references to secrets.
variable struct {
Value string
Secret string `yaml:"from_secret"`
Value string
FromSecret string `yaml:"from_secret"`
}
)
// UnmarshalYAML implements yaml unmarshalling.
func (v *Variable) UnmarshalYAML(unmarshal func(interface{}) error) error {
d := new(variable)
err := unmarshal(&d.Value)
if err != nil {
err = unmarshal(d)
}
v.Value = d.Value
v.Secret = d.Secret
v.FromSecret = d.FromSecret
return err
}
// MarshalYAML implements yaml marshalling.
func (v *Variable) MarshalYAML() (interface{}, error) {
if v.Secret != "" {
if v.FromSecret != "" {
m := map[string]interface{}{}
m["from_secret"] = v.Secret
m["from_secret"] = v.FromSecret
return m, nil
}
if v.Value != "" {
return v.Value, nil
}
//nolint:nilnil
return nil, nil
}

View File

@ -14,7 +14,7 @@ import (
var ErrDuplicatePipelineName = errors.New("linter: duplicate pipeline names")
// ErrMissingPipelineDependency is returned when a Pipeline
// defines dependencies that are invlid or unknown.
// defines dependencies that are invalid or unknown.
var ErrMissingPipelineDependency = errors.New("linter: invalid or unknown pipeline dependency")
// ErrCyclicalPipelineDependency is returned when a Pipeline
@ -27,12 +27,13 @@ var ErrCyclicalPipelineDependency = errors.New("linter: cyclical pipeline depend
var ErrPipelineSelfDependency = errors.New("linter: pipeline cannot have a dependency on itself")
// Manifest performs lint operations for a manifest.
func Manifest(manifest *yaml.Manifest, trusted bool) error {
return checkPipelines(manifest, trusted)
func Manifest(manifest *yaml.Manifest) error {
return checkPipelines(manifest)
}
func checkPipelines(manifest *yaml.Manifest, trusted bool) error {
func checkPipelines(manifest *yaml.Manifest) error {
names := map[string]struct{}{}
for _, resource := range manifest.Resources {
switch v := resource.(type) {
case *yaml.Pipeline:
@ -40,19 +41,25 @@ func checkPipelines(manifest *yaml.Manifest, trusted bool) error {
if ok {
return ErrDuplicatePipelineName
}
names[v.Name] = struct{}{}
err := checkPipelineDeps(v, names)
if err != nil {
return err
}
if (v.Kind == "pipeline" || v.Kind == "") && (v.Type == "" || v.Type == "docker") {
err = checkPlatform(v.Platform)
if err != nil {
return err
}
}
default:
continue
}
}
return nil
}
@ -62,9 +69,11 @@ func checkPipelineDeps(pipeline *yaml.Pipeline, deps map[string]struct{}) error
if !ok {
return ErrMissingPipelineDependency
}
if pipeline.Name == dep {
return ErrPipelineSelfDependency
}
}
return nil
}

View File

@ -10,29 +10,49 @@ import (
"github.com/drone/drone-yaml/yaml"
)
var os = map[string]struct{}{
"linux": {},
"windows": {},
}
//nolint:gochecknoglobals
var (
os = map[string]struct{}{
"linux": {},
"windows": {},
}
arch = map[string]struct{}{
"arm": {},
"arm64": {},
"amd64": {},
}
)
var arch = map[string]struct{}{
"arm": {},
"arm64": {},
"amd64": {},
}
var (
// ErrDuplicateStepName is returned when two Pipeline steps
// have the same name.
ErrDuplicateStepName = errors.New("linter: duplicate step names")
// ErrDuplicateStepName is returned when two Pipeline steps
// have the same name.
var ErrDuplicateStepName = errors.New("linter: duplicate step names")
// ErrMissingDependency is returned when a Pipeline step
// defines dependencies that are invalid or unknown.
ErrMissingDependency = errors.New("linter: invalid or unknown step dependency")
// ErrMissingDependency is returned when a Pipeline step
// defines dependencies that are invlid or unknown.
var ErrMissingDependency = errors.New("linter: invalid or unknown step dependency")
// ErrCyclicalDependency is returned when a Pipeline step
// defines a cyclical dependency, which would result in an
// infinite execution loop.
ErrCyclicalDependency = errors.New("linter: cyclical step dependency detected")
// ErrCyclicalDependency is returned when a Pipeline step
// defines a cyclical dependency, which would result in an
// infinite execution loop.
var ErrCyclicalDependency = errors.New("linter: cyclical step dependency detected")
ErrUnsupportedOS = errors.New("linter: unsupported os")
ErrUnsupportedArch = errors.New("linter: unsupported architecture")
ErrInvalidImage = errors.New("linter: invalid or missing image")
ErrInvalidBuildImage = errors.New("linter: invalid or missing build image")
ErrInvalidName = errors.New("linter: invalid or missing name")
ErrPrivilegedNotAllowed = errors.New("linter: untrusted repositories cannot enable privileged mode")
ErrMountNotAllowed = errors.New("linter: untrusted repositories cannot mount devices")
ErrDNSNotAllowed = errors.New("linter: untrusted repositories cannot configure dns")
ErrDNSSearchNotAllowed = errors.New("linter: untrusted repositories cannot configure dns_search")
ErrExtraHostsNotAllowed = errors.New("linter: untrusted repositories cannot configure extra_hosts")
ErrNetworkModeNotAllowed = errors.New("linter: untrusted repositories cannot configure network_mode")
ErrInvalidVolumeName = errors.New("linter: invalid volume name")
ErrHostPortNotAllowed = errors.New("linter: untrusted repositories cannot map to a host port")
ErrHostVolumeNotAllowed = errors.New("linter: untrusted repositories cannot mount host volumes")
ErrTempVolumeNotAllowed = errors.New("linter: untrusted repositories cannot mount in-memory volumes")
)
// Lint performs lint operations for a resource.
func Lint(resource yaml.Resource, trusted bool) error {
@ -57,19 +77,23 @@ func checkPipeline(pipeline *yaml.Pipeline, trusted bool) error {
if err != nil {
return err
}
err = checkPlatform(pipeline.Platform)
if err != nil {
return err
}
names := map[string]struct{}{}
if !pipeline.Clone.Disable {
names["clone"] = struct{}{}
}
for _, container := range pipeline.Steps {
_, ok := names[container.Name]
if ok {
return ErrDuplicateStepName
}
names[container.Name] = struct{}{}
err := checkContainer(container, trusted)
@ -82,11 +106,13 @@ func checkPipeline(pipeline *yaml.Pipeline, trusted bool) error {
return err
}
}
for _, container := range pipeline.Services {
_, ok := names[container.Name]
if ok {
return ErrDuplicateStepName
}
names[container.Name] = struct{}{}
err := checkContainer(container, trusted)
@ -94,6 +120,7 @@ func checkPipeline(pipeline *yaml.Pipeline, trusted bool) error {
return err
}
}
return nil
}
@ -101,15 +128,17 @@ func checkPlatform(platform yaml.Platform) error {
if v := platform.OS; v != "" {
_, ok := os[v]
if !ok {
return fmt.Errorf("linter: unsupported os: %s", v)
return fmt.Errorf("%w: %s", ErrUnsupportedOS, v)
}
}
if v := platform.Arch; v != "" {
_, ok := arch[v]
if !ok {
return fmt.Errorf("linter: unsupported architecture: %s", v)
return fmt.Errorf("%w: %s", ErrUnsupportedArch, v)
}
}
return nil
}
@ -118,39 +147,50 @@ func checkContainer(container *yaml.Container, trusted bool) error {
if err != nil {
return err
}
if container.Build == nil && container.Image == "" {
return errors.New("linter: invalid or missing image")
return ErrInvalidImage
}
if container.Build != nil && container.Build.Image == "" {
return errors.New("linter: invalid or missing build image")
return ErrInvalidBuildImage
}
if container.Name == "" {
return errors.New("linter: invalid or missing name")
return ErrInvalidName
}
if trusted && container.Privileged {
return errors.New("linter: untrusted repositories cannot enable privileged mode")
return ErrPrivilegedNotAllowed
}
if trusted && len(container.Devices) > 0 {
return errors.New("linter: untrusted repositories cannot mount devices")
return ErrMountNotAllowed
}
if trusted && len(container.DNS) > 0 {
return errors.New("linter: untrusted repositories cannot configure dns")
return ErrDNSNotAllowed
}
if trusted && len(container.DNSSearch) > 0 {
return errors.New("linter: untrusted repositories cannot configure dns_search")
return ErrDNSSearchNotAllowed
}
if trusted && len(container.ExtraHosts) > 0 {
return errors.New("linter: untrusted repositories cannot configure extra_hosts")
return ErrExtraHostsNotAllowed
}
if trusted && len(container.Network) > 0 {
return errors.New("linter: untrusted repositories cannot configure network_mode")
if trusted && len(container.NetworkMode) > 0 {
return ErrNetworkModeNotAllowed
}
for _, mount := range container.Volumes {
switch mount.Name {
case "workspace", "_workspace", "_docker_socket":
return fmt.Errorf("linter: invalid volume name: %s", mount.Name)
return fmt.Errorf("%w: %s", ErrInvalidVolumeName, mount.Name)
}
}
return nil
}
@ -161,49 +201,56 @@ func checkPorts(ports []*yaml.Port, trusted bool) error {
return err
}
}
return nil
}
func checkPort(port *yaml.Port, trusted bool) error {
if trusted && port.Host != 0 {
return errors.New("linter: untrusted repositories cannot map to a host port")
return ErrHostPortNotAllowed
}
return nil
}
func checkVolumes(pipeline *yaml.Pipeline, trusted bool) error {
for _, volume := range pipeline.Volumes {
if volume.EmptyDir != nil {
err := checkEmptyDirVolume(volume.EmptyDir, trusted)
if volume.Temp != nil {
err := checkEmptyDirVolume(volume.Temp, trusted)
if err != nil {
return err
}
}
if volume.HostPath != nil {
err := checkHostPathVolume(volume.HostPath, trusted)
if volume.Host != nil {
err := checkHostPathVolume(trusted)
if err != nil {
return err
}
}
switch volume.Name {
case "workspace", "_workspace", "_docker_socket":
return fmt.Errorf("linter: invalid volume name: %s", volume.Name)
return fmt.Errorf("%w: %s", ErrInvalidVolumeName, volume.Name)
}
}
return nil
}
func checkHostPathVolume(volume *yaml.VolumeHostPath, trusted bool) error {
func checkHostPathVolume(trusted bool) error {
if trusted {
return errors.New("linter: untrusted repositories cannot mount host volumes")
return ErrHostVolumeNotAllowed
}
return nil
}
func checkEmptyDirVolume(volume *yaml.VolumeEmptyDir, trusted bool) error {
if trusted && volume.Medium == "memory" {
return errors.New("linter: untrusted repositories cannot mount in-memory volumes")
return ErrTempVolumeNotAllowed
}
return nil
}
@ -213,9 +260,11 @@ func checkDeps(container *yaml.Container, deps map[string]struct{}) error {
if !ok {
return ErrMissingDependency
}
if container.Name == dep {
return ErrCyclicalDependency
}
}
return nil
}

View File

@ -8,7 +8,7 @@ import (
"encoding/json"
"errors"
"github.com/buildkite/yaml"
"gopkg.in/yaml.v2"
)
// Resource enums.
@ -20,6 +20,8 @@ const (
KindSignature = "signature"
)
var ErrMarshalNotImplemented = errors.New("yaml: marshal not implemented")
type (
// Manifest is a collection of Drone resources.
Manifest struct {
@ -44,6 +46,7 @@ type (
Data []byte `yaml:"-"`
}
//nolint:musttag
resource struct {
Version string
Kind string `json:"kind"`
@ -54,17 +57,22 @@ type (
// UnmarshalJSON implement the json.Unmarshaler.
func (m *Manifest) UnmarshalJSON(b []byte) error {
messages := []json.RawMessage{}
err := json.Unmarshal(b, &messages)
if err != nil {
return err
}
for _, message := range messages {
res := new(resource)
err := json.Unmarshal(message, res)
if err != nil {
return err
}
var obj Resource
switch res.Kind {
case "cron":
obj = new(Cron)
@ -77,12 +85,15 @@ func (m *Manifest) UnmarshalJSON(b []byte) error {
default:
obj = new(Pipeline)
}
err = json.Unmarshal(message, obj)
if err != nil {
return err
}
m.Resources = append(m.Resources, obj)
}
return nil
}
@ -96,17 +107,19 @@ func (m *Manifest) MarshalJSON() ([]byte, error) {
// documents, and MarshalYAML would otherwise attempt to marshal
// as a single Yaml document. Use the Encode method instead.
func (m *Manifest) MarshalYAML() (interface{}, error) {
return nil, errors.New("yaml: marshal not implemented")
return nil, ErrMarshalNotImplemented
}
// Encode encodes the manifest in Yaml format.
func (m *Manifest) Encode() ([]byte, error) {
buf := new(bytes.Buffer)
enc := yaml.NewEncoder(buf)
for _, res := range m.Resources {
if err := enc.Encode(res); err != nil {
return nil, err
}
}
return buf.Bytes(), nil
}

View File

@ -8,14 +8,14 @@ type (
// can be defined as a literal or as a reference
// to a secret.
Parameter struct {
Value interface{} `json:"value,omitempty"`
Secret string `json:"from_secret,omitempty" yaml:"from_secret"`
Value interface{} `json:"value,omitempty"`
FromSecret string `json:"from_secret,omitempty" yaml:"from_secret"`
}
// parameter is a tempoary type used to unmarshal
// parameters with references to secrets.
parameter struct {
Secret string `yaml:"from_secret"`
FromSecret string `yaml:"from_secret"`
}
)
@ -23,25 +23,33 @@ type (
func (p *Parameter) UnmarshalYAML(unmarshal func(interface{}) error) error {
d := new(parameter)
err := unmarshal(d)
if err == nil && d.Secret != "" {
p.Secret = d.Secret
if err == nil && d.FromSecret != "" {
p.FromSecret = d.FromSecret
return nil
}
var i interface{}
err = unmarshal(&i)
p.Value = i
return err
}
// MarshalYAML implements yaml marshalling.
func (p *Parameter) MarshalYAML() (interface{}, error) {
if p.Secret != "" {
if p.FromSecret != "" {
m := map[string]interface{}{}
m["from_secret"] = p.Secret
m["from_secret"] = p.FromSecret
return m, nil
}
if p.Value != "" {
return p.Value, nil
}
//nolint:nilnil
return nil, nil
}

View File

@ -11,10 +11,10 @@ import (
"os"
"strings"
"github.com/buildkite/yaml"
"gopkg.in/yaml.v2"
)
var errorMissingKind = errors.New("yaml: missing kind attribute")
var ErrMissingKind = errors.New("yaml: missing kind attribute")
// Parse parses the configuration from io.Reader r.
func Parse(r io.Reader) (*Manifest, error) {
@ -22,23 +22,29 @@ func Parse(r io.Reader) (*Manifest, error) {
if err != nil {
return nil, err
}
manifest := new(Manifest)
for _, raw := range resources {
if raw == nil {
continue
}
resource, err := parseRaw(raw)
if err != nil {
return nil, err
}
if resource.GetKind() == "" {
return nil, errorMissingKind
return nil, ErrMissingKind
}
manifest.Resources = append(
manifest.Resources,
resource,
)
}
return manifest, nil
}
@ -63,11 +69,13 @@ func ParseFile(p string) (*Manifest, error) {
return nil, err
}
defer f.Close()
return Parse(f)
}
func parseRaw(r *RawResource) (Resource, error) {
func parseRaw(r *RawResource) (Resource, error) { //nolint:ireturn
var obj Resource
switch r.Kind {
case "cron":
obj = new(Cron)
@ -80,7 +88,9 @@ func parseRaw(r *RawResource) (Resource, error) {
default:
obj = new(Pipeline)
}
err := yaml.Unmarshal(r.Data, obj)
return obj, err
}
@ -88,8 +98,11 @@ func parseRaw(r *RawResource) (Resource, error) {
// io.Reader and returns a slice of raw resources.
func ParseRaw(r io.Reader) ([]*RawResource, error) {
const newline = '\n'
var resources []*RawResource
var resource *RawResource
var (
resources []*RawResource
resource *RawResource
)
scanner := bufio.NewScanner(r)
for scanner.Scan() {
@ -97,34 +110,42 @@ func ParseRaw(r io.Reader) ([]*RawResource, error) {
if isSeparator(line) {
resource = nil
}
if resource == nil {
resource = &RawResource{}
resources = append(resources, resource)
}
if isSeparator(line) {
continue
}
if isTerminator(line) {
break
}
if scanner.Err() == io.EOF {
if errors.Is(scanner.Err(), io.EOF) {
break
}
resource.Data = append(
resource.Data,
line...,
)
resource.Data = append(
resource.Data,
newline,
)
}
for _, resource := range resources {
err := yaml.Unmarshal(resource.Data, resource)
if err != nil {
return nil, err
}
}
return resources, nil
}
@ -152,6 +173,7 @@ func ParseRawFile(p string) ([]*RawResource, error) {
return nil, err
}
defer f.Close()
return ParseRaw(f)
}

View File

@ -11,17 +11,17 @@ type Pipeline struct {
Type string `json:"type,omitempty"`
Name string `json:"name,omitempty"`
Clone Clone `json:"clone,omitempty"`
Concurrency Concurrency `json:"concurrency,omitempty"`
DependsOn []string `json:"depends_on,omitempty" yaml:"depends_on" `
Node map[string]string `json:"node,omitempty" yaml:"node"`
Platform Platform `json:"platform,omitempty"`
PullSecrets []string `json:"image_pull_secrets,omitempty" yaml:"image_pull_secrets"`
Services []*Container `json:"services,omitempty"`
Steps []*Container `json:"steps,omitempty"`
Trigger Conditions `json:"trigger,omitempty"`
Volumes []*Volume `json:"volumes,omitempty"`
Workspace Workspace `json:"workspace,omitempty"`
Clone Clone `json:"clone,omitempty"`
Concurrency Concurrency `json:"concurrency,omitempty"`
DependsOn []string `json:"depends_on,omitempty" yaml:"depends_on" `
Node map[string]string `json:"node,omitempty" yaml:"node"`
Platform Platform `json:"platform,omitempty"`
ImagePullSecrets []string `json:"image_pull_secrets,omitempty" yaml:"image_pull_secrets"`
Services []*Container `json:"services,omitempty"`
Steps []*Container `json:"steps,omitempty"`
Trigger Conditions `json:"trigger,omitempty"`
Volumes []*Volume `json:"volumes,omitempty"`
Workspace Workspace `json:"workspace,omitempty"`
}
// GetVersion returns the resource version.
@ -58,7 +58,7 @@ type (
ExtraHosts []string `json:"extra_hosts,omitempty" yaml:"extra_hosts"`
Failure string `json:"failure,omitempty"`
Image string `json:"image,omitempty"`
Network string `json:"network_mode,omitempty" yaml:"network_mode"`
NetworkMode string `json:"network_mode,omitempty" yaml:"network_mode"`
Name string `json:"name,omitempty"`
Ports []*Port `json:"ports,omitempty"`
Privileged bool `json:"privileged,omitempty"`
@ -102,23 +102,23 @@ type (
// Volume that can be mounted by containers.
Volume struct {
Name string `json:"name,omitempty"`
EmptyDir *VolumeEmptyDir `json:"temp,omitempty" yaml:"temp"`
HostPath *VolumeHostPath `json:"host,omitempty" yaml:"host"`
Name string `json:"name,omitempty"`
Temp *VolumeEmptyDir `json:"temp,omitempty" yaml:"temp"`
Host *VolumeHostPath `json:"host,omitempty" yaml:"host"`
}
// VolumeDevice describes a mapping of a raw block
// device within a container.
VolumeDevice struct {
Name string `json:"name,omitempty"`
DevicePath string `json:"path,omitempty" yaml:"path"`
Name string `json:"name,omitempty"`
Path string `json:"path,omitempty" yaml:"path"`
}
// VolumeMount describes a mounting of a Volume
// within a container.
VolumeMount struct {
Name string `json:"name,omitempty"`
MountPath string `json:"path,omitempty" yaml:"path"`
Name string `json:"name,omitempty"`
Path string `json:"path,omitempty" yaml:"path"`
}
// VolumeEmptyDir mounts a temporary directory from the
@ -135,7 +135,7 @@ type (
Path string `json:"path,omitempty"`
}
// Workspace represents the pipeline workspace configuraiton.
// Workspace represents the pipeline workspace configuration.
Workspace struct {
Base string `json:"base,omitempty"`
Path string `json:"path,omitempty"`

View File

@ -22,12 +22,15 @@ type (
// UnmarshalYAML implements yaml unmarshalling.
func (p *Port) UnmarshalYAML(unmarshal func(interface{}) error) error {
out := new(port)
err := unmarshal(&out.Port)
if err != nil {
err = unmarshal(&out)
}
p.Port = out.Port
p.Host = out.Host
p.Protocol = out.Protocol
return err
}

View File

@ -19,6 +19,7 @@ func printContainer(w writer, v *yaml.Container) {
if v.Build != nil {
printBuild(w, v.Build)
}
if v.Push != nil {
w.WriteTagValue("push", v.Push.Image)
}
@ -32,7 +33,7 @@ func printContainer(w writer, v *yaml.Container) {
w.WriteTagValue("dns", v.DNS)
w.WriteTagValue("dns_search", v.DNSSearch)
w.WriteTagValue("extra_hosts", v.ExtraHosts)
w.WriteTagValue("network_mode", v.Network)
w.WriteTagValue("network_mode", v.NetworkMode)
if len(v.Settings) > 0 {
printSettings(w, v.Settings)
@ -49,22 +50,28 @@ func printContainer(w writer, v *yaml.Container) {
if len(v.Devices) > 0 {
printDeviceMounts(w, v.Devices)
}
if len(v.Ports) > 0 {
printPorts(w, v.Ports)
}
if v.Resources != nil {
printResources(w, v.Resources)
}
if len(v.Volumes) > 0 {
printVolumeMounts(w, v.Volumes)
}
if !isConditionsEmpty(v.When) {
printConditions(w, "when", v.When)
}
if len(v.DependsOn) > 0 {
printDependsOn(w, v.DependsOn)
}
w.WriteByte('\n')
_ = w.WriteByte('\n')
w.IndentDecrease()
}
@ -93,50 +100,57 @@ func printDependsOn(w writer, v []string) {
// helper function pretty prints the device sequence.
func printDeviceMounts(w writer, v []*yaml.VolumeDevice) {
w.WriteTag("devices")
for _, v := range v {
s := new(indexWriter)
s.writer = w
s.IndentIncrease()
s.WriteTagValue("name", v.Name)
s.WriteTagValue("path", v.DevicePath)
s.WriteTagValue("path", v.Path)
s.IndentDecrease()
}
}
// helper function pretty prints the environment mapping.
func printEnviron(w writer, v map[string]*yaml.Variable) {
var keys []string
keys := make([]string, 0)
for k := range v {
keys = append(keys, k)
}
sort.Strings(keys)
w.WriteTag("environment")
w.IndentIncrease()
for _, k := range keys {
v := v[k]
if v.Secret == "" {
if v.FromSecret == "" {
w.WriteTagValue(k, v.Value)
} else {
w.WriteTag(k)
w.IndentIncrease()
w.WriteTagValue("from_secret", v.Secret)
w.WriteTagValue("from_secret", v.FromSecret)
w.IndentDecrease()
}
}
w.IndentDecrease()
}
// helper function pretty prints the port sequence.
func printPorts(w writer, v []*yaml.Port) {
w.WriteTag("ports")
for _, v := range v {
if shortPort(v) {
w.WriteByte('\n')
_ = w.WriteByte('\n')
w.Indent()
w.WriteByte('-')
w.WriteByte(' ')
_ = w.WriteByte('-')
_ = w.WriteByte(' ')
writeInt(w, v.Port)
continue
}
@ -162,6 +176,7 @@ func printResources(w writer, v *yaml.Resources) {
w.WriteTagValue("memory", v.Limits.Memory)
w.IndentDecrease()
}
if v.Requests != nil {
w.WriteTag("requests")
w.IndentIncrease()
@ -169,38 +184,44 @@ func printResources(w writer, v *yaml.Resources) {
w.WriteTagValue("memory", v.Requests.Memory)
w.IndentDecrease()
}
w.IndentDecrease()
}
// helper function pretty prints the resoure mapping.
func printSettings(w writer, v map[string]*yaml.Parameter) {
var keys []string
keys := make([]string, 0)
for k := range v {
keys = append(keys, k)
}
sort.Strings(keys)
w.WriteTag("settings")
w.IndentIncrease()
for _, k := range keys {
v := v[k]
if v.Secret == "" {
if v.FromSecret == "" {
w.IncludeZero()
w.WriteTagValue(k, v.Value)
w.ExcludeZero()
} else {
w.WriteTag(k)
w.IndentIncrease()
w.WriteTagValue("from_secret", v.Secret)
w.WriteTagValue("from_secret", v.FromSecret)
w.IndentDecrease()
}
}
w.IndentDecrease()
}
// helper function pretty prints the volume sequence.
func printVolumeMounts(w writer, v []*yaml.VolumeMount) {
w.WriteTag("volumes")
for _, v := range v {
s := new(indexWriter)
s.writer = w
@ -208,7 +229,7 @@ func printVolumeMounts(w writer, v []*yaml.VolumeMount) {
s.IndentIncrease()
s.WriteTagValue("name", v.Name)
s.WriteTagValue("path", v.MountPath)
s.WriteTagValue("path", v.Path)
s.IndentDecrease()
w.IndentDecrease()

View File

@ -7,13 +7,13 @@ import "github.com/drone/drone-yaml/yaml"
// helper function pretty prints the cron resource.
func printCron(w writer, v *yaml.Cron) {
w.WriteString("---")
_, _ = w.WriteString("---")
w.WriteTagValue("version", v.Version)
w.WriteTagValue("kind", v.Kind)
w.WriteTagValue("name", v.Name)
printSpec(w, v)
w.WriteByte('\n')
w.WriteByte('\n')
_ = w.WriteByte('\n')
_ = w.WriteByte('\n')
}
// helper function pretty prints the spec block.
@ -23,9 +23,11 @@ func printSpec(w writer, v *yaml.Cron) {
w.IndentIncrease()
w.WriteTagValue("schedule", v.Spec.Schedule)
w.WriteTagValue("branch", v.Spec.Branch)
if hasDeployment(v) {
printDeploy(w, v)
}
w.IndentDecrease()
}
@ -33,12 +35,12 @@ func printSpec(w writer, v *yaml.Cron) {
func printDeploy(w writer, v *yaml.Cron) {
w.WriteTag("deployment")
w.IndentIncrease()
w.WriteTagValue("target", v.Spec.Deploy.Target)
w.WriteTagValue("target", v.Spec.Deployment.Target)
w.IndentDecrease()
}
// helper function returns true if the deployment
// object is empty.
func hasDeployment(v *yaml.Cron) bool {
return v.Spec.Deploy.Target != ""
return v.Spec.Deployment.Target != ""
}

View File

@ -9,34 +9,39 @@ import (
// helper function to pretty print the pipeline resource.
func printPipeline(w writer, v *yaml.Pipeline) {
w.WriteString("---")
_, _ = w.WriteString("---")
w.WriteTagValue("version", v.Version)
w.WriteTagValue("kind", v.Kind)
w.WriteTagValue("type", v.Type)
w.WriteTagValue("name", v.Name)
w.WriteByte('\n')
_ = w.WriteByte('\n')
if !isPlatformEmpty(v.Platform) {
printPlatform(w, v.Platform)
} else {
printPlatformDefault(w)
}
if !isCloneEmpty(v.Clone) {
printClone(w, v.Clone)
}
if !isConcurrencyEmpty(v.Concurrency) {
printConcurrency(w, v.Concurrency)
}
if !isWorkspaceEmpty(v.Workspace) {
printWorkspace(w, v.Workspace)
}
if len(v.Steps) > 0 {
w.WriteTag("steps")
for _, step := range v.Steps {
if step == nil {
continue
}
seq := new(indexWriter)
seq.writer = w
seq.IndentIncrease()
@ -47,10 +52,12 @@ func printPipeline(w writer, v *yaml.Pipeline) {
if len(v.Services) > 0 {
w.WriteTag("services")
for _, step := range v.Services {
if step == nil {
continue
}
seq := new(indexWriter)
seq.writer = w
seq.IndentIncrease()
@ -61,30 +68,30 @@ func printPipeline(w writer, v *yaml.Pipeline) {
if len(v.Volumes) != 0 {
printVolumes(w, v.Volumes)
w.WriteByte('\n')
_ = w.WriteByte('\n')
}
if len(v.PullSecrets) > 0 {
w.WriteTagValue("image_pull_secrets", v.PullSecrets)
w.WriteByte('\n')
if len(v.ImagePullSecrets) > 0 {
w.WriteTagValue("image_pull_secrets", v.ImagePullSecrets)
_ = w.WriteByte('\n')
}
if len(v.Node) > 0 {
printNode(w, v.Node)
w.WriteByte('\n')
_ = w.WriteByte('\n')
}
if !isConditionsEmpty(v.Trigger) {
printConditions(w, "trigger", v.Trigger)
w.WriteByte('\n')
_ = w.WriteByte('\n')
}
if len(v.DependsOn) > 0 {
printDependsOn(w, v.DependsOn)
w.WriteByte('\n')
_ = w.WriteByte('\n')
}
w.WriteByte('\n')
_ = w.WriteByte('\n')
}
// helper function pretty prints the clone block.
@ -94,7 +101,7 @@ func printClone(w writer, v yaml.Clone) {
w.WriteTagValue("depth", v.Depth)
w.WriteTagValue("disable", v.Disable)
w.WriteTagValue("skip_verify", v.SkipVerify)
w.WriteByte('\n')
_ = w.WriteByte('\n')
w.IndentDecrease()
}
@ -103,7 +110,7 @@ func printConcurrency(w writer, v yaml.Concurrency) {
w.WriteTag("concurrency")
w.IndentIncrease()
w.WriteTagValue("limit", v.Limit)
w.WriteByte('\n')
_ = w.WriteByte('\n')
w.IndentDecrease()
}
@ -111,54 +118,68 @@ func printConcurrency(w writer, v yaml.Concurrency) {
func printConditions(w writer, name string, v yaml.Conditions) {
w.WriteTag(name)
w.IndentIncrease()
if !isConditionEmpty(v.Action) {
printCondition(w, "action", v.Action)
}
if !isConditionEmpty(v.Branch) {
printCondition(w, "branch", v.Branch)
}
if !isConditionEmpty(v.Cron) {
printCondition(w, "cron", v.Cron)
}
if !isConditionEmpty(v.Event) {
printCondition(w, "event", v.Event)
}
if !isConditionEmpty(v.Instance) {
printCondition(w, "instance", v.Instance)
}
if !isConditionEmpty(v.Paths) {
printCondition(w, "paths", v.Paths)
}
if !isConditionEmpty(v.Ref) {
printCondition(w, "ref", v.Ref)
}
if !isConditionEmpty(v.Repo) {
printCondition(w, "repo", v.Repo)
}
if !isConditionEmpty(v.Status) {
printCondition(w, "status", v.Status)
}
if !isConditionEmpty(v.Target) {
printCondition(w, "target", v.Target)
}
w.IndentDecrease()
}
// helper function pretty prints a condition mapping.
func printCondition(w writer, k string, v yaml.Condition) {
w.WriteTag(k)
if len(v.Include) != 0 && len(v.Exclude) == 0 {
w.WriteByte('\n')
_ = w.WriteByte('\n')
w.IndentIncrease()
w.Indent()
writeValue(w, v.Include)
w.IndentDecrease()
}
if len(v.Include) != 0 && len(v.Exclude) != 0 {
w.IndentIncrease()
w.WriteTagValue("include", v.Include)
w.IndentDecrease()
}
if len(v.Exclude) != 0 {
w.IndentIncrease()
w.WriteTagValue("exclude", v.Exclude)
@ -179,7 +200,7 @@ func printPlatform(w writer, v yaml.Platform) {
w.WriteTagValue("arch", v.Arch)
w.WriteTagValue("variant", v.Variant)
w.WriteTagValue("version", v.Version)
w.WriteByte('\n')
_ = w.WriteByte('\n')
w.IndentDecrease()
}
@ -190,13 +211,14 @@ func printPlatformDefault(w writer) {
w.IndentIncrease()
w.WriteTagValue("os", "linux")
w.WriteTagValue("arch", "amd64")
w.WriteByte('\n')
_ = w.WriteByte('\n')
w.IndentDecrease()
}
// helper function pretty prints the volume sequence.
func printVolumes(w writer, v []*yaml.Volume) {
w.WriteTag("volumes")
for _, v := range v {
s := new(indexWriter)
s.writer = w
@ -204,12 +226,14 @@ func printVolumes(w writer, v []*yaml.Volume) {
s.IndentIncrease()
s.WriteTagValue("name", v.Name)
if v := v.EmptyDir; v != nil {
if v := v.Temp; v != nil {
s.WriteTag("temp")
if isEmptyDirEmpty(v) {
w.WriteByte(' ')
w.WriteByte('{')
w.WriteByte('}')
_ = w.WriteByte(' ')
_ = w.WriteByte('{')
_ = w.WriteByte('}')
} else {
s.IndentIncrease()
s.WriteTagValue("medium", v.Medium)
@ -218,7 +242,7 @@ func printVolumes(w writer, v []*yaml.Volume) {
}
}
if v := v.HostPath; v != nil {
if v := v.Host; v != nil {
s.WriteTag("host")
s.IndentIncrease()
s.WriteTagValue("path", v.Path)
@ -236,7 +260,7 @@ func printWorkspace(w writer, v yaml.Workspace) {
w.IndentIncrease()
w.WriteTagValue("base", v.Base)
w.WriteTagValue("path", v.Path)
w.WriteByte('\n')
_ = w.WriteByte('\n')
w.IndentDecrease()
}

View File

@ -12,6 +12,7 @@ import (
// Print pretty prints the manifest.
func Print(w io.Writer, v *yaml.Manifest) {
state := new(baseWriter)
for _, r := range v.Resources {
switch t := r.(type) {
case *yaml.Cron:
@ -24,7 +25,8 @@ func Print(w io.Writer, v *yaml.Manifest) {
printPipeline(state, t)
}
}
state.WriteString("...")
state.WriteByte('\n')
w.Write(state.Bytes())
_, _ = w.Write(state.Bytes())
}

View File

@ -9,11 +9,9 @@ import (
"github.com/drone/drone-yaml/yaml"
)
// TODO consider "!!binary |" for secret value
// helper function to pretty prints the signature resource.
func printSecret(w writer, v *yaml.Secret) {
w.WriteString("---")
_, _ = w.WriteString("---")
w.WriteTagValue("version", v.Version)
w.WriteTagValue("kind", v.Kind)
w.WriteTagValue("type", v.Type)
@ -22,13 +20,15 @@ func printSecret(w writer, v *yaml.Secret) {
w.WriteTagValue("name", v.Name)
printData(w, v.Data)
}
if !isSecretGetEmpty(v.Get) {
w.WriteTagValue("name", v.Name)
w.WriteByte('\n')
_ = w.WriteByte('\n')
printGet(w, v.Get)
}
w.WriteByte('\n')
w.WriteByte('\n')
_ = w.WriteByte('\n')
_ = w.WriteByte('\n')
}
// helper function prints the get block.
@ -42,22 +42,24 @@ func printGet(w writer, v yaml.SecretGet) {
}
func printData(w writer, d string) {
spaceReplacer := strings.NewReplacer(" ", "", "\n", "")
w.WriteTag("data")
w.WriteByte(' ')
w.WriteByte('>')
_ = w.WriteByte(' ')
_ = w.WriteByte('>')
w.IndentIncrease()
d = spaceReplacer.Replace(d)
//nolint:gomnd
for _, s := range chunk(d, 60) {
w.WriteByte('\n')
_ = w.WriteByte('\n')
w.Indent()
w.WriteString(s)
_, _ = w.WriteString(s)
}
w.IndentDecrease()
}
// replace spaces and newlines.
var spaceReplacer = strings.NewReplacer(" ", "", "\n", "")
// helper function returns true if the secret get
// object is empty.
func isSecretGetEmpty(v yaml.SecretGet) bool {

View File

@ -9,10 +9,10 @@ import (
// helper function pretty prints the signature resource.
func printSignature(w writer, v *yaml.Signature) {
w.WriteString("---")
_, _ = w.WriteString("---")
w.WriteTagValue("version", v.Version)
w.WriteTagValue("kind", v.Kind)
w.WriteTagValue("hmac", v.Hmac)
w.WriteByte('\n')
w.WriteByte('\n')
_ = w.WriteByte('\n')
_ = w.WriteByte('\n')
}

View File

@ -72,6 +72,7 @@ func isQuoted(s string) bool {
}
var r0, r1 byte
t := strings.TrimSpace(s)
// if the trimmed string does not match the string, it
@ -84,6 +85,7 @@ func isQuoted(s string) bool {
if len(t) > 0 {
r0 = t[0]
}
if len(t) > 1 {
r1 = t[1]
}
@ -103,6 +105,7 @@ func isQuoted(s string) bool {
}
var prev rune
for _, b := range s {
switch {
case isEscapeCode(b):
@ -112,6 +115,7 @@ func isQuoted(s string) bool {
case b == '#' && prev == ' ':
return true
}
prev = b
}
@ -124,13 +128,17 @@ func chunk(s string, chunkSize int) []string {
if len(s) == 0 {
return []string{s}
}
var chunks []string
for i := 0; i < len(s); i += chunkSize {
nn := i + chunkSize
if nn > len(s) {
nn = len(s)
}
chunks = append(chunks, s[i:nn])
}
return chunks
}

View File

@ -71,6 +71,7 @@ func TestQuoted(t *testing.T) {
writeEncode(buf, test.before)
a := test.after
b := buf.String()
if b != a {
t.Errorf("Want %q, got %q", a, b)
}
@ -78,16 +79,17 @@ func TestQuoted(t *testing.T) {
}
func TestChunk(t *testing.T) {
testChunk := []string{
"ZDllMjFjZDg3Zjk0ZWFjZDRhMjdhMTA1ZDQ1OTVkYTA1ODBjMTk0ZWVlZjQyNmU4",
"N2RiNTIwZjg0NWQwYjcyYjE3MmFmZDIyYzg3NTQ1N2YyYzgxODhjYjJmNDhhOTFj",
"ZjdhMzA0YjEzYWFlMmYxMTIwMmEyM2Q1YjQ5Yjg2ZmMK",
}
s := strings.Join(testChunk, "")
got, want := chunk(s, 64), testChunk
if diff := cmp.Diff(got, want); diff != "" {
t.Errorf("Unexpected chunk value")
t.Log(diff)
}
}
var testChunk = []string{
"ZDllMjFjZDg3Zjk0ZWFjZDRhMjdhMTA1ZDQ1OTVkYTA1ODBjMTk0ZWVlZjQyNmU4",
"N2RiNTIwZjg0NWQwYjcyYjE3MmFmZDIyYzg3NTQ1N2YyYzgxODhjYjJmNDhhOTFj",
"ZjdhMzA0YjEzYWFlMmYxMTIwMmEyM2Q1YjQ5Yjg2ZmMK",
}

View File

@ -12,9 +12,6 @@ import (
"github.com/drone/drone-yaml/yaml"
)
// TODO rename WriteTag to WriteKey
// TODO rename WriteTagValue to WriteKeyValue
// ESCAPING:
//
// The string starts with a special character:
@ -71,7 +68,7 @@ type baseWriter struct {
func (w *baseWriter) Indent() {
for i := 0; i < w.depth; i++ {
w.WriteString(" ")
_, _ = w.WriteString(" ")
}
}
@ -92,29 +89,32 @@ func (w *baseWriter) ExcludeZero() {
}
func (w *baseWriter) WriteTag(v interface{}) {
w.WriteByte('\n')
_ = w.WriteByte('\n')
w.Indent()
writeValue(w, v)
w.WriteByte(':')
_ = w.WriteByte(':')
}
func (w *baseWriter) WriteTagValue(k, v interface{}) {
if isZero(v) && !w.zero {
return
}
w.WriteTag(k)
if isPrimative(v) {
w.WriteByte(' ')
switch {
case isPrimative(v):
_ = w.WriteByte(' ')
writeValue(w, v)
} else if isSlice(v) {
w.WriteByte('\n')
case isSlice(v):
_ = w.WriteByte('\n')
w.IndentIncrease()
w.Indent()
writeValue(w, v)
w.IndentDecrease()
} else {
default:
w.depth++
w.WriteByte('\n')
_ = w.WriteByte('\n')
w.Indent()
writeValue(w, v)
w.depth--
@ -140,18 +140,20 @@ func (w *indexWriter) ExcludeZero() {
}
func (w *indexWriter) WriteTag(v interface{}) {
w.WriteByte('\n')
_ = w.WriteByte('\n')
if w.index == 0 {
w.IndentDecrease()
w.Indent()
w.IndentIncrease()
w.WriteByte('-')
w.WriteByte(' ')
_ = w.WriteByte('-')
_ = w.WriteByte(' ')
} else {
w.Indent()
}
writeValue(w, v)
w.WriteByte(':')
_ = w.WriteByte(':')
w.index++
}
@ -159,19 +161,22 @@ func (w *indexWriter) WriteTagValue(k, v interface{}) {
if isZero(v) && !w.zero {
return
}
w.WriteTag(k)
if isPrimative(v) {
w.WriteByte(' ')
switch {
case isPrimative(v):
_ = w.WriteByte(' ')
writeValue(w, v)
} else if isSlice(v) {
w.WriteByte('\n')
case isSlice(v):
_ = w.WriteByte('\n')
w.IndentIncrease()
w.Indent()
writeValue(w, v)
w.IndentDecrease()
} else {
default:
w.IndentIncrease()
w.WriteByte('\n')
_ = w.WriteByte('\n')
w.Indent()
writeValue(w, v)
w.IndentDecrease()
@ -183,47 +188,51 @@ func (w *indexWriter) WriteTagValue(k, v interface{}) {
//
func writeBool(w writer, v bool) {
w.WriteString(
_, _ = w.WriteString(
strconv.FormatBool(v),
)
}
func writeFloat(w writer, v float64) {
w.WriteString(
_, _ = w.WriteString(
strconv.FormatFloat(v, 'g', -1, 64),
)
}
func writeInt(w writer, v int) {
w.WriteString(
_, _ = w.WriteString(
strconv.Itoa(v),
)
}
func writeInt64(w writer, v int64) {
w.WriteString(
_, _ = w.WriteString(
strconv.FormatInt(v, 10),
)
}
func writeEncode(w writer, v string) {
if len(v) == 0 {
w.WriteByte('"')
w.WriteByte('"')
_ = w.WriteByte('"')
_ = w.WriteByte('"')
return
}
if isQuoted(v) {
fmt.Fprintf(w, "%q", v)
} else {
w.WriteString(v)
_, _ = w.WriteString(v)
}
}
func writeValue(w writer, v interface{}) {
if v == nil {
w.WriteByte('~')
_ = w.WriteByte('~')
return
}
switch v := v.(type) {
case bool, int, int64, float64, string:
writeScalar(w, v)
@ -257,17 +266,20 @@ func writeScalar(w writer, v interface{}) {
func writeSequence(w writer, v []interface{}) {
if len(v) == 0 {
w.WriteByte('[')
w.WriteByte(']')
_ = w.WriteByte('[')
_ = w.WriteByte(']')
return
}
for i, v := range v {
if i != 0 {
w.WriteByte('\n')
_ = w.WriteByte('\n')
w.Indent()
}
w.WriteByte('-')
w.WriteByte(' ')
_ = w.WriteByte('-')
_ = w.WriteByte(' ')
w.IndentIncrease()
writeValue(w, v)
w.IndentDecrease()
@ -276,50 +288,61 @@ func writeSequence(w writer, v []interface{}) {
func writeSequenceStr(w writer, v []string) {
if len(v) == 0 {
w.WriteByte('[')
w.WriteByte(']')
_ = w.WriteByte('[')
_ = w.WriteByte(']')
return
}
for i, v := range v {
if i != 0 {
w.WriteByte('\n')
_ = w.WriteByte('\n')
w.Indent()
}
w.WriteByte('-')
w.WriteByte(' ')
_ = w.WriteByte('-')
_ = w.WriteByte(' ')
writeEncode(w, v)
}
}
func writeMapping(w writer, v map[interface{}]interface{}) {
if len(v) == 0 {
w.WriteByte('{')
w.WriteByte('}')
_ = w.WriteByte('{')
_ = w.WriteByte('}')
return
}
var keys []string
keys := make([]string, 0)
for k := range v {
s := fmt.Sprint(k)
keys = append(keys, s)
}
sort.Strings(keys)
for i, k := range keys {
v := v[k]
if i != 0 {
w.WriteByte('\n')
_ = w.WriteByte('\n')
w.Indent()
}
writeEncode(w, k)
w.WriteByte(':')
_ = w.WriteByte(':')
if v == nil || isPrimative(v) || isZero(v) {
w.WriteByte(' ')
_ = w.WriteByte(' ')
writeValue(w, v)
} else {
slice := isSlice(v)
if !slice {
w.IndentIncrease()
}
w.WriteByte('\n')
_ = w.WriteByte('\n')
w.Indent()
writeValue(w, v)
if !slice {
@ -331,24 +354,31 @@ func writeMapping(w writer, v map[interface{}]interface{}) {
func writeMappingStr(w writer, v map[string]string) {
if len(v) == 0 {
w.WriteByte('{')
w.WriteByte('}')
_ = w.WriteByte('{')
_ = w.WriteByte('}')
return
}
var keys []string
keys := make([]string, 0)
for k := range v {
keys = append(keys, k)
}
sort.Strings(keys)
for i, k := range keys {
v := v[k]
if i != 0 {
w.WriteByte('\n')
_ = w.WriteByte('\n')
w.Indent()
}
writeEncode(w, k)
w.WriteByte(':')
w.WriteByte(' ')
_ = w.WriteByte(':')
_ = w.WriteByte(' ')
writeEncode(w, v)
}
}

View File

@ -7,31 +7,13 @@ import (
"strings"
"testing"
"github.com/buildkite/yaml"
"gopkg.in/yaml.v2"
)
// this unit tests pretty prints a complex yaml structure
// to ensure we have common use cases covered.
func TestWriteComplexValue(t *testing.T) {
block := map[interface{}]interface{}{}
err := yaml.Unmarshal([]byte(testComplexValue), &block)
if err != nil {
t.Error(err)
return
}
b := new(baseWriter)
writeValue(b, block)
got, want := b.String(), strings.TrimSpace(testComplexValue)
if got != want {
t.Errorf("Unexpected block format")
println(got)
println("---")
println(want)
}
}
var testComplexValue = `
testComplexValue := `
a: b
c:
- d
@ -57,3 +39,24 @@ x: ~
z: "#y"
zz: "\nz\n"
"{z}": z`
block := map[interface{}]interface{}{}
err := yaml.Unmarshal([]byte(testComplexValue), &block)
if err != nil {
t.Error(err)
return
}
b := new(baseWriter)
writeValue(b, block)
got, want := b.String(), strings.TrimSpace(testComplexValue)
if got != want {
t.Errorf("Unexpected block format")
println(got)
println("---")
println(want)
}
}

View File

@ -19,10 +19,13 @@ type (
// UnmarshalYAML implements yaml unmarshalling.
func (p *Push) UnmarshalYAML(unmarshal func(interface{}) error) error {
d := new(push)
err := unmarshal(&d.Image)
if err != nil {
err = unmarshal(d)
}
p.Image = d.Image
return err
}

View File

@ -18,6 +18,8 @@ type (
}
)
var ErrInvalidRegistry = errors.New("yaml: invalid registry resource")
// GetVersion returns the resource version.
func (r *Registry) GetVersion() string { return r.Version }
@ -27,7 +29,8 @@ func (r *Registry) GetKind() string { return r.Kind }
// Validate returns an error if the registry is invalid.
func (r *Registry) Validate() error {
if len(r.Data) == 0 {
return errors.New("yaml: invalid registry resource")
return ErrInvalidRegistry
}
return nil
}

View File

@ -5,9 +5,6 @@ package yaml
import "errors"
// TODO(bradrydzewski) deprecate Secret
// TODO(bradrydzewski) deprecate ExternalData
type (
// Secret is a resource that provides encrypted data
// and pointers to external data (i.e. from vault).
@ -22,7 +19,7 @@ type (
}
// SecretGet defines a request to get a secret from
// an external sevice at the specified path, or with the
// an external service at the specified path, or with the
// specified name.
SecretGet struct {
Path string `json:"path,omitempty"`
@ -38,6 +35,8 @@ type (
}
)
var ErrInvalidSecret = errors.New("yaml: invalid secret resource")
// GetVersion returns the resource version.
func (s *Secret) GetVersion() string { return s.Version }
@ -47,7 +46,8 @@ func (s *Secret) GetKind() string { return s.Kind }
// Validate returns an error if the secret is invalid.
func (s *Secret) Validate() error {
if len(s.Data) == 0 && len(s.Get.Path) == 0 && len(s.Get.Name) == 0 {
return errors.New("yaml: invalid secret resource")
return ErrInvalidSecret
}
return nil
}

View File

@ -17,6 +17,8 @@ type (
}
)
var ErrInvalidSignature = errors.New("yaml: invalid signature due to missing hash")
// GetVersion returns the resource version.
func (s *Signature) GetVersion() string { return s.Version }
@ -26,7 +28,8 @@ func (s *Signature) GetKind() string { return s.Kind }
// Validate returns an error if the signature is invalid.
func (s Signature) Validate() error {
if s.Hmac == "" {
return errors.New("yaml: invalid signature. missing hash")
return ErrInvalidSignature
}
return nil
}

View File

@ -17,6 +17,7 @@ func (b *BytesSize) UnmarshalYAML(unmarshal func(interface{}) error) error {
var intType int64
if err := unmarshal(&intType); err == nil {
*b = BytesSize(intType)
return nil
}
@ -29,6 +30,7 @@ func (b *BytesSize) UnmarshalYAML(unmarshal func(interface{}) error) error {
if err == nil {
*b = BytesSize(intType)
}
return err
}

View File

@ -6,7 +6,7 @@ package yaml
import (
"testing"
"github.com/buildkite/yaml"
"gopkg.in/yaml.v2"
)
func TestBytesSize(t *testing.T) {
@ -21,7 +21,7 @@ func TestBytesSize(t *testing.T) {
text: "1KiB",
},
{
yaml: "100Mi",
yaml: "100MiB",
size: 104857600,
text: "100MiB",
},
@ -34,14 +34,18 @@ func TestBytesSize(t *testing.T) {
for _, test := range tests {
in := []byte(test.yaml)
out := BytesSize(0)
err := yaml.Unmarshal(in, &out)
if err != nil {
t.Error(err)
return
}
if got, want := int64(out), test.size; got != want {
t.Errorf("Want byte size %d, got %d", want, got)
}
if got, want := out.String(), test.text; got != want {
t.Errorf("Want byte text %s, got %s", want, got)
}