pleroma_ctl: add an update command
authorrinpatch <rinpatch@sdf.org>
Wed, 19 Jun 2019 11:53:16 +0000 (14:53 +0300)
committerrinpatch <rinpatch@sdf.org>
Wed, 19 Jun 2019 11:53:16 +0000 (14:53 +0300)
Closes #988 and #1004

rel/files/bin/pleroma_ctl

index ac7339762dbbe463f13de05e70ae4f79ead7e79f..671fd3860b664ecda79f52a5a39dc135514eb50c 100755 (executable)
 #!/bin/sh
 # XXX: This should be removed when elixir's releases get custom command support
+
+detect_flavour() {
+       arch="$(arch)"
+       if [ "$arch" = "x86_64" ]; then
+               arch="amd64"
+       elif [ "$arch" = "armv7l" ]; then
+               arch="arm"
+       elif [ "$arch" = "aarch64" ]; then
+               arch="arm64"
+       else
+               echo "Unsupported arch: $arch" >&2
+               exit 1
+       fi
+
+       if getconf GNU_LIBC_VERSION >/dev/null; then
+               libc_postfix=""
+       elif [ "$(ldd 2>&1 | head -c 9)" = "musl libc" ]; then
+               libc_postfix="-musl"
+       elif [ "$(find /lib/libc.musl* | wc -l)" ]; then
+               libc_postfix="-musl"
+       else
+               echo "Unsupported libc" >&2
+               exit 1
+       fi
+
+       echo "$arch$libc_postfix"
+}
+
+detect_branch() {
+       version="$(cut -d' ' -f2 <"$RELEASE_ROOT"/releases/start_erl.data)"
+       branch="$(echo "$version" | cut -d'-' -f 4)"
+       if [ "$branch" = "develop" ]; then
+               echo "develop"
+       elif [ "$branch" = "" ]; then
+               echo "master"
+       else
+               echo "Releases are built only for master and develop branches" >&2
+               exit 1
+       fi
+}
+update() {
+       set -e
+       RELEASE_ROOT=$(dirname "$SCRIPTPATH")
+       uri="${PLEROMA_CTL_URI:-https://git.pleroma.social}"
+       project_id="${PLEROMA_CTL_PROJECT_ID:-2}"
+       project_branch="$(detect_branch)"
+       flavour="${PLEROMA_CTL_ARCH:-$(detect_flavour)}"
+       echo "Detected flavour: $flavour"
+       tmp="${PLEROMA_CTL_TMP_DIR:-/tmp}"
+       artifact="$tmp/pleroma.zip"
+       full_uri="${uri}/api/v4/projects/${project_id}/jobs/artifacts/${project_branch}/download?job=${flavour}"
+       echo "Downloading the artifact from ${full_uri} to ${artifact}"
+       curl "$full_uri" -o "${artifact}"
+       echo "Unpacking ${artifact} to ${tmp}"
+       unzip -q "$artifact" -d "$tmp"
+       echo "Copying files over to $RELEASE_ROOT"
+       if [ "$1" != "--no-rm" ]; then
+               rm -r "${RELEASE_ROOT:-?}"/*
+       fi
+       cp -rf "$tmp/release"/* "$RELEASE_ROOT"
+       echo "Removing temporary files"
+       rm -r "$tmp/release"
+       rm "$artifact"
+       echo "Done! Please refer to the changelog/release notes for changes and update instructions"
+       set +e
+}
+
 if [ -z "$1" ] || [ "$1" = "help" ]; then
+       # TODO: Just list the commands on `pleroma_ctl help` and output help for the individual command on `pleroma_ctl help $COMMAND`
        echo "Usage: $(basename "$0") COMMAND [ARGS]
 
     The known commands are:
 
-        create                     Create database schema (needs to be executed only once)
-        migrate                    Execute database migrations (needs to be done after updates)
-        rollback [VERSION]         Rollback database migrations (needs to be done before downgrading)
+        create
+         Create database schema (needs to be executed only once)
+
+        migrate
+         Execute database migrations (needs to be done after updates)
+
+        rollback [VERSION]
+         Rollback database migrations (needs to be done before downgrading)
+
+       update [OPTIONS]
+         Update the instance using the latest CI artifact for the current branch.
+
+         The only supported option is --no-rm, when set the script won't delete the whole directory, but
+         just force copy over files from the new release. This wastes more space, but may be useful if
+         some files are stored inside of the release directories (although you really shouldn't store them
+         there), or if you want to be able to quickly revert a broken update.
+
+         The script will try to detect your architecture and ABI automatically, but if it is wrong, you can
+         overwrite it by setting PLEROMA_CTL_ARCH to the desired architecture.
+
+         By default the artifact will be downloaded from https://git.pleroma.social for pleroma/pleroma (project id: 2)
+         to /tmp/, you can overwrite these settings by setting PLEROMA_CTL_URI, PLEROMA_CTL_PROJECT_ID and PLEROMA_CTL_TMP_DIR
+         respectievly.
+
 
     and any mix tasks under Pleroma namespace, for example \`mix pleroma.user COMMAND\` is
     equivalent to \`$(basename "$0") user COMMAND\`
@@ -18,7 +107,10 @@ if [ -z "$1" ] || [ "$1" = "help" ]; then
 else
        SCRIPT=$(readlink -f "$0")
        SCRIPTPATH=$(dirname "$SCRIPT")
-       if [ "$1" = "migrate" ] || [ "$1" = "rollback" ] || [ "$1" = "create" ] || [ -n "$PLEROMA_CTL_RPC_DISABLED" ]; then
+
+       if [ "$1" = "update" ]; then
+               update "$2"
+       elif [ "$1" = "migrate" ] || [ "$1" = "rollback" ] || [ "$1" = "create" ] || [ -n "$PLEROMA_CTL_RPC_DISABLED" ]; then
                "$SCRIPTPATH"/pleroma eval 'Pleroma.ReleaseTasks.run("'"$*"'")'
        else
                "$SCRIPTPATH"/pleroma rpc 'Pleroma.ReleaseTasks.run("'"$*"'")'