diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8853a3ce..aff8deb9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -52,6 +52,8 @@ jobs: fi make build + - name: prepare release + run: ./scripts/release/prepare-release.sh - name: publish run: | if [[ "$DRY_RUN" = true ]]; then @@ -59,9 +61,12 @@ jobs: else ./scripts/release/publish.sh fi + - name: release details + run: | + git show -p ls -1a "$ARTIFACT_DIRECTORY" - - name: commit changes and tag - run: ./scripts/release/commit-and-tag.sh + - name: create tag + run: ./scripts/release/create-tag.sh - name: create Github release uses: ncipollo/release-action@v1.14.0 if: ${{ !inputs.dryRun }} diff --git a/scripts/release/commit-and-tag.sh b/scripts/release/commit-and-tag.sh deleted file mode 100755 index 47c80132..00000000 --- a/scripts/release/commit-and-tag.sh +++ /dev/null @@ -1,59 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -release_tag="v${LD_RELEASE_VERSION}" - -tag_exists() ( - git fetch --tags - git rev-parse "${release_tag}" >/dev/null 2>&1 -) - -update_changelog() ( - local ts=$(date +"%Y-%m-%d") - # multiline strings don't seem to be supported for GHA inputs, so for now we - # require that the changelog include \n characters for new lines and then we - # just expand them here - # TODO improve this - local changelog_content=$(printf "%b" "$CHANGELOG_ENTRY") - local changelog_entry=$(printf "## [%s] - %s\n%s\n" "$LD_RELEASE_VERSION" "$ts" "$changelog_content") - - # insert the new changelog entry (followed by empty line) after line 4 - # of CHANGELOG.md - sed -i "4r /dev/stdin" CHANGELOG.md <<< "$changelog_entry"$'\n' -) - -release_summary() ( - echo "Changes staged for release $release_tag:" - git diff - - echo "Updated CHANGELOG:" - cat CHANGELOG.md -) - -commit_and_tag() ( - if tag_exists; then - echo "Tag $release_tag already exists. Aborting." - exit 1 - fi - - update_changelog - release_summary - - git config user.name "LaunchDarklyReleaseBot" - git config user.email "releasebot@launchdarkly.com" - git add . - git commit -m "Prepare release ${release_tag}" - git tag "${release_tag}" - git push origin HEAD - git push origin "${release_tag}" -) - -if [[ "$DRY_RUN" == "true" ]]; then - update_changelog - release_summary - echo "Dry run mode: skipping commit, tag, and push" -else - commit_and_tag -fi - diff --git a/scripts/release/create-tag.sh b/scripts/release/create-tag.sh new file mode 100755 index 00000000..796d86ec --- /dev/null +++ b/scripts/release/create-tag.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +set -euo pipefail + +release_tag="v${LD_RELEASE_VERSION}" + +tag_exists() ( + git fetch --tags + git rev-parse "${release_tag}" >/dev/null 2>&1 +) + +create_tag() ( + if tag_exists; then + echo "Tag $release_tag already exists. Aborting." + exit 1 + fi + + git tag "${release_tag}" + git push origin HEAD + git push origin "${release_tag}" +) + +if [[ "$DRY_RUN" == "true" ]]; then + git reset --hard HEAD^ + echo "Dry run mode: skipping tag and push" +else + create_tag +fi + diff --git a/scripts/release/prepare-release.sh b/scripts/release/prepare-release.sh index 3717dcd7..20952b2f 100755 --- a/scripts/release/prepare-release.sh +++ b/scripts/release/prepare-release.sh @@ -4,17 +4,6 @@ set -euo pipefail release_tag="v${LD_RELEASE_VERSION}" -stage_artifacts() ( - local target=$1 - - echo "$DOCKER_TOKEN" | sudo docker login --username "$DOCKER_USERNAME" --password-stdin - - sudo PATH="$PATH" GITHUB_TOKEN="$GITHUB_TOKEN" make "$target" - - mkdir -p "$ARTIFACT_DIRECTORY" - cp ./dist/*.deb ./dist/*.rpm ./dist/*.tar.gz ./dist/*.txt "$ARTIFACT_DIRECTORY" -) - update_go() ( sed -i "s/const Version =.*/const Version = \"${LD_RELEASE_VERSION}\"/g" internal/version/version.go ) @@ -34,13 +23,27 @@ update_bitbucket() ( sed -i "s#image: launchdarkly/ld-find-code-refs-bitbucket-pipeline:.*#image: launchdarkly/ld-find-code-refs-bitbucket-pipeline:${LD_RELEASE_VERSION}#g" build/metadata/bitbucket/pipe.yml ) -prepare_release() ( - # create artifacts with goreleaser - stage_artifacts $1 - - # update metadata files - update_go - update_orb - update_gha - update_bitbucket +update_changelog() ( + local ts=$(date +"%Y-%m-%d") + # multiline strings don't seem to be supported for GHA inputs, so for now we + # require that the changelog include \n characters for new lines and then we + # just expand them here + # TODO improve this + local changelog_content=$(printf "%b" "$CHANGELOG_ENTRY") + local changelog_entry=$(printf "## [%s] - %s\n%s\n" "$LD_RELEASE_VERSION" "$ts" "$changelog_content") + + # insert the new changelog entry (followed by empty line) after line 4 + # of CHANGELOG.md + sed -i "4r /dev/stdin" CHANGELOG.md <<< "$changelog_entry"$'\n' ) + +update_go +update_orb +update_gha +update_bitbucket +update_changelog + +git config user.name "LaunchDarklyReleaseBot" +git config user.email "releasebot@launchdarkly.com" +git add . +git commit -m "Prepare release ${release_tag}" diff --git a/scripts/release/publish-dry-run.sh b/scripts/release/publish-dry-run.sh index 81808403..4e95e110 100755 --- a/scripts/release/publish-dry-run.sh +++ b/scripts/release/publish-dry-run.sh @@ -2,8 +2,8 @@ set -euo pipefail -source $(dirname $0)/prepare_release.sh -prepare_release products-for-release +source $(dirname $0)/stage-artifacts.sh +stage-artifacts products-for-release # Copy the Docker image that goreleaser just built into the artifacts - we only do # this in a dry run, because in a real release the image will be available from diff --git a/scripts/release/publish.sh b/scripts/release/publish.sh index 3de16725..a9cc6165 100755 --- a/scripts/release/publish.sh +++ b/scripts/release/publish.sh @@ -2,8 +2,8 @@ set -euo pipefail -source $(dirname $0)/prepare-release.sh -prepare_release publish +source $(dirname $0)/stage-artifacts.sh +stage-artifacts publish # make bitbucket and github known hosts to push successfully mkdir -m700 ~/.ssh diff --git a/scripts/release/stage-artifacts.sh b/scripts/release/stage-artifacts.sh new file mode 100755 index 00000000..918f2d64 --- /dev/null +++ b/scripts/release/stage-artifacts.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +set -euo pipefail + +stage_artifacts() ( + local target=$1 + + echo "$DOCKER_TOKEN" | sudo docker login --username "$DOCKER_USERNAME" --password-stdin + + sudo PATH="$PATH" GITHUB_TOKEN="$GITHUB_TOKEN" make "$target" + + mkdir -p "$ARTIFACT_DIRECTORY" + cp ./dist/*.deb ./dist/*.rpm ./dist/*.tar.gz ./dist/*.txt "$ARTIFACT_DIRECTORY" +)