mirror of
https://github.com/dokku/dokku.git
synced 2025-12-15 19:47:42 +01:00
This makes standard use of shellcheck work without needing to provide extra configuration anywhere. Also remove use of inline 'shellcheck disable' calls that are already defined in the .shellcheckrc and don't need to be set inline.
173 lines
5.0 KiB
Bash
Executable File
173 lines
5.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -eo pipefail
|
|
[[ $TRACE ]] && set -x
|
|
|
|
readonly TMP_WORK_DIR="$(mktemp -d "/tmp/dokku-plugin-release.XXXXXX")"
|
|
|
|
trap "rm -rf '$TMP_WORK_DIR' >/dev/null" RETURN INT TERM EXIT
|
|
|
|
log-info() {
|
|
declare desc="Log info formatter"
|
|
echo "$*"
|
|
}
|
|
|
|
log-error() {
|
|
declare desc="Log error formatter"
|
|
echo "! $*" 1>&2
|
|
}
|
|
|
|
log-fail() {
|
|
declare desc="Log fail formatter"
|
|
log-error "$*"
|
|
exit 1
|
|
}
|
|
|
|
fn-github-download-release() {
|
|
declare REPO_NAME="$1" VERSION="$2"
|
|
|
|
if [[ -n "$DOKKU_PLUGIN_GITHUB_ACCESS_TOKEN" ]]; then
|
|
curl -L "https://api.github.com/repos/${REPO_NAME}/tarball/${VERSION}?access_token=${DOKKU_PLUGIN_GITHUB_ACCESS_TOKEN}"
|
|
else
|
|
curl -L "https://api.github.com/repos/${REPO_NAME}/tarball/${VERSION}"
|
|
fi
|
|
}
|
|
|
|
fn-replace-version() {
|
|
declare desc="Replaces the version within a file"
|
|
local CURRENT_VERSION="$1"
|
|
local NEXT_VERSION="$2"
|
|
local FILENAME="$3"
|
|
sed -i.bak "s/${CURRENT_VERSION//./\.}/$NEXT_VERSION/g" "$FILENAME" && rm "$FILENAME.bak"
|
|
git add "$FILENAME"
|
|
}
|
|
|
|
fn-require-bin() {
|
|
declare desc="Checks that a binary exists"
|
|
declare BINARY="$1"
|
|
if ! command -v "$BINARY" &>/dev/null; then
|
|
log-fail "Missing ${BINARY}, please install it"
|
|
fi
|
|
}
|
|
|
|
main() {
|
|
local RELEASE="$1" AWS_RELEASE="$2"
|
|
local CURRENT_VERSION FILENAME NEXT_VERSION ORG_REPO_NAME REPO_NAME major minor patch
|
|
|
|
if [[ -z "$RELEASE" ]]; then
|
|
cat <<'EOF'
|
|
requirements:
|
|
|
|
- this is run in a plugin folder
|
|
- a `plugin.toml` exists
|
|
- the plugin is versioned via git
|
|
|
|
usage:
|
|
|
|
# the following commands make these assumptions
|
|
# - the plugin's folder name is dokku-example, as is the remote repository
|
|
# - the current version is `0.0.1` in the `plugin.toml`
|
|
|
|
# create the alias
|
|
alias release-dokku-plugin="path/to/dokku/contrib/release-plugin"
|
|
|
|
# make a specific kind of release
|
|
release-dokku-plugin patch # creates a 0.0.2 release
|
|
release-dokku-plugin minor # creates a 0.1.0 release
|
|
release-dokku-plugin major # creates a 1.0.0 release
|
|
|
|
# release private plugins as tarballs to S3
|
|
# note that the plugin *must* exist on github for this to work
|
|
export DOKKU_PLUGIN_GITHUB_ACCESS_TOKEN="some-github-token"
|
|
export DOKKU_PLUGIN_S3_BUCKET="example"
|
|
export DOKKU_PLUGIN_S3_PATH="some/path"
|
|
# will upload the versioned tarball url to s3://example/some/path/dokku-plugin-name-0.0.1.tar.gz
|
|
release-dokku-plugin patch
|
|
EOF
|
|
return
|
|
fi
|
|
|
|
fn-require-bin "git"
|
|
|
|
if [[ "$AWS_RELEASE" != "true" ]] && [[ "$AWS_RELEASE" != "false" ]]; then
|
|
local AWS_RELEASE=true
|
|
fi
|
|
|
|
if [[ "$AWS_RELEASE" == "true" ]] && [[ -z "$DOKKU_PLUGIN_GITHUB_ACCESS_TOKEN" ]]; then
|
|
log-info "You are running this without a DOKKU_PLUGIN_GITHUB_ACCESS_TOKEN environment variable."
|
|
log-info "Doing so disables uploading releases to S3, which may be necessary for installing private plugins."
|
|
while true; do
|
|
read -rp "Do you wish to continue? " yn
|
|
case $yn in
|
|
[Yy]*) break ;;
|
|
[Nn]*) exit ;;
|
|
*) echo "Please answer yes or no." ;;
|
|
esac
|
|
done
|
|
fi
|
|
|
|
if [[ "$AWS_RELEASE" == "true" ]]; then
|
|
fn-require-bin "aws"
|
|
fn-require-bin "curl"
|
|
if [[ -z "$DOKKU_PLUGIN_S3_BUCKET" ]]; then
|
|
log-fail "No DOKKU_PLUGIN_S3_BUCKET environment variable set"
|
|
fi
|
|
if [[ -z "$DOKKU_PLUGIN_S3_PATH" ]]; then
|
|
log-fail "No DOKKU_PLUGIN_S3_PATH environment variable set"
|
|
fi
|
|
fi
|
|
|
|
if [[ ! -f plugin.toml ]]; then
|
|
log-error "No plugin.toml found"
|
|
return 1
|
|
fi
|
|
|
|
if [[ ! -d .git ]]; then
|
|
log-error "No git repository found"
|
|
return 1
|
|
fi
|
|
|
|
CURRENT_VERSION=$(grep version plugin.toml | cut -d '"' -f2)
|
|
major=$(echo "$CURRENT_VERSION" | awk '{split($0,a,"."); print a[1]}')
|
|
minor=$(echo "$CURRENT_VERSION" | awk '{split($0,a,"."); print a[2]}')
|
|
patch=$(echo "$CURRENT_VERSION" | awk '{split($0,a,"."); print a[3]}')
|
|
|
|
if [[ "$RELEASE" == "major" ]]; then
|
|
major=$((major + 1))
|
|
minor="0"
|
|
patch="0"
|
|
elif [[ "$RELEASE" == "minor" ]]; then
|
|
minor=$((minor + 1))
|
|
patch="0"
|
|
elif [[ "$RELEASE" == "patch" ]]; then
|
|
patch=$((patch + 1))
|
|
else
|
|
log-error "Invalid release type specified"
|
|
return 1
|
|
fi
|
|
NEXT_VERSION="${major}.${minor}.${patch}"
|
|
|
|
fn-replace-version "$CURRENT_VERSION" "$NEXT_VERSION" plugin.toml
|
|
git add plugin.toml
|
|
git commit -m "Release ${NEXT_VERSION}"
|
|
git tag "${NEXT_VERSION}"
|
|
git push --tags origin master
|
|
git fetch
|
|
|
|
ORG_REPO_NAME="$(git remote -v | grep origin | HEAD -n1 | cut -d':' -f2 | cut -d'.' -f1)"
|
|
REPO_NAME="$(echo "$ORG_REPO_NAME" | cut -d'/' -f2)"
|
|
FILENAME="${REPO_NAME}-${NEXT_VERSION}.tar.gz"
|
|
|
|
if [[ "$AWS_RELEASE" == "true" ]]; then
|
|
DOKKU_PLUGIN_S3_BUCKET="${DOKKU_PLUGIN_S3_BUCKET%/}"
|
|
DOKKU_PLUGIN_S3_PATH="${DOKKU_PLUGIN_S3_PATH%/}"
|
|
if [[ "$DOKKU_PLUGIN_S3_PATH" != "/" ]]; then
|
|
DOKKU_PLUGIN_S3_PATH="${DOKKU_PLUGIN_S3_PATH}/"
|
|
fi
|
|
|
|
fn-github-download-release "$ORG_REPO_NAME" "$NEXT_VERSION" >"${TMP_WORK_DIR}/${FILENAME}"
|
|
aws s3 cp "${TMP_WORK_DIR}/${FILENAME}" "s3://${DOKKU_PLUGIN_S3_BUCKET}/${DOKKU_PLUGIN_S3_PATH}${FILENAME}" --acl public-read
|
|
fi
|
|
}
|
|
|
|
main "$@"
|