From d2efc0f1107876704a57cd13a1be01804562d8cf Mon Sep 17 00:00:00 2001 From: Yujie Yan Date: Tue, 27 Feb 2024 10:47:33 -0800 Subject: [PATCH 01/20] feat(release): change the prerelease logic --- orbs/shared/jobs/pre-release.yaml | 53 +++++++++++++++ orbs/shared/jobs/release.yaml | 2 +- shell/ci/release/dryrun.sh | 4 +- .../{unstable-release.sh => pre-release.sh} | 67 ++++++++++--------- shell/ci/release/release.sh | 18 +---- 5 files changed, 94 insertions(+), 50 deletions(-) create mode 100644 orbs/shared/jobs/pre-release.yaml rename shell/ci/release/{unstable-release.sh => pre-release.sh} (66%) diff --git a/orbs/shared/jobs/pre-release.yaml b/orbs/shared/jobs/pre-release.yaml new file mode 100644 index 00000000..d1d54909 --- /dev/null +++ b/orbs/shared/jobs/pre-release.yaml @@ -0,0 +1,53 @@ +description: Releases a new version of the application +parameters: + node_client: + description: Build and release a Node.JS gRPC client + type: boolean + default: false + dryrun: + description: Don't actually release, just dryrun the release flow + type: boolean + default: true + machine: + description: Denotes that we're using a machine executor. Will need to set executor manually + type: boolean + default: false + resource_class: + description: The resource class to use for the release + type: string + default: "large" + release_failure_slack_channel: + description: The slack channel to notify if the release fails + type: string + default: "" + executor: + description: The executor to use for the release + type: executor + default: "testbed-docker" +resource_class: << parameters.resource_class >> +executor: << parameters.executor >> +steps: + - setup_environment: + machine: << parameters.machine >> + - when: + condition: << parameters.node_client >> + steps: + - with_node_client_cache: + build: true + - with_node_cache: + save: true + - when: + condition: << parameters.dryrun >> + steps: + - run: + name: Pre-elease (Dry-run) + command: ./scripts/shell-wrapper.sh ci/release/dryrun.sh + - unless: + condition: << parameters.dryrun >> + steps: + - run: + name: Pre-release + # disable for testing + # environment: + # RELEASE_FAILURE_SLACK_CHANNEL: << parameters.release_failure_slack_channel >> + command: ./scripts/shell-wrapper.sh ci/release/pre-release.sh diff --git a/orbs/shared/jobs/release.yaml b/orbs/shared/jobs/release.yaml index 8a8e9641..9b172115 100644 --- a/orbs/shared/jobs/release.yaml +++ b/orbs/shared/jobs/release.yaml @@ -1,4 +1,4 @@ -description: Releases a new version of the application +description: Pre-releases a new version of the application parameters: node_client: description: Build and release a Node.JS gRPC client diff --git a/shell/ci/release/dryrun.sh b/shell/ci/release/dryrun.sh index b24a1a4c..09811562 100755 --- a/shell/ci/release/dryrun.sh +++ b/shell/ci/release/dryrun.sh @@ -44,6 +44,6 @@ fi GH_TOKEN="$GH_TOKEN" yarn --frozen-lockfile semantic-release --dry-run -# Handle unstable releasing for CLIs, pre-conditions for this exist +# Handle prerelease releasing for CLIs, pre-conditions for this exist # in the script. -"$DIR/unstable-release.sh" --dry-run +"$DIR/prerelease-release.sh" --dry-run diff --git a/shell/ci/release/unstable-release.sh b/shell/ci/release/pre-release.sh similarity index 66% rename from shell/ci/release/unstable-release.sh rename to shell/ci/release/pre-release.sh index b342bfd9..774083d5 100755 --- a/shell/ci/release/unstable-release.sh +++ b/shell/ci/release/pre-release.sh @@ -1,4 +1,5 @@ #!/usr/bin/env bash + # This file contains the logic for releasing unstable code on CLI # containing repositories that have also opted to enablePrereleases # _and_ not release from the default branch (e.g. main). @@ -10,11 +11,6 @@ source "$DIR/../../lib/yaml.sh" # shellcheck source=./../../lib/bootstrap.sh source "$DIR/../../lib/bootstrap.sh" -# CIRCLE_BRANCH is the current branch we're on. If we're unable to -# determine the current branch (e.g., not running in CI) we fallback to -# attempting to parse the current branch from git. -CIRCLE_BRANCH="${CIRCLE_BRANCH:-$(git rev-parse --abbrev-ref HEAD)}" - # DRYRUN is a flag that can be passed to this script to prevent it from # actually creating a release in Github. Defaults to false and is # configurable through the --dry-run CLI flag. @@ -53,32 +49,23 @@ if [[ "$(yaml_get_field ".arguments.releaseOptions.enablePrereleases" "$(get_ser exit 0 fi -# If our prereleasesBranch is empty, or equal to the default branch -# skip this. This is to enable prereleases to be created from the `main` -# branch thereby skipping the 'unstable' release process entirely. +# Ensure we are on the prerelease branch. The default is main branch. +# It is intend to use same branch +# to run unstale release and also create prerelease to rc prereleasesBranch="$(yaml_get_field '.arguments.releaseOptions.prereleasesBranch' "$(get_service_yaml)")" -defaultBranch="$(git rev-parse --abbrev-ref origin/HEAD | sed 's/^origin\///')" -if [[ -z $prereleasesBranch ]] || [[ $prereleasesBranch == "$defaultBranch" ]]; then - echo "releaseOptions.prereleasesBranch is empty or equal to the default branch, skipping unstable release" - exit 0 -fi -# If we're not on the default branch, skip. This is to prevent +# If we're not on the prerelease branch, skip. This is to prevent # accidentally releasing from a branch that isn't mean to create # unstable releases that happened to fail releasing for whatever reason. # # Special case, skip this check if we're doing a dry-run since we will # short circuit before we actually create a release. -if [[ $CIRCLE_BRANCH != "$defaultBranch" ]] && [[ $DRYRUN == "false" ]]; then - echo "\$CIRCLE_BRANCH ($CIRCLE_BRANCH) != \$defaultBranch ($defaultBranch), skipping unstable release" +if [[ $CIRCLE_BRANCH != "$prereleasesBranch" ]] && [[ $DRYRUN == "false" ]]; then + echo "\$CIRCLE_BRANCH ($CIRCLE_BRANCH) != \$prereleaseBranch ($prereleasesBranch), skipping prerelease" exit 0 fi -# If there's no .goreleaser.yml file, skip the unstable release process. -# Otherwise, the 'make release' step would fail. -# -# IDEA(jaredallard): We should support a more customizable release -# process for things that don't use goreleaser. + if [[ ! -e "$(get_repo_directory)/.goreleaser.yml" ]]; then echo "No .goreleaser.yml, skipping creating unstable release" @@ -87,22 +74,42 @@ if [[ ! -e "$(get_repo_directory)/.goreleaser.yml" ]]; then exit 0 fi -app_version="v0.0.0-unstable+$(git rev-parse HEAD)" -echo "Creating unstable release ($app_version)" - -make release APP_VERSION="$app_version" - # If we're in dry-run mode, skip creating the release. if [[ $DRYRUN == "true" ]]; then + ## TODO: remove ater test + echo "this is dryrun" exit 0 fi -# delete unstable release+tag if it exists +# Check commit message on current branch +COMMIT_MESSAGE=$(git log --format=%B -n 1) +## TODO: remove ater test +echo "getting commit message: $COMMIT_MESSAGE" + +if [[ $COMMIT_MESSAGE == "chore: Release" ]]; then + # Pre-release to rc + echo "Creating prerelease to rc channel" + # Read the GH_TOKEN from the file + GH_TOKEN="$(cat "$HOME/.outreach/github.token")" + if [[ -z $GH_TOKEN ]]; then + echo "Failed to read Github personal access token" >&2 + fi + # Unset NPM_TOKEN to force it to use the configured ~/.npmrc + NPM_TOKEN='' GH_TOKEN=$GH_TOKEN \ + yarn --frozen-lockfile semantic-release + exit +fi + +# publish unstable release +app_version="v0.0.0-unstable+$(git rev-parse HEAD)" +echo "Creating unstable release ($app_version)" + +make release APP_VERSION="$app_version" +# delete unstable release and unstable tag if it exists gh release delete unstable -y || true git tag --delete unstable || true git push --delete origin unstable || true - -# create unstable release and upload assets to it -gh release create unstable --prerelease --generate-notes ./dist/*.tar.gz ./dist/checksums.txt +# create release and upload assets to it +gh release create unstable --prerelease=true --generate-notes ./dist/*.tar.gz ./dist/checksums.txt run_unstable_include diff --git a/shell/ci/release/release.sh b/shell/ci/release/release.sh index 9a845f59..2e73f97b 100755 --- a/shell/ci/release/release.sh +++ b/shell/ci/release/release.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Release some code +# This file contains the logic for releasing code on CLI. set -e DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" @@ -40,23 +40,7 @@ unset CIRCLE_PULL_REQUEST unset CI_PULL_REQUEST unset CI_PULL_REQUESTS -ORIGINAL_VERSION=$(git describe --match 'v[0-9]*' --tags --always HEAD) - # Unset NPM_TOKEN to force it to use the configured ~/.npmrc NPM_TOKEN='' GH_TOKEN=$GH_TOKEN \ yarn --frozen-lockfile semantic-release || send_failure_notification -NEW_VERSION=$(git describe --match 'v[0-9]*' --tags --always HEAD) - -# Determine if we updated by checking the original version from git -# vs the new version (potentially) after we ran semantic-release. -UPDATED=false -if [[ $ORIGINAL_VERSION != "$NEW_VERSION" ]]; then - UPDATED=true -fi - -# If we didn't update, assume we're on a prerelease branch -# and run the unstable-release code. -if [[ $UPDATED == "false" ]]; then - exec "$DIR/unstable-release.sh" -fi From a865381f0f05222ac252229b58e2dde0f064b2d2 Mon Sep 17 00:00:00 2001 From: Yujie Yan Date: Tue, 27 Feb 2024 15:42:00 -0800 Subject: [PATCH 02/20] fix: typo --- shell/ci/release/dryrun.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/ci/release/dryrun.sh b/shell/ci/release/dryrun.sh index 09811562..ffc58cbc 100755 --- a/shell/ci/release/dryrun.sh +++ b/shell/ci/release/dryrun.sh @@ -46,4 +46,4 @@ GH_TOKEN="$GH_TOKEN" yarn --frozen-lockfile semantic-release --dry-run # Handle prerelease releasing for CLIs, pre-conditions for this exist # in the script. -"$DIR/prerelease-release.sh" --dry-run +"$DIR/pre-release.sh" --dry-run From a470e695145047d70187ef45183250483b9ca1f4 Mon Sep 17 00:00:00 2001 From: Yujie Yan Date: Tue, 27 Feb 2024 16:04:34 -0800 Subject: [PATCH 03/20] fix: linter --- shell/ci/release/pre-release.sh | 3 +-- shell/ci/release/release.sh | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/shell/ci/release/pre-release.sh b/shell/ci/release/pre-release.sh index 774083d5..1b9a7466 100755 --- a/shell/ci/release/pre-release.sh +++ b/shell/ci/release/pre-release.sh @@ -65,7 +65,6 @@ if [[ $CIRCLE_BRANCH != "$prereleasesBranch" ]] && [[ $DRYRUN == "false" ]]; the exit 0 fi - if [[ ! -e "$(get_repo_directory)/.goreleaser.yml" ]]; then echo "No .goreleaser.yml, skipping creating unstable release" @@ -96,7 +95,7 @@ if [[ $COMMIT_MESSAGE == "chore: Release" ]]; then fi # Unset NPM_TOKEN to force it to use the configured ~/.npmrc NPM_TOKEN='' GH_TOKEN=$GH_TOKEN \ - yarn --frozen-lockfile semantic-release + yarn --frozen-lockfile semantic-release exit fi diff --git a/shell/ci/release/release.sh b/shell/ci/release/release.sh index 2e73f97b..623d74e9 100755 --- a/shell/ci/release/release.sh +++ b/shell/ci/release/release.sh @@ -43,4 +43,3 @@ unset CI_PULL_REQUESTS # Unset NPM_TOKEN to force it to use the configured ~/.npmrc NPM_TOKEN='' GH_TOKEN=$GH_TOKEN \ yarn --frozen-lockfile semantic-release || send_failure_notification - From 88a598f87445ae2ae2d9f99a8288268accefe98f Mon Sep 17 00:00:00 2001 From: Yujie Yan Date: Wed, 28 Feb 2024 09:14:33 -0800 Subject: [PATCH 04/20] fix: remove testing lines --- shell/ci/release/pre-release.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/shell/ci/release/pre-release.sh b/shell/ci/release/pre-release.sh index 1b9a7466..b603fd3f 100755 --- a/shell/ci/release/pre-release.sh +++ b/shell/ci/release/pre-release.sh @@ -75,8 +75,6 @@ fi # If we're in dry-run mode, skip creating the release. if [[ $DRYRUN == "true" ]]; then - ## TODO: remove ater test - echo "this is dryrun" exit 0 fi From 35dee940b7bb7537ec2d265075422c00e0049196 Mon Sep 17 00:00:00 2001 From: Yujie Yan Date: Mon, 4 Mar 2024 10:30:29 -0800 Subject: [PATCH 05/20] fix: add comments --- shell/ci/release/pre-release.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/shell/ci/release/pre-release.sh b/shell/ci/release/pre-release.sh index b603fd3f..5d97d49d 100755 --- a/shell/ci/release/pre-release.sh +++ b/shell/ci/release/pre-release.sh @@ -65,6 +65,11 @@ if [[ $CIRCLE_BRANCH != "$prereleasesBranch" ]] && [[ $DRYRUN == "false" ]]; the exit 0 fi +# If there's no .goreleaser.yml file, skip the unstable release process. +# Otherwise, the 'make release' step would fail. +# +# IDEA(jaredallard): We should support a more customizable release +# process for things that don't use goreleaser. if [[ ! -e "$(get_repo_directory)/.goreleaser.yml" ]]; then echo "No .goreleaser.yml, skipping creating unstable release" From 865b6e6737da98684fc337a666be2b74de0674fd Mon Sep 17 00:00:00 2001 From: Yujie Yan Date: Mon, 4 Mar 2024 15:59:00 -0800 Subject: [PATCH 06/20] fix: add script and orb to trigger rc release --- orbs/shared/jobs/trigger_rc_release.yaml | 34 +++++++++++++++++++++ service.yaml | 1 + shell/ci/release/trigger-rc-release.sh | 38 ++++++++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 orbs/shared/jobs/trigger_rc_release.yaml create mode 100755 shell/ci/release/trigger-rc-release.sh diff --git a/orbs/shared/jobs/trigger_rc_release.yaml b/orbs/shared/jobs/trigger_rc_release.yaml new file mode 100644 index 00000000..da99b1b4 --- /dev/null +++ b/orbs/shared/jobs/trigger_rc_release.yaml @@ -0,0 +1,34 @@ +description: Trigger release a new rc version of the application +parameters: + machine: + description: Denotes that we're using a machine executor. Will need to set executor manually + type: boolean + default: false + resource_class: + description: The resource class to use for the release + type: string + # This is to trigger the release job, small should be enough + default: "small" + release_failure_slack_channel: + description: The slack channel to notify if the release fails + type: string + default: "" + executor: + description: The executor to use for the release + type: executor + default: "testbed-docker" + +resource_class: << parameters.resource_class >> +executor: << parameters.executor >> +steps: + - setup_environment: + machine: << parameters.machine >> + - with_node_cache: + save: true + - checkout + - run: + name: Trigger RC Release + # disable for testing + # environment: + # RELEASE_FAILURE_SLACK_CHANNEL: << parameters.release_failure_slack_channel >> + command: ./scripts/shell-wrapper.sh ci/release/trigger-rc-release.sh diff --git a/service.yaml b/service.yaml index 2f663323..d2fa71ca 100644 --- a/service.yaml +++ b/service.yaml @@ -3,6 +3,7 @@ arguments: ciOptions: skipE2e: true skipDocker: true + autoPrerelease: false description: A collection of scripts and ci configuration lintroller: platinum oss: true diff --git a/shell/ci/release/trigger-rc-release.sh b/shell/ci/release/trigger-rc-release.sh new file mode 100755 index 00000000..5b8fe9ce --- /dev/null +++ b/shell/ci/release/trigger-rc-release.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash +# This script is to add chore: Release comit to the default pre-release +# branch to trigger pre-release. +set -eo pipefail +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" + +# shellcheck source=./../../lib/yaml.sh +source "$DIR/../../lib/yaml.sh" +# shellcheck source=./../../lib/bootstrap.sh +source "$DIR/../../lib/bootstrap.sh" + +if [[ "$(yaml_get_field ".arguments.releaseOptions.enablePrereleases" "$(get_service_yaml)")" != "true" ]]; then + echo "releaseOptions.enablePrereleases is not true, skipping rc release" + exit 0 +fi + +# Default it to use main branch, should this be configurable? +prereleaseBranch="main" +# TODO: allow to config release user in service.yaml +releaseUsername="Outreach CI" +releaseUseremail="outreach-ci@outreach.io" + +git config --global user.name "$releaseUsername" +git config --global user.email "$releaseUseremail" +git checkout $prereleaseBranch + +# Dryrun the semantic-release on prereleaseBranch to check if there is changes to release. +# If not skip the release. +releaseOutput=$(NPM_TOKEN='' yarn --frozen-lockfile semantic-release -d) +echo "$releaseOutput" + +if [[ $releaseOutput != *"Published release"* ]]; then + echo "No release will be created, skipping..." + exit 0 +fi + +git commit -m "chore: Release" --allow-empty +git push origin $prereleaseBranch From 76930f97c0c244e8a871acf2226d9e55ed44c342 Mon Sep 17 00:00:00 2001 From: Yujie Yan Date: Mon, 4 Mar 2024 16:47:17 -0800 Subject: [PATCH 07/20] fix: set branch to current if it is null --- service.yaml | 1 - shell/ci/release/pre-release.sh | 5 +++++ shell/ci/release/release.sh | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/service.yaml b/service.yaml index d2fa71ca..2f663323 100644 --- a/service.yaml +++ b/service.yaml @@ -3,7 +3,6 @@ arguments: ciOptions: skipE2e: true skipDocker: true - autoPrerelease: false description: A collection of scripts and ci configuration lintroller: platinum oss: true diff --git a/shell/ci/release/pre-release.sh b/shell/ci/release/pre-release.sh index 5d97d49d..47c5d93e 100755 --- a/shell/ci/release/pre-release.sh +++ b/shell/ci/release/pre-release.sh @@ -11,6 +11,11 @@ source "$DIR/../../lib/yaml.sh" # shellcheck source=./../../lib/bootstrap.sh source "$DIR/../../lib/bootstrap.sh" +# CIRCLE_BRANCH is the current branch we're on. If we're unable to +# determine the current branch (e.g., not running in CI) we fallback to +# attempting to parse the current branch from git. +CIRCLE_BRANCH="${CIRCLE_BRANCH:-$(git rev-parse --abbrev-ref HEAD)}" + # DRYRUN is a flag that can be passed to this script to prevent it from # actually creating a release in Github. Defaults to false and is # configurable through the --dry-run CLI flag. diff --git a/shell/ci/release/release.sh b/shell/ci/release/release.sh index 623d74e9..cf75e4b0 100755 --- a/shell/ci/release/release.sh +++ b/shell/ci/release/release.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# This file contains the logic for releasing code on CLI. +# Release some code set -e DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" From 1113b659f4165760932c75cf9a59f7c55a8115d0 Mon Sep 17 00:00:00 2001 From: Yujie Yan Date: Tue, 5 Mar 2024 12:11:23 -0800 Subject: [PATCH 08/20] fix: comments and remove testing lines --- orbs/shared/jobs/pre-release.yaml | 5 ++--- orbs/shared/jobs/trigger_rc_release.yaml | 5 ++--- shell/ci/release/pre-release.sh | 8 ++------ 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/orbs/shared/jobs/pre-release.yaml b/orbs/shared/jobs/pre-release.yaml index d1d54909..e9855bff 100644 --- a/orbs/shared/jobs/pre-release.yaml +++ b/orbs/shared/jobs/pre-release.yaml @@ -47,7 +47,6 @@ steps: steps: - run: name: Pre-release - # disable for testing - # environment: - # RELEASE_FAILURE_SLACK_CHANNEL: << parameters.release_failure_slack_channel >> + environment: + RELEASE_FAILURE_SLACK_CHANNEL: << parameters.release_failure_slack_channel >> command: ./scripts/shell-wrapper.sh ci/release/pre-release.sh diff --git a/orbs/shared/jobs/trigger_rc_release.yaml b/orbs/shared/jobs/trigger_rc_release.yaml index da99b1b4..7f0c5114 100644 --- a/orbs/shared/jobs/trigger_rc_release.yaml +++ b/orbs/shared/jobs/trigger_rc_release.yaml @@ -28,7 +28,6 @@ steps: - checkout - run: name: Trigger RC Release - # disable for testing - # environment: - # RELEASE_FAILURE_SLACK_CHANNEL: << parameters.release_failure_slack_channel >> + environment: + RELEASE_FAILURE_SLACK_CHANNEL: << parameters.release_failure_slack_channel >> command: ./scripts/shell-wrapper.sh ci/release/trigger-rc-release.sh diff --git a/shell/ci/release/pre-release.sh b/shell/ci/release/pre-release.sh index 47c5d93e..6379c990 100755 --- a/shell/ci/release/pre-release.sh +++ b/shell/ci/release/pre-release.sh @@ -55,8 +55,6 @@ if [[ "$(yaml_get_field ".arguments.releaseOptions.enablePrereleases" "$(get_ser fi # Ensure we are on the prerelease branch. The default is main branch. -# It is intend to use same branch -# to run unstale release and also create prerelease to rc prereleasesBranch="$(yaml_get_field '.arguments.releaseOptions.prereleasesBranch' "$(get_service_yaml)")" # If we're not on the prerelease branch, skip. This is to prevent @@ -89,10 +87,8 @@ if [[ $DRYRUN == "true" ]]; then fi # Check commit message on current branch +# Prerelease to rc if the latest commit is chore: Release. COMMIT_MESSAGE=$(git log --format=%B -n 1) -## TODO: remove ater test -echo "getting commit message: $COMMIT_MESSAGE" - if [[ $COMMIT_MESSAGE == "chore: Release" ]]; then # Pre-release to rc echo "Creating prerelease to rc channel" @@ -104,7 +100,7 @@ if [[ $COMMIT_MESSAGE == "chore: Release" ]]; then # Unset NPM_TOKEN to force it to use the configured ~/.npmrc NPM_TOKEN='' GH_TOKEN=$GH_TOKEN \ yarn --frozen-lockfile semantic-release - exit + exit 0 fi # publish unstable release From a09ac16098d7ca2179f4a4e73bcdf02c639ba3bb Mon Sep 17 00:00:00 2001 From: Yujie Yan Date: Tue, 5 Mar 2024 16:34:40 -0800 Subject: [PATCH 09/20] fix: address comments --- orbs/shared/jobs/pre-release.yaml | 4 ++-- orbs/shared/jobs/release.yaml | 4 ++-- shell/ci/release/dryrun.sh | 2 +- shell/ci/release/pre-release.sh | 5 +++-- shell/ci/release/release.sh | 4 ++-- shell/ci/release/trigger-rc-release.sh | 10 +++++----- 6 files changed, 15 insertions(+), 14 deletions(-) diff --git a/orbs/shared/jobs/pre-release.yaml b/orbs/shared/jobs/pre-release.yaml index e9855bff..3a2fc0e7 100644 --- a/orbs/shared/jobs/pre-release.yaml +++ b/orbs/shared/jobs/pre-release.yaml @@ -1,4 +1,4 @@ -description: Releases a new version of the application +description: Pre-releases a new version of the application parameters: node_client: description: Build and release a Node.JS gRPC client @@ -40,7 +40,7 @@ steps: condition: << parameters.dryrun >> steps: - run: - name: Pre-elease (Dry-run) + name: Pre-elease (dry run) command: ./scripts/shell-wrapper.sh ci/release/dryrun.sh - unless: condition: << parameters.dryrun >> diff --git a/orbs/shared/jobs/release.yaml b/orbs/shared/jobs/release.yaml index 9b172115..f0ef81da 100644 --- a/orbs/shared/jobs/release.yaml +++ b/orbs/shared/jobs/release.yaml @@ -1,4 +1,4 @@ -description: Pre-releases a new version of the application +description: Releases a new version of the application parameters: node_client: description: Build and release a Node.JS gRPC client @@ -44,7 +44,7 @@ steps: condition: << parameters.dryrun >> steps: - run: - name: Release (Dry-run) + name: Release (dry run) command: ./scripts/shell-wrapper.sh ci/release/dryrun.sh no_output_timeout: << parameters.no_output_timeout >> - unless: diff --git a/shell/ci/release/dryrun.sh b/shell/ci/release/dryrun.sh index ffc58cbc..5bae1430 100755 --- a/shell/ci/release/dryrun.sh +++ b/shell/ci/release/dryrun.sh @@ -44,6 +44,6 @@ fi GH_TOKEN="$GH_TOKEN" yarn --frozen-lockfile semantic-release --dry-run -# Handle prerelease releasing for CLIs, pre-conditions for this exist +# Handle prereleases for CLIs, pre-conditions for this exist # in the script. "$DIR/pre-release.sh" --dry-run diff --git a/shell/ci/release/pre-release.sh b/shell/ci/release/pre-release.sh index 6379c990..c14c9118 100755 --- a/shell/ci/release/pre-release.sh +++ b/shell/ci/release/pre-release.sh @@ -92,8 +92,9 @@ COMMIT_MESSAGE=$(git log --format=%B -n 1) if [[ $COMMIT_MESSAGE == "chore: Release" ]]; then # Pre-release to rc echo "Creating prerelease to rc channel" - # Read the GH_TOKEN from the file - GH_TOKEN="$(cat "$HOME/.outreach/github.token")" + + # Retrieve the GH_TOKEN + GH_TOKEN=$(gh auth token) if [[ -z $GH_TOKEN ]]; then echo "Failed to read Github personal access token" >&2 fi diff --git a/shell/ci/release/release.sh b/shell/ci/release/release.sh index cf75e4b0..f9154789 100755 --- a/shell/ci/release/release.sh +++ b/shell/ci/release/release.sh @@ -5,8 +5,8 @@ set -e DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" LIB_DIR="${DIR}/../../lib" -# Read the GH_TOKEN from the file -GH_TOKEN="$(cat "$HOME/.outreach/github.token")" +# Retrieve the GH_TOKEN +GH_TOKEN="$(gh auth token)" if [[ -z $GH_TOKEN ]]; then echo "Failed to read Github personal access token" >&2 fi diff --git a/shell/ci/release/trigger-rc-release.sh b/shell/ci/release/trigger-rc-release.sh index 5b8fe9ce..1f06af2c 100755 --- a/shell/ci/release/trigger-rc-release.sh +++ b/shell/ci/release/trigger-rc-release.sh @@ -16,12 +16,12 @@ fi # Default it to use main branch, should this be configurable? prereleaseBranch="main" -# TODO: allow to config release user in service.yaml -releaseUsername="Outreach CI" -releaseUseremail="outreach-ci@outreach.io" -git config --global user.name "$releaseUsername" -git config --global user.email "$releaseUseremail" +# releaseUsername=$(get_box_field 'ci.circleci.username') +# releaseUseremail=$(get_box_field 'ci.circleci.useremail') + +# git config --global user.name "$releaseUsername" +# git config --global user.email "$releaseUseremail" git checkout $prereleaseBranch # Dryrun the semantic-release on prereleaseBranch to check if there is changes to release. From 4a42d7b95b9f7b380df59c7be1aa5e6b5d194972 Mon Sep 17 00:00:00 2001 From: Yujie Yan Date: Tue, 5 Mar 2024 16:48:31 -0800 Subject: [PATCH 10/20] fix: force to trigger release for testing access token --- shell/ci/release/trigger-rc-release.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/shell/ci/release/trigger-rc-release.sh b/shell/ci/release/trigger-rc-release.sh index 1f06af2c..c8b7603a 100755 --- a/shell/ci/release/trigger-rc-release.sh +++ b/shell/ci/release/trigger-rc-release.sh @@ -26,13 +26,13 @@ git checkout $prereleaseBranch # Dryrun the semantic-release on prereleaseBranch to check if there is changes to release. # If not skip the release. -releaseOutput=$(NPM_TOKEN='' yarn --frozen-lockfile semantic-release -d) -echo "$releaseOutput" +# releaseOutput=$(NPM_TOKEN='' yarn --frozen-lockfile semantic-release -d) +# echo "$releaseOutput" -if [[ $releaseOutput != *"Published release"* ]]; then - echo "No release will be created, skipping..." - exit 0 -fi +# if [[ $releaseOutput != *"Published release"* ]]; then +# echo "No release will be created, skipping..." +# exit 0 +# fi git commit -m "chore: Release" --allow-empty git push origin $prereleaseBranch From ee735bcebe095fbd67cca1b0a324de9fcaf597d9 Mon Sep 17 00:00:00 2001 From: Yujie Yan Date: Tue, 5 Mar 2024 17:09:31 -0800 Subject: [PATCH 11/20] fix: config release uer in service.yaml and default in box --- shell/ci/release/trigger-rc-release.sh | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/shell/ci/release/trigger-rc-release.sh b/shell/ci/release/trigger-rc-release.sh index c8b7603a..d754d8a7 100755 --- a/shell/ci/release/trigger-rc-release.sh +++ b/shell/ci/release/trigger-rc-release.sh @@ -8,6 +8,9 @@ DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" source "$DIR/../../lib/yaml.sh" # shellcheck source=./../../lib/bootstrap.sh source "$DIR/../../lib/bootstrap.sh" +# shellcheck source=./../../lib/box.sh +source "$DIR/../../lib/box.sh" + if [[ "$(yaml_get_field ".arguments.releaseOptions.enablePrereleases" "$(get_service_yaml)")" != "true" ]]; then echo "releaseOptions.enablePrereleases is not true, skipping rc release" @@ -17,11 +20,16 @@ fi # Default it to use main branch, should this be configurable? prereleaseBranch="main" -# releaseUsername=$(get_box_field 'ci.circleci.username') -# releaseUseremail=$(get_box_field 'ci.circleci.useremail') +if [[ -n "$(yaml_get_field ".arguments.releaseOptions.releaseUser" "$(get_service_yaml)")" ]]; then + releaseUsername="$(yaml_get_field ".arguments.releaseOptions.releaseUser.name" "$(get_service_yaml)")" + releaseUseremail="$(yaml_get_field ".arguments.releaseOptions.releaseUser.email" "$(get_service_yaml)")" +else + releaseUsername=$(get_box_field 'ci.circleci.username') + releaseUseremail=$(get_box_field 'ci.circleci.useremail') +fi -# git config --global user.name "$releaseUsername" -# git config --global user.email "$releaseUseremail" +git config --global user.name "$releaseUsername" +git config --global user.email "$releaseUseremail" git checkout $prereleaseBranch # Dryrun the semantic-release on prereleaseBranch to check if there is changes to release. From 0ef3639918cd0767c84db5b4615dfce761bed0d1 Mon Sep 17 00:00:00 2001 From: Yujie Yan Date: Tue, 5 Mar 2024 18:41:16 -0800 Subject: [PATCH 12/20] fix: revert testing --- shell/ci/release/trigger-rc-release.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/shell/ci/release/trigger-rc-release.sh b/shell/ci/release/trigger-rc-release.sh index d754d8a7..0049767d 100755 --- a/shell/ci/release/trigger-rc-release.sh +++ b/shell/ci/release/trigger-rc-release.sh @@ -34,13 +34,13 @@ git checkout $prereleaseBranch # Dryrun the semantic-release on prereleaseBranch to check if there is changes to release. # If not skip the release. -# releaseOutput=$(NPM_TOKEN='' yarn --frozen-lockfile semantic-release -d) -# echo "$releaseOutput" +releaseOutput=$(NPM_TOKEN='' yarn --frozen-lockfile semantic-release -d) +echo "$releaseOutput" -# if [[ $releaseOutput != *"Published release"* ]]; then -# echo "No release will be created, skipping..." -# exit 0 -# fi +if [[ $releaseOutput != *"Published release"* ]]; then + echo "No release will be created, skipping..." + exit 0 +fi git commit -m "chore: Release" --allow-empty git push origin $prereleaseBranch From 60b4743ea680004d162a9c19720a5e718059b10d Mon Sep 17 00:00:00 2001 From: Yujie Yan Date: Wed, 6 Mar 2024 10:19:30 -0800 Subject: [PATCH 13/20] fix: linter --- shell/ci/release/trigger-rc-release.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/shell/ci/release/trigger-rc-release.sh b/shell/ci/release/trigger-rc-release.sh index 0049767d..a5ff243f 100755 --- a/shell/ci/release/trigger-rc-release.sh +++ b/shell/ci/release/trigger-rc-release.sh @@ -11,7 +11,6 @@ source "$DIR/../../lib/bootstrap.sh" # shellcheck source=./../../lib/box.sh source "$DIR/../../lib/box.sh" - if [[ "$(yaml_get_field ".arguments.releaseOptions.enablePrereleases" "$(get_service_yaml)")" != "true" ]]; then echo "releaseOptions.enablePrereleases is not true, skipping rc release" exit 0 From 19a79e08d74ef110a749a03579ee0695ee053d0e Mon Sep 17 00:00:00 2001 From: Yujie Yan Date: Wed, 6 Mar 2024 11:52:45 -0800 Subject: [PATCH 14/20] fix: box config for release user --- shell/ci/release/trigger-rc-release.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shell/ci/release/trigger-rc-release.sh b/shell/ci/release/trigger-rc-release.sh index a5ff243f..5b194a36 100755 --- a/shell/ci/release/trigger-rc-release.sh +++ b/shell/ci/release/trigger-rc-release.sh @@ -23,8 +23,8 @@ if [[ -n "$(yaml_get_field ".arguments.releaseOptions.releaseUser" "$(get_servic releaseUsername="$(yaml_get_field ".arguments.releaseOptions.releaseUser.name" "$(get_service_yaml)")" releaseUseremail="$(yaml_get_field ".arguments.releaseOptions.releaseUser.email" "$(get_service_yaml)")" else - releaseUsername=$(get_box_field 'ci.circleci.username') - releaseUseremail=$(get_box_field 'ci.circleci.useremail') + releaseUsername=$(get_box_field 'ci.circleci.releaseUser.name') + releaseUseremail=$(get_box_field 'ci.circleci.releaseUser.email') fi git config --global user.name "$releaseUsername" From bdfec961c585defc9b44a00728ec2d6a74b8bd22 Mon Sep 17 00:00:00 2001 From: Yujie Yan Date: Wed, 6 Mar 2024 15:00:48 -0800 Subject: [PATCH 15/20] fix: use GH_TOKEN --- shell/ci/release/trigger-rc-release.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/shell/ci/release/trigger-rc-release.sh b/shell/ci/release/trigger-rc-release.sh index 5b194a36..a8c48f46 100755 --- a/shell/ci/release/trigger-rc-release.sh +++ b/shell/ci/release/trigger-rc-release.sh @@ -33,7 +33,8 @@ git checkout $prereleaseBranch # Dryrun the semantic-release on prereleaseBranch to check if there is changes to release. # If not skip the release. -releaseOutput=$(NPM_TOKEN='' yarn --frozen-lockfile semantic-release -d) +GH_TOKEN=$(gh auth token) +releaseOutput=$(NPM_TOKEN='' GH_TOKEN=$GH_TOKEN yarn --frozen-lockfile semantic-release -d) echo "$releaseOutput" if [[ $releaseOutput != *"Published release"* ]]; then From b61cb983047a86568a438ff93910512faa535c2b Mon Sep 17 00:00:00 2001 From: Yujie Yan Date: Mon, 1 Apr 2024 15:36:35 -0700 Subject: [PATCH 16/20] fix: allow partial match the commit message --- shell/ci/release/pre-release.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/ci/release/pre-release.sh b/shell/ci/release/pre-release.sh index c14c9118..fb72e887 100755 --- a/shell/ci/release/pre-release.sh +++ b/shell/ci/release/pre-release.sh @@ -89,7 +89,7 @@ fi # Check commit message on current branch # Prerelease to rc if the latest commit is chore: Release. COMMIT_MESSAGE=$(git log --format=%B -n 1) -if [[ $COMMIT_MESSAGE == "chore: Release" ]]; then +if [[ $COMMIT_MESSAGE =~ "chore: Release" ]]; then # Pre-release to rc echo "Creating prerelease to rc channel" From 66205ff3676d07e965b84231367ef12a9443605b Mon Sep 17 00:00:00 2001 From: Devbase CI Date: Tue, 2 Apr 2024 13:06:06 -0700 Subject: [PATCH 17/20] fix: skip release dryrun for empty change --- shell/ci/release/dryrun.sh | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/shell/ci/release/dryrun.sh b/shell/ci/release/dryrun.sh index 5bae1430..2b54a7fb 100755 --- a/shell/ci/release/dryrun.sh +++ b/shell/ci/release/dryrun.sh @@ -34,16 +34,21 @@ git checkout "$CIRCLE_BRANCH" # Squash our branch onto the HEAD (default) branch to mimic # what would happen after merge. -git merge --squash "$OLD_CIRCLE_BRANCH" -git commit -m "$COMMIT_MESSAGE" - -GH_TOKEN="$(cat "$HOME/.outreach/github.token")" -if [[ -z $GH_TOKEN ]]; then - echo "Failed to read Github personal access token" >&2 +if ! git diff --quiet "$OLD_CIRCLE_BRANCH" ; then + git merge --squash "$OLD_CIRCLE_BRANCH" + git commit -m "$COMMIT_MESSAGE" + GH_TOKEN="$(cat "$HOME/.outreach/github.token")" + if [[ -z $GH_TOKEN ]]; then + echo "Failed to read Github personal access token" >&2 + fi + + GH_TOKEN="$GH_TOKEN" yarn --frozen-lockfile semantic-release --dry-run + + # Handle prereleases for CLIs, pre-conditions for this exist + # in the script. + "$DIR/pre-release.sh" --dry-run +else + echo "No changes to release" fi -GH_TOKEN="$GH_TOKEN" yarn --frozen-lockfile semantic-release --dry-run -# Handle prereleases for CLIs, pre-conditions for this exist -# in the script. -"$DIR/pre-release.sh" --dry-run From e75ec638e027d54fa986b3dbfc5679c95210e650 Mon Sep 17 00:00:00 2001 From: Yujie Yan <134322381+yj-yan@users.noreply.github.com> Date: Wed, 24 Apr 2024 11:27:40 -0700 Subject: [PATCH 18/20] use gh auth Co-authored-by: Mark Lee --- shell/ci/release/dryrun.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/ci/release/dryrun.sh b/shell/ci/release/dryrun.sh index 2b54a7fb..ca8ab267 100755 --- a/shell/ci/release/dryrun.sh +++ b/shell/ci/release/dryrun.sh @@ -37,7 +37,7 @@ git checkout "$CIRCLE_BRANCH" if ! git diff --quiet "$OLD_CIRCLE_BRANCH" ; then git merge --squash "$OLD_CIRCLE_BRANCH" git commit -m "$COMMIT_MESSAGE" - GH_TOKEN="$(cat "$HOME/.outreach/github.token")" + GH_TOKEN="$(gh auth token)" if [[ -z $GH_TOKEN ]]; then echo "Failed to read Github personal access token" >&2 fi From 15f01c94fccc0a2820e07bd35ccdbbc37ffc0fb4 Mon Sep 17 00:00:00 2001 From: Yujie Yan <134322381+yj-yan@users.noreply.github.com> Date: Wed, 24 Apr 2024 11:28:04 -0700 Subject: [PATCH 19/20] update description Co-authored-by: Mark Lee --- orbs/shared/jobs/trigger_rc_release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/orbs/shared/jobs/trigger_rc_release.yaml b/orbs/shared/jobs/trigger_rc_release.yaml index 7f0c5114..f496e554 100644 --- a/orbs/shared/jobs/trigger_rc_release.yaml +++ b/orbs/shared/jobs/trigger_rc_release.yaml @@ -1,4 +1,4 @@ -description: Trigger release a new rc version of the application +description: Trigger release a new RC version of the application parameters: machine: description: Denotes that we're using a machine executor. Will need to set executor manually From 26b9cb0772137ea87bd96b7e8628dfe3037b13e4 Mon Sep 17 00:00:00 2001 From: Yujie Yan Date: Wed, 24 Apr 2024 13:59:27 -0700 Subject: [PATCH 20/20] fix format --- shell/ci/release/dryrun.sh | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/shell/ci/release/dryrun.sh b/shell/ci/release/dryrun.sh index 125682d2..e9949fe3 100755 --- a/shell/ci/release/dryrun.sh +++ b/shell/ci/release/dryrun.sh @@ -36,21 +36,19 @@ git checkout "$CIRCLE_BRANCH" # Squash our branch onto the HEAD (default) branch to mimic # what would happen after merge. -if ! git diff --quiet "$OLD_CIRCLE_BRANCH" ; then - git merge --squash "$OLD_CIRCLE_BRANCH" - git commit -m "$COMMIT_MESSAGE" - GH_TOKEN="$(gh auth token)" - if [[ -z $GH_TOKEN ]]; then - echo "Failed to read Github personal access token" >&2 - fi - - GH_TOKEN="$GH_TOKEN" yarn --frozen-lockfile semantic-release --dry-run - - # Handle prereleases for CLIs, pre-conditions for this exist - # in the script. - "$DIR/pre-release.sh" --dry-run +if ! git diff --quiet "$OLD_CIRCLE_BRANCH"; then + git merge --squash "$OLD_CIRCLE_BRANCH" + git commit -m "$COMMIT_MESSAGE" + GH_TOKEN="$(gh auth token)" + if [[ -z $GH_TOKEN ]]; then + echo "Failed to read Github personal access token" >&2 + fi + + GH_TOKEN="$GH_TOKEN" yarn --frozen-lockfile semantic-release --dry-run + + # Handle prereleases for CLIs, pre-conditions for this exist + # in the script. + "$DIR/pre-release.sh" --dry-run else - echo "No changes to release" + echo "No changes to release" fi - -