sourcecred/scripts/deploy.sh

147 lines
4.3 KiB
Bash
Executable File

#!/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 "$@"