From 5da0af26a0adc41cb42a8b3ea74647337dc798ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krist=C3=B3f=20T=C3=B3th?= Date: Mon, 30 Sep 2019 15:08:04 +0200 Subject: [PATCH] Rework release tooling --- hack/libhack/baseimage.sh | 113 ++++++-------------------------------- hack/libhack/common.sh | 15 +++++ hack/libhack/frontend.sh | 34 ++++++++++++ hack/tfw.sh | 27 +++++---- 4 files changed, 81 insertions(+), 108 deletions(-) create mode 100644 hack/libhack/frontend.sh diff --git a/hack/libhack/baseimage.sh b/hack/libhack/baseimage.sh index 9f006b9..b8a50d6 100644 --- a/hack/libhack/baseimage.sh +++ b/hack/libhack/baseimage.sh @@ -8,112 +8,33 @@ libhack_dir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" source "${libhack_dir}/common.sh" -baseimage::build_as_latest() { - pushd "${BASEIMAGE_PATH}" - baseimage::build - baseimage::tag_as_latest - popd -} - -baseimage::build() { - pushd "${BASEIMAGE_PATH}" - docker build -t "${BASEIMAGE_NAME}:$(releasename)" \ - . - popd -} - -baseimage::build_if_exists() { - if [[ -d "$BASEIMAGE_PATH" ]]; then - baseimage::build_as_latest +baseimage::assert_exists() { + if [[ ! -d "${BASEIMAGE_PATH}" ]]; then + exit 0 fi } -baseimage::tag_as_latest() { - docker tag "${BASEIMAGE_NAME}:$(releasename)" "${BASEIMAGE_NAME}:latest" +baseimage::build_if_exists() { + [[ ! -d "${BASEIMAGE_PATH}" ]] && return ||: + pushd "${BASEIMAGE_PATH}" + local tag + tag="${BASEIMAGE_NAME}:$(releasename)" + docker build -t "${tag}" . + docker tag "${tag}" "${BASEIMAGE_NAME}:latest" + popd } baseimage::release() { pushd "${BASEIMAGE_PATH}" - check_drone_releasename - local tag tag="$(releasename)" - read -p "Tag and push new TFW version \"${tag}\"? [y/N]" -r && echo + read -p "Tag and push baseimage \"${tag}\"? [y/N]" -r && echo if [[ $REPLY =~ ^(y|Y|yes|Yes|YES)$ ]]; then - prompt_for_tag_description # This command sets $description - tag="${tag}" description="${description}" force_push_tag + printf "Pushing git tag to upstream...\n" + tag="${tag}" description="${tag}" force_push_tag + printf "\nPushing image to DockerHub...\n" + docker push "${BASEIMAGE_NAME}:${tag}" + docker push "${BASEIMAGE_NAME}:latest" fi popd } - -baseimage::builddocs() { - mount_point="/mnt/docs" - - docker run --rm \ - -ti \ - -v "${BASEIMAGE_PATH}"/docs:"${mount_point}" \ - "${BASEIMAGE_NAME}" \ - /bin/bash -c \ - "cd ${mount_point} - pip3 install sphinx - make html - exit" \ - &> /dev/null - - if [ "$?" == "0" ]; then - echo "Built baseimage docs at ${BASEIMAGE_PATH}/docs/build/html!" - else - echo "Building baseimage docs failed!" - fi -} - -releasename() { - local version - local date - version="$(cat VERSION | head -n 1)" - date="$(date +%Y%m%d)" - printf "${version}-${date}" -} - -check_drone_releasename() { - local drone_releasename - local actual_releasename - drone_releasename="$(grep -oP '(?<=branch:\srefs/tags/).+(?=-.+)' .drone.yml)" - actual_releasename="$(releasename | grep -oP ".+(?=-\d{8})")" - if [ "${drone_releasename}" != "${actual_releasename}" ]; then - echo "Release name '${drone_releasename}' in .drone.yml does not match \ - actual release name '${actual_releasename}' in VERSION." - echo "Please make them match before releasing!" - exit 1 - fi -} - -prompt_for_tag_description() { - local editor - local tempfile - editor="$(git config --global core.editor)" - tempfile="$(mktemp)" - - printf "\n\n" >> "${tempfile}" - echo "# Please enter the description for this release." >> "${tempfile}" - echo "# Lines starting with '#' will be ignored." >> "${tempfile}" - echo "# An empty description aborts the release." >> "${tempfile}" - - ${editor} "${tempfile}" - sed -i -e 's/#.*$//' -e '/^$/d' "${tempfile}" - sed -i 's/\n/ /g' "${tempfile}" - if [[ ! -s "${tempfile}" ]]; then - echo "Aborting release due to empty description." - exit 1 - fi - - description="$(tr '\n' ' ' < "${tempfile}")" - rm "${tempfile}" -} - -force_push_tag() { - git tag -d "${tag}" > /dev/null 2>&1 || : - git push --delete origin "${tag}" > /dev/null 2>&1 || : - git tag -s -m "${description}" "${tag}" - git push origin "${tag}" -} diff --git a/hack/libhack/common.sh b/hack/libhack/common.sh index 95a908b..075fef2 100644 --- a/hack/libhack/common.sh +++ b/hack/libhack/common.sh @@ -5,3 +5,18 @@ pushd() { popd() { command popd "$@" > /dev/null } + +releasename() { + local version + local date + version="$(cat VERSION | head -n 1)" + date="$(date +%Y%m%d)" + printf "${version}-${date}" +} + +force_push_tag() { + git tag -d "${tag}" > /dev/null 2>&1 || : + git push --delete origin "${tag}" > /dev/null 2>&1 || : + git tag -s -m "${description}" "${tag}" + git push origin "${tag}" +} diff --git a/hack/libhack/frontend.sh b/hack/libhack/frontend.sh new file mode 100644 index 0000000..43ab2b8 --- /dev/null +++ b/hack/libhack/frontend.sh @@ -0,0 +1,34 @@ +# Requires context: +# - FRONTEND_PATH: absolute path of frontend repo + +FRONTEND_IMAGE_NAME="${FRONTEND_IMAGE_NAME:-avatao/frontend-tutorial-framework}" + +libhack_dir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" +source "${libhack_dir}/common.sh" + + +frontend::assert_exists() { + if [[ ! -d "${FRONTEND_PATH}" ]]; then + exit 0 + fi +} + +frontend::build() { + pushd "${FRONTEND_PATH}" + docker build -t "${FRONTEND_IMAGE_NAME}:$(releasename)" . + popd +} + +frontend::release() { + pushd "${FRONTEND_PATH}" + local tag + tag="$(releasename)" + read -p "Tag and push frontend \"${tag}\"? [y/N]" -r && echo + if [[ $REPLY =~ ^(y|Y|yes|Yes|YES)$ ]]; then + printf "Pushing git tag to upstream...\n" + tag="${tag}" description="${tag}" force_push_tag + printf "\nPushing image to DockerHub...\n" + docker push "${FRONTEND_IMAGE_NAME}:${tag}" + fi + popd +} diff --git a/hack/tfw.sh b/hack/tfw.sh index 4590a64..3ade1f1 100755 --- a/hack/tfw.sh +++ b/hack/tfw.sh @@ -18,6 +18,7 @@ FRONTEND_PATH="${TFW_PATH}/${FRONTEND_REPO}" source "${SCRIPT_DIR}/libhack/baseimage.sh" source "${SCRIPT_DIR}/libhack/challenge.sh" +source "${SCRIPT_DIR}/libhack/frontend.sh" case ${1:-} in @@ -29,30 +30,32 @@ case ${1:-} in run) challenge:run ${@:2} ;; - buildtfw) + build-baseimage) baseimage::build_if_exists ;; build) baseimage::build_if_exists challenge::build_no_cache ;; - releasetfw) - if [[ -d "$BASEIMAGE_PATH" ]]; then - baseimage::release - fi + build-frontend) + frontend::assert_exists + frontend::build ;; - builddocs) - if [[ -d "$BASEIMAGE_PATH" ]]; then - baseimage::builddocs - fi + release-baseimage) + baseimage::assert_exists + baseimage::release + ;; + release-frontend) + frontend::assert_exists + frontend::release ;; *) echo "Usage: tfw.sh [COMMAND]" echo " |--- start: build & run TFW challenge" echo " |--- run: run TFW challenge" - echo " |--- buildtfw: build TFW baseimage" + echo " |--- build-baseimage: build TFW baseimage" echo " |--- build: build TFW baseimage and challenge" - echo " |--- releasetfw: tag TFW baseimage and push to upstream" - echo " |--- builddocs: build baseimage documentation (in docs/build/html)" + echo " |--- release-baseimage: tag TFW baseimage and push to DockerHub" + echo " |--- release-frontend: tag TFW frontend and push to DockerHub" ;; esac