From 873a7c64379bcd61ef5d29cff7138ac75068f47e Mon Sep 17 00:00:00 2001 From: Robert Kaussow Date: Sun, 27 Nov 2022 14:33:39 +0100 Subject: [PATCH] initial commit after fork --- .chglog/CHANGELOG.tpl.md | 23 ++ .chglog/config.yml | 25 ++ .dictionary | 5 + .dockerignore | 2 + .dockeringore | 2 - .drone.jsonnet | 360 ++++++++++++++++- .drone.windows.jsonnet | 9 - .drone.windows.yml | 273 ------------- .drone.yml | 650 ++++++++++++++++++------------- .github/issue_template.md | 9 - .github/pull_request_template.md | 0 .github/settings.yml | 51 ++- .gitignore | 32 +- .golangci.yml | 31 ++ .markdownlint.yml | 6 + .prettierignore | 3 + CONTRIBUTING.md | 31 ++ LICENSE | 6 +- Makefile | 96 +++++ README.md | 49 +-- cmd/drone-git-action/config.go | 135 +++++++ cmd/drone-git-action/main.go | 63 +++ docker/Dockerfile.amd64 | 12 + docker/Dockerfile.arm | 12 + docker/Dockerfile.arm64 | 12 + docker/Dockerfile.linux.amd64 | 11 - docker/Dockerfile.linux.arm | 11 - docker/Dockerfile.linux.arm64 | 11 - docker/Dockerfile.windows.1803 | 16 - docker/Dockerfile.windows.1809 | 16 - docker/manifest-quay.tmpl | 24 ++ docker/manifest.tmpl | 25 +- {repo => git}/commit.go | 12 +- {repo => git}/config.go | 2 +- {repo => git}/remote.go | 6 +- repo/key.go => git/utils.go | 25 +- {repo => git}/verify.go | 2 +- go.mod | 18 +- go.sum | 29 +- main.go | 144 ------- pipeline.libsonnet | 205 ---------- plugin.go | 223 ----------- plugin/git.go | 105 +++++ plugin/impl.go | 110 ++++++ plugin/plugin.go | 21 + utils.go => plugin/utils.go | 3 +- renovate.json | 4 + 47 files changed, 1567 insertions(+), 1353 deletions(-) create mode 100755 .chglog/CHANGELOG.tpl.md create mode 100755 .chglog/config.yml create mode 100644 .dictionary create mode 100644 .dockerignore delete mode 100644 .dockeringore delete mode 100644 .drone.windows.jsonnet delete mode 100644 .drone.windows.yml delete mode 100644 .github/issue_template.md delete mode 100644 .github/pull_request_template.md create mode 100644 .golangci.yml create mode 100644 .markdownlint.yml create mode 100644 .prettierignore create mode 100644 CONTRIBUTING.md create mode 100644 Makefile create mode 100644 cmd/drone-git-action/config.go create mode 100644 cmd/drone-git-action/main.go create mode 100644 docker/Dockerfile.amd64 create mode 100644 docker/Dockerfile.arm create mode 100644 docker/Dockerfile.arm64 delete mode 100644 docker/Dockerfile.linux.amd64 delete mode 100644 docker/Dockerfile.linux.arm delete mode 100644 docker/Dockerfile.linux.arm64 delete mode 100644 docker/Dockerfile.windows.1803 delete mode 100644 docker/Dockerfile.windows.1809 create mode 100644 docker/manifest-quay.tmpl rename {repo => git}/commit.go (86%) rename {repo => git}/config.go (96%) rename {repo => git}/remote.go (80%) rename repo/key.go => git/utils.go (77%) rename {repo => git}/verify.go (94%) delete mode 100644 main.go delete mode 100644 pipeline.libsonnet delete mode 100644 plugin.go create mode 100644 plugin/git.go create mode 100644 plugin/impl.go create mode 100644 plugin/plugin.go rename utils.go => plugin/utils.go (97%) create mode 100644 renovate.json diff --git a/.chglog/CHANGELOG.tpl.md b/.chglog/CHANGELOG.tpl.md new file mode 100755 index 0000000..b79faa8 --- /dev/null +++ b/.chglog/CHANGELOG.tpl.md @@ -0,0 +1,23 @@ +# Changelog + +{{ range .Versions -}} +## {{ if .Tag.Previous }}[{{ .Tag.Name }}]({{ $.Info.RepositoryURL }}/compare/{{ .Tag.Previous.Name }}...{{ .Tag.Name }}){{ else }}{{ .Tag.Name }}{{ end }} ({{ datetime "2006-01-02" .Tag.Date }}) + +{{ range .CommitGroups -}} +### {{ .Title }} + +{{ range .Commits -}} +- {{ if .Scope }}**{{ .Scope }}:** {{ end }}{{ (regexReplaceAll "(.*)/issues/(.*)" (regexReplaceAll "(Co-\\w*-by.*)" .Subject "") "${1}/pull/${2}") | trim }} +{{ end }} +{{- end -}} + +{{- if .NoteGroups -}} +{{ range .NoteGroups -}} +### {{ .Title }} + +{{ range .Notes }} +{{ .Body }} +{{ end }} +{{ end -}} +{{ end -}} +{{ end -}} diff --git a/.chglog/config.yml b/.chglog/config.yml new file mode 100755 index 0000000..0d12601 --- /dev/null +++ b/.chglog/config.yml @@ -0,0 +1,25 @@ +style: github +template: CHANGELOG.tpl.md +info: + title: CHANGELOG + repository_url: https://github.com/thegeeklab/drone-git-action +options: + commit_groups: + title_maps: + feat: Features + fix: Bug Fixes + perf: Performance Improvements + refactor: Code Refactoring + chore: Others + test: Testing + ci: CI Pipeline + docs: Documentation + header: + pattern: "^(\\w*)(?:\\(([\\w\\$\\.\\-\\*\\s]*)\\))?\\:\\s(.*)$" + pattern_maps: + - Type + - Scope + - Subject + notes: + keywords: + - BREAKING CHANGE diff --git a/.dictionary b/.dictionary new file mode 100644 index 0000000..6d9a77e --- /dev/null +++ b/.dictionary @@ -0,0 +1,5 @@ +api +github +url +gh +drone-git-action diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..92d6c40 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +* +!dist/ diff --git a/.dockeringore b/.dockeringore deleted file mode 100644 index c13ca3f..0000000 --- a/.dockeringore +++ /dev/null @@ -1,2 +0,0 @@ -* -!release/ diff --git a/.drone.jsonnet b/.drone.jsonnet index 0582bd8..896aa5d 100644 --- a/.drone.jsonnet +++ b/.drone.jsonnet @@ -1,14 +1,352 @@ -local pipeline = import 'pipeline.libsonnet'; -local name = 'drone-git-action'; +local PipelineTest = { + kind: 'pipeline', + name: 'test', + platform: { + os: 'linux', + arch: 'amd64', + }, + steps: [ + { + name: 'deps', + image: 'golang:1.19', + commands: [ + 'make deps', + ], + volumes: [ + { + name: 'godeps', + path: '/go', + }, + ], + }, + { + name: 'lint', + image: 'golang:1.19', + commands: [ + 'make lint', + ], + volumes: [ + { + name: 'godeps', + path: '/go', + }, + ], + }, + { + name: 'test', + image: 'golang:1.19', + commands: [ + 'make test', + ], + volumes: [ + { + name: 'godeps', + path: '/go', + }, + ], + }, + ], + volumes: [ + { + name: 'godeps', + temp: {}, + }, + ], + trigger: { + ref: ['refs/heads/main', 'refs/tags/**', 'refs/pull/**'], + }, +}; + + +local PipelineBuildBinaries = { + kind: 'pipeline', + name: 'build-binaries', + platform: { + os: 'linux', + arch: 'amd64', + }, + steps: [ + { + name: 'build', + image: 'techknowlogick/xgo:go-1.19.x', + commands: [ + 'ln -s /drone/src /source', + 'make release', + ], + }, + { + name: 'executable', + image: 'alpine', + commands: [ + '$(find dist/ -executable -type f -iname ${DRONE_REPO_NAME}-linux-amd64) --help', + ], + }, + { + 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: ['dist/*'], + 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', + name: 'build-container-' + arch, + platform: { + os: 'linux', + arch: arch, + }, + steps: [ + { + name: 'build', + image: 'golang:1.19', + commands: [ + 'make build', + 'ls -l dist/drone-git-action', + ], + }, + { + name: 'dryrun', + image: 'thegeeklab/drone-docker:19', + settings: { + dry_run: true, + dockerfile: 'docker/Dockerfile.' + arch, + repo: 'thegeeklab/${DRONE_REPO_NAME}', + }, + depends_on: ['build'], + when: { + ref: ['refs/pull/**'], + }, + }, + { + name: 'publish-dockerhub', + image: 'thegeeklab/drone-docker:19', + settings: { + 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: { + 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: 'thegeeklab/alpine-tools', + commands: [ + "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', + 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: 'Drone plugin to execute git actions', + 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: 'thegeeklab/drone-matrix', + settings: { + homeserver: { from_secret: 'matrix_homeserver' }, + roomid: { from_secret: 'matrix_roomid' }, + template: 'Status: **{{ build.Status }}**
Build: [{{ repo.Owner }}/{{ repo.Name }}]({{ build.Link }}){{#if build.Branch}} ({{ build.Branch }}){{/if}} by {{ commit.Author }}
Message: {{ commit.Message.Title }}', + 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'], + }, +}; [ - pipeline.test('linux', 'amd64'), - pipeline.build(name, 'linux', 'amd64'), - pipeline.build(name, 'linux', 'arm64'), - pipeline.build(name, 'linux', 'arm'), - pipeline.notifications(depends_on=[ - 'linux-amd64', - 'linux-arm64', - 'linux-arm', - ]), + PipelineTest, + PipelineBuildBinaries, + PipelineBuildContainer(arch='amd64'), + PipelineBuildContainer(arch='arm64'), + PipelineBuildContainer(arch='arm'), + PipelineDocs, + PipelineNotifications, ] diff --git a/.drone.windows.jsonnet b/.drone.windows.jsonnet deleted file mode 100644 index cbac768..0000000 --- a/.drone.windows.jsonnet +++ /dev/null @@ -1,9 +0,0 @@ -local pipeline = import 'pipeline.libsonnet'; -local name = 'drone-git-action'; - -[ - pipeline.test('windows', 'amd64', '1803'), - pipeline.build(name, 'windows', 'amd64', '1803'), - pipeline.build(name, 'windows', 'amd64', '1809'), - pipeline.notifications('windows', 'amd64', '1809', ['windows-1803', 'windows-1809']), -] diff --git a/.drone.windows.yml b/.drone.windows.yml deleted file mode 100644 index 71f6fd5..0000000 --- a/.drone.windows.yml +++ /dev/null @@ -1,273 +0,0 @@ ---- -kind: pipeline -name: testing - -platform: - os: windows - arch: amd64 - version: 1803 - -steps: -- name: vet - pull: always - image: golang:1.11-windowsservercore-1803 - commands: - - go vet ./... - environment: - GO111MODULE: on - volumes: - - name: gopath - path: C:\\gopath - -- name: test - pull: always - image: golang:1.11-windowsservercore-1803 - commands: - - go test -cover ./... - environment: - GO111MODULE: on - volumes: - - name: gopath - path: C:\\gopath - -volumes: -- name: gopath - temp: {} - -trigger: - ref: - - refs/heads/master - - "refs/tags/**" - - "refs/pull/**" - ---- -kind: pipeline -name: windows-1803 - -platform: - os: windows - arch: amd64 - version: 1803 - -steps: -- name: build-push - pull: always - image: golang:1.11-windowsservercore-1803 - commands: - - "go build -v -ldflags \"-X main.version=${DRONE_COMMIT_SHA:0:8}\" -a -tags netgo -o release/windows/amd64/drone-git-action.exe" - environment: - CGO_ENABLED: 0 - GO111MODULE: on - when: - event: - exclude: - - tag - -- name: build-tag - pull: always - image: golang:1.11-windowsservercore-1803 - commands: - - "go build -v -ldflags \"-X main.version=${DRONE_TAG##v}\" -a -tags netgo -o release/windows/amd64/drone-git-action.exe" - environment: - CGO_ENABLED: 0 - GO111MODULE: on - when: - event: - - tag - -- name: executable - pull: always - image: golang:1.11-windowsservercore-1803 - commands: - - ./release/windows/amd64/drone-git-action.exe --help - -- name: dryrun - pull: always - image: plugins/docker:windows-1803 - settings: - daemon_off: true - dockerfile: docker/Dockerfile.windows.1803 - dry_run: true - password: - from_secret: docker_password - repo: plugins/git-action - tags: windows-1803 - username: - from_secret: docker_username - volumes: - - name: docker_pipe - path: \\\\.\\pipe\\docker_engine - when: - event: - - pull_request - -- name: publish - pull: always - image: plugins/docker:windows-1803 - settings: - auto_tag: true - auto_tag_suffix: windows-1803 - daemon_off: true - dockerfile: docker/Dockerfile.windows.1803 - password: - from_secret: docker_password - repo: plugins/git-action - username: - from_secret: docker_username - volumes: - - name: docker_pipe - path: \\\\.\\pipe\\docker_engine - when: - event: - exclude: - - pull_request - -volumes: -- name: docker_pipe - host: - path: \\\\.\\pipe\\docker_engine - -trigger: - ref: - - refs/heads/master - - "refs/tags/**" - - "refs/pull/**" - -depends_on: -- testing - ---- -kind: pipeline -name: windows-1809 - -platform: - os: windows - arch: amd64 - version: 1809 - -steps: -- name: build-push - pull: always - image: golang:1.11-windowsservercore-1809 - commands: - - "go build -v -ldflags \"-X main.version=${DRONE_COMMIT_SHA:0:8}\" -a -tags netgo -o release/windows/amd64/drone-git-action.exe" - environment: - CGO_ENABLED: 0 - GO111MODULE: on - when: - event: - exclude: - - tag - -- name: build-tag - pull: always - image: golang:1.11-windowsservercore-1809 - commands: - - "go build -v -ldflags \"-X main.version=${DRONE_TAG##v}\" -a -tags netgo -o release/windows/amd64/drone-git-action.exe" - environment: - CGO_ENABLED: 0 - GO111MODULE: on - when: - event: - - tag - -- name: executable - pull: always - image: golang:1.11-windowsservercore-1809 - commands: - - ./release/windows/amd64/drone-git-action.exe --help - -- name: dryrun - pull: always - image: plugins/docker:windows-1809 - settings: - daemon_off: true - dockerfile: docker/Dockerfile.windows.1809 - dry_run: true - password: - from_secret: docker_password - repo: plugins/git-action - tags: windows-1809 - username: - from_secret: docker_username - volumes: - - name: docker_pipe - path: \\\\.\\pipe\\docker_engine - when: - event: - - pull_request - -- name: publish - pull: always - image: plugins/docker:windows-1809 - settings: - auto_tag: true - auto_tag_suffix: windows-1809 - daemon_off: true - dockerfile: docker/Dockerfile.windows.1809 - password: - from_secret: docker_password - repo: plugins/git-action - username: - from_secret: docker_username - volumes: - - name: docker_pipe - path: \\\\.\\pipe\\docker_engine - when: - event: - exclude: - - pull_request - -volumes: -- name: docker_pipe - host: - path: \\\\.\\pipe\\docker_engine - -trigger: - ref: - - refs/heads/master - - "refs/tags/**" - - "refs/pull/**" - -depends_on: -- testing - ---- -kind: pipeline -name: notifications - -platform: - os: windows - arch: amd64 - version: 1809 - -steps: -- name: manifest - pull: always - image: plugins/manifest - settings: - auto_tag: true - ignore_missing: true - password: - from_secret: docker_password - spec: docker/manifest.tmpl - username: - from_secret: docker_username - -- name: microbadger - pull: always - image: plugins/webhook - settings: - urls: - from_secret: microbadger_url - -trigger: - ref: - - refs/heads/master - - "refs/tags/**" - -depends_on: -- windows-1803 -- windows-1809 - -... diff --git a/.drone.yml b/.drone.yml index 79c568e..838982e 100644 --- a/.drone.yml +++ b/.drone.yml @@ -1,295 +1,369 @@ --- kind: pipeline -name: testing +name: test platform: os: linux arch: amd64 steps: -- name: vet - pull: always - image: golang:1.11 - commands: - - go vet ./... - environment: - GO111MODULE: on - volumes: - - name: gopath - path: /go - -- name: test - pull: always - image: golang:1.11 - commands: - - go test -cover ./... - environment: - GO111MODULE: on - volumes: - - name: gopath - path: /go + - name: deps + image: golang:1.19 + commands: + - make deps + volumes: + - name: godeps + path: /go + + - name: lint + image: golang:1.19 + commands: + - make lint + volumes: + - name: godeps + path: /go + + - name: test + image: golang:1.19 + commands: + - make test + volumes: + - name: godeps + path: /go volumes: -- name: gopath - temp: {} + - name: godeps + temp: {} trigger: ref: - - refs/heads/master - - "refs/tags/**" - - "refs/pull/**" + - refs/heads/main + - refs/tags/** + - refs/pull/** --- kind: pipeline -name: linux-amd64 +name: build-binaries platform: os: linux arch: amd64 steps: -- name: build-push - pull: always - image: golang:1.11 - commands: - - "go build -v -ldflags \"-X main.version=${DRONE_COMMIT_SHA:0:8}\" -a -tags netgo -o release/linux/amd64/drone-git-action" - environment: - CGO_ENABLED: 0 - GO111MODULE: on - when: - event: - exclude: - - tag - -- name: build-tag - pull: always - image: golang:1.11 - commands: - - "go build -v -ldflags \"-X main.version=${DRONE_TAG##v}\" -a -tags netgo -o release/linux/amd64/drone-git-action" - environment: - CGO_ENABLED: 0 - GO111MODULE: on - when: - event: - - tag - -- name: executable - pull: always - image: golang:1.11 - commands: - - ./release/linux/amd64/drone-git-action --help - -- name: dryrun - pull: always - image: plugins/docker:linux-amd64 - settings: - daemon_off: false - dockerfile: docker/Dockerfile.linux.amd64 - dry_run: true - password: - from_secret: docker_password - repo: plugins/git-action - tags: linux-amd64 - username: - from_secret: docker_username - when: - event: - - pull_request - -- name: publish - pull: always - image: plugins/docker:linux-amd64 - settings: - auto_tag: true - auto_tag_suffix: linux-amd64 - daemon_off: false - dockerfile: docker/Dockerfile.linux.amd64 - password: - from_secret: docker_password - repo: plugins/git-action - username: - from_secret: docker_username - when: - event: - exclude: - - pull_request + - name: build + image: techknowlogick/xgo:go-1.19.x + commands: + - ln -s /drone/src /source + - make release + + - name: executable + image: alpine + commands: + - $(find dist/ -executable -type f -iname ${DRONE_REPO_NAME}-linux-amd64) --help + + - 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: + - dist/* + note: CHANGELOG.md + overwrite: true + title: ${DRONE_TAG} + when: + ref: + - refs/tags/** trigger: ref: - - refs/heads/master - - "refs/tags/**" - - "refs/pull/**" + - refs/heads/main + - refs/tags/** + - refs/pull/** depends_on: -- testing + - test --- kind: pipeline -name: linux-arm64 +name: build-container-amd64 + +platform: + os: linux + arch: amd64 + +steps: + - name: build + image: golang:1.19 + commands: + - make build + - ls -l dist/drone-git-action + + - name: dryrun + image: thegeeklab/drone-docker:19 + settings: + dockerfile: docker/Dockerfile.amd64 + dry_run: true + repo: thegeeklab/${DRONE_REPO_NAME} + when: + ref: + - refs/pull/** + depends_on: + - build + + - name: publish-dockerhub + image: thegeeklab/drone-docker:19 + settings: + auto_tag: true + auto_tag_suffix: amd64 + 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 + 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 + +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-push - pull: always - image: golang:1.11 - commands: - - "go build -v -ldflags \"-X main.version=${DRONE_COMMIT_SHA:0:8}\" -a -tags netgo -o release/linux/arm64/drone-git-action" - environment: - CGO_ENABLED: 0 - GO111MODULE: on - when: - event: - exclude: - - tag - -- name: build-tag - pull: always - image: golang:1.11 - commands: - - "go build -v -ldflags \"-X main.version=${DRONE_TAG##v}\" -a -tags netgo -o release/linux/arm64/drone-git-action" - environment: - CGO_ENABLED: 0 - GO111MODULE: on - when: - event: - - tag - -- name: executable - pull: always - image: golang:1.11 - commands: - - ./release/linux/arm64/drone-git-action --help - -- name: dryrun - pull: always - image: plugins/docker:linux-arm64 - settings: - daemon_off: false - dockerfile: docker/Dockerfile.linux.arm64 - dry_run: true - password: - from_secret: docker_password - repo: plugins/git-action - tags: linux-arm64 - username: - from_secret: docker_username - when: - event: - - pull_request - -- name: publish - pull: always - image: plugins/docker:linux-arm64 - settings: - auto_tag: true - auto_tag_suffix: linux-arm64 - daemon_off: false - dockerfile: docker/Dockerfile.linux.arm64 - password: - from_secret: docker_password - repo: plugins/git-action - username: - from_secret: docker_username - when: - event: - exclude: - - pull_request + - name: build + image: golang:1.19 + commands: + - make build + - ls -l dist/drone-git-action + + - name: dryrun + image: thegeeklab/drone-docker:19 + settings: + dockerfile: docker/Dockerfile.arm64 + dry_run: true + repo: thegeeklab/${DRONE_REPO_NAME} + when: + ref: + - refs/pull/** + depends_on: + - build + + - name: publish-dockerhub + image: thegeeklab/drone-docker:19 + settings: + auto_tag: true + auto_tag_suffix: arm64 + 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 + 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 trigger: ref: - - refs/heads/master - - "refs/tags/**" - - "refs/pull/**" + - refs/heads/main + - refs/tags/** + - refs/pull/** depends_on: -- testing + - test --- kind: pipeline -name: linux-arm +name: build-container-arm platform: os: linux arch: arm steps: -- name: build-push - pull: always - image: golang:1.11 - commands: - - "go build -v -ldflags \"-X main.version=${DRONE_COMMIT_SHA:0:8}\" -a -tags netgo -o release/linux/arm/drone-git-action" - environment: - CGO_ENABLED: 0 - GO111MODULE: on - when: - event: - exclude: - - tag - -- name: build-tag - pull: always - image: golang:1.11 - commands: - - "go build -v -ldflags \"-X main.version=${DRONE_TAG##v}\" -a -tags netgo -o release/linux/arm/drone-git-action" - environment: - CGO_ENABLED: 0 - GO111MODULE: on - when: - event: - - tag - -- name: executable - pull: always - image: golang:1.11 - commands: - - ./release/linux/arm/drone-git-action --help - -- name: dryrun - pull: always - image: plugins/docker:linux-arm - settings: - daemon_off: false - dockerfile: docker/Dockerfile.linux.arm - dry_run: true - password: - from_secret: docker_password - repo: plugins/git-action - tags: linux-arm - username: - from_secret: docker_username - when: - event: - - pull_request - -- name: publish - pull: always - image: plugins/docker:linux-arm - settings: - auto_tag: true - auto_tag_suffix: linux-arm - daemon_off: false - dockerfile: docker/Dockerfile.linux.arm - password: - from_secret: docker_password - repo: plugins/git-action - username: - from_secret: docker_username - when: - event: - exclude: - - pull_request + - name: build + image: golang:1.19 + commands: + - make build + - ls -l dist/drone-git-action + + - name: dryrun + image: thegeeklab/drone-docker:19 + settings: + dockerfile: docker/Dockerfile.arm + dry_run: true + repo: thegeeklab/${DRONE_REPO_NAME} + when: + ref: + - refs/pull/** + depends_on: + - build + + - name: publish-dockerhub + image: thegeeklab/drone-docker:19 + settings: + auto_tag: true + auto_tag_suffix: arm + 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 + 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 trigger: ref: - - refs/heads/master - - "refs/tags/**" - - "refs/pull/**" + - refs/heads/main + - refs/tags/** + - refs/pull/** depends_on: -- testing + - 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: thegeeklab/alpine-tools + commands: + - 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 @@ -300,33 +374,89 @@ platform: arch: amd64 steps: -- name: manifest - pull: always - image: plugins/manifest - settings: - auto_tag: true - ignore_missing: true - password: - from_secret: docker_password - spec: docker/manifest.tmpl - username: - from_secret: docker_username - -- name: microbadger - pull: always - image: plugins/webhook - settings: - urls: - from_secret: microbadger_url + - 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: Drone plugin to execute git actions + 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: thegeeklab/drone-matrix + settings: + homeserver: + from_secret: matrix_homeserver + password: + from_secret: matrix_password + roomid: + from_secret: matrix_roomid + template: "Status: **{{ build.Status }}**
Build: [{{ repo.Owner }}/{{ repo.Name }}]({{ build.Link }}){{#if build.Branch}} ({{ build.Branch }}){{/if}} by {{ commit.Author }}
Message: {{ commit.Message.Title }}" + username: + from_secret: matrix_username + when: + status: + - success + - failure trigger: ref: - - refs/heads/master - - "refs/tags/**" + - refs/heads/main + - refs/tags/** + status: + - success + - failure depends_on: -- linux-amd64 -- linux-arm64 -- linux-arm + - docs + +--- +kind: signature +hmac: fa6e3cc79dbe3ac732db2f1949298af295708d6d5932690ed63a8ca74d0eed25 ... diff --git a/.github/issue_template.md b/.github/issue_template.md deleted file mode 100644 index 3f95605..0000000 --- a/.github/issue_template.md +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md deleted file mode 100644 index e69de29..0000000 diff --git a/.github/settings.yml b/.github/settings.yml index 28400f9..7d8a68d 100644 --- a/.github/settings.yml +++ b/.github/settings.yml @@ -1,15 +1,15 @@ repository: - name: drone-codacy - description: Drone plugin to publish coverage to Codacy - homepage: http://plugins.drone.io/drone-plugins/drone-codacy + name: drone-git-action + description: Drone plugin to execute git actions + homepage: https://drone-plugin-index.geekdocs.de/plugins/drone-git-action topics: drone, drone-plugin private: false has_issues: true has_wiki: false - has_downloads: false + has_downloads: true - default_branch: master + default_branch: main allow_squash_merge: true allow_merge_commit: true @@ -19,6 +19,9 @@ labels: - name: bug color: d73a4a description: Something isn't working + - name: documentation + color: 0075ca + description: Improvements or additions to documentation - name: duplicate color: cfd3d7 description: This issue or pull request already exists @@ -37,37 +40,29 @@ labels: - name: question color: d876e3 description: Further information is requested - - name: renovate - color: e99695 - description: Automated action from Renovate - name: wontfix color: ffffff description: This will not be worked on -teams: - - name: Admins - permission: admin - - name: Captain - permission: admin - - name: Maintainers - permission: push - branches: - - name: master + - name: main protection: - required_pull_request_reviews: - required_approving_review_count: 1 - dismiss_stale_reviews: false - require_code_owner_reviews: false - dismissal_restrictions: - teams: - - Admins - - Captain + required_pull_request_reviews: null required_status_checks: - strict: true + strict: false contexts: - continuous-integration/drone/pr - enforce_admins: false + enforce_admins: true + required_linear_history: true + restrictions: null + - name: docs + protection: + required_pull_request_reviews: null + required_status_checks: null + enforce_admins: true + required_linear_history: true restrictions: + apps: [] users: [] - teams: [] + teams: + - bot diff --git a/.gitignore b/.gitignore index 6a38da8..7eedee7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,30 +1,6 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe -*.test -*.prof - -release/ -vendor/ +/dist/ +/release/ +/drone-git-action* coverage.out -drone-git-action +CHANGELOG.md diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 0000000..7bb18ea --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,31 @@ +linters: + enable: + - gosimple + - deadcode + - typecheck + - govet + - errcheck + - staticcheck + - unused + - structcheck + - varcheck + - dupl + - gofmt + - misspell + - gocritic + - bidichk + - ineffassign + - revive + - gofumpt + - depguard + enable-all: false + disable-all: true + fast: false + +run: + timeout: 3m + +linters-settings: + gofumpt: + extra-rules: true + lang-version: "1.18" diff --git a/.markdownlint.yml b/.markdownlint.yml new file mode 100644 index 0000000..b59a114 --- /dev/null +++ b/.markdownlint.yml @@ -0,0 +1,6 @@ +--- +default: True +MD013: False +MD041: False +MD004: + style: dash diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..23a4f05 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,3 @@ +.drone.yml +*.tpl.md +LICENSE diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..c471f59 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,31 @@ +# Contributing + +## 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. + +## Bug Reports and Feature Requests + +If you have found a **bug** or have a **feature request** please use the search first in case a similar issue already exists. +If not, please create an issue in this repository + +## Code + +If you would like to fix a bug or implement a feature, please fork the repository and create a Pull Request. + +Before you start any Pull Request, it is recommended that you create an issue to discuss first if you have any +doubts about requirement or implementation. That way you can be sure that the maintainer(s) agree on what to change and how, +and you can hopefully get a quick merge afterwards. + +Pull Requests can only be merged once all status checks are green. + +## Do not force push to your Pull Request branch + +Please do not force push to your Pull Requests branch after you have created your Pull Request, as doing so makes it harder for us to review your work. +Pull Requests will always be squashed by us when we merge your work. Commit as many times as you need in your Pull Request branch. + +## Re-requesting a review + +Please do not ping your reviewer(s) by mentioning them in a new comment. Instead, use the re-request review functionality. +Read more about this in the [GitHub docs, Re-requesting a review](https://docs.github.com/en/free-pro-team@latest/github/collaborating-with-issues-and-pull-requests/incorporating-feedback-in-your-pull-request#re-requesting-a-review). diff --git a/LICENSE b/LICENSE index 8f71f43..c9faf00 100644 --- a/LICENSE +++ b/LICENSE @@ -1,3 +1,4 @@ + Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -178,7 +179,7 @@ APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" + boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -186,7 +187,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright {yyyy} {name of copyright owner} + Copyright 2022 Robert Kaussow Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -199,4 +200,3 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4a1ee7c --- /dev/null +++ b/Makefile @@ -0,0 +1,96 @@ +# renovate: datasource=github-releases depName=mvdan/gofumpt +GOFUMPT_PACKAGE_VERSION := v0.4.0 +# renovate: datasource=github-releases depName=golangci/golangci-lint +GOLANGCI_LINT_PACKAGE_VERSION := v1.50.1 + +EXECUTABLE := drone-git-action + +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.19.x +XGO_TARGETS ?= linux/amd64,linux/arm-6,linux/arm-7,linux/arm64 + +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) + $(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) diff --git a/README.md b/README.md index 0e86ec7..cd62b97 100644 --- a/README.md +++ b/README.md @@ -1,44 +1,21 @@ # drone-git-action -[![Build Status](http://cloud.drone.io/api/badges/drone-plugins/drone-git-action/status.svg)](http://cloud.drone.io/drone-plugins/drone-git-action) -[![Gitter chat](https://badges.gitter.im/drone/drone.png)](https://gitter.im/drone/drone) -[![Join the discussion at https://discourse.drone.io](https://img.shields.io/badge/discourse-forum-orange.svg)](https://discourse.drone.io) -[![Drone questions at https://stackoverflow.com](https://img.shields.io/badge/drone-stackoverflow-orange.svg)](https://stackoverflow.com/questions/tagged/drone.io) -[![](https://images.microbadger.com/badges/image/plugins/git-action.svg)](https://microbadger.com/images/plugins/git-action "Get your own image badge on microbadger.com") -[![Go Doc](https://godoc.org/github.com/drone-plugins/drone-git-action?status.svg)](http://godoc.org/github.com/drone-plugins/drone-git-action) -[![Go Report](https://goreportcard.com/badge/github.com/drone-plugins/drone-git-action)](https://goreportcard.com/report/github.com/drone-plugins/drone-git-action) +Drone plugin to execute git actions -Drone plugin to handle Git actions like `clone`, `commit` and `push`. For the usage information and a listing of the available options please take a look at [the docs](http://plugins.drone.io/drone-plugins/drone-git-action/). +[![Build Status](https://img.shields.io/drone/build/thegeeklab/drone-git-action?logo=drone&server=https%3A%2F%2Fdrone.thegeeklab.de)](https://drone.thegeeklab.de/thegeeklab/drone-git-action) +[![Docker Hub](https://img.shields.io/badge/dockerhub-latest-blue.svg?logo=docker&logoColor=white)](https://hub.docker.com/r/thegeeklab/drone-git-action) +[![Quay.io](https://img.shields.io/badge/quay-latest-blue.svg?logo=docker&logoColor=white)](https://quay.io/repository/thegeeklab/drone-git-action) +[![Go Report Card](https://goreportcard.com/badge/github.com/thegeeklab/drone-git-action)](https://goreportcard.com/report/github.com/thegeeklab/drone-git-action) +[![GitHub contributors](https://img.shields.io/github/contributors/thegeeklab/drone-git-action)](https://github.com/thegeeklab/drone-git-action/graphs/contributors) +[![Source: GitHub](https://img.shields.io/badge/source-github-blue.svg?logo=github&logoColor=white)](https://github.com/thegeeklab/drone-git-action) +[![License: Apache-2.0](https://img.shields.io/github/license/thegeeklab/drone-git-action)](https://github.com/thegeeklab/drone-git-action/blob/main/LICENSE) -## Build +Drone plugin to execute git actions. You can find the full documentation at [https://drone-plugin-index.geekdocs.de](https://drone-plugin-index.geekdocs.de/plugins/drone-git-action). -Build the binary with the following command: +## Contributors -```console -export GOOS=linux -export GOARCH=amd64 -export CGO_ENABLED=0 -export GO111MODULE=on +Special thanks to all [contributors](https://github.com/thegeeklab/drone-git-action/graphs/contributors). If you would like to contribute, please see the [instructions](https://github.com/thegeeklab/drone-git-action/blob/main/CONTRIBUTING.md). -go build -v -a -tags netgo -o release/linux/amd64/drone-git-action -``` +## License -## Docker - -Build the Docker image with the following command: - -```console -docker build \ - --label org.label-schema.build-date=$(date -u +"%Y-%m-%dT%H:%M:%SZ") \ - --label org.label-schema.vcs-ref=$(git rev-parse --short HEAD) \ - --file docker/Dockerfile.linux.amd64 --tag plugins/git-action . -``` - -### Usage - -```console -docker run --rm \ - -v $(pwd):$(pwd) \ - -w $(pwd) \ - plugins/git-action -``` +This project is licensed under the Apache-2.0 License - see the [LICENSE](https://github.com/thegeeklab/drone-docker/blob/main/LICENSE) file for details. diff --git a/cmd/drone-git-action/config.go b/cmd/drone-git-action/config.go new file mode 100644 index 0000000..4aeaa54 --- /dev/null +++ b/cmd/drone-git-action/config.go @@ -0,0 +1,135 @@ +package main + +import ( + "github.com/thegeeklab/drone-git-action/plugin" + "github.com/urfave/cli/v2" +) + +// settingsFlags has the cli.Flags for the plugin.Settings. +func settingsFlags(settings *plugin.Settings, category string) []cli.Flag { + return []cli.Flag{ + &cli.StringSliceFlag{ + Name: "actions", + Usage: "actions to execute", + EnvVars: []string{"PLUGIN_ACTIONS"}, + Destination: &settings.Actions, + Required: true, + Category: category, + }, + + &cli.StringFlag{ + Name: "commit.author.name", + Usage: "git author name", + EnvVars: []string{"PLUGIN_AUTHOR_NAME", "DRONE_COMMIT_AUTHOR"}, + Destination: &settings.Commit.Author.Name, + Required: true, + Category: category, + }, + &cli.StringFlag{ + Name: "commit.author.email", + Usage: "git author email", + EnvVars: []string{"PLUGIN_AUTHOR_EMAIL", "DRONE_COMMIT_AUTHOR_EMAIL"}, + Destination: &settings.Commit.Author.Email, + Required: true, + Category: category, + }, + + &cli.StringFlag{ + Name: "netrc.machine", + Usage: "netrc machine", + EnvVars: []string{"PLUGIN_NETRC_MACHINE", "DRONE_NETRC_MACHINE"}, + Destination: &settings.Netrc.Machine, + Category: category, + }, + &cli.StringFlag{ + Name: "netrc.username", + Usage: "netrc username", + EnvVars: []string{"PLUGIN_NETRC_USERNAME", "DRONE_NETRC_USERNAME"}, + Destination: &settings.Netrc.Login, + Category: category, + }, + &cli.StringFlag{ + Name: "netrc.password", + Usage: "netrc password", + EnvVars: []string{"PLUGIN_NETRC_PASSWORD", "DRONE_NETRC_PASSWORD"}, + Destination: &settings.Netrc.Password, + Category: category, + }, + &cli.StringFlag{ + Name: "ssh-key", + Usage: "private ssh key", + EnvVars: []string{"PLUGIN_SSH_KEY"}, + Destination: &settings.SSHKey, + Category: category, + }, + + &cli.StringFlag{ + Name: "remote", + Usage: "url of the repo", + EnvVars: []string{"PLUGIN_REMOTE"}, + Destination: &settings.Remote, + Category: category, + }, + &cli.StringFlag{ + Name: "branch", + Usage: "name of branch", + EnvVars: []string{"PLUGIN_BRANCH"}, + Destination: &settings.Branch, + Value: "main", + Category: category, + }, + + &cli.StringFlag{ + Name: "path", + Usage: "path to git repo", + EnvVars: []string{"PLUGIN_PATH"}, + Destination: &settings.Path, + Category: category, + }, + + &cli.StringFlag{ + Name: "message", + Usage: "commit message", + EnvVars: []string{"PLUGIN_MESSAGE"}, + Destination: &settings.Message, + Value: "[skip ci] Commit dirty state", + Category: category, + }, + + &cli.BoolFlag{ + Name: "force", + Usage: "force push to remote", + EnvVars: []string{"PLUGIN_FORCE"}, + Destination: &settings.Force, + Category: category, + }, + &cli.BoolFlag{ + Name: "followtags", + Usage: "push to remote with tags", + EnvVars: []string{"PLUGIN_FOLLOWTAGS"}, + Destination: &settings.FollowTags, + Category: category, + }, + &cli.BoolFlag{ + Name: "skip-verify", + Usage: "skip ssl verification", + EnvVars: []string{"PLUGIN_SKIP_VERIFY"}, + Destination: &settings.SkipVerify, + Category: category, + }, + &cli.BoolFlag{ + Name: "empty-commit", + Usage: "allow empty commits", + EnvVars: []string{"PLUGIN_EMPTY_COMMIT"}, + Destination: &settings.EmptyCommit, + Category: category, + }, + &cli.BoolFlag{ + Name: "no-verify", + Usage: "bypasses commit hooks", + EnvVars: []string{"PLUGIN_NO_VERIFY"}, + Destination: &settings.NoVerify, + Category: category, + }, + } +} diff --git a/cmd/drone-git-action/main.go b/cmd/drone-git-action/main.go new file mode 100644 index 0000000..1a8f4d9 --- /dev/null +++ b/cmd/drone-git-action/main.go @@ -0,0 +1,63 @@ +package main + +import ( + "fmt" + "os" + + "github.com/joho/godotenv" + "github.com/sirupsen/logrus" + "github.com/thegeeklab/drone-git-action/plugin" + "github.com/thegeeklab/drone-plugin-lib/v2/urfave" + "github.com/urfave/cli/v2" +) + +var ( + BuildVersion = "devel" + BuildDate = "00000000" +) + +func main() { + settings := &plugin.Settings{} + + if _, err := os.Stat("/run/drone/env"); err == nil { + _ = godotenv.Overload("/run/drone/env") + } + + cli.VersionPrinter = func(c *cli.Context) { + fmt.Printf("%s version=%s date=%s\n", c.App.Name, c.App.Version, BuildDate) + } + + app := &cli.App{ + Name: "drone-git-action", + Usage: "handle comments to github issues or pull requests", + Version: BuildVersion, + Flags: append(settingsFlags(settings, urfave.FlagsPluginCategory), urfave.Flags()...), + Action: run(settings), + } + + if err := app.Run(os.Args); err != nil { + logrus.Fatal(err) + } +} + +func run(settings *plugin.Settings) cli.ActionFunc { + return func(ctx *cli.Context) error { + urfave.LoggingFromContext(ctx) + + plugin := plugin.New( + *settings, + urfave.PipelineFromContext(ctx), + urfave.NetworkFromContext(ctx), + ) + + if err := plugin.Validate(); err != nil { + return fmt.Errorf("validation failed: %w", err) + } + + if err := plugin.Execute(); err != nil { + return fmt.Errorf("execution failed: %w", err) + } + + return nil + } +} diff --git a/docker/Dockerfile.amd64 b/docker/Dockerfile.amd64 new file mode 100644 index 0000000..aff3d62 --- /dev/null +++ b/docker/Dockerfile.amd64 @@ -0,0 +1,12 @@ +FROM alpine:3.17@sha256:8914eb54f968791faf6a8638949e480fef81e697984fba772b3976835194c6d4 + +LABEL maintainer="Robert Kaussow " +LABEL org.opencontainers.image.authors="Robert Kaussow " +LABEL org.opencontainers.image.title="drone-git-action" +LABEL org.opencontainers.image.url="https://github.com/thegeeklab/drone-git-action" +LABEL org.opencontainers.image.source="https://github.com/thegeeklab/drone-git-action" +LABEL org.opencontainers.image.documentation="https://github.com/thegeeklab/drone-git-action" + +ADD dist/drone-git-action /bin/ + +ENTRYPOINT ["/bin/drone-git-action"] diff --git a/docker/Dockerfile.arm b/docker/Dockerfile.arm new file mode 100644 index 0000000..a3511fe --- /dev/null +++ b/docker/Dockerfile.arm @@ -0,0 +1,12 @@ +FROM arm32v7/alpine:3.17@sha256:4c679bd1e6b6516faf8466986fc2a9f52496e61cada7c29ec746621a954a80ac + +LABEL maintainer="Robert Kaussow " +LABEL org.opencontainers.image.authors="Robert Kaussow " +LABEL org.opencontainers.image.title="drone-git-action" +LABEL org.opencontainers.image.url="https://github.com/thegeeklab/drone-git-action" +LABEL org.opencontainers.image.source="https://github.com/thegeeklab/drone-git-action" +LABEL org.opencontainers.image.documentation="https://github.com/thegeeklab/drone-git-action" + +ADD dist/drone-git-action /bin/ + +ENTRYPOINT ["/bin/drone-git-action"] diff --git a/docker/Dockerfile.arm64 b/docker/Dockerfile.arm64 new file mode 100644 index 0000000..b6bfb0e --- /dev/null +++ b/docker/Dockerfile.arm64 @@ -0,0 +1,12 @@ +FROM arm64v8/alpine:3.17@sha256:af06af3514c44a964d3b905b498cf6493db8f1cde7c10e078213a89c87308ba0 + +LABEL maintainer="Robert Kaussow " +LABEL org.opencontainers.image.authors="Robert Kaussow " +LABEL org.opencontainers.image.title="drone-git-action" +LABEL org.opencontainers.image.url="https://github.com/thegeeklab/drone-git-action" +LABEL org.opencontainers.image.source="https://github.com/thegeeklab/drone-git-action" +LABEL org.opencontainers.image.documentation="https://github.com/thegeeklab/drone-git-action" + +ADD dist/drone-git-action /bin/ + +ENTRYPOINT ["/bin/drone-git-action"] diff --git a/docker/Dockerfile.linux.amd64 b/docker/Dockerfile.linux.amd64 deleted file mode 100644 index ae6918d..0000000 --- a/docker/Dockerfile.linux.amd64 +++ /dev/null @@ -1,11 +0,0 @@ -FROM plugins/base:linux-amd64 - -LABEL maintainer="Drone.IO Community " \ - org.label-schema.name="Drone Git Action" \ - org.label-schema.vendor="Drone.IO Community" \ - org.label-schema.schema-version="1.0" - -RUN apk add --no-cache ca-certificates git openssh curl perl - -ADD release/linux/amd64/drone-git-action /bin/ -ENTRYPOINT ["/bin/drone-git-action"] diff --git a/docker/Dockerfile.linux.arm b/docker/Dockerfile.linux.arm deleted file mode 100644 index d98f466..0000000 --- a/docker/Dockerfile.linux.arm +++ /dev/null @@ -1,11 +0,0 @@ -FROM plugins/base:linux-arm - -LABEL maintainer="Drone.IO Community " \ - org.label-schema.name="Drone Git Action" \ - org.label-schema.vendor="Drone.IO Community" \ - org.label-schema.schema-version="1.0" - -RUN apk add --no-cache ca-certificates git openssh curl perl - -ADD release/linux/arm/drone-git-action /bin/ -ENTRYPOINT ["/bin/drone-git-action"] diff --git a/docker/Dockerfile.linux.arm64 b/docker/Dockerfile.linux.arm64 deleted file mode 100644 index d97fbfd..0000000 --- a/docker/Dockerfile.linux.arm64 +++ /dev/null @@ -1,11 +0,0 @@ -FROM plugins/base:linux-arm64 - -LABEL maintainer="Drone.IO Community " \ - org.label-schema.name="Drone Git Action" \ - org.label-schema.vendor="Drone.IO Community" \ - org.label-schema.schema-version="1.0" - -RUN apk add --no-cache ca-certificates git openssh curl perl - -ADD release/linux/arm64/drone-git-action /bin/ -ENTRYPOINT ["/bin/drone-git-action"] diff --git a/docker/Dockerfile.windows.1803 b/docker/Dockerfile.windows.1803 deleted file mode 100644 index 8fb1b3c..0000000 --- a/docker/Dockerfile.windows.1803 +++ /dev/null @@ -1,16 +0,0 @@ -# escape=` -FROM plugins/base:windows-1803 - -LABEL maintainer="Drone.IO Community " ` - org.label-schema.name="Drone Git Action" ` - org.label-schema.vendor="Drone.IO Community" ` - org.label-schema.schema-version="1.0" - -RUN Invoke-WebRequest 'https://github.com/git-for-windows/git/releases/download/v2.12.2.windows.2/MinGit-2.12.2.2-64-bit.zip' -OutFile 'git.zip'; ` - Expand-Archive -Path git.zip -DestinationPath c:\git\ -Force; ` - $env:PATH = 'c:\git\cmd;c:\git\mingw64\bin;c:\git\usr\bin;{0}' -f $env:PATH; ` - Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\' -Name Path -Value $env:PATH; ` - Remove-Item -Path git.zip - -ADD release/windows/amd64/drone-git-action.exe C:/bin/drone-git-action.exe -ENTRYPOINT [ "C:\\bin\\drone-git-action.exe" ] diff --git a/docker/Dockerfile.windows.1809 b/docker/Dockerfile.windows.1809 deleted file mode 100644 index 8f73dc8..0000000 --- a/docker/Dockerfile.windows.1809 +++ /dev/null @@ -1,16 +0,0 @@ -# escape=` -FROM plugins/base:windows-1809 - -LABEL maintainer="Drone.IO Community " ` - org.label-schema.name="Drone Git Action" ` - org.label-schema.vendor="Drone.IO Community" ` - org.label-schema.schema-version="1.0" - -RUN Invoke-WebRequest 'https://github.com/git-for-windows/git/releases/download/v2.12.2.windows.2/MinGit-2.12.2.2-64-bit.zip' -OutFile 'git.zip'; ` - Expand-Archive -Path git.zip -DestinationPath c:\git\ -Force; ` - $env:PATH = 'c:\git\cmd;c:\git\mingw64\bin;c:\git\usr\bin;{0}' -f $env:PATH; ` - Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\' -Name Path -Value $env:PATH; ` - Remove-Item -Path git.zip - -ADD release/windows/amd64/drone-git-action.exe C:/bin/drone-git-action.exe -ENTRYPOINT [ "C:\\bin\\drone-git-action.exe" ] diff --git a/docker/manifest-quay.tmpl b/docker/manifest-quay.tmpl new file mode 100644 index 0000000..6a0e9c9 --- /dev/null +++ b/docker/manifest-quay.tmpl @@ -0,0 +1,24 @@ +image: quay.io/thegeeklab/drone-git-action:{{#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-git-action:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}amd64 + platform: + architecture: amd64 + os: linux + + - image: quay.io/thegeeklab/drone-git-action:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}arm64 + platform: + architecture: arm64 + os: linux + variant: v8 + + - image: quay.io/thegeeklab/drone-git-action:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}arm + platform: + architecture: arm + os: linux + variant: v7 diff --git a/docker/manifest.tmpl b/docker/manifest.tmpl index 57a1778..5e5f3ab 100644 --- a/docker/manifest.tmpl +++ b/docker/manifest.tmpl @@ -1,4 +1,4 @@ -image: plugins/git-action:{{#if build.tag}}{{trimPrefix "v" build.tag}}{{else}}latest{{/if}} +image: thegeeklab/drone-git-action:{{#if build.tag}}{{trimPrefix "v" build.tag}}{{else}}latest{{/if}} {{#if build.tags}} tags: {{#each build.tags}} @@ -6,32 +6,19 @@ tags: {{/each}} {{/if}} manifests: - - - image: plugins/git-action:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-amd64 + - image: thegeeklab/drone-git-action:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}amd64 platform: architecture: amd64 os: linux - - - image: plugins/git-action:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-arm64 + + - image: thegeeklab/drone-git-action:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}arm64 platform: architecture: arm64 os: linux variant: v8 - - - image: plugins/git-action:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-arm + + - image: thegeeklab/drone-git-action:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}arm platform: architecture: arm os: linux variant: v7 - - - image: plugins/git-action:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}windows-1803 - platform: - architecture: amd64 - os: windows - version: 1803 - - - image: plugins/git-action:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}windows-1809 - platform: - architecture: amd64 - os: windows - version: 1809 diff --git a/repo/commit.go b/git/commit.go similarity index 86% rename from repo/commit.go rename to git/commit.go index d2581ed..77113dc 100644 --- a/repo/commit.go +++ b/git/commit.go @@ -1,11 +1,9 @@ -package repo +package git import ( "os/exec" ) -const defaultCommitMessage = "[skip ci] Commit dirty state" - // ForceAdd forces the addition of all dirty files. func ForceAdd() *exec.Cmd { cmd := exec.Command( @@ -41,10 +39,6 @@ func TestCleanTree() *exec.Cmd { // EmptyCommit simply create an empty commit func EmptyCommit(msg string, noVerify bool) *exec.Cmd { - if msg == "" { - msg = defaultCommitMessage - } - cmd := exec.Command( "git", "commit", @@ -64,10 +58,6 @@ func EmptyCommit(msg string, noVerify bool) *exec.Cmd { // ForceCommit commits every change while skipping CI. func ForceCommit(msg string, noVerify bool) *exec.Cmd { - if msg == "" { - msg = defaultCommitMessage - } - cmd := exec.Command( "git", "commit", diff --git a/repo/config.go b/git/config.go similarity index 96% rename from repo/config.go rename to git/config.go index 3bef72d..18dc964 100644 --- a/repo/config.go +++ b/git/config.go @@ -1,4 +1,4 @@ -package repo +package git import ( "os/exec" diff --git a/repo/remote.go b/git/remote.go similarity index 80% rename from repo/remote.go rename to git/remote.go index 82082c7..a455b83 100644 --- a/repo/remote.go +++ b/git/remote.go @@ -1,4 +1,4 @@ -package repo +package git import ( "os/exec" @@ -28,12 +28,12 @@ func RemoteAdd(name, url string) *exec.Cmd { } // RemotePush pushs the changes from the local head to a remote branch.. -func RemotePush(remote, branch string, force bool, followtags bool) *exec.Cmd { +func RemotePush(remote, branch string, force, followtags bool) *exec.Cmd { return RemotePushNamedBranch(remote, "HEAD", branch, force, followtags) } // RemotePushNamedBranch puchs changes from a local to a remote branch. -func RemotePushNamedBranch(remote, localbranch string, branch string, force bool, followtags bool) *exec.Cmd { +func RemotePushNamedBranch(remote, localbranch, branch string, force, followtags bool) *exec.Cmd { cmd := exec.Command( "git", "push", diff --git a/repo/key.go b/git/utils.go similarity index 77% rename from repo/key.go rename to git/utils.go index bb6afef..520f343 100644 --- a/repo/key.go +++ b/git/utils.go @@ -1,8 +1,7 @@ -package repo +package git import ( "fmt" - "io/ioutil" "os" "os/user" "path/filepath" @@ -20,12 +19,8 @@ StrictHostKeyChecking no UserKnownHostsFile=/dev/null ` -// WriteKey writes the private key. -func WriteKey(privateKey string) error { - if privateKey == "" { - return nil - } - +// WriteKey writes the SSH private key. +func WriteSSHKey(privateKey string) error { home := "/root" if currentUser, err := user.Current(); err == nil { @@ -36,7 +31,7 @@ func WriteKey(privateKey string) error { home, ".ssh") - if err := os.MkdirAll(sshpath, 0700); err != nil { + if err := os.MkdirAll(sshpath, 0o700); err != nil { return err } @@ -44,10 +39,10 @@ func WriteKey(privateKey string) error { sshpath, "config") - if err := ioutil.WriteFile( + if err := os.WriteFile( confpath, []byte(configFile), - 0700, + 0o700, ); err != nil { return err } @@ -57,10 +52,10 @@ func WriteKey(privateKey string) error { "id_rsa", ) - if err := ioutil.WriteFile( + if err := os.WriteFile( privpath, []byte(privateKey), - 0600, + 0o600, ); err != nil { return err } @@ -92,9 +87,9 @@ func WriteNetrc(machine, login, password string) error { ".netrc", ) - return ioutil.WriteFile( + return os.WriteFile( netpath, []byte(netrcContent), - 0600, + 0o600, ) } diff --git a/repo/verify.go b/git/verify.go similarity index 94% rename from repo/verify.go rename to git/verify.go index 8e4b767..d119a15 100644 --- a/repo/verify.go +++ b/git/verify.go @@ -1,4 +1,4 @@ -package repo +package git import ( "os/exec" diff --git a/go.mod b/go.mod index 645a371..65b3dba 100644 --- a/go.mod +++ b/go.mod @@ -1,5 +1,17 @@ -module github.com/drone-plugins/drone-git-action +module github.com/thegeeklab/drone-git-action -go 1.12 +go 1.19 -require github.com/urfave/cli v1.20.0 +require ( + github.com/joho/godotenv v1.4.0 + github.com/sirupsen/logrus v1.9.0 + github.com/thegeeklab/drone-plugin-lib/v2 v2.2.0 + github.com/urfave/cli/v2 v2.23.5 +) + +require ( + github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect + golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect +) diff --git a/go.sum b/go.sum index 03e08fc..baa8f68 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +1,27 @@ -github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +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/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg= +github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/thegeeklab/drone-plugin-lib/v2 v2.2.0 h1:/rDyNZiR5GFbBLzEL5yges931H6lFmwX302kraFweBU= +github.com/thegeeklab/drone-plugin-lib/v2 v2.2.0/go.mod h1:/jLeBCFQRRyO/UFpU3cyx1Pt4fD20ejegmW4PioCSLo= +github.com/urfave/cli/v2 v2.23.5 h1:xbrU7tAYviSpqeR3X4nEFWUdB/uDZ6DE+HxmRU7Xtyw= +github.com/urfave/cli/v2 v2.23.5/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/main.go b/main.go deleted file mode 100644 index c0ddc8c..0000000 --- a/main.go +++ /dev/null @@ -1,144 +0,0 @@ -package main - -import ( - "log" - "os" - - "github.com/urfave/cli" -) - -var ( - version = "unknown" -) - -func main() { - app := cli.NewApp() - app.Name = "git-action plugin" - app.Usage = "git-action plugin" - app.Action = run - app.Version = version - app.Flags = []cli.Flag{ - cli.StringSliceFlag{ - Name: "actions", - Usage: "actions to execute", - EnvVar: "PLUGIN_ACTIONS", - }, - - cli.StringFlag{ - Name: "commit.author.name", - Usage: "git author name", - EnvVar: "PLUGIN_AUTHOR_NAME,DRONE_COMMIT_AUTHOR", - }, - cli.StringFlag{ - Name: "commit.author.email", - Usage: "git author email", - EnvVar: "PLUGIN_AUTHOR_EMAIL,DRONE_COMMIT_AUTHOR_EMAIL", - }, - - cli.StringFlag{ - Name: "netrc.machine", - Usage: "netrc machine", - EnvVar: "PLUGIN_NETRC_MACHINE,DRONE_NETRC_MACHINE", - }, - cli.StringFlag{ - Name: "netrc.username", - Usage: "netrc username", - EnvVar: "PLUGIN_NETRC_USERNAME,DRONE_NETRC_USERNAME", - }, - cli.StringFlag{ - Name: "netrc.password", - Usage: "netrc password", - EnvVar: "PLUGIN_NETRC_PASSWORD,DRONE_NETRC_PASSWORD", - }, - cli.StringFlag{ - Name: "ssh-key", - Usage: "private ssh key", - EnvVar: "PLUGIN_SSH_KEY", - }, - - cli.StringFlag{ - Name: "remote", - Usage: "url of the repo", - EnvVar: "PLUGIN_REMOTE", - }, - cli.StringFlag{ - Name: "branch", - Usage: "name of branch", - EnvVar: "PLUGIN_BRANCH", - Value: "master", - }, - - cli.StringFlag{ - Name: "path", - Usage: "path to git repo", - EnvVar: "PLUGIN_PATH", - }, - - cli.StringFlag{ - Name: "message", - Usage: "commit message", - EnvVar: "PLUGIN_MESSAGE", - }, - - cli.BoolFlag{ - Name: "force", - Usage: "force push to remote", - EnvVar: "PLUGIN_FORCE", - }, - cli.BoolFlag{ - Name: "followtags", - Usage: "push to remote with tags", - EnvVar: "PLUGIN_FOLLOWTAGS", - }, - cli.BoolFlag{ - Name: "skip-verify", - Usage: "skip ssl verification", - EnvVar: "PLUGIN_SKIP_VERIFY", - }, - cli.BoolFlag{ - Name: "empty-commit", - Usage: "allow empty commits", - EnvVar: "PLUGIN_EMPTY_COMMIT", - }, - cli.BoolFlag{ - Name: "no-verify", - Usage: "bypasses commit hooks", - EnvVar: "PLUGIN_NO_VERIFY", - }, - } - - if err := app.Run(os.Args); err != nil { - log.Fatal(err) - } -} - -func run(c *cli.Context) error { - plugin := Plugin{ - Netrc: Netrc{ - Login: c.String("netrc.username"), - Machine: c.String("netrc.machine"), - Password: c.String("netrc.password"), - }, - Commit: Commit{ - Author: Author{ - Name: c.String("commit.author.name"), - Email: c.String("commit.author.email"), - }, - }, - Config: Config{ - Actions: c.StringSlice("actions"), - Key: c.String("ssh-key"), - Remote: c.String("remote"), - Branch: c.String("branch"), - Path: c.String("path"), - Message: c.String("message"), - Force: c.Bool("force"), - FollowTags: c.Bool("followtags"), - SkipVerify: c.Bool("skip-verify"), - EmptyCommit: c.Bool("empty-commit"), - NoVerify: c.Bool("no-verify"), - }, - } - - return plugin.Exec() -} diff --git a/pipeline.libsonnet b/pipeline.libsonnet deleted file mode 100644 index 54a07b2..0000000 --- a/pipeline.libsonnet +++ /dev/null @@ -1,205 +0,0 @@ -local windows_pipe = '\\\\\\\\.\\\\pipe\\\\docker_engine'; -local windows_pipe_volume = 'docker_pipe'; -local test_pipeline_name = 'testing'; - -local windows(os) = os == 'windows'; - -local golang_image(os, version) = - 'golang:' + '1.11' + if windows(os) then '-windowsservercore-' + version else ''; - -{ - test(os='linux', arch='amd64', version=''):: - local is_windows = windows(os); - local golang = golang_image(os, version); - local volumes = if is_windows then [{name: 'gopath', path: 'C:\\\\gopath'}] else [{name: 'gopath', path: '/go',}]; - { - kind: 'pipeline', - name: test_pipeline_name, - platform: { - os: os, - arch: arch, - version: if std.length(version) > 0 then version, - }, - steps: [ - { - name: 'vet', - image: golang, - pull: 'always', - environment: { - GO111MODULE: 'on', - }, - commands: [ - 'go vet ./...', - ], - volumes: volumes, - }, - { - name: 'test', - image: golang, - pull: 'always', - environment: { - GO111MODULE: 'on', - }, - commands: [ - 'go test -cover ./...', - ], - volumes: volumes, - }, - ], - trigger: { - ref: [ - 'refs/heads/master', - 'refs/tags/**', - 'refs/pull/**', - ], - }, - volumes: [{name: 'gopath', temp: {}}] - }, - - build(name, os='linux', arch='amd64', version=''):: - local is_windows = windows(os); - local tag = if is_windows then os + '-' + version else os + '-' + arch; - local file_suffix = std.strReplace(tag, '-', '.'); - local volumes = if is_windows then [{ name: windows_pipe_volume, path: windows_pipe }] else []; - local golang = golang_image(os, version); - local plugin_repo = 'plugins/' + std.splitLimit(name, '-', 1)[1]; - local extension = if is_windows then '.exe' else ''; - { - kind: 'pipeline', - name: tag, - platform: { - os: os, - arch: arch, - version: if std.length(version) > 0 then version, - }, - steps: [ - { - name: 'build-push', - image: golang, - pull: 'always', - environment: { - CGO_ENABLED: '0', - GO111MODULE: 'on', - }, - commands: [ - 'go build -v -ldflags "-X main.version=${DRONE_COMMIT_SHA:0:8}" -a -tags netgo -o release/' + os + '/' + arch + '/' + name + extension, - ], - when: { - event: { - exclude: ['tag'], - }, - }, - }, - { - name: 'build-tag', - image: golang, - pull: 'always', - environment: { - CGO_ENABLED: '0', - GO111MODULE: 'on', - }, - commands: [ - 'go build -v -ldflags "-X main.version=${DRONE_TAG##v}" -a -tags netgo -o release/' + os + '/' + arch + '/' + name + extension, - ], - when: { - event: ['tag'], - }, - }, - { - name: 'executable', - image: golang, - pull: 'always', - commands: [ - './release/' + os + '/' + arch + '/' + name + extension + ' --help', - ], - }, - { - name: 'dryrun', - image: 'plugins/docker:' + tag, - pull: 'always', - settings: { - dry_run: true, - tags: tag, - dockerfile: 'docker/Dockerfile.' + file_suffix, - daemon_off: if is_windows then 'true' else 'false', - repo: plugin_repo, - username: { from_secret: 'docker_username' }, - password: { from_secret: 'docker_password' }, - }, - volumes: if std.length(volumes) > 0 then volumes, - when: { - event: ['pull_request'], - }, - }, - { - name: 'publish', - image: 'plugins/docker:' + tag, - pull: 'always', - settings: { - auto_tag: true, - auto_tag_suffix: tag, - daemon_off: if is_windows then 'true' else 'false', - dockerfile: 'docker/Dockerfile.' + file_suffix, - repo: plugin_repo, - username: { from_secret: 'docker_username' }, - password: { from_secret: 'docker_password' }, - }, - volumes: if std.length(volumes) > 0 then volumes, - when: { - event: { - exclude: ['pull_request'], - }, - }, - }, - ], - trigger: { - ref: [ - 'refs/heads/master', - 'refs/tags/**', - 'refs/pull/**', - ], - }, - depends_on: [test_pipeline_name], - volumes: if is_windows then [{ name: windows_pipe_volume, host: { path: windows_pipe } }], - }, - - notifications(os='linux', arch='amd64', version='', depends_on=[]):: - { - kind: 'pipeline', - name: 'notifications', - platform: { - os: os, - arch: arch, - version: if std.length(version) > 0 then version, - }, - steps: [ - { - name: 'manifest', - image: 'plugins/manifest', - pull: 'always', - settings: { - username: { from_secret: 'docker_username' }, - password: { from_secret: 'docker_password' }, - spec: 'docker/manifest.tmpl', - ignore_missing: true, - auto_tag: true, - }, - }, - { - name: 'microbadger', - image: 'plugins/webhook', - pull: 'always', - settings: { - urls: { from_secret: 'microbadger_url' }, - }, - }, - ], - trigger: { - ref: [ - 'refs/heads/master', - 'refs/tags/**', - ], - }, - depends_on: depends_on, - }, -} diff --git a/plugin.go b/plugin.go deleted file mode 100644 index 66363a4..0000000 --- a/plugin.go +++ /dev/null @@ -1,223 +0,0 @@ -package main - -import ( - "fmt" - "os" - "os/exec" - "path/filepath" - - "github.com/drone-plugins/drone-git-action/repo" -) - -type ( - Netrc struct { - Machine string - Login string - Password string - } - - Commit struct { - Author Author - } - - Author struct { - Name string - Email string - } - - Config struct { - Actions []string - Key string - Remote string - Branch string - Path string - Message string - Force bool - FollowTags bool - SkipVerify bool - EmptyCommit bool - NoVerify bool - } - - Plugin struct { - Netrc Netrc - Commit Commit - Config Config - } -) - -func (p *Plugin) Exec() error { - if err := p.HandlePath(); err != nil { - return err - } - - if err := p.WriteConfig(); err != nil { - return err - } - - if err := p.WriteKey(); err != nil { - return err - } - - if err := p.WriteNetrc(); err != nil { - return err - } - - for _, action := range p.Config.Actions { - switch action { - case "clone": - if err := p.InitRepo(); err != nil { - return err - } - - if err := p.AddRemote(); err != nil { - return err - } - - if err := p.FetchSource(); err != nil { - return err - } - - if err := p.CheckoutHead(); err != nil { - return err - } - case "commit": - if err := p.HandleCommit(); err != nil { - return err - } - case "push": - if err := p.HandlePush(); err != nil { - return err - } - default: - return fmt.Errorf("Unknown action %s", action) - } - } - - return nil -} - -// HandlePath changes to a different directory if required -func (p Plugin) HandlePath() error { - if p.Config.Path != "" { - if err := os.MkdirAll(p.Config.Path, os.ModePerm); err != nil { - return err - } - - if err := os.Chdir(p.Config.Path); err != nil { - return err - } - } - - return nil -} - -// WriteConfig writes all required configurations. -func (p Plugin) WriteConfig() error { - if err := repo.GlobalName(p.Commit.Author.Name).Run(); err != nil { - return err - } - - if err := repo.GlobalUser(p.Commit.Author.Email).Run(); err != nil { - return err - } - - if p.Config.SkipVerify { - if err := repo.SkipVerify().Run(); err != nil { - return err - } - } - - return nil -} - -// WriteKey writes the private SSH key. -func (p Plugin) WriteKey() error { - return repo.WriteKey( - p.Config.Key, - ) -} - -// WriteNetrc writes the netrc config. -func (p Plugin) WriteNetrc() error { - return repo.WriteNetrc( - p.Netrc.Machine, - p.Netrc.Login, - p.Netrc.Password, - ) -} - -// InitRepo initializes the repository. -func (p Plugin) InitRepo() error { - if isDirEmpty(filepath.Join(p.Config.Path, ".git")) { - return execute(exec.Command( - "git", - "init", - )) - } - - return nil -} - -// AddRemote adds a remote to repository. -func (p Plugin) AddRemote() error { - if p.Config.Remote != "" { - if err := execute(repo.RemoteAdd("origin", p.Config.Remote)); err != nil { - return err - } - } - - return nil -} - -// FetchSource fetches the source from remote. -func (p Plugin) FetchSource() error { - return execute(exec.Command( - "git", - "fetch", - "origin", - fmt.Sprintf("+%s:", p.Config.Branch), - )) -} - -// CheckoutHead handles branch checkout. -func (p Plugin) CheckoutHead() error { - return execute(exec.Command( - "git", - "checkout", - "-qf", - "FETCH_HEAD", - )) -} - -// HandleCommit commits changes locally. -func (p Plugin) HandleCommit() error { - if err := execute(repo.Add()); err != nil { - return err - } - - if err := execute(repo.TestCleanTree()); err != nil { - if err := execute(repo.ForceCommit(p.Config.Message, p.Config.NoVerify)); err != nil { - return err - } - } else { - if p.Config.EmptyCommit { - if err := execute(repo.EmptyCommit(p.Config.Message, p.Config.NoVerify)); err != nil { - return err - } - } - } - - return nil -} - -// HandlePush pushs changes to remote. -func (p Plugin) HandlePush() error { - return execute(repo.RemotePushNamedBranch( - "origin", - p.Config.Branch, - p.Config.Branch, - p.Config.Force, - p.Config.FollowTags, - )) -} diff --git a/plugin/git.go b/plugin/git.go new file mode 100644 index 0000000..80431de --- /dev/null +++ b/plugin/git.go @@ -0,0 +1,105 @@ +package plugin + +import ( + "fmt" + "os/exec" + "path/filepath" + + "github.com/thegeeklab/drone-git-action/git" +) + +// InitRepo initializes the repository. +func (p Plugin) initRepo() error { + if isDirEmpty(filepath.Join(p.settings.Path, ".git")) { + return execute(exec.Command( + "git", + "init", + )) + } + + return nil +} + +// AddRemote adds a remote to repository. +func (p Plugin) addRemote() error { + if p.settings.Remote != "" { + if err := execute(git.RemoteAdd("origin", p.settings.Remote)); err != nil { + return err + } + } + + return nil +} + +// FetchSource fetches the source from remote. +func (p Plugin) fetchSource() error { + return execute(exec.Command( + "git", + "fetch", + "origin", + fmt.Sprintf("+%s:", p.settings.Branch), + )) +} + +// CheckoutHead handles branch checkout. +func (p Plugin) checkoutHead() error { + return execute(exec.Command( + "git", + "checkout", + "-qf", + p.settings.Branch, + )) +} + +// HandleClone clones remote. +func (p Plugin) handleClone() error { + if err := p.initRepo(); err != nil { + return err + } + + if err := p.addRemote(); err != nil { + return err + } + + if err := p.fetchSource(); err != nil { + return err + } + + if err := p.checkoutHead(); err != nil { + return err + } + + return nil +} + +// HandleCommit commits changes locally. +func (p Plugin) handleCommit() error { + if err := execute(git.Add()); err != nil { + return err + } + + if err := execute(git.TestCleanTree()); err != nil { + if err := execute(git.ForceCommit(p.settings.Message, p.settings.NoVerify)); err != nil { + return err + } + } else { + if p.settings.EmptyCommit { + if err := execute(git.EmptyCommit(p.settings.Message, p.settings.NoVerify)); err != nil { + return err + } + } + } + + return nil +} + +// HandlePush pushs changes to remote. +func (p Plugin) handlePush() error { + return execute(git.RemotePushNamedBranch( + "origin", + p.settings.Branch, + p.settings.Branch, + p.settings.Force, + p.settings.FollowTags, + )) +} diff --git a/plugin/impl.go b/plugin/impl.go new file mode 100644 index 0000000..a12f1f6 --- /dev/null +++ b/plugin/impl.go @@ -0,0 +1,110 @@ +package plugin + +import ( + "fmt" + "os" + + "github.com/thegeeklab/drone-git-action/git" + "github.com/urfave/cli/v2" +) + +type Netrc struct { + Machine string + Login string + Password string +} + +type Commit struct { + Author Author +} + +type Author struct { + Name string + Email string +} + +// Settings for the Plugin. +type Settings struct { + Actions cli.StringSlice + SSHKey string + Remote string + Branch string + Path string + Message string + Force bool + FollowTags bool + SkipVerify bool + EmptyCommit bool + NoVerify bool + + Netrc Netrc + Commit Commit + Author Author +} + +// Validate handles the settings validation of the plugin. +func (p *Plugin) Validate() error { + if (p.settings.SSHKey == "") && (p.settings.Netrc.Login == "" || p.settings.Netrc.Password == "") { + return fmt.Errorf("either SSH key or netrc username and password are required") + } + + return nil +} + +// Execute provides the implementation of the plugin. +func (p *Plugin) Execute() error { + if p.settings.Path != "" { + if err := os.MkdirAll(p.settings.Path, os.ModePerm); err != nil { + return err + } + + if err := os.Chdir(p.settings.Path); err != nil { + return err + } + } + + if err := git.GlobalName(p.settings.Commit.Author.Name).Run(); err != nil { + return err + } + + if err := git.GlobalUser(p.settings.Commit.Author.Email).Run(); err != nil { + return err + } + + if p.settings.SkipVerify { + if err := git.SkipVerify().Run(); err != nil { + return err + } + } + + if p.settings.SSHKey != "" { + if err := git.WriteSSHKey(p.settings.SSHKey); err != nil { + return err + } + } + + if err := git.WriteNetrc(p.settings.Netrc.Machine, p.settings.Netrc.Login, p.settings.Netrc.Password); err != nil { + return err + } + + for _, action := range p.settings.Actions.Value() { + switch action { + case "clone": + if err := p.handleClone(); err != nil { + return err + } + case "commit": + if err := p.handleCommit(); err != nil { + return err + } + case "push": + if err := p.handlePush(); err != nil { + return err + } + default: + return fmt.Errorf("unknown action %s", action) + } + } + + return nil +} diff --git a/plugin/plugin.go b/plugin/plugin.go new file mode 100644 index 0000000..65eada6 --- /dev/null +++ b/plugin/plugin.go @@ -0,0 +1,21 @@ +package plugin + +import ( + "github.com/thegeeklab/drone-plugin-lib/v2/drone" +) + +// Plugin implements drone.Plugin to provide the plugin implementation. +type Plugin struct { + settings Settings + pipeline drone.Pipeline + network drone.Network +} + +// New initializes a plugin from the given Settings, Pipeline, and Network. +func New(settings Settings, pipeline drone.Pipeline, network drone.Network) drone.Plugin { + return &Plugin{ + settings: settings, + pipeline: pipeline, + network: network, + } +} diff --git a/utils.go b/plugin/utils.go similarity index 97% rename from utils.go rename to plugin/utils.go index 9507012..de05972 100644 --- a/utils.go +++ b/plugin/utils.go @@ -1,4 +1,4 @@ -package main +package plugin import ( "fmt" @@ -22,7 +22,6 @@ func execute(cmd *exec.Cmd) error { // helper function returns true if directory dir is empty. func isDirEmpty(dir string) bool { f, err := os.Open(dir) - if err != nil { return true } diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000..45d1c03 --- /dev/null +++ b/renovate.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": ["github>thegeeklab/renovate-presets:golang"] +}