From 44d78bf9aad1e7bdadecfb99cd7c27735a95525f Mon Sep 17 00:00:00 2001 From: Benjamin Wang Date: Sat, 26 Nov 2022 19:17:52 +0800 Subject: [PATCH] Automated cherry-pick of #14860: Trigger release in current branch for github workflow case Signed-off-by: ArkaSaha30 --- .github/workflows/release.yaml | 2 +- scripts/build-binary | 3 -- scripts/release | 65 +++++++++++++++++++++++++--------- scripts/test_lib.sh | 4 ++- 4 files changed, 53 insertions(+), 21 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 05b8fbcbf..cb6d09239 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -21,4 +21,4 @@ jobs: Name-Email: github-action@etcd.io Expire-Date: 0 EOF - DRY_RUN=true BRANCH=release-3.5 ./scripts/release --no-upload --no-docker-push 3.5.99 + DRY_RUN=true ./scripts/release --no-upload --no-docker-push --in-place 3.5.99 diff --git a/scripts/build-binary b/scripts/build-binary index 894652932..dd3a73092 100755 --- a/scripts/build-binary +++ b/scripts/build-binary @@ -7,7 +7,6 @@ source ./scripts/test_lib.sh VER=$1 REPOSITORY="${REPOSITORY:-git@github.com:etcd-io/etcd.git}" - if [ -z "$1" ]; then echo "Usage: ${0} VERSION" >> /dev/stderr exit 255 @@ -25,9 +24,7 @@ function setup_env { pushd "${proj}" >/dev/null run git fetch --all - git_assert_branch_in_sync || exit 2 run git checkout "${ver}" - git_assert_branch_in_sync || exit 2 popd >/dev/null } diff --git a/scripts/release b/scripts/release index c3f86da85..b3a6dd0de 100755 --- a/scripts/release +++ b/scripts/release @@ -41,6 +41,7 @@ help() { echo " flags:" echo " --no-upload: skip gs://etcd binary artifact uploads." echo " --no-docker-push: skip docker image pushes." + echo " --in-place: build binaries using current branch." echo "" echo "One can perform a (dry-run) test release from any (uncommitted) branch using:" echo " DRY_RUN=true REPOSITORY=\`pwd\` BRANCH='local-branch-name' ./scripts/release 3.5.0-foobar.2" @@ -54,8 +55,15 @@ main() { fi RELEASE_VERSION="v${VERSION}" MINOR_VERSION=$(echo "${VERSION}" | cut -d. -f 1-2) - BRANCH=${BRANCH:-"release-${MINOR_VERSION}"} - REPOSITORY=${REPOSITORY:-"https://github.com/etcd-io/etcd.git"} + + if [ "${IN_PLACE}" == 1 ]; then + # Trigger release in current branch + REPOSITORY=$(pwd) + BRANCH=$(git rev-parse --abbrev-ref HEAD) + else + REPOSITORY=${REPOSITORY:-"https://github.com/etcd-io/etcd.git"} + BRANCH=${BRANCH:-"release-${MINOR_VERSION}"} + fi log_warning "DRY_RUN=${DRY_RUN}" log_callout "RELEASE_VERSION=${RELEASE_VERSION}" @@ -78,19 +86,20 @@ main() { # Set up release directory. local reldir="/tmp/etcd-release-${VERSION}" log_callout "Preparing temporary directory: ${reldir}" - if [ ! -d "${reldir}/etcd" ]; then + if [ ! -d "${reldir}/etcd" ] && [ "${IN_PLACE}" == 0 ]; then mkdir -p "${reldir}" cd "${reldir}" run git clone "${REPOSITORY}" --branch "${BRANCH}" + run cd "${reldir}/etcd" || exit 2 + run git checkout "${BRANCH}" || exit 2 + run git pull origin + + git_assert_branch_in_sync || exit 2 fi - run cd "${reldir}/etcd" || exit 2 + # mark local directory as root for test_lib scripts executions set_root_dir - run git checkout "${BRANCH}" || exit 2 - run git pull origin - git_assert_branch_in_sync || exit 2 - # If a release version tag already exists, use it. local remote_tag_exists remote_tag_exists=$(run git ls-remote origin "refs/tags/${RELEASE_VERSION}" | grep -c "${RELEASE_VERSION}" || true) @@ -101,6 +110,7 @@ main() { fi # Check go version. + log_callout "Check go version" local go_version current_go_version go_version="go$(grep go-version .github/workflows/tests.yaml | awk '{print $2}' | tr -d '"')" current_go_version=$(go version | awk '{ print $3 }') @@ -110,6 +120,7 @@ main() { fi # If the release tag does not already exist remotely, create it. + log_callout "Create tag if not present" if [ "${remote_tag_exists}" -eq 0 ]; then # Bump version/version.go to release version. local source_version @@ -147,7 +158,7 @@ main() { fi # Push the version change if it's not already been pushed. - if [ "$DRY_RUN" != "true" ] && [ "$(git rev-list --count "origin/${BRANCH}..${BRANCH}")" -gt 0 ]; then + if [ "${DRY_RUN}" != "true" ] && [ "$(git rev-list --count "origin/${BRANCH}..${BRANCH}")" -gt 0 ]; then read -p "Push version bump up to ${VERSION} to '$(git remote get-url origin)' [y/N]? " -r confirm [[ "${confirm,,}" == "y" ]] || exit 1 maybe_run git push @@ -161,14 +172,23 @@ main() { REMOTE_REPO="origin" push_mod_tags_cmd fi - # Verify the version tag is on the right branch - local branch=$(git for-each-ref --contains "${RELEASE_VERSION}" --format="%(refname)" 'refs/heads' | cut -d '/' -f 3) - if [ "${branch}" != "${BRANCH}" ]; then - log_error "Error: Git tag ${RELEASE_VERSION} should be on branch '${BRANCH}' but is on '${branch}'" - exit 1 + if [ "${IN_PLACE}" == 0 ]; then + # Tried with `local branch=$(git branch -a --contains tags/"${RELEASE_VERSION}")` + # so as to work with both current branch and main/release-3.X. + # But got error below on current branch mode, + # Error: Git tag v3.6.99 should be on branch '* (HEAD detached at pull/14860/merge)' but is on '* (HEAD detached from pull/14860/merge)' + # + # Verify the version tag is on the right branch + # shellcheck disable=SC2155 + local branch=$(git for-each-ref --contains "${RELEASE_VERSION}" --format="%(refname)" 'refs/heads' | cut -d '/' -f 3) + if [ "${branch}" != "${BRANCH}" ]; then + log_error "Error: Git tag ${RELEASE_VERSION} should be on branch '${BRANCH}' but is on '${branch}'" + exit 1 + fi fi fi + log_callout "Verify the latest commit has the version tag" # Verify the latest commit has the version tag # shellcheck disable=SC2155 local tag="$(git describe --exact-match HEAD)" @@ -177,6 +197,7 @@ main() { exit 1 fi + log_callout "Verify the work space is clean" # Verify the clean working tree # shellcheck disable=SC2155 local diff="$(git diff HEAD --stat)" @@ -212,7 +233,7 @@ main() { fi # Upload artifacts. - if [ "${NO_UPLOAD}" == 1 ]; then + if [ "${DRY_RUN}" == "true" ] || [ "${NO_UPLOAD}" == 1 ]; then log_callout "Skipping artifact upload to gs://etcd. --no-upload flat is set." else read -p "Upload etcd ${RELEASE_VERSION} release artifacts to gs://etcd [y/N]? " -r confirm @@ -224,7 +245,7 @@ main() { fi # Push images. - if [ "${NO_DOCKER_PUSH}" == 1 ]; then + if [ "${DRY_RUN}" == "true" ] || [ "${NO_DOCKER_PUSH}" == 1 ]; then log_callout "Skipping docker push. --no-docker-push flat is set." else read -p "Publish etcd ${RELEASE_VERSION} docker images to quay.io [y/N]? " -r confirm @@ -303,6 +324,7 @@ main() { POSITIONAL=() NO_UPLOAD=0 NO_DOCKER_PUSH=0 +IN_PLACE=0 while test $# -gt 0; do case "$1" in @@ -311,6 +333,10 @@ while test $# -gt 0; do help exit 0 ;; + --in-place) + IN_PLACE=1 + shift + ;; --no-upload) NO_UPLOAD=1 shift @@ -332,4 +358,11 @@ if [[ ! $# -eq 1 ]]; then exit 1 fi +# Note that we shouldn't upload artifacts in --in-place mode, so it +# must be called with DRY_RUN=true +if [ "${DRY_RUN}" != "true" ] && [ "${IN_PLACE}" == 1 ]; then + log_error "--in-place should only be called with DRY_RUN=true" + exit 1 +fi + main "$1" diff --git a/scripts/test_lib.sh b/scripts/test_lib.sh index 44b9d2895..00047fb9f 100644 --- a/scripts/test_lib.sh +++ b/scripts/test_lib.sh @@ -365,14 +365,16 @@ function assert_no_git_modifications { # - no differencing commits in relation to the origin/$branch function git_assert_branch_in_sync { local branch - branch=$(run git rev-parse --abbrev-ref HEAD) # TODO: When git 2.22 popular, change to: # branch=$(git branch --show-current) + branch=$(run git rev-parse --abbrev-ref HEAD) + log_callout "Verify the current branch '${branch}' is clean" if [[ $(run git status --porcelain --untracked-files=no) ]]; then log_error "The workspace in '$(pwd)' for branch: ${branch} has uncommitted changes" log_error "Consider cleaning up / renaming this directory or (cd $(pwd) && git reset --hard)" return 2 fi + log_callout "Verify the current branch '${branch}' is in sync with the 'origin/${branch}'" if [ -n "${branch}" ]; then ref_local=$(run git rev-parse "${branch}") ref_origin=$(run git rev-parse "origin/${branch}")