From a0a1361888a3986d589720a7eb39d49c913154f2 Mon Sep 17 00:00:00 2001 From: rinpatch Date: Wed, 19 Jun 2019 03:51:59 +0300 Subject: [PATCH 1/6] Refactor pleroma_ctl copying to a generic function for copying files into the release dir --- mix.exs | 6 +++--- rel/{ => files/bin}/pleroma_ctl | 0 2 files changed, 3 insertions(+), 3 deletions(-) rename rel/{ => files/bin}/pleroma_ctl (100%) diff --git a/mix.exs b/mix.exs index df3253d5a..781560a0a 100644 --- a/mix.exs +++ b/mix.exs @@ -37,14 +37,14 @@ defmodule Pleroma.Mixfile do pleroma: [ include_executables_for: [:unix], applications: [ex_syslogger: :load, syslog: :load], - steps: [:assemble, ©_pleroma_ctl/1] + steps: [:assemble, ©_files/1] ] ] ] end - def copy_pleroma_ctl(%{path: target_path} = release) do - File.cp!("./rel/pleroma_ctl", Path.join([target_path, "bin", "pleroma_ctl"])) + def copy_files(%{path: target_path} = release) do + File.cp_r!("./rel/files", target_path) release end diff --git a/rel/pleroma_ctl b/rel/files/bin/pleroma_ctl similarity index 100% rename from rel/pleroma_ctl rename to rel/files/bin/pleroma_ctl From a6e3169cfc5657e5819b3e018bf4c3cdf1c1377a Mon Sep 17 00:00:00 2001 From: rinpatch Date: Wed, 19 Jun 2019 14:40:39 +0300 Subject: [PATCH 2/6] Make possible to override the branch name via a env variable This is useful for the CI builds because they have a detached HEAD or for emulating a feature that is availible only on a particular branch (e.g pleroma_ctl downloads CI artifacts only for develop and master) --- .gitlab-ci.yml | 1 + mix.exs | 1 + 2 files changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 97f96ffc8..fa5dafdb2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -173,6 +173,7 @@ amd64: script: &release - mix deps.get --only prod - mkdir release + - PLEROMA_BUILD_BRANCH=$CI_COMMIT_REF_NAME - mix release --path release diff --git a/mix.exs b/mix.exs index 781560a0a..ac25b7266 100644 --- a/mix.exs +++ b/mix.exs @@ -207,6 +207,7 @@ defmodule Pleroma.Mixfile do branch_name = with {branch_name, 0} <- System.cmd("git", ["rev-parse", "--abbrev-ref", "HEAD"]), + branch_name <- System.get_env("PLEROMA_BUILD_BRANCH") || branch_name, true <- branch_name != "master" do branch_name = String.trim(branch_name) From 66f2cdcdb07b358c53e4c8d4f01bfe80da5883a7 Mon Sep 17 00:00:00 2001 From: rinpatch Date: Wed, 19 Jun 2019 14:53:16 +0300 Subject: [PATCH 3/6] pleroma_ctl: add an update command Closes #988 and #1004 --- rel/files/bin/pleroma_ctl | 100 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 96 insertions(+), 4 deletions(-) diff --git a/rel/files/bin/pleroma_ctl b/rel/files/bin/pleroma_ctl index ac7339762..671fd3860 100755 --- a/rel/files/bin/pleroma_ctl +++ b/rel/files/bin/pleroma_ctl @@ -1,13 +1,102 @@ #!/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("'"$*"'")' From 2571e07fbae39728c6edacaab484e44975200b33 Mon Sep 17 00:00:00 2001 From: rinpatch Date: Wed, 19 Jun 2019 14:59:12 +0300 Subject: [PATCH 4/6] pleroma_ctl: Rename arch to flavour because it also includes the libc --- rel/files/bin/pleroma_ctl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rel/files/bin/pleroma_ctl b/rel/files/bin/pleroma_ctl index 671fd3860..03b7e57bb 100755 --- a/rel/files/bin/pleroma_ctl +++ b/rel/files/bin/pleroma_ctl @@ -46,7 +46,7 @@ update() { 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)}" + flavour="${PLEROMA_CTL_FLAVOUR:-$(detect_flavour)}" echo "Detected flavour: $flavour" tmp="${PLEROMA_CTL_TMP_DIR:-/tmp}" artifact="$tmp/pleroma.zip" @@ -90,8 +90,8 @@ if [ -z "$1" ] || [ "$1" = "help" ]; then 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. + The script will try to detect your architecture and ABI and set a flavour automatically, + but if it is wrong, you can overwrite it by setting PLEROMA_CTL_FLAVOUR to the desired flavour. 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 From 4974988f0353341e7f89decb3b95cda9ced372b7 Mon Sep 17 00:00:00 2001 From: rinpatch Date: Thu, 20 Jun 2019 11:02:05 +0300 Subject: [PATCH 5/6] Export PLEROMA_BUILD_BRANCH --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index fa5dafdb2..f8711f299 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -173,7 +173,7 @@ amd64: script: &release - mix deps.get --only prod - mkdir release - - PLEROMA_BUILD_BRANCH=$CI_COMMIT_REF_NAME + - export PLEROMA_BUILD_BRANCH=$CI_COMMIT_REF_NAME - mix release --path release From 0e31d195af89551e58070390f74e917c5d1ce0fc Mon Sep 17 00:00:00 2001 From: rinpatch Date: Thu, 20 Jun 2019 08:12:56 +0000 Subject: [PATCH 6/6] Apply suggestion to rel/files/bin/pleroma_ctl --- rel/files/bin/pleroma_ctl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rel/files/bin/pleroma_ctl b/rel/files/bin/pleroma_ctl index 03b7e57bb..62368115e 100755 --- a/rel/files/bin/pleroma_ctl +++ b/rel/files/bin/pleroma_ctl @@ -95,7 +95,7 @@ if [ -z "$1" ] || [ "$1" = "help" ]; then 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. + respectively. and any mix tasks under Pleroma namespace, for example \`mix pleroma.user COMMAND\` is