[Main] Create New Release #58
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
## | ||
# Copyright (C) 2025 Hedera Hashgraph, LLC | ||
# | ||
# Licensed under the Apache License, Version 2.0 (the "License"); | ||
# you may not use this file except in compliance with the License. | ||
# You may obtain a copy of the License at | ||
# | ||
# http://www.apache.org/licenses/LICENSE-2.0 | ||
# | ||
# Unless required by applicable law or agreed to in writing, software | ||
# distributed under the License is distributed on an "AS IS" BASIS, | ||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
# See the License for the specific language governing permissions and | ||
# limitations under the License. | ||
## | ||
name: "[Main] Create New Release" | ||
on: | ||
workflow_dispatch: | ||
inputs: | ||
build_number: | ||
description: "Build Number (ex: 43 = build_00043)" | ||
type: string | ||
required: true | ||
dry-run-enabled: | ||
description: "Perform Dry Run" | ||
type: boolean | ||
required: false | ||
default: false | ||
defaults: | ||
run: | ||
shell: bash | ||
permissions: | ||
id-token: write | ||
contents: read | ||
actions: read | ||
jobs: | ||
create-new-release: | ||
name: Create New Release | ||
runs-on: network-node-linux-medium | ||
steps: | ||
- name: Harden Runner | ||
uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 | ||
with: | ||
egress-policy: audit | ||
- name: Process, Validate, and Pad Build Input | ||
id: validate | ||
run: | | ||
echo "The input is ${{ inputs.build_number }}" | ||
if ! [[ "${{ inputs.build_number }}" =~ ^[0-9]+$ ]]; then | ||
echo "Input is not a valid integer" | ||
exit 1 | ||
fi | ||
echo "Input is a valid integer: $(( ${{ inputs.build_number }} ))" | ||
# 5-digit padding | ||
padded_number=$(printf "%05d" ${{ inputs.build_number }}) | ||
echo "Padded number is: $padded_number" | ||
# Add "build_" prefix to the padded number | ||
build_tag="build-$padded_number" | ||
echo "Prefixed number is: $build_tag" | ||
# Export to Github output and Github summary | ||
echo "BUILD_TAG=$build_tag" >> ${GITHUB_OUTPUT} | ||
printf "Build Tag to Release: ${BUILD_TAG}" >> ${GITHUB_STEP_SUMMARY} | ||
- name: Checkout Code | ||
id: checkout_code | ||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | ||
with: | ||
fetch-depth: "0" | ||
ref: ${{ steps.validate.outputs.BUILD_TAG }} | ||
token: ${{ secrets.GH_ACCESS_TOKEN }} | ||
- name: Display Current Branch or Tag | ||
run: | | ||
# Check if it's a tag | ||
if git describe --exact-match --tags >/dev/null 2>&1; then | ||
echo "Checked out tag: $(git describe --exact-match --tags)" | ||
else | ||
echo "Checked out branch: $(git symbolic-ref --short HEAD)" | ||
fi | ||
- name: Import GPG Key | ||
uses: step-security/ghaction-import-gpg@6c8fe4d0126a59d57c21f87c9ae5dd3451fa3cca # v6.1.0 | ||
with: | ||
git_commit_gpgsign: true | ||
git_tag_gpgsign: true | ||
git_user_signingkey: true | ||
gpg_private_key: ${{ secrets.SVCS_GPG_KEY_CONTENTS }} | ||
passphrase: ${{ secrets.SVCS_GPG_KEY_PASSPHRASE }} | ||
- name: Setup Node | ||
uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 | ||
with: | ||
node-version: 20 | ||
- name: Calculate Temporary Semantic Release Branch Name | ||
id: branch_name | ||
run: | | ||
Check failure on line 105 in .github/workflows/flow-trigger-release.yaml GitHub Actions / [Main] Create New ReleaseInvalid workflow file
|
||
echo "BRANCH_NAME=temp/${{ steps.validate.outputs.BUILD_TAG }}" >> ${GITHUB_OUTPUT} | ||
echo "The temp branch name is: ${BRANCH_NAME}" | ||
printf "The temp branch name for release is: ${{ BRANCH_NAME }}" >> ${GITHUB_STEP_SUMMARY} | ||
- name: Create a Temporary Semantic Release Branch | ||
run: | | ||
echo "Going to run the following command:" | ||
echo "git checkout -b ${{ steps.branch_name.outputs.BRANCH_NAME }}" | ||
git checkout -b ${{ steps.branch_name.outputs.BRANCH_NAME }} | ||
- name: Echo Current Branch Name | ||
run: | | ||
current_branch=$(git symbolic-ref --short HEAD) | ||
echo "Currently on branch: $current_branch" | ||
- name: Push Temporary Branch to Origin | ||
run: | | ||
echo "Pushing branch to origin:" | ||
git push --set-upstream origin ${{ steps.branch_name.outputs.BRANCH_NAME }} | ||
- name: Git-Semver Setup Action | ||
uses: DJ-BBot/setup-git-semver@7ede9a8b0c0f4cfff14e9b0a8771dbc546f2b76b # v1.0.1 | ||
- name: Identify Current Version Number | ||
run: | | ||
echo "Find the current version number" | ||
current_version=$(git-semver latest) | ||
echo "Current version is: ${current_version}" | ||
# IF HIERO/HEDERA TRANSITIONS TO A MAJOR RELEASE NUMBER (1.0.0+) | ||
# stable = false WILL NO LONGER BE VALID | ||
- name: Compute Next Version Number | ||
id: next_version | ||
run: | | ||
echo "Compute next version number using git-semver" | ||
echo "next_release=$(git-semver next --stable=false)" >> ${GITHUB_OUTPUT} | ||
echo "Next release version is: ${next_release}" | ||
#printf "Next Release Version Number: ${next_release}" >> ${GITHUB_STEP_SUMMARY} | ||
- name: Apply Tag with Calculated Next Version | ||
run: | | ||
echo "Applying computed version tag" | ||
git tag -a v${{ steps.next_version.outputs.next_release }} -m "v${{ steps.next_version.outputs.next_release }}" | ||
echo "Applied tag v${{ steps.next_version.outputs.next_release }}" | ||
printf "Version Tag Applied: v${{ steps.next_version.outputs.next_release }}" >> ${GITHUB_STEP_SUMMARY} | ||
- name: Identify Current Version Number After Tagging | ||
run: | | ||
echo "Find the current version number after we applied the new tag" | ||
current_version=$(git-semver latest) | ||
echo "Current version is: ${current_version}" | ||
echo "Should match version we just applied: ${{ steps.next_version.outputs.next_release }}" | ||
- name: Create Release Notes with Conventional Commits | ||
run: | | ||
echo git-semver log --conventional-commits ${{ steps.next_version.outputs.next_release }} | ||
git-semver log --conventional-commits ${{ steps.next_version.outputs.next_release }} | ||
- name: Create Release Notes with Markdown | ||
run: | | ||
echo git-semver log --markdown ${{ steps.next_version.outputs.next_release }} | ||
git-semver log --markdown ${{ steps.next_version.outputs.next_release }} | ||
- name: Clean Up git-semver | ||
run: | | ||
echo "Deleting git-semver directory" | ||
rm -rf git-semver | ||
echo "Successfully removed git-semver directory" | ||
- name: View Status After Running Semantic Release | ||
run: git status | ||
# TODO: Remove this delete step before merging to mainline | ||
- name: Delete Created Tag | ||
if: always() | ||
run: | | ||
git tag --delete v${{ steps.next_version.outputs.next_release }} | ||
- name: Ensure Branch Not in Use and Delete Worktree | ||
if: always() | ||
run: | | ||
# Switch to main | ||
git checkout main | ||
# Check if the branch is associated with a worktree and remove the worktree if it exists | ||
worktree_path=$(git worktree list | grep ${{ steps.branch_name.outputs.BRANCH_NAME }} || true) | ||
if [ -n "$worktree_path" ]; then | ||
echo "Removing worktree at $worktree_path" | ||
git worktree remove "$worktree_path" | ||
else | ||
echo "No worktree found for branch ${{ steps.branch_name.outputs.BRANCH_NAME }}" | ||
fi | ||
- name: Delete the Temporary Semantic Release Branch | ||
if: always() | ||
run: | | ||
echo "Deleting the temporary semantic release branch" | ||
echo "Deleting local branch now:" | ||
git branch -d ${{ steps.branch_name.outputs.BRANCH_NAME }} | ||
printf "Deleted Temporary Branch from Local Runner\n" >> ${GITHUB_STEP_SUMMARY} | ||
echo "Deleting remote branch now:" | ||
git push -d origin ${{ steps.branch_name.outputs.BRANCH_NAME }} | ||
printf "Deleted Temporary Branch from Remote" >> ${GITHUB_STEP_SUMMARY} |