mirror of
https://github.com/thegeeklab/wp-s3-action.git
synced 2024-11-21 14:50:39 +00:00
refactor: initial commit after rewrite to woodpecker
This commit is contained in:
parent
5b8ed49203
commit
2932153f5d
@ -2,7 +2,7 @@ style: github
|
|||||||
template: CHANGELOG.tpl.md
|
template: CHANGELOG.tpl.md
|
||||||
info:
|
info:
|
||||||
title: CHANGELOG
|
title: CHANGELOG
|
||||||
repository_url: https://github.com/thegeeklab/drone-s3-sync
|
repository_url: https://github.com/thegeeklab/wp-s3-action
|
||||||
options:
|
options:
|
||||||
commit_groups:
|
commit_groups:
|
||||||
title_maps:
|
title_maps:
|
||||||
|
@ -2,7 +2,7 @@ api
|
|||||||
github
|
github
|
||||||
url
|
url
|
||||||
gh
|
gh
|
||||||
drone-s3-sync
|
wp-s3-action
|
||||||
(s|S)3
|
(s|S)3
|
||||||
cloudfront
|
cloudfront
|
||||||
Minio
|
Minio
|
||||||
|
297
.drone.yml
297
.drone.yml
@ -1,297 +0,0 @@
|
|||||||
---
|
|
||||||
kind: pipeline
|
|
||||||
name: test
|
|
||||||
|
|
||||||
platform:
|
|
||||||
os: linux
|
|
||||||
arch: amd64
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: deps
|
|
||||||
image: golang:1.20
|
|
||||||
commands:
|
|
||||||
- make deps
|
|
||||||
volumes:
|
|
||||||
- name: godeps
|
|
||||||
path: /go
|
|
||||||
|
|
||||||
- name: lint
|
|
||||||
image: golang:1.20
|
|
||||||
commands:
|
|
||||||
- make lint
|
|
||||||
volumes:
|
|
||||||
- name: godeps
|
|
||||||
path: /go
|
|
||||||
|
|
||||||
- name: test
|
|
||||||
image: golang:1.20
|
|
||||||
commands:
|
|
||||||
- make test
|
|
||||||
volumes:
|
|
||||||
- name: godeps
|
|
||||||
path: /go
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
- name: godeps
|
|
||||||
temp: {}
|
|
||||||
|
|
||||||
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.20.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/main
|
|
||||||
- refs/tags/**
|
|
||||||
- refs/pull/**
|
|
||||||
|
|
||||||
depends_on:
|
|
||||||
- test
|
|
||||||
|
|
||||||
---
|
|
||||||
kind: pipeline
|
|
||||||
name: build-container
|
|
||||||
|
|
||||||
platform:
|
|
||||||
os: linux
|
|
||||||
arch: amd64
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: dryrun
|
|
||||||
image: thegeeklab/drone-docker-buildx:23
|
|
||||||
settings:
|
|
||||||
dockerfile: Dockerfile.multiarch
|
|
||||||
dry_run: true
|
|
||||||
platforms:
|
|
||||||
- linux/amd64
|
|
||||||
- linux/arm64
|
|
||||||
- linux/arm/v7
|
|
||||||
- linux/arm/v6
|
|
||||||
provenance: false
|
|
||||||
repo: thegeeklab/${DRONE_REPO_NAME}
|
|
||||||
when:
|
|
||||||
ref:
|
|
||||||
- refs/pull/**
|
|
||||||
|
|
||||||
- name: publish-dockerhub
|
|
||||||
image: thegeeklab/drone-docker-buildx:23
|
|
||||||
settings:
|
|
||||||
auto_tag: true
|
|
||||||
dockerfile: Dockerfile.multiarch
|
|
||||||
password:
|
|
||||||
from_secret: docker_password
|
|
||||||
platforms:
|
|
||||||
- linux/amd64
|
|
||||||
- linux/arm64
|
|
||||||
- linux/arm/v7
|
|
||||||
- linux/arm/v6
|
|
||||||
provenance: false
|
|
||||||
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-buildx:23
|
|
||||||
settings:
|
|
||||||
auto_tag: true
|
|
||||||
dockerfile: Dockerfile.multiarch
|
|
||||||
password:
|
|
||||||
from_secret: quay_password
|
|
||||||
platforms:
|
|
||||||
- linux/amd64
|
|
||||||
- linux/arm64
|
|
||||||
- linux/arm/v7
|
|
||||||
- linux/arm/v6
|
|
||||||
provenance: false
|
|
||||||
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: 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: thegeeklab/drone-git-action
|
|
||||||
settings:
|
|
||||||
action:
|
|
||||||
- pages
|
|
||||||
author_email: bot@thegeeklab.de
|
|
||||||
author_name: thegeeklab-bot
|
|
||||||
branch: docs
|
|
||||||
message: auto-update documentation
|
|
||||||
netrc_password:
|
|
||||||
from_secret: github_token
|
|
||||||
pages_directory: _docs/
|
|
||||||
when:
|
|
||||||
ref:
|
|
||||||
- refs/heads/main
|
|
||||||
|
|
||||||
trigger:
|
|
||||||
ref:
|
|
||||||
- refs/heads/main
|
|
||||||
- refs/tags/**
|
|
||||||
- refs/pull/**
|
|
||||||
|
|
||||||
depends_on:
|
|
||||||
- build-binaries
|
|
||||||
- build-container
|
|
||||||
|
|
||||||
---
|
|
||||||
kind: pipeline
|
|
||||||
name: notifications
|
|
||||||
|
|
||||||
platform:
|
|
||||||
os: linux
|
|
||||||
arch: amd64
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- 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 synchronize a directory with an S3 bucket
|
|
||||||
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 }}**<br/> Build: [{{ .Repo.Owner }}/{{ .Repo.Name }}]({{ .Build.Link }}){{ if .Build.Branch }} ({{ .Build.Branch }}){{ end }} by {{ .Commit.Author }}<br/> Message: {{ .Commit.Message.Title }}"
|
|
||||||
username:
|
|
||||||
from_secret: matrix_username
|
|
||||||
when:
|
|
||||||
status:
|
|
||||||
- success
|
|
||||||
- failure
|
|
||||||
|
|
||||||
trigger:
|
|
||||||
ref:
|
|
||||||
- refs/heads/main
|
|
||||||
- refs/tags/**
|
|
||||||
status:
|
|
||||||
- success
|
|
||||||
- failure
|
|
||||||
|
|
||||||
depends_on:
|
|
||||||
- docs
|
|
||||||
|
|
||||||
---
|
|
||||||
kind: signature
|
|
||||||
hmac: dfc2eb36a2e743dc5a698a1721eac2e1e2f2702e3c53dde73e44a297c0e40744
|
|
||||||
|
|
||||||
...
|
|
15
.github/settings.yml
vendored
15
.github/settings.yml
vendored
@ -1,8 +1,8 @@
|
|||||||
repository:
|
repository:
|
||||||
name: drone-s3-sync
|
name: wp-s3-action
|
||||||
description: Drone plugin to synchronize a directory with an S3 bucket
|
description: Woodpecker CI plugin to perform S3 actions
|
||||||
homepage: https://drone-plugin-index.geekdocs.de/plugins/drone-s3-sync
|
homepage: https://wp-plugin-index.geekdocs.de/plugins/wp-s3-action
|
||||||
topics: drone, drone-plugin
|
topics: woodpecker-ci, woodpecker, woodpecker-plugin
|
||||||
|
|
||||||
private: false
|
private: false
|
||||||
has_issues: true
|
has_issues: true
|
||||||
@ -51,8 +51,11 @@ branches:
|
|||||||
required_status_checks:
|
required_status_checks:
|
||||||
strict: false
|
strict: false
|
||||||
contexts:
|
contexts:
|
||||||
- continuous-integration/drone/pr
|
- ci/woodpecker/pr/test
|
||||||
enforce_admins: true
|
- ci/woodpecker/pr/build-binary
|
||||||
|
- ci/woodpecker/pr/build-container
|
||||||
|
- ci/woodpecker/pr/docs
|
||||||
|
enforce_admins: false
|
||||||
required_linear_history: true
|
required_linear_history: true
|
||||||
restrictions: null
|
restrictions: null
|
||||||
- name: docs
|
- name: docs
|
||||||
|
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,6 +1,6 @@
|
|||||||
/dist/
|
/dist/
|
||||||
/release/
|
/release/
|
||||||
/drone-s3-sync*
|
/wp-s3-action*
|
||||||
|
|
||||||
coverage.out
|
coverage.out
|
||||||
CHANGELOG.md
|
CHANGELOG.md
|
||||||
|
@ -94,4 +94,4 @@ run:
|
|||||||
linters-settings:
|
linters-settings:
|
||||||
gofumpt:
|
gofumpt:
|
||||||
extra-rules: true
|
extra-rules: true
|
||||||
lang-version: "1.20"
|
lang-version: "1.21"
|
||||||
|
@ -1,3 +1,2 @@
|
|||||||
.drone.yml
|
|
||||||
*.tpl.md
|
*.tpl.md
|
||||||
LICENSE
|
LICENSE
|
||||||
|
44
.woodpecker/build-binary.yml
Normal file
44
.woodpecker/build-binary.yml
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
---
|
||||||
|
when:
|
||||||
|
- event: [pull_request, tag]
|
||||||
|
- event: [push, manual]
|
||||||
|
branch:
|
||||||
|
- ${CI_REPO_DEFAULT_BRANCH}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
build:
|
||||||
|
image: docker.io/techknowlogick/xgo:go-1.21.x
|
||||||
|
commands:
|
||||||
|
- ln -s $(pwd) /source
|
||||||
|
- make release
|
||||||
|
|
||||||
|
executable:
|
||||||
|
image: docker.io/library/alpine
|
||||||
|
commands:
|
||||||
|
- $(find dist/ -executable -type f -iname ${CI_REPO_NAME}-linux-amd64) --help
|
||||||
|
|
||||||
|
changelog-generate:
|
||||||
|
image: quay.io/thegeeklab/git-chglog
|
||||||
|
commands:
|
||||||
|
- git fetch -tq
|
||||||
|
- git-chglog --no-color --no-emoji -o CHANGELOG.md ${CI_COMMIT_TAG:---next-tag unreleased unreleased}
|
||||||
|
|
||||||
|
changelog-format:
|
||||||
|
image: quay.io/thegeeklab/alpine-tools
|
||||||
|
commands:
|
||||||
|
- prettier CHANGELOG.md
|
||||||
|
- prettier -w CHANGELOG.md
|
||||||
|
|
||||||
|
publish-github:
|
||||||
|
image: docker.io/plugins/github-release
|
||||||
|
settings:
|
||||||
|
api_key:
|
||||||
|
from_secret: github_token
|
||||||
|
note: CHANGELOG.md
|
||||||
|
overwrite: true
|
||||||
|
title: ${CI_COMMIT_TAG}
|
||||||
|
when:
|
||||||
|
- event: [tag]
|
||||||
|
|
||||||
|
depends_on:
|
||||||
|
- test
|
66
.woodpecker/build-container.yml
Normal file
66
.woodpecker/build-container.yml
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
---
|
||||||
|
when:
|
||||||
|
- event: [pull_request, tag]
|
||||||
|
- event: [push, manual]
|
||||||
|
branch:
|
||||||
|
- ${CI_REPO_DEFAULT_BRANCH}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
dryrun:
|
||||||
|
image: quay.io/thegeeklab/wp-docker-buildx
|
||||||
|
settings:
|
||||||
|
containerfile: Containerfile.multiarch
|
||||||
|
dry_run: true
|
||||||
|
platforms:
|
||||||
|
- linux/amd64
|
||||||
|
- linux/arm64
|
||||||
|
provenance: false
|
||||||
|
repo: ${CI_REPO}
|
||||||
|
when:
|
||||||
|
- event: [pull_request]
|
||||||
|
|
||||||
|
publish-dockerhub:
|
||||||
|
group: container
|
||||||
|
image: quay.io/thegeeklab/wp-docker-buildx
|
||||||
|
settings:
|
||||||
|
auto_tag: true
|
||||||
|
containerfile: Containerfile.multiarch
|
||||||
|
password:
|
||||||
|
from_secret: docker_password
|
||||||
|
platforms:
|
||||||
|
- linux/amd64
|
||||||
|
- linux/arm64
|
||||||
|
provenance: false
|
||||||
|
repo: ${CI_REPO}
|
||||||
|
username:
|
||||||
|
from_secret: docker_username
|
||||||
|
when:
|
||||||
|
- event: [tag]
|
||||||
|
- event: [push, manual]
|
||||||
|
branch:
|
||||||
|
- ${CI_REPO_DEFAULT_BRANCH}
|
||||||
|
|
||||||
|
publish-quay:
|
||||||
|
group: container
|
||||||
|
image: quay.io/thegeeklab/wp-docker-buildx
|
||||||
|
settings:
|
||||||
|
auto_tag: true
|
||||||
|
containerfile: Containerfile.multiarch
|
||||||
|
password:
|
||||||
|
from_secret: quay_password
|
||||||
|
platforms:
|
||||||
|
- linux/amd64
|
||||||
|
- linux/arm64
|
||||||
|
provenance: false
|
||||||
|
registry: quay.io
|
||||||
|
repo: quay.io/${CI_REPO}
|
||||||
|
username:
|
||||||
|
from_secret: quay_username
|
||||||
|
when:
|
||||||
|
- event: [tag]
|
||||||
|
- event: [push, manual]
|
||||||
|
branch:
|
||||||
|
- ${CI_REPO_DEFAULT_BRANCH}
|
||||||
|
|
||||||
|
depends_on:
|
||||||
|
- test
|
72
.woodpecker/docs.yml
Normal file
72
.woodpecker/docs.yml
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
---
|
||||||
|
when:
|
||||||
|
- event: [pull_request, tag]
|
||||||
|
- event: [push, manual]
|
||||||
|
branch:
|
||||||
|
- ${CI_REPO_DEFAULT_BRANCH}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
markdownlint:
|
||||||
|
image: quay.io/thegeeklab/markdownlint-cli
|
||||||
|
commands:
|
||||||
|
- markdownlint 'README.md' 'CONTRIBUTING.md'
|
||||||
|
|
||||||
|
spellcheck:
|
||||||
|
image: quay.io/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"
|
||||||
|
|
||||||
|
publish:
|
||||||
|
image: quay.io/thegeeklab/wp-git-action
|
||||||
|
settings:
|
||||||
|
action:
|
||||||
|
- pages
|
||||||
|
author_email: bot@thegeeklab.de
|
||||||
|
author_name: thegeeklab-bot
|
||||||
|
branch: docs
|
||||||
|
message: "[skip ci] auto-update documentation"
|
||||||
|
netrc_password:
|
||||||
|
from_secret: github_token
|
||||||
|
pages_directory: _docs/
|
||||||
|
when:
|
||||||
|
- event: [push, manual]
|
||||||
|
branch:
|
||||||
|
- ${CI_REPO_DEFAULT_BRANCH}
|
||||||
|
|
||||||
|
pushrm-dockerhub:
|
||||||
|
image: docker.io/chko/docker-pushrm:1
|
||||||
|
secrets:
|
||||||
|
- source: docker_password
|
||||||
|
target: DOCKER_PASS
|
||||||
|
- source: docker_username
|
||||||
|
target: DOCKER_USER
|
||||||
|
environment:
|
||||||
|
PUSHRM_FILE: README.md
|
||||||
|
PUSHRM_SHORT: Woodpecker CI plugin to perform S3 actions
|
||||||
|
PUSHRM_TARGET: ${CI_REPO}
|
||||||
|
when:
|
||||||
|
- event: [push, manual]
|
||||||
|
branch:
|
||||||
|
- ${CI_REPO_DEFAULT_BRANCH}
|
||||||
|
status: [success]
|
||||||
|
|
||||||
|
pushrm-quay:
|
||||||
|
image: docker.io/chko/docker-pushrm:1
|
||||||
|
secrets:
|
||||||
|
- source: quay_token
|
||||||
|
target: APIKEY__QUAY_IO
|
||||||
|
environment:
|
||||||
|
PUSHRM_FILE: README.md
|
||||||
|
PUSHRM_TARGET: quay.io/${CI_REPO}
|
||||||
|
when:
|
||||||
|
- event: [push, manual]
|
||||||
|
branch:
|
||||||
|
- ${CI_REPO_DEFAULT_BRANCH}
|
||||||
|
status: [success]
|
||||||
|
|
||||||
|
depends_on:
|
||||||
|
- build-binary
|
||||||
|
- build-container
|
30
.woodpecker/notify.yml
Normal file
30
.woodpecker/notify.yml
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
---
|
||||||
|
when:
|
||||||
|
- event: [tag]
|
||||||
|
- event: [push, manual]
|
||||||
|
branch:
|
||||||
|
- ${CI_REPO_DEFAULT_BRANCH}
|
||||||
|
|
||||||
|
runs_on: [success, failure]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
matrix:
|
||||||
|
image: quay.io/thegeeklab/drone-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 }}){{ if .Build.Branch }} ({{ .Build.Branch }}){{ end }} by {{ .Commit.Author }}<br/>
|
||||||
|
Message: {{ .Commit.Message.Title }}
|
||||||
|
username:
|
||||||
|
from_secret: matrix_username
|
||||||
|
when:
|
||||||
|
- status: [success, failure]
|
||||||
|
|
||||||
|
depends_on:
|
||||||
|
- docs
|
22
.woodpecker/test.yml
Normal file
22
.woodpecker/test.yml
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
---
|
||||||
|
when:
|
||||||
|
- event: [pull_request, tag]
|
||||||
|
- event: [push, manual]
|
||||||
|
branch:
|
||||||
|
- ${CI_REPO_DEFAULT_BRANCH}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
deps:
|
||||||
|
image: docker.io/library/golang:1.21
|
||||||
|
commands:
|
||||||
|
- make deps
|
||||||
|
|
||||||
|
lint:
|
||||||
|
image: docker.io/library/golang:1.21
|
||||||
|
commands:
|
||||||
|
- make lint
|
||||||
|
|
||||||
|
test:
|
||||||
|
image: docker.io/library/golang:1.21
|
||||||
|
commands:
|
||||||
|
- make test
|
@ -1,4 +1,4 @@
|
|||||||
FROM --platform=$BUILDPLATFORM golang:1.20@sha256:839ba88412b5d3e12d66ed4774a85fc6e6c644dce8074ab82c798e5db27d4a09 as build
|
FROM --platform=$BUILDPLATFORM golang:1.21 as build
|
||||||
|
|
||||||
ARG TARGETOS
|
ARG TARGETOS
|
||||||
ARG TARGETARCH
|
ARG TARGETARCH
|
||||||
@ -12,10 +12,10 @@ FROM alpine:3.18@sha256:7144f7bab3d4c2648d7e59409f15ec52a18006a128c733fcff20d3a4
|
|||||||
|
|
||||||
LABEL maintainer="Robert Kaussow <mail@thegeeklab.de>"
|
LABEL maintainer="Robert Kaussow <mail@thegeeklab.de>"
|
||||||
LABEL org.opencontainers.image.authors="Robert Kaussow <mail@thegeeklab.de>"
|
LABEL org.opencontainers.image.authors="Robert Kaussow <mail@thegeeklab.de>"
|
||||||
LABEL org.opencontainers.image.title="drone-s3-sync"
|
LABEL org.opencontainers.image.title="wp-s3-action"
|
||||||
LABEL org.opencontainers.image.url="https://github.com/thegeeklab/drone-s3-sync"
|
LABEL org.opencontainers.image.url="https://github.com/thegeeklab/wp-s3-action"
|
||||||
LABEL org.opencontainers.image.source="https://github.com/thegeeklab/drone-s3-sync"
|
LABEL org.opencontainers.image.source="https://github.com/thegeeklab/wp-s3-action"
|
||||||
LABEL org.opencontainers.image.documentation="https://github.com/thegeeklab/drone-s3-sync"
|
LABEL org.opencontainers.image.documentation="https://github.com/thegeeklab/wp-s3-action"
|
||||||
|
|
||||||
COPY --from=build /src/dist/drone-s3-sync /bin/drone-s3-sync
|
COPY --from=build /src/dist/wp-s3-action /bin/wp-s3-action
|
||||||
ENTRYPOINT ["/bin/drone-s3-sync"]
|
ENTRYPOINT ["/bin/wp-s3-action"]
|
8
Makefile
8
Makefile
@ -3,7 +3,7 @@ GOFUMPT_PACKAGE_VERSION := v0.5.0
|
|||||||
# renovate: datasource=github-releases depName=golangci/golangci-lint
|
# renovate: datasource=github-releases depName=golangci/golangci-lint
|
||||||
GOLANGCI_LINT_PACKAGE_VERSION := v1.54.1
|
GOLANGCI_LINT_PACKAGE_VERSION := v1.54.1
|
||||||
|
|
||||||
EXECUTABLE := drone-s3-sync
|
EXECUTABLE := wp-s3-action
|
||||||
|
|
||||||
DIST := dist
|
DIST := dist
|
||||||
DIST_DIRS := $(DIST)
|
DIST_DIRS := $(DIST)
|
||||||
@ -19,7 +19,7 @@ GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/cmd/golangci-lint@$(G
|
|||||||
XGO_PACKAGE ?= src.techknowlogick.com/xgo@latest
|
XGO_PACKAGE ?= src.techknowlogick.com/xgo@latest
|
||||||
|
|
||||||
GENERATE ?=
|
GENERATE ?=
|
||||||
XGO_VERSION := go-1.20.x
|
XGO_VERSION := go-1.21.x
|
||||||
XGO_TARGETS ?= linux/amd64,linux/arm-6,linux/arm-7,linux/arm64
|
XGO_TARGETS ?= linux/amd64,linux/arm-6,linux/arm-7,linux/arm64
|
||||||
|
|
||||||
TARGETOS ?= linux
|
TARGETOS ?= linux
|
||||||
@ -30,8 +30,8 @@ endif
|
|||||||
TAGS ?= netgo,osusergo
|
TAGS ?= netgo,osusergo
|
||||||
|
|
||||||
ifndef VERSION
|
ifndef VERSION
|
||||||
ifneq ($(DRONE_TAG),)
|
ifneq ($(CI_COMMIT_TAG),)
|
||||||
VERSION ?= $(subst v,,$(DRONE_TAG))
|
VERSION ?= $(subst v,,$(CI_COMMIT_TAG))
|
||||||
else
|
else
|
||||||
VERSION ?= $(shell git rev-parse --short HEAD)
|
VERSION ?= $(shell git rev-parse --short HEAD)
|
||||||
endif
|
endif
|
||||||
|
24
README.md
24
README.md
@ -1,21 +1,21 @@
|
|||||||
# drone-s3-sync
|
# wp-s3-action
|
||||||
|
|
||||||
Drone plugin to synchronize a directory with an S3 bucket
|
Woodpecker CI plugin to perform S3 actions
|
||||||
|
|
||||||
[![Build Status](https://img.shields.io/drone/build/thegeeklab/drone-s3-sync?logo=drone&server=https%3A%2F%2Fdrone.thegeeklab.de)](https://drone.thegeeklab.de/thegeeklab/drone-s3-sync)
|
[![Build Status](https://ci.thegeeklab.de/api/badges/thegeeklab/wp-s3-action/status.svg)](https://ci.thegeeklab.de/repos/thegeeklab/wp-s3-action)
|
||||||
[![Docker Hub](https://img.shields.io/badge/dockerhub-latest-blue.svg?logo=docker&logoColor=white)](https://hub.docker.com/r/thegeeklab/drone-s3-sync)
|
[![Docker Hub](https://img.shields.io/badge/dockerhub-latest-blue.svg?logo=docker&logoColor=white)](https://hub.docker.com/r/thegeeklab/wp-s3-action)
|
||||||
[![Quay.io](https://img.shields.io/badge/quay-latest-blue.svg?logo=docker&logoColor=white)](https://quay.io/repository/thegeeklab/drone-s3-sync)
|
[![Quay.io](https://img.shields.io/badge/quay-latest-blue.svg?logo=docker&logoColor=white)](https://quay.io/repository/thegeeklab/wp-s3-action)
|
||||||
[![Go Report Card](https://goreportcard.com/badge/github.com/thegeeklab/drone-s3-sync)](https://goreportcard.com/report/github.com/thegeeklab/drone-s3-sync)
|
[![Go Report Card](https://goreportcard.com/badge/github.com/thegeeklab/wp-s3-action)](https://goreportcard.com/report/github.com/thegeeklab/wp-s3-action)
|
||||||
[![GitHub contributors](https://img.shields.io/github/contributors/thegeeklab/drone-s3-sync)](https://github.com/thegeeklab/drone-s3-sync/graphs/contributors)
|
[![GitHub contributors](https://img.shields.io/github/contributors/thegeeklab/wp-s3-action)](https://github.com/thegeeklab/wp-s3-action/graphs/contributors)
|
||||||
[![Source: GitHub](https://img.shields.io/badge/source-github-blue.svg?logo=github&logoColor=white)](https://github.com/thegeeklab/drone-s3-sync)
|
[![Source: GitHub](https://img.shields.io/badge/source-github-blue.svg?logo=github&logoColor=white)](https://github.com/thegeeklab/wp-s3-action)
|
||||||
[![License: MIT](https://img.shields.io/github/license/thegeeklab/drone-s3-sync)](https://github.com/thegeeklab/drone-s3-sync/blob/main/LICENSE)
|
[![License: MIT](https://img.shields.io/github/license/thegeeklab/wp-s3-action)](https://github.com/thegeeklab/wp-s3-action/blob/main/LICENSE)
|
||||||
|
|
||||||
Drone plugin to synchronize a directory with an S3 bucket. You can find the full documentation at [https://drone-plugin-index.geekdocs.de](https://drone-plugin-index.geekdocs.de/plugins/drone-s3-sync).
|
Woodpecker CI plugin to perform S3 actions. You can find the full documentation at [https://wp-plugin-index.geekdocs.de](https://wp-plugin-index.geekdocs.de/plugins/wp-s3-action).
|
||||||
|
|
||||||
## Contributors
|
## Contributors
|
||||||
|
|
||||||
Special thanks to all [contributors](https://github.com/thegeeklab/drone-s3-sync/graphs/contributors). If you would like to contribute, please see the [instructions](https://github.com/thegeeklab/drone-s3-sync/blob/main/CONTRIBUTING.md).
|
Special thanks to all [contributors](https://github.com/thegeeklab/wp-s3-action/graphs/contributors). If you would like to contribute, please see the [instructions](https://github.com/thegeeklab/wp-s3-action/blob/main/CONTRIBUTING.md).
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
This project is licensed under the MIT License - see the [LICENSE](https://github.com/thegeeklab/drone-s3-sync/blob/main/LICENSE) file for details.
|
This project is licensed under the MIT License - see the [LICENSE](https://github.com/thegeeklab/wp-s3-action/blob/main/LICENSE) file for details.
|
||||||
|
@ -1,15 +1,16 @@
|
|||||||
---
|
---
|
||||||
title: drone-s3-sync
|
title: wp-s3-action
|
||||||
---
|
---
|
||||||
|
|
||||||
[![Build Status](https://img.shields.io/drone/build/thegeeklab/drone-s3-sync?logo=drone&server=https%3A%2F%2Fdrone.thegeeklab.de)](https://drone.thegeeklab.de/thegeeklab/drone-s3-sync)
|
[![Build Status](https://ci.thegeeklab.de/api/badges/thegeeklab/wp-s3-action/status.svg)](https://ci.thegeeklab.de/repos/thegeeklab/wp-s3-action)
|
||||||
[![Docker Hub](https://img.shields.io/badge/dockerhub-latest-blue.svg?logo=docker&logoColor=white)](https://hub.docker.com/r/thegeeklab/drone-s3-sync)
|
[![Docker Hub](https://img.shields.io/badge/dockerhub-latest-blue.svg?logo=docker&logoColor=white)](https://hub.docker.com/r/thegeeklab/wp-s3-action)
|
||||||
[![Quay.io](https://img.shields.io/badge/quay-latest-blue.svg?logo=docker&logoColor=white)](https://quay.io/repository/thegeeklab/drone-s3-sync)
|
[![Quay.io](https://img.shields.io/badge/quay-latest-blue.svg?logo=docker&logoColor=white)](https://quay.io/repository/thegeeklab/wp-s3-action)
|
||||||
[![GitHub contributors](https://img.shields.io/github/contributors/thegeeklab/drone-s3-sync)](https://github.com/thegeeklab/drone-s3-sync/graphs/contributors)
|
[![Go Report Card](https://goreportcard.com/badge/github.com/thegeeklab/wp-s3-action)](https://goreportcard.com/report/github.com/thegeeklab/wp-s3-action)
|
||||||
[![Source: GitHub](https://img.shields.io/badge/source-github-blue.svg?logo=github&logoColor=white)](https://github.com/thegeeklab/drone-s3-sync)
|
[![GitHub contributors](https://img.shields.io/github/contributors/thegeeklab/wp-s3-action)](https://github.com/thegeeklab/wp-s3-action/graphs/contributors)
|
||||||
[![License: MIT](https://img.shields.io/github/license/thegeeklab/drone-s3-sync)](https://github.com/thegeeklab/drone-s3-sync/blob/main/LICENSE)
|
[![Source: GitHub](https://img.shields.io/badge/source-github-blue.svg?logo=github&logoColor=white)](https://github.com/thegeeklab/wp-s3-action)
|
||||||
|
[![License: MIT](https://img.shields.io/github/license/thegeeklab/wp-s3-action)](https://github.com/thegeeklab/wp-s3-action/blob/main/LICENSE)
|
||||||
|
|
||||||
Drone plugin to synchronize a directory with an S3 bucket.
|
Woodpecker CI plugin to perform S3 actions.
|
||||||
|
|
||||||
<!-- prettier-ignore-start -->
|
<!-- prettier-ignore-start -->
|
||||||
<!-- spellchecker-disable -->
|
<!-- spellchecker-disable -->
|
||||||
@ -25,7 +26,7 @@ name: default
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: sync
|
- name: sync
|
||||||
image: thegeeklab/drone-s3-sync
|
image: thegeeklab/wp-s3-action
|
||||||
settings:
|
settings:
|
||||||
access_key: a50d28f4dd477bc184fbd10b376de753
|
access_key: a50d28f4dd477bc184fbd10b376de753
|
||||||
secret_key: bc5785d3ece6a9cdefa42eb99b58986f9095ff1c
|
secret_key: bc5785d3ece6a9cdefa42eb99b58986f9095ff1c
|
||||||
@ -39,7 +40,7 @@ steps:
|
|||||||
|
|
||||||
<!-- prettier-ignore-start -->
|
<!-- prettier-ignore-start -->
|
||||||
<!-- spellchecker-disable -->
|
<!-- spellchecker-disable -->
|
||||||
{{< propertylist name=drone-s3-sync.data sort=name >}}
|
{{< propertylist name=wp-s3-action.data sort=name >}}
|
||||||
<!-- spellchecker-enable -->
|
<!-- spellchecker-enable -->
|
||||||
<!-- prettier-ignore-end -->
|
<!-- prettier-ignore-end -->
|
||||||
|
|
||||||
@ -53,7 +54,7 @@ name: default
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: sync
|
- name: sync
|
||||||
image: thegeeklab/drone-s3-sync
|
image: thegeeklab/wp-s3-action
|
||||||
settings:
|
settings:
|
||||||
access_key: a50d28f4dd477bc184fbd10b376de753
|
access_key: a50d28f4dd477bc184fbd10b376de753
|
||||||
secret_key: bc5785d3ece6a9cdefa42eb99b58986f9095ff1c
|
secret_key: bc5785d3ece6a9cdefa42eb99b58986f9095ff1c
|
||||||
@ -89,7 +90,7 @@ name: default
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: sync
|
- name: sync
|
||||||
image: thegeeklab/drone-s3-sync
|
image: thegeeklab/wp-s3-action
|
||||||
settings:
|
settings:
|
||||||
endpoint: https://minio.example.com
|
endpoint: https://minio.example.com
|
||||||
access_key: a50d28f4dd477bc184fbd10b376de753
|
access_key: a50d28f4dd477bc184fbd10b376de753
|
||||||
@ -105,18 +106,13 @@ steps:
|
|||||||
Build the binary with the following command:
|
Build the binary with the following command:
|
||||||
|
|
||||||
```Shell
|
```Shell
|
||||||
export GOOS=linux
|
|
||||||
export GOARCH=amd64
|
|
||||||
export CGO_ENABLED=0
|
|
||||||
export GO111MODULE=on
|
|
||||||
|
|
||||||
make build
|
make build
|
||||||
```
|
```
|
||||||
|
|
||||||
Build the Docker image with the following command:
|
Build the container image with the following command:
|
||||||
|
|
||||||
```Shell
|
```Shell
|
||||||
docker build --file docker/Dockerfile.amd64 --tag thegeeklab/drone-s3-sync .
|
docker build --file Containerfile.multiarch --tag thegeeklab/wp-s3-action .
|
||||||
```
|
```
|
||||||
|
|
||||||
## Test
|
## Test
|
||||||
@ -126,7 +122,7 @@ docker run --rm \
|
|||||||
-e PLUGIN_BUCKET=my_bucket \
|
-e PLUGIN_BUCKET=my_bucket \
|
||||||
-e AWS_ACCESS_KEY_ID=abc123 \
|
-e AWS_ACCESS_KEY_ID=abc123 \
|
||||||
-e AWS_SECRET_ACCESS_KEY=xyc789 \
|
-e AWS_SECRET_ACCESS_KEY=xyc789 \
|
||||||
-v $(pwd):$(pwd) \
|
-v $(pwd):/build:z \
|
||||||
-w $(pwd) \
|
-w /build \
|
||||||
thegeeklab/drone-s3-sync
|
thegeeklab/wp-s3-action
|
||||||
```
|
```
|
||||||
|
@ -1,104 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/joho/godotenv"
|
|
||||||
"github.com/sirupsen/logrus"
|
|
||||||
"github.com/thegeeklab/drone-plugin-lib/v2/urfave"
|
|
||||||
"github.com/thegeeklab/drone-s3-sync/plugin"
|
|
||||||
"github.com/urfave/cli/v2"
|
|
||||||
)
|
|
||||||
|
|
||||||
//nolint:gochecknoglobals
|
|
||||||
var (
|
|
||||||
BuildVersion = "devel"
|
|
||||||
BuildDate = "00000000"
|
|
||||||
)
|
|
||||||
|
|
||||||
var ErrTypeAssertionFailed = errors.New("type assertion failed")
|
|
||||||
|
|
||||||
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-s3-sync",
|
|
||||||
Usage: "synchronize a directory with an S3 bucket",
|
|
||||||
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)
|
|
||||||
|
|
||||||
acl, ok := ctx.Generic("acl").(*StringMapFlag)
|
|
||||||
if !ok {
|
|
||||||
return fmt.Errorf("%w: failed to read acl input", ErrTypeAssertionFailed)
|
|
||||||
}
|
|
||||||
|
|
||||||
cacheControl, ok := ctx.Generic("cache-control").(*StringMapFlag)
|
|
||||||
if !ok {
|
|
||||||
return fmt.Errorf("%w: failed to read cache-control input", ErrTypeAssertionFailed)
|
|
||||||
}
|
|
||||||
|
|
||||||
contentType, ok := ctx.Generic("content-type").(*StringMapFlag)
|
|
||||||
if !ok {
|
|
||||||
return fmt.Errorf("%w: failed to read content-type input", ErrTypeAssertionFailed)
|
|
||||||
}
|
|
||||||
|
|
||||||
contentEncoding, ok := ctx.Generic("content-encoding").(*StringMapFlag)
|
|
||||||
if !ok {
|
|
||||||
return fmt.Errorf("%w: failed to read content-encoding input", ErrTypeAssertionFailed)
|
|
||||||
}
|
|
||||||
|
|
||||||
metadata, ok := ctx.Generic("metadata").(*DeepStringMapFlag)
|
|
||||||
if !ok {
|
|
||||||
return fmt.Errorf("%w: failed to read metadata input", ErrTypeAssertionFailed)
|
|
||||||
}
|
|
||||||
|
|
||||||
redirects, ok := ctx.Generic("redirects").(*MapFlag)
|
|
||||||
if !ok {
|
|
||||||
return fmt.Errorf("%w: failed to read redirects input", ErrTypeAssertionFailed)
|
|
||||||
}
|
|
||||||
|
|
||||||
settings.ACL = acl.Get()
|
|
||||||
settings.CacheControl = cacheControl.Get()
|
|
||||||
settings.ContentType = contentType.Get()
|
|
||||||
settings.ContentEncoding = contentEncoding.Get()
|
|
||||||
settings.Metadata = metadata.Get()
|
|
||||||
settings.Redirects = redirects.Get()
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,76 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
)
|
|
||||||
|
|
||||||
type DeepStringMapFlag struct {
|
|
||||||
parts map[string]map[string]string
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *DeepStringMapFlag) String() string {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *DeepStringMapFlag) Get() map[string]map[string]string {
|
|
||||||
return d.parts
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *DeepStringMapFlag) Set(value string) error {
|
|
||||||
d.parts = map[string]map[string]string{}
|
|
||||||
|
|
||||||
err := json.Unmarshal([]byte(value), &d.parts)
|
|
||||||
if err != nil {
|
|
||||||
single := map[string]string{}
|
|
||||||
|
|
||||||
err := json.Unmarshal([]byte(value), &single)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
d.parts["*"] = single
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type StringMapFlag struct {
|
|
||||||
parts map[string]string
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *StringMapFlag) String() string {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *StringMapFlag) Get() map[string]string {
|
|
||||||
return s.parts
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *StringMapFlag) Set(value string) error {
|
|
||||||
s.parts = map[string]string{}
|
|
||||||
|
|
||||||
err := json.Unmarshal([]byte(value), &s.parts)
|
|
||||||
if err != nil {
|
|
||||||
s.parts["*"] = value
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type MapFlag struct {
|
|
||||||
parts map[string]string
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *MapFlag) String() string {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *MapFlag) Get() map[string]string {
|
|
||||||
return m.parts
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *MapFlag) Set(value string) error {
|
|
||||||
m.parts = map[string]string{}
|
|
||||||
|
|
||||||
return json.Unmarshal([]byte(value), &m.parts)
|
|
||||||
}
|
|
@ -1,7 +1,8 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/thegeeklab/drone-s3-sync/plugin"
|
"github.com/thegeeklab/wp-s3-action/plugin"
|
||||||
|
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -78,46 +79,46 @@ func settingsFlags(settings *plugin.Settings, category string) []cli.Flag {
|
|||||||
Category: category,
|
Category: category,
|
||||||
},
|
},
|
||||||
&cli.GenericFlag{
|
&cli.GenericFlag{
|
||||||
Name: "acl",
|
Name: "acl",
|
||||||
Usage: "access control list",
|
Usage: "access control list",
|
||||||
EnvVars: []string{"PLUGIN_ACL"},
|
EnvVars: []string{"PLUGIN_ACL"},
|
||||||
Value: &StringMapFlag{},
|
Destination: &settings.ACL,
|
||||||
Category: category,
|
Category: category,
|
||||||
},
|
},
|
||||||
&cli.GenericFlag{
|
&cli.GenericFlag{
|
||||||
Name: "content-type",
|
Name: "content-type",
|
||||||
Usage: "content-type settings for uploads",
|
Usage: "content-type settings for uploads",
|
||||||
EnvVars: []string{"PLUGIN_CONTENT_TYPE"},
|
EnvVars: []string{"PLUGIN_CONTENT_TYPE"},
|
||||||
Value: &StringMapFlag{},
|
Destination: &settings.ContentType,
|
||||||
Category: category,
|
Category: category,
|
||||||
},
|
},
|
||||||
&cli.GenericFlag{
|
&cli.GenericFlag{
|
||||||
Name: "content-encoding",
|
Name: "content-encoding",
|
||||||
Usage: "content-encoding settings for uploads",
|
Usage: "content-encoding settings for uploads",
|
||||||
EnvVars: []string{"PLUGIN_CONTENT_ENCODING"},
|
EnvVars: []string{"PLUGIN_CONTENT_ENCODING"},
|
||||||
Value: &StringMapFlag{},
|
Destination: &settings.ContentEncoding,
|
||||||
Category: category,
|
Category: category,
|
||||||
},
|
},
|
||||||
&cli.GenericFlag{
|
&cli.GenericFlag{
|
||||||
Name: "cache-control",
|
Name: "cache-control",
|
||||||
Usage: "cache-control settings for uploads",
|
Usage: "cache-control settings for uploads",
|
||||||
EnvVars: []string{"PLUGIN_CACHE_CONTROL"},
|
EnvVars: []string{"PLUGIN_CACHE_CONTROL"},
|
||||||
Value: &StringMapFlag{},
|
Destination: &settings.CacheControl,
|
||||||
Category: category,
|
Category: category,
|
||||||
},
|
},
|
||||||
&cli.GenericFlag{
|
&cli.GenericFlag{
|
||||||
Name: "metadata",
|
Name: "metadata",
|
||||||
Usage: "additional metadata for uploads",
|
Usage: "additional metadata for uploads",
|
||||||
EnvVars: []string{"PLUGIN_METADATA"},
|
EnvVars: []string{"PLUGIN_METADATA"},
|
||||||
Value: &DeepStringMapFlag{},
|
Destination: &settings.Metadata,
|
||||||
Category: category,
|
Category: category,
|
||||||
},
|
},
|
||||||
&cli.GenericFlag{
|
&cli.GenericFlag{
|
||||||
Name: "redirects",
|
Name: "redirects",
|
||||||
Usage: "redirects to create",
|
Usage: "redirects to create",
|
||||||
EnvVars: []string{"PLUGIN_REDIRECTS"},
|
EnvVars: []string{"PLUGIN_REDIRECTS"},
|
||||||
Value: &MapFlag{},
|
Destination: &settings.Redirects,
|
||||||
Category: category,
|
Category: category,
|
||||||
},
|
},
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "cloudfront-distribution",
|
Name: "cloudfront-distribution",
|
28
cmd/wp-s3-action/main.go
Normal file
28
cmd/wp-s3-action/main.go
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/thegeeklab/wp-s3-action/plugin"
|
||||||
|
|
||||||
|
wp "github.com/thegeeklab/wp-plugin-go/plugin"
|
||||||
|
)
|
||||||
|
|
||||||
|
//nolint:gochecknoglobals
|
||||||
|
var (
|
||||||
|
BuildVersion = "devel"
|
||||||
|
BuildDate = "00000000"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
settings := &plugin.Settings{}
|
||||||
|
options := wp.Options{
|
||||||
|
Name: "wp-s3-action",
|
||||||
|
Description: "Perform S3 actions",
|
||||||
|
Version: BuildVersion,
|
||||||
|
VersionMetadata: fmt.Sprintf("date=%s", BuildDate),
|
||||||
|
Flags: settingsFlags(settings, wp.FlagsPluginCategory),
|
||||||
|
}
|
||||||
|
|
||||||
|
plugin.New(options, settings).Run()
|
||||||
|
}
|
16
go.mod
16
go.mod
@ -1,20 +1,24 @@
|
|||||||
module github.com/thegeeklab/drone-s3-sync
|
module github.com/thegeeklab/wp-s3-action
|
||||||
|
|
||||||
go 1.20
|
go 1.21
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/aws/aws-sdk-go v1.44.302
|
github.com/aws/aws-sdk-go v1.44.302
|
||||||
github.com/joho/godotenv v1.5.1
|
github.com/rs/zerolog v1.30.0
|
||||||
github.com/ryanuber/go-glob v1.0.0
|
github.com/ryanuber/go-glob v1.0.0
|
||||||
github.com/sirupsen/logrus v1.9.3
|
github.com/thegeeklab/wp-plugin-go v0.4.0
|
||||||
github.com/thegeeklab/drone-plugin-lib/v2 v2.3.4
|
|
||||||
github.com/urfave/cli/v2 v2.25.7
|
github.com/urfave/cli/v2 v2.25.7
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
|
github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
|
||||||
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
github.com/jmespath/go-jmespath v0.4.0 // indirect
|
github.com/jmespath/go-jmespath v0.4.0 // indirect
|
||||||
|
github.com/joho/godotenv v1.5.1 // indirect
|
||||||
|
github.com/mattn/go-colorable v0.1.12 // indirect
|
||||||
|
github.com/mattn/go-isatty v0.0.14 // indirect
|
||||||
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
||||||
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
|
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
|
||||||
golang.org/x/sys v0.2.0 // indirect
|
golang.org/x/net v0.14.0 // indirect
|
||||||
|
golang.org/x/sys v0.11.0 // indirect
|
||||||
)
|
)
|
||||||
|
31
go.sum
31
go.sum
@ -1,30 +1,35 @@
|
|||||||
github.com/aws/aws-sdk-go v1.44.302 h1:ST3ko6GrJKn3Xi+nAvxjG3uk/V1pW8KC52WLeIxqqNk=
|
github.com/aws/aws-sdk-go v1.44.302 h1:ST3ko6GrJKn3Xi+nAvxjG3uk/V1pW8KC52WLeIxqqNk=
|
||||||
github.com/aws/aws-sdk-go v1.44.302/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI=
|
github.com/aws/aws-sdk-go v1.44.302/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI=
|
||||||
|
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=
|
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/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.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 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||||
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
|
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
|
||||||
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
|
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
|
||||||
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
|
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
|
||||||
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
|
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
|
||||||
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
|
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
|
||||||
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
|
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
|
||||||
|
github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
|
||||||
|
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
|
||||||
|
github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
|
||||||
|
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
|
||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
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/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
|
||||||
|
github.com/rs/zerolog v1.30.0 h1:SymVODrcRsaRaSInD9yQtKbtWqwsfoPcRff/oRXLj4c=
|
||||||
|
github.com/rs/zerolog v1.30.0/go.mod h1:/tk+P47gFdPXq4QYjvCmT5/Gsug2nagsFWBWhAiSi1w=
|
||||||
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
|
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/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk=
|
github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk=
|
||||||
github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc=
|
github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc=
|
||||||
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
|
|
||||||
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
github.com/thegeeklab/wp-plugin-go v0.4.0 h1:eTkRH04gAAsYgCUekk8RBmPrIXk+UG+EJtRkoUFllLs=
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/thegeeklab/wp-plugin-go v0.4.0/go.mod h1:y0k5zaKWjdGbgkaOHhEPFEL6p+yOLOjqHy0LWOrv0MM=
|
||||||
github.com/thegeeklab/drone-plugin-lib/v2 v2.3.4 h1:Quzrike/xRAR0izxQ0d+ocJyIUm4h1497Oyo9grcRzg=
|
|
||||||
github.com/thegeeklab/drone-plugin-lib/v2 v2.3.4/go.mod h1:qWVUZCmwL0Ntwa/hvyqM03EeIr1ReBR2XJsmIc7MGus=
|
|
||||||
github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs=
|
github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs=
|
||||||
github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ=
|
github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ=
|
||||||
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=
|
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=
|
||||||
@ -36,27 +41,29 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91
|
|||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||||
golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0=
|
|
||||||
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
|
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
|
||||||
|
golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14=
|
||||||
|
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A=
|
golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
|
||||||
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
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.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||||
golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg=
|
|
||||||
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||||
|
golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
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-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||||
@ -64,5 +71,3 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
|
|||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
|
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
|
||||||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
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=
|
|
||||||
|
100
plugin/aws.go
100
plugin/aws.go
@ -18,8 +18,8 @@ import (
|
|||||||
"github.com/aws/aws-sdk-go/aws/session"
|
"github.com/aws/aws-sdk-go/aws/session"
|
||||||
"github.com/aws/aws-sdk-go/service/cloudfront"
|
"github.com/aws/aws-sdk-go/service/cloudfront"
|
||||||
"github.com/aws/aws-sdk-go/service/s3"
|
"github.com/aws/aws-sdk-go/service/s3"
|
||||||
|
"github.com/rs/zerolog/log"
|
||||||
"github.com/ryanuber/go-glob"
|
"github.com/ryanuber/go-glob"
|
||||||
"github.com/sirupsen/logrus"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type AWS struct {
|
type AWS struct {
|
||||||
@ -32,18 +32,18 @@ type AWS struct {
|
|||||||
|
|
||||||
func NewAWS(plugin *Plugin) AWS {
|
func NewAWS(plugin *Plugin) AWS {
|
||||||
sessCfg := &aws.Config{
|
sessCfg := &aws.Config{
|
||||||
S3ForcePathStyle: aws.Bool(plugin.settings.PathStyle),
|
S3ForcePathStyle: aws.Bool(plugin.Settings.PathStyle),
|
||||||
Region: aws.String(plugin.settings.Region),
|
Region: aws.String(plugin.Settings.Region),
|
||||||
}
|
}
|
||||||
|
|
||||||
if plugin.settings.Endpoint != "" {
|
if plugin.Settings.Endpoint != "" {
|
||||||
sessCfg.Endpoint = &plugin.settings.Endpoint
|
sessCfg.Endpoint = &plugin.Settings.Endpoint
|
||||||
sessCfg.DisableSSL = aws.Bool(strings.HasPrefix(plugin.settings.Endpoint, "http://"))
|
sessCfg.DisableSSL = aws.Bool(strings.HasPrefix(plugin.Settings.Endpoint, "http://"))
|
||||||
}
|
}
|
||||||
|
|
||||||
// allowing to use the instance role or provide a key and secret
|
// allowing to use the instance role or provide a key and secret
|
||||||
if plugin.settings.AccessKey != "" && plugin.settings.SecretKey != "" {
|
if plugin.Settings.AccessKey != "" && plugin.Settings.SecretKey != "" {
|
||||||
sessCfg.Credentials = credentials.NewStaticCredentials(plugin.settings.AccessKey, plugin.settings.SecretKey, "")
|
sessCfg.Credentials = credentials.NewStaticCredentials(plugin.Settings.AccessKey, plugin.Settings.SecretKey, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
sess, _ := session.NewSession(sessCfg)
|
sess, _ := session.NewSession(sessCfg)
|
||||||
@ -73,9 +73,9 @@ func (a *AWS) Upload(local, remote string) error {
|
|||||||
|
|
||||||
var acl string
|
var acl string
|
||||||
|
|
||||||
for pattern := range plugin.settings.ACL {
|
for pattern := range plugin.Settings.ACL.Get() {
|
||||||
if match := glob.Glob(pattern, local); match {
|
if match := glob.Glob(pattern, local); match {
|
||||||
acl = plugin.settings.ACL[pattern]
|
acl = plugin.Settings.ACL.Get()[pattern]
|
||||||
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@ -89,9 +89,9 @@ func (a *AWS) Upload(local, remote string) error {
|
|||||||
|
|
||||||
var contentType string
|
var contentType string
|
||||||
|
|
||||||
for patternExt := range plugin.settings.ContentType {
|
for patternExt := range plugin.Settings.ContentType.Get() {
|
||||||
if patternExt == fileExt {
|
if patternExt == fileExt {
|
||||||
contentType = plugin.settings.ContentType[patternExt]
|
contentType = plugin.Settings.ContentType.Get()[patternExt]
|
||||||
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@ -103,9 +103,9 @@ func (a *AWS) Upload(local, remote string) error {
|
|||||||
|
|
||||||
var contentEncoding string
|
var contentEncoding string
|
||||||
|
|
||||||
for patternExt := range plugin.settings.ContentEncoding {
|
for patternExt := range plugin.Settings.ContentEncoding.Get() {
|
||||||
if patternExt == fileExt {
|
if patternExt == fileExt {
|
||||||
contentEncoding = plugin.settings.ContentEncoding[patternExt]
|
contentEncoding = plugin.Settings.ContentEncoding.Get()[patternExt]
|
||||||
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@ -113,9 +113,9 @@ func (a *AWS) Upload(local, remote string) error {
|
|||||||
|
|
||||||
var cacheControl string
|
var cacheControl string
|
||||||
|
|
||||||
for pattern := range plugin.settings.CacheControl {
|
for pattern := range plugin.Settings.CacheControl.Get() {
|
||||||
if match := glob.Glob(pattern, local); match {
|
if match := glob.Glob(pattern, local); match {
|
||||||
cacheControl = plugin.settings.CacheControl[pattern]
|
cacheControl = plugin.Settings.CacheControl.Get()[pattern]
|
||||||
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@ -123,9 +123,9 @@ func (a *AWS) Upload(local, remote string) error {
|
|||||||
|
|
||||||
metadata := map[string]*string{}
|
metadata := map[string]*string{}
|
||||||
|
|
||||||
for pattern := range plugin.settings.Metadata {
|
for pattern := range plugin.Settings.Metadata.Get() {
|
||||||
if match := glob.Glob(pattern, local); match {
|
if match := glob.Glob(pattern, local); match {
|
||||||
for k, v := range plugin.settings.Metadata[pattern] {
|
for k, v := range plugin.Settings.Metadata.Get()[pattern] {
|
||||||
metadata[k] = aws.String(v)
|
metadata[k] = aws.String(v)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -136,7 +136,7 @@ func (a *AWS) Upload(local, remote string) error {
|
|||||||
var AWSErr awserr.Error
|
var AWSErr awserr.Error
|
||||||
|
|
||||||
head, err := a.client.HeadObject(&s3.HeadObjectInput{
|
head, err := a.client.HeadObject(&s3.HeadObjectInput{
|
||||||
Bucket: aws.String(plugin.settings.Bucket),
|
Bucket: aws.String(plugin.Settings.Bucket),
|
||||||
Key: aws.String(remote),
|
Key: aws.String(remote),
|
||||||
})
|
})
|
||||||
if err != nil && errors.As(err, &AWSErr) {
|
if err != nil && errors.As(err, &AWSErr) {
|
||||||
@ -145,7 +145,7 @@ func (a *AWS) Upload(local, remote string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
logrus.Debugf(
|
log.Debug().Msgf(
|
||||||
"'%s' not found in bucket, uploading with content-type '%s' and permissions '%s'",
|
"'%s' not found in bucket, uploading with content-type '%s' and permissions '%s'",
|
||||||
local,
|
local,
|
||||||
contentType,
|
contentType,
|
||||||
@ -153,7 +153,7 @@ func (a *AWS) Upload(local, remote string) error {
|
|||||||
)
|
)
|
||||||
|
|
||||||
putObject := &s3.PutObjectInput{
|
putObject := &s3.PutObjectInput{
|
||||||
Bucket: aws.String(plugin.settings.Bucket),
|
Bucket: aws.String(plugin.Settings.Bucket),
|
||||||
Key: aws.String(remote),
|
Key: aws.String(remote),
|
||||||
Body: file,
|
Body: file,
|
||||||
ContentType: aws.String(contentType),
|
ContentType: aws.String(contentType),
|
||||||
@ -170,7 +170,7 @@ func (a *AWS) Upload(local, remote string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// skip upload during dry run
|
// skip upload during dry run
|
||||||
if a.plugin.settings.DryRun {
|
if a.plugin.Settings.DryRun {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -189,43 +189,43 @@ func (a *AWS) Upload(local, remote string) error {
|
|||||||
shouldCopy := false
|
shouldCopy := false
|
||||||
|
|
||||||
if head.ContentType == nil && contentType != "" {
|
if head.ContentType == nil && contentType != "" {
|
||||||
logrus.Debugf("content-type has changed from unset to %s", contentType)
|
log.Debug().Msgf("content-type has changed from unset to %s", contentType)
|
||||||
|
|
||||||
shouldCopy = true
|
shouldCopy = true
|
||||||
}
|
}
|
||||||
|
|
||||||
if !shouldCopy && head.ContentType != nil && contentType != *head.ContentType {
|
if !shouldCopy && head.ContentType != nil && contentType != *head.ContentType {
|
||||||
logrus.Debugf("content-type has changed from %s to %s", *head.ContentType, contentType)
|
log.Debug().Msgf("content-type has changed from %s to %s", *head.ContentType, contentType)
|
||||||
|
|
||||||
shouldCopy = true
|
shouldCopy = true
|
||||||
}
|
}
|
||||||
|
|
||||||
if !shouldCopy && head.ContentEncoding == nil && contentEncoding != "" {
|
if !shouldCopy && head.ContentEncoding == nil && contentEncoding != "" {
|
||||||
logrus.Debugf("Content-Encoding has changed from unset to %s", contentEncoding)
|
log.Debug().Msgf("Content-Encoding has changed from unset to %s", contentEncoding)
|
||||||
|
|
||||||
shouldCopy = true
|
shouldCopy = true
|
||||||
}
|
}
|
||||||
|
|
||||||
if !shouldCopy && head.ContentEncoding != nil && contentEncoding != *head.ContentEncoding {
|
if !shouldCopy && head.ContentEncoding != nil && contentEncoding != *head.ContentEncoding {
|
||||||
logrus.Debugf("Content-Encoding has changed from %s to %s", *head.ContentEncoding, contentEncoding)
|
log.Debug().Msgf("Content-Encoding has changed from %s to %s", *head.ContentEncoding, contentEncoding)
|
||||||
|
|
||||||
shouldCopy = true
|
shouldCopy = true
|
||||||
}
|
}
|
||||||
|
|
||||||
if !shouldCopy && head.CacheControl == nil && cacheControl != "" {
|
if !shouldCopy && head.CacheControl == nil && cacheControl != "" {
|
||||||
logrus.Debugf("cache-control has changed from unset to %s", cacheControl)
|
log.Debug().Msgf("cache-control has changed from unset to %s", cacheControl)
|
||||||
|
|
||||||
shouldCopy = true
|
shouldCopy = true
|
||||||
}
|
}
|
||||||
|
|
||||||
if !shouldCopy && head.CacheControl != nil && cacheControl != *head.CacheControl {
|
if !shouldCopy && head.CacheControl != nil && cacheControl != *head.CacheControl {
|
||||||
logrus.Debugf("cache-control has changed from %s to %s", *head.CacheControl, cacheControl)
|
log.Debug().Msgf("cache-control has changed from %s to %s", *head.CacheControl, cacheControl)
|
||||||
|
|
||||||
shouldCopy = true
|
shouldCopy = true
|
||||||
}
|
}
|
||||||
|
|
||||||
if !shouldCopy && len(head.Metadata) != len(metadata) {
|
if !shouldCopy && len(head.Metadata) != len(metadata) {
|
||||||
logrus.Debugf("count of metadata values has changed for %s", local)
|
log.Debug().Msgf("count of metadata values has changed for %s", local)
|
||||||
|
|
||||||
shouldCopy = true
|
shouldCopy = true
|
||||||
}
|
}
|
||||||
@ -234,7 +234,7 @@ func (a *AWS) Upload(local, remote string) error {
|
|||||||
for k, v := range metadata {
|
for k, v := range metadata {
|
||||||
if hv, ok := head.Metadata[k]; ok {
|
if hv, ok := head.Metadata[k]; ok {
|
||||||
if *v != *hv {
|
if *v != *hv {
|
||||||
logrus.Debugf("metadata values have changed for %s", local)
|
log.Debug().Msgf("metadata values have changed for %s", local)
|
||||||
|
|
||||||
shouldCopy = true
|
shouldCopy = true
|
||||||
|
|
||||||
@ -246,7 +246,7 @@ func (a *AWS) Upload(local, remote string) error {
|
|||||||
|
|
||||||
if !shouldCopy {
|
if !shouldCopy {
|
||||||
grant, err := a.client.GetObjectAcl(&s3.GetObjectAclInput{
|
grant, err := a.client.GetObjectAcl(&s3.GetObjectAclInput{
|
||||||
Bucket: aws.String(plugin.settings.Bucket),
|
Bucket: aws.String(plugin.Settings.Bucket),
|
||||||
Key: aws.String(remote),
|
Key: aws.String(remote),
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -275,24 +275,24 @@ func (a *AWS) Upload(local, remote string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if previousACL != acl {
|
if previousACL != acl {
|
||||||
logrus.Debugf("permissions for '%s' have changed from '%s' to '%s'", remote, previousACL, acl)
|
log.Debug().Msgf("permissions for '%s' have changed from '%s' to '%s'", remote, previousACL, acl)
|
||||||
|
|
||||||
shouldCopy = true
|
shouldCopy = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !shouldCopy {
|
if !shouldCopy {
|
||||||
logrus.Debugf("skipping '%s' because hashes and metadata match", local)
|
log.Debug().Msgf("skipping '%s' because hashes and metadata match", local)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
logrus.Debugf("updating metadata for '%s' content-type: '%s', ACL: '%s'", local, contentType, acl)
|
log.Debug().Msgf("updating metadata for '%s' content-type: '%s', ACL: '%s'", local, contentType, acl)
|
||||||
|
|
||||||
copyObject := &s3.CopyObjectInput{
|
copyObject := &s3.CopyObjectInput{
|
||||||
Bucket: aws.String(plugin.settings.Bucket),
|
Bucket: aws.String(plugin.Settings.Bucket),
|
||||||
Key: aws.String(remote),
|
Key: aws.String(remote),
|
||||||
CopySource: aws.String(fmt.Sprintf("%s/%s", plugin.settings.Bucket, remote)),
|
CopySource: aws.String(fmt.Sprintf("%s/%s", plugin.Settings.Bucket, remote)),
|
||||||
ACL: aws.String(acl),
|
ACL: aws.String(acl),
|
||||||
ContentType: aws.String(contentType),
|
ContentType: aws.String(contentType),
|
||||||
Metadata: metadata,
|
Metadata: metadata,
|
||||||
@ -308,7 +308,7 @@ func (a *AWS) Upload(local, remote string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// skip update if dry run
|
// skip update if dry run
|
||||||
if a.plugin.settings.DryRun {
|
if a.plugin.Settings.DryRun {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -322,10 +322,10 @@ func (a *AWS) Upload(local, remote string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
logrus.Debugf("uploading '%s' with content-type '%s' and permissions '%s'", local, contentType, acl)
|
log.Debug().Msgf("uploading '%s' with content-type '%s' and permissions '%s'", local, contentType, acl)
|
||||||
|
|
||||||
putObject := &s3.PutObjectInput{
|
putObject := &s3.PutObjectInput{
|
||||||
Bucket: aws.String(plugin.settings.Bucket),
|
Bucket: aws.String(plugin.Settings.Bucket),
|
||||||
Key: aws.String(remote),
|
Key: aws.String(remote),
|
||||||
Body: file,
|
Body: file,
|
||||||
ContentType: aws.String(contentType),
|
ContentType: aws.String(contentType),
|
||||||
@ -342,7 +342,7 @@ func (a *AWS) Upload(local, remote string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// skip upload if dry run
|
// skip upload if dry run
|
||||||
if a.plugin.settings.DryRun {
|
if a.plugin.Settings.DryRun {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -354,14 +354,14 @@ func (a *AWS) Upload(local, remote string) error {
|
|||||||
func (a *AWS) Redirect(path, location string) error {
|
func (a *AWS) Redirect(path, location string) error {
|
||||||
plugin := a.plugin
|
plugin := a.plugin
|
||||||
|
|
||||||
logrus.Debugf("adding redirect from '%s' to '%s'", path, location)
|
log.Debug().Msgf("adding redirect from '%s' to '%s'", path, location)
|
||||||
|
|
||||||
if a.plugin.settings.DryRun {
|
if a.plugin.Settings.DryRun {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err := a.client.PutObject(&s3.PutObjectInput{
|
_, err := a.client.PutObject(&s3.PutObjectInput{
|
||||||
Bucket: aws.String(plugin.settings.Bucket),
|
Bucket: aws.String(plugin.Settings.Bucket),
|
||||||
Key: aws.String(path),
|
Key: aws.String(path),
|
||||||
ACL: aws.String("public-read"),
|
ACL: aws.String("public-read"),
|
||||||
WebsiteRedirectLocation: aws.String(location),
|
WebsiteRedirectLocation: aws.String(location),
|
||||||
@ -373,14 +373,14 @@ func (a *AWS) Redirect(path, location string) error {
|
|||||||
func (a *AWS) Delete(remote string) error {
|
func (a *AWS) Delete(remote string) error {
|
||||||
plugin := a.plugin
|
plugin := a.plugin
|
||||||
|
|
||||||
logrus.Debugf("removing remote file '%s'", remote)
|
log.Debug().Msgf("removing remote file '%s'", remote)
|
||||||
|
|
||||||
if a.plugin.settings.DryRun {
|
if a.plugin.Settings.DryRun {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err := a.client.DeleteObject(&s3.DeleteObjectInput{
|
_, err := a.client.DeleteObject(&s3.DeleteObjectInput{
|
||||||
Bucket: aws.String(plugin.settings.Bucket),
|
Bucket: aws.String(plugin.Settings.Bucket),
|
||||||
Key: aws.String(remote),
|
Key: aws.String(remote),
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -393,7 +393,7 @@ func (a *AWS) List(path string) ([]string, error) {
|
|||||||
remote := make([]string, 0)
|
remote := make([]string, 0)
|
||||||
|
|
||||||
resp, err := a.client.ListObjects(&s3.ListObjectsInput{
|
resp, err := a.client.ListObjects(&s3.ListObjectsInput{
|
||||||
Bucket: aws.String(plugin.settings.Bucket),
|
Bucket: aws.String(plugin.Settings.Bucket),
|
||||||
Prefix: aws.String(path),
|
Prefix: aws.String(path),
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -406,7 +406,7 @@ func (a *AWS) List(path string) ([]string, error) {
|
|||||||
|
|
||||||
for *resp.IsTruncated {
|
for *resp.IsTruncated {
|
||||||
resp, err = a.client.ListObjects(&s3.ListObjectsInput{
|
resp, err = a.client.ListObjects(&s3.ListObjectsInput{
|
||||||
Bucket: aws.String(plugin.settings.Bucket),
|
Bucket: aws.String(plugin.Settings.Bucket),
|
||||||
Prefix: aws.String(path),
|
Prefix: aws.String(path),
|
||||||
Marker: aws.String(remote[len(remote)-1]),
|
Marker: aws.String(remote[len(remote)-1]),
|
||||||
})
|
})
|
||||||
@ -426,10 +426,10 @@ func (a *AWS) List(path string) ([]string, error) {
|
|||||||
func (a *AWS) Invalidate(invalidatePath string) error {
|
func (a *AWS) Invalidate(invalidatePath string) error {
|
||||||
p := a.plugin
|
p := a.plugin
|
||||||
|
|
||||||
logrus.Debugf("invalidating '%s'", invalidatePath)
|
log.Debug().Msgf("invalidating '%s'", invalidatePath)
|
||||||
|
|
||||||
_, err := a.cfClient.CreateInvalidation(&cloudfront.CreateInvalidationInput{
|
_, err := a.cfClient.CreateInvalidation(&cloudfront.CreateInvalidationInput{
|
||||||
DistributionId: aws.String(p.settings.CloudFrontDistribution),
|
DistributionId: aws.String(p.Settings.CloudFrontDistribution),
|
||||||
InvalidationBatch: &cloudfront.InvalidationBatch{
|
InvalidationBatch: &cloudfront.InvalidationBatch{
|
||||||
CallerReference: aws.String(time.Now().Format(time.RFC3339Nano)),
|
CallerReference: aws.String(time.Now().Format(time.RFC3339Nano)),
|
||||||
Paths: &cloudfront.Paths{
|
Paths: &cloudfront.Paths{
|
||||||
|
@ -1,47 +1,32 @@
|
|||||||
package plugin
|
package plugin
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/rs/zerolog/log"
|
||||||
|
"github.com/urfave/cli/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Settings for the Plugin.
|
var ErrTypeAssertionFailed = errors.New("type assertion failed")
|
||||||
type Settings struct {
|
|
||||||
Endpoint string
|
|
||||||
AccessKey string
|
|
||||||
SecretKey string
|
|
||||||
Bucket string
|
|
||||||
Region string
|
|
||||||
Source string
|
|
||||||
Target string
|
|
||||||
Delete bool
|
|
||||||
ACL map[string]string
|
|
||||||
CacheControl map[string]string
|
|
||||||
ContentType map[string]string
|
|
||||||
ContentEncoding map[string]string
|
|
||||||
Metadata map[string]map[string]string
|
|
||||||
Redirects map[string]string
|
|
||||||
CloudFrontDistribution string
|
|
||||||
DryRun bool
|
|
||||||
PathStyle bool
|
|
||||||
Client AWS
|
|
||||||
Jobs []Job
|
|
||||||
MaxConcurrency int
|
|
||||||
}
|
|
||||||
|
|
||||||
type Job struct {
|
// Execute provides the implementation of the plugin.
|
||||||
local string
|
//
|
||||||
remote string
|
//nolint:revive
|
||||||
action string
|
func (p *Plugin) run(ctx context.Context, cCtx *cli.Context) error {
|
||||||
}
|
if err := p.Validate(); err != nil {
|
||||||
|
return fmt.Errorf("validation failed: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
type Result struct {
|
if err := p.Execute(); err != nil {
|
||||||
j Job
|
return fmt.Errorf("execution failed: %w", err)
|
||||||
err error
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate handles the settings validation of the plugin.
|
// Validate handles the settings validation of the plugin.
|
||||||
@ -51,25 +36,25 @@ func (p *Plugin) Validate() error {
|
|||||||
return fmt.Errorf("error while retrieving working directory: %w", err)
|
return fmt.Errorf("error while retrieving working directory: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p.settings.Source = filepath.Join(wd, p.settings.Source)
|
p.Settings.Source = filepath.Join(wd, p.Settings.Source)
|
||||||
p.settings.Target = strings.TrimPrefix(p.settings.Target, "/")
|
p.Settings.Target = strings.TrimPrefix(p.Settings.Target, "/")
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Execute provides the implementation of the plugin.
|
// Execute provides the implementation of the plugin.
|
||||||
func (p *Plugin) Execute() error {
|
func (p *Plugin) Execute() error {
|
||||||
p.settings.Jobs = make([]Job, 1)
|
p.Settings.Jobs = make([]Job, 1)
|
||||||
p.settings.Client = NewAWS(p)
|
p.Settings.Client = NewAWS(p)
|
||||||
|
|
||||||
if err := p.createSyncJobs(); err != nil {
|
if err := p.createSyncJobs(); err != nil {
|
||||||
return fmt.Errorf("error while creating sync job: %w", err)
|
return fmt.Errorf("error while creating sync job: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(p.settings.CloudFrontDistribution) > 0 {
|
if len(p.Settings.CloudFrontDistribution) > 0 {
|
||||||
p.settings.Jobs = append(p.settings.Jobs, Job{
|
p.Settings.Jobs = append(p.Settings.Jobs, Job{
|
||||||
local: "",
|
local: "",
|
||||||
remote: filepath.Join("/", p.settings.Target, "*"),
|
remote: filepath.Join("/", p.Settings.Target, "*"),
|
||||||
action: "invalidateCloudFront",
|
action: "invalidateCloudFront",
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -82,27 +67,27 @@ func (p *Plugin) Execute() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (p *Plugin) createSyncJobs() error {
|
func (p *Plugin) createSyncJobs() error {
|
||||||
remote, err := p.settings.Client.List(p.settings.Target)
|
remote, err := p.Settings.Client.List(p.Settings.Target)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
local := make([]string, 0)
|
local := make([]string, 0)
|
||||||
|
|
||||||
err = filepath.Walk(p.settings.Source, func(path string, info os.FileInfo, err error) error {
|
err = filepath.Walk(p.Settings.Source, func(path string, info os.FileInfo, err error) error {
|
||||||
if err != nil || info.IsDir() {
|
if err != nil || info.IsDir() {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
localPath := path
|
localPath := path
|
||||||
if p.settings.Source != "." {
|
if p.Settings.Source != "." {
|
||||||
localPath = strings.TrimPrefix(path, p.settings.Source)
|
localPath = strings.TrimPrefix(path, p.Settings.Source)
|
||||||
localPath = strings.TrimPrefix(localPath, "/")
|
localPath = strings.TrimPrefix(localPath, "/")
|
||||||
}
|
}
|
||||||
local = append(local, localPath)
|
local = append(local, localPath)
|
||||||
p.settings.Jobs = append(p.settings.Jobs, Job{
|
p.Settings.Jobs = append(p.Settings.Jobs, Job{
|
||||||
local: filepath.Join(p.settings.Source, localPath),
|
local: filepath.Join(p.Settings.Source, localPath),
|
||||||
remote: filepath.Join(p.settings.Target, localPath),
|
remote: filepath.Join(p.Settings.Target, localPath),
|
||||||
action: "upload",
|
action: "upload",
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -112,20 +97,20 @@ func (p *Plugin) createSyncJobs() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
for path, location := range p.settings.Redirects {
|
for path, location := range p.Settings.Redirects.Get() {
|
||||||
path = strings.TrimPrefix(path, "/")
|
path = strings.TrimPrefix(path, "/")
|
||||||
local = append(local, path)
|
local = append(local, path)
|
||||||
p.settings.Jobs = append(p.settings.Jobs, Job{
|
p.Settings.Jobs = append(p.Settings.Jobs, Job{
|
||||||
local: path,
|
local: path,
|
||||||
remote: location,
|
remote: location,
|
||||||
action: "redirect",
|
action: "redirect",
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if p.settings.Delete {
|
if p.Settings.Delete {
|
||||||
for _, remote := range remote {
|
for _, remote := range remote {
|
||||||
found := false
|
found := false
|
||||||
remotePath := strings.TrimPrefix(remote, p.settings.Target+"/")
|
remotePath := strings.TrimPrefix(remote, p.Settings.Target+"/")
|
||||||
|
|
||||||
for _, l := range local {
|
for _, l := range local {
|
||||||
if l == remotePath {
|
if l == remotePath {
|
||||||
@ -136,7 +121,7 @@ func (p *Plugin) createSyncJobs() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if !found {
|
if !found {
|
||||||
p.settings.Jobs = append(p.settings.Jobs, Job{
|
p.Settings.Jobs = append(p.Settings.Jobs, Job{
|
||||||
local: "",
|
local: "",
|
||||||
remote: remote,
|
remote: remote,
|
||||||
action: "delete",
|
action: "delete",
|
||||||
@ -149,15 +134,15 @@ func (p *Plugin) createSyncJobs() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (p *Plugin) runJobs() error {
|
func (p *Plugin) runJobs() error {
|
||||||
client := p.settings.Client
|
client := p.Settings.Client
|
||||||
jobChan := make(chan struct{}, p.settings.MaxConcurrency)
|
jobChan := make(chan struct{}, p.Settings.MaxConcurrency)
|
||||||
results := make(chan *Result, len(p.settings.Jobs))
|
results := make(chan *Result, len(p.Settings.Jobs))
|
||||||
|
|
||||||
var invalidateJob *Job
|
var invalidateJob *Job
|
||||||
|
|
||||||
logrus.Infof("Synchronizing with bucket '%s'", p.settings.Bucket)
|
log.Info().Msgf("Synchronizing with bucket '%s'", p.Settings.Bucket)
|
||||||
|
|
||||||
for _, job := range p.settings.Jobs {
|
for _, job := range p.Settings.Jobs {
|
||||||
jobChan <- struct{}{}
|
jobChan <- struct{}{}
|
||||||
|
|
||||||
go func(job Job) {
|
go func(job Job) {
|
||||||
@ -181,7 +166,7 @@ func (p *Plugin) runJobs() error {
|
|||||||
}(job)
|
}(job)
|
||||||
}
|
}
|
||||||
|
|
||||||
for range p.settings.Jobs {
|
for range p.Settings.Jobs {
|
||||||
r := <-results
|
r := <-results
|
||||||
if r.err != nil {
|
if r.err != nil {
|
||||||
return fmt.Errorf("failed to %s %s to %s: %w", r.j.action, r.j.local, r.j.remote, r.err)
|
return fmt.Errorf("failed to %s %s to %s: %w", r.j.action, r.j.local, r.j.remote, r.err)
|
||||||
|
@ -1,21 +1,58 @@
|
|||||||
package plugin
|
package plugin
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/thegeeklab/drone-plugin-lib/v2/drone"
|
wp "github.com/thegeeklab/wp-plugin-go/plugin"
|
||||||
|
"github.com/thegeeklab/wp-plugin-go/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Plugin implements drone.Plugin to provide the plugin implementation.
|
// Plugin implements provide the plugin implementation.
|
||||||
type Plugin struct {
|
type Plugin struct {
|
||||||
settings Settings
|
*wp.Plugin
|
||||||
pipeline drone.Pipeline
|
Settings *Settings
|
||||||
network drone.Network
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// New initializes a plugin from the given Settings, Pipeline, and Network.
|
// Settings for the Plugin.
|
||||||
func New(settings Settings, pipeline drone.Pipeline, network drone.Network) *Plugin {
|
type Settings struct {
|
||||||
return &Plugin{
|
Endpoint string
|
||||||
settings: settings,
|
AccessKey string
|
||||||
pipeline: pipeline,
|
SecretKey string
|
||||||
network: network,
|
Bucket string
|
||||||
}
|
Region string
|
||||||
|
Source string
|
||||||
|
Target string
|
||||||
|
Delete bool
|
||||||
|
ACL types.StringMapFlag
|
||||||
|
CacheControl types.StringMapFlag
|
||||||
|
ContentType types.StringMapFlag
|
||||||
|
ContentEncoding types.StringMapFlag
|
||||||
|
Metadata types.DeepStringMapFlag
|
||||||
|
Redirects types.StringMapFlag
|
||||||
|
CloudFrontDistribution string
|
||||||
|
DryRun bool
|
||||||
|
PathStyle bool
|
||||||
|
Client AWS
|
||||||
|
Jobs []Job
|
||||||
|
MaxConcurrency int
|
||||||
|
}
|
||||||
|
|
||||||
|
type Job struct {
|
||||||
|
local string
|
||||||
|
remote string
|
||||||
|
action string
|
||||||
|
}
|
||||||
|
|
||||||
|
type Result struct {
|
||||||
|
j Job
|
||||||
|
err error
|
||||||
|
}
|
||||||
|
|
||||||
|
func New(options wp.Options, settings *Settings) *Plugin {
|
||||||
|
p := &Plugin{}
|
||||||
|
|
||||||
|
options.Execute = p.run
|
||||||
|
|
||||||
|
p.Plugin = wp.New(options)
|
||||||
|
p.Settings = settings
|
||||||
|
|
||||||
|
return p
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user