diff --git a/scripts/deploy.sh b/scripts/deploy.sh new file mode 100755 index 0000000..fbe0b1c --- /dev/null +++ b/scripts/deploy.sh @@ -0,0 +1,146 @@ +#!/bin/sh +set -eu + +: "${SOURCECRED_REMOTE:=git@github.com:sourcecred/sourcecred.git}" +: "${SOURCECRED_REF:=origin/master}" + +: "${DEPLOY_REMOTE:=git@github.com:sourcecred/sourcecred.github.io.git}" +: "${DEPLOY_BRANCH:=master}" + +export GIT_CONFIG_NOSYSTEM=1 +export GIT_ATTR_NOSYSTEM=1 + +main() { + parse_args "$@" + + toplevel="$(git -C "$(dirname "$0")" rev-parse --show-toplevel)" + cd "${toplevel}" + + sourcecred_repo= + sourcecred_site= + preview_dir= + trap cleanup EXIT + + ensure_clean_working_tree + build_and_deploy +} + +parse_args() { + while [ $# -gt 0 ]; do + case "$1" in + -n|--dry-run) + printf 'Setting DRY_RUN=1.\n' + DRY_RUN=1 + ;; + *) + printf >&2 'unknown argument: %s\n' "$1" + exit 1 + ;; + esac + shift + done +} + +# Adapted from: +# https://github.com/git/git/blob/8d530c4d64ffcc853889f7b385f554d53db375ed/git-sh-setup.sh#L207-L222 +ensure_clean_working_tree() { + err=0 + if ! git diff-files --quiet --ignore-submodules; then + printf >&2 'Cannot deploy: You have unstaged changes.\n' + err=1 + fi + if ! git diff-index --cached --quiet --ignore-submodules HEAD -- ; then + if [ "${err}" -eq 0 ]; then + printf >&2 'Cannot deploy: Your index contains uncommitted changes.\n' + else + printf >&2 'Additionally, your index contains uncommitted changes.\n' + fi + err=1 + fi + if [ "${err}" -ne 0 ]; then + exit "${err}" + fi +} + +build_and_deploy() { + sourcecred_data="$(mktemp -d --suffix ".sourcecred-data")" + export SOURCECRED_DIRECTORY="${sourcecred_data}" + + sourcecred_repo="$(mktemp -d --suffix ".sourcecred-repo")" + git clone "${SOURCECRED_REMOTE}" "${sourcecred_repo}" + sourcecred_hash="$( + git -C "${sourcecred_repo}" rev-parse --verify "${SOURCECRED_REF}" -- + )" + git -C "${sourcecred_repo}" checkout --detach "${sourcecred_hash}" + ( + cd "${sourcecred_repo}" + yarn + yarn backend + yarn build + node ./bin/sourcecred.js load sourcecred example-github + node ./bin/sourcecred.js load sourcecred example-git + node ./bin/sourcecred.js load sourcecred sourcecred + ) + + sourcecred_site="$(mktemp -d --suffix ".sourcecred-site")" + git clone "${DEPLOY_REMOTE}" "${sourcecred_site}" + + if ! base_commit="$( + git -C "${sourcecred_site}" rev-parse --verify \ + "refs/remotes/origin/${DEPLOY_BRANCH}" -- + )"; then + printf >&2 'No deploy branch %s.\n' "${DEPLOY_BRANCH}" + exit 1 + fi + git -C "${sourcecred_site}" checkout --detach "${base_commit}" + rm "${sourcecred_site}/.git/index" + git -C "${sourcecred_site}" clean -qfdx + # Explode the `build/` directory into the current directory. + find "${sourcecred_repo}/build/" -mindepth 1 -maxdepth 1 \ + \( -name .git -prune \) -o \ + -exec cp -r -t "${sourcecred_site}" -- {} + + # Copy the SourceCred data into the appropriate API route. + mkdir "${sourcecred_site}/api/" + mkdir "${sourcecred_site}/api/v1/" + cp -r "${sourcecred_data}" "${sourcecred_site}/api/v1/data" + git -C "${sourcecred_site}" add --all . + git -C "${sourcecred_site}" commit -m "deploy-v1: ${sourcecred_hash}" + deploy_commit="$(git -C "${sourcecred_site}" rev-parse HEAD)" + + preview_dir="$(mktemp -d --suffix ".sourcecred-prvw")" + git clone -q --no-local --no-checkout "${sourcecred_site}" "${preview_dir}" + git -C "${preview_dir}" checkout -q --detach "${deploy_commit}" + + printf '\n' + printf 'Please review the build output now---run:\n' + printf ' cd "%s" && python -m SimpleHTTPServer\n' "${preview_dir}" + printf 'Do you want to deploy? yes/no> ' + read -r line + if [ "${line}" = yes ]; then + ( + set -x; + git -C "${sourcecred_site}" push ${DRY_RUN:+--dry-run} \ + origin \ + "${deploy_commit}:${DEPLOY_BRANCH}" \ + ; + ) + else + printf 'Aborting.\n' + fi + + printf 'Done.\n' +} + +cleanup() { + if [ -d "${sourcecred_site}" ]; then + rm -rf "${sourcecred_site}" + fi + if [ -d "${sourcecred_repo}" ]; then + rm -rf "${sourcecred_repo}" + fi + if [ -d "${preview_dir}" ]; then + rm -rf "${preview_dir}" + fi +} + +main "$@"