55 workflow_dispatch :
66 inputs :
77 release-type :
8- description : ' Type of release to perform'
8+ description : " Type of release to perform"
99 required : true
1010 type : choice
1111 options :
1212 - preview # Show what would be released (dry-run)
1313 - release # Full production release
14- default : ' preview'
14+ default : " preview"
1515
1616defaults :
1717 run :
2525 ats-release :
2626 name : Create ATS Release
2727 runs-on : token-studio-linux-large
28- # Only allow authorized teams to trigger releases per CODEOWNERS
29- if : >
30- github.event_name == 'workflow_dispatch' && (
31- contains(fromJSON('["platform-ci", "platform-ci-committers", "release-engineering-managers", "developer-advocates", "iobuilders-hedera"]'),
32- github.actor) ||
33- contains(github.actor, 'hashgraph')
34- )
3528
3629 steps :
3730 - name : Harden Runner
@@ -49,38 +42,35 @@ jobs:
4942 - name : Setup NodeJS Environment
5043 uses : actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
5144 with :
52- node-version : 22.x
45+ node-version : v22.20.0
5346
5447 - name : Install dependencies
5548 run : npm ci
5649
5750 - name : Validate ATS changesets exist
5851 id : validate
5952 run : |
60- # Use changeset status with JSON output to detect ATS packages with changes
6153 echo "📋 Getting changeset status..."
6254 npx changeset status --output=changeset-status.json
6355
64- # Parse JSON to check if ATS packages have pending changes
6556 ATS_PACKAGES_TO_BUMP=$(jq -r '.releases[] | select(.name | test("@hashgraph/asset-tokenization-")) | .name' changeset-status.json | wc -l)
6657
67- echo "ats-packages-to-bump=$ATS_PACKAGES_TO_BUMP" >> $ GITHUB_OUTPUT
58+ echo "ats-packages-to-bump=${ ATS_PACKAGES_TO_BUMP} " >> "${ GITHUB_OUTPUT}"
6859
69- if [ "$ATS_PACKAGES_TO_BUMP" -eq 0 ]; then
60+ if [ "${ ATS_PACKAGES_TO_BUMP} " -eq 0 ]; then
7061 echo "❌ No ATS packages found to be bumped"
7162 echo "📋 Current changeset status:"
7263 npx changeset status
7364 exit 1
7465 fi
7566
76- echo "✅ Found $ATS_PACKAGES_TO_BUMP ATS package(s) ready for release"
67+ echo "✅ Found ${ ATS_PACKAGES_TO_BUMP} ATS package(s) ready for release"
7768
78- # Show which packages will be bumped
7969 echo "📦 ATS packages to be released:"
8070 jq -r '.releases[] | select(.name | test("@hashgraph/asset-tokenization-")) | " - \(.name) (\(.oldVersion) → \(.newVersion))"' changeset-status.json
8171
8272 - name : Preview ATS release
83- if : inputs.release-type == 'preview'
73+ if : ${{ inputs.release-type == 'preview' }}
8474 run : |
8575 echo "🔍 PREVIEW MODE - What would be released for ATS packages:"
8676 echo ""
@@ -93,14 +83,12 @@ jobs:
9383 echo "To proceed with actual release, run this workflow with 'release' option."
9484
9585 - name : Version ATS packages
96- if : inputs.release-type == 'release'
86+ if : ${{ inputs.release-type == 'release' }}
9787 run : |
9888 echo "🚀 Releasing ATS packages only (ignoring Mass Payout packages)"
9989
100- # Run changeset version with ignore flag for Mass Payout packages
10190 npx changeset version --ignore "@hashgraph/mass-payout*"
10291
103- # Check if any files were changed
10492 if [[ -n "$(git status --porcelain)" ]]; then
10593 echo "✅ Version bump completed for ATS packages"
10694 else
@@ -109,76 +97,59 @@ jobs:
10997 fi
11098
11199 - name : Commit version changes
112- if : inputs.release-type == 'release'
100+ if : ${{ inputs.release-type == 'release' }}
113101 run : |
114- # GitHub Actions bot automatically handles git config for branch protection bypass
115- # When using GITHUB_TOKEN, GitHub automatically configures the correct identity
116-
117- # Add all changed files
118102 git add .
119103
120- # Commit with DCO sign-off using GitHub Actions bot identity
121- if git commit --signoff -m "chore: release ATS packages"; then
104+ if git commit --signoff -S -m "chore: release ATS packages"; then
122105 echo "✅ Version changes committed"
123106 else
124107 echo "ℹ️ No changes to commit"
125108 fi
126109
127110 - name : Create ATS release
128- if : inputs.release-type == 'release'
111+ id : create-release-tag
112+ if : ${{ inputs.release-type == 'release' }}
113+ env :
114+ GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
129115 run : |
130- # Get the current ATS version (all ATS packages use fixed versioning)
131116 ATS_VERSION=$(node -p "require('./packages/ats/contracts/package.json').version")
132117 TAG_NAME="v${ATS_VERSION}-ats"
133-
134- echo "📦 Creating ATS release: $TAG_NAME"
135-
136- # Create and push tag
118+ echo "📦 Creating ATS release tag: ${TAG_NAME}"
137119 git tag "${TAG_NAME}"
138120 git push origin "${TAG_NAME}"
139121
140- # Generate release notes from ATS package changelogs
141- RELEASE_NOTES=""
142- for package in contracts sdk; do
143- CHANGELOG_FILE="packages/ats/${package}/CHANGELOG.md"
144- if [ -f "$CHANGELOG_FILE" ]; then
145- echo "📋 Including changelog from $package"
146- RELEASE_NOTES="$RELEASE_NOTES\n\n## @hashgraph/asset-tokenization-${package}\n"
147- # Get the latest version section from changelog
148- sed -n "/^## $ATS_VERSION/,/^## /p" "$CHANGELOG_FILE" | head -n -1 >> release-notes.md
149- fi
150- done
151-
152- # Create GitHub release
153- gh release create "$TAG_NAME" \
154- --title "ATS Release v${ATS_VERSION}" \
155- --notes-file release-notes.md \
156- --target main
157-
158- echo "✅ GitHub release created: $TAG_NAME"
159- echo "🔗 Release URL: https://github.com/${{ github.repository }}/releases/tag/$TAG_NAME"
160- env :
161- GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
122+ echo "tag-name=${TAG_NAME}" >> "${GITHUB_OUTPUT}"
123+
124+ - name : Create github release
125+ if : ${{ inputs.release-type == 'release' }}
126+ uses : step-security/release-action@03a57407052f15d1537fd5469a6fbbc536aba326 # v1.20.0
127+ with :
128+ tag : ${{ steps.create-release-tag.outputs.tag-name }}
129+ prerelease : false
130+ draft : false
131+ generateReleaseNotes : true
132+ skipIfReleaseExists : true
162133
163134 - name : Release Summary
164135 if : always()
165136 run : |
166137 if [ "${{ inputs.release-type }}" = "preview" ]; then
167- echo "## 🔍 ATS Release Preview Completed" >> $ GITHUB_STEP_SUMMARY
168- echo "Preview mode was selected. No actual release was created." >> $ GITHUB_STEP_SUMMARY
138+ echo "## 🔍 ATS Release Preview Completed" >> "${ GITHUB_STEP_SUMMARY}"
139+ echo "Preview mode was selected. No actual release was created." >> "${ GITHUB_STEP_SUMMARY}"
169140 elif [ "${{ job.status }}" = "success" ]; then
170141 ATS_VERSION=$(node -p "require('./packages/ats/contracts/package.json').version" 2>/dev/null || echo "unknown")
171- echo "## ✅ ATS Release v${ATS_VERSION} Completed Successfully" >> $ GITHUB_STEP_SUMMARY
172- echo "| Package | Status |" >> $ GITHUB_STEP_SUMMARY
173- echo "| --- | --- |" >> $ GITHUB_STEP_SUMMARY
174- echo "| ATS Contracts | ✅ Released |" >> $ GITHUB_STEP_SUMMARY
175- echo "| ATS SDK | ✅ Released |" >> $ GITHUB_STEP_SUMMARY
176- echo "| GitHub Release | ✅ Created |" >> $ GITHUB_STEP_SUMMARY
177- echo "" >> $ GITHUB_STEP_SUMMARY
178- echo "**Next Steps:**" >> $ GITHUB_STEP_SUMMARY
179- echo "- NPM publishing will be triggered automatically via ats.publish.yml" >> $ GITHUB_STEP_SUMMARY
180- echo "- Mass Payout packages were ignored and remain available for separate release" >> $ GITHUB_STEP_SUMMARY
142+ echo "## ✅ ATS Release v${ATS_VERSION} Completed Successfully" >> "${ GITHUB_STEP_SUMMARY}"
143+ echo "| Package | Status |" >> "${ GITHUB_STEP_SUMMARY}"
144+ echo "| --- | --- |" >> "${ GITHUB_STEP_SUMMARY}"
145+ echo "| ATS Contracts | ✅ Released |" >> "${ GITHUB_STEP_SUMMARY}"
146+ echo "| ATS SDK | ✅ Released |" >> "${ GITHUB_STEP_SUMMARY}"
147+ echo "| GitHub Release | ✅ Created |" >> "${ GITHUB_STEP_SUMMARY}"
148+ echo "" >> "${ GITHUB_STEP_SUMMARY}"
149+ echo "**Next Steps:**" >> "${ GITHUB_STEP_SUMMARY}"
150+ echo "- NPM publishing will be triggered automatically via ats.publish.yml" >> "${ GITHUB_STEP_SUMMARY}"
151+ echo "- Mass Payout packages were ignored and remain available for separate release" >> "${ GITHUB_STEP_SUMMARY}"
181152 else
182- echo "## ❌ ATS Release Failed" >> $ GITHUB_STEP_SUMMARY
183- echo "Check the logs above for details on what went wrong." >> $ GITHUB_STEP_SUMMARY
153+ echo "## ❌ ATS Release Failed" >> "${ GITHUB_STEP_SUMMARY}"
154+ echo "Check the logs above for details on what went wrong." >> "${ GITHUB_STEP_SUMMARY}"
184155 fi
0 commit comments