@@ -7,16 +7,175 @@ permissions:
77 contents : write
88 actions : read
99
10+ env :
11+ EXTENSION_NAME : VsixManifestDesigner
12+ DISPLAY_NAME : ' VSIX Manifest Designer'
13+ MARKETPLACE_ID : CodingWithCalvin.VS-VsixManifestDesigner
14+ DESCRIPTION : ' A Visual Studio extension providing a modern visual designer for VSIX manifest files!'
15+ INFO_FILE : CodingWithCalvin.VsixManifestDesigner.info
16+ VSIX_FILE : CodingWithCalvin.VsixManifestDesigner.vsix
17+ MARKETPLACE_URL : https://marketplace.visualstudio.com/items?itemName=CodingWithCalvin.VS-VsixManifestDesigner
18+
1019jobs :
20+ changelog :
21+ name : Generate Changelog
22+ runs-on : ubuntu-latest
23+ outputs :
24+ changelog : ${{ steps.changelog.outputs.CHANGELOG }}
25+ steps :
26+ - name : Checkout code
27+ uses : actions/checkout@v4
28+ with :
29+ fetch-depth : 0
30+
31+ - name : Generate changelog
32+ id : changelog
33+ run : |
34+ PREVIOUS_TAG=$(git describe --abbrev=0 --tags 2>/dev/null || echo "")
35+ echo "Previous tag: ${PREVIOUS_TAG:-'(none - first release)'}"
36+
37+ if [ -z "$PREVIOUS_TAG" ]; then
38+ COMMIT_RANGE="HEAD"
39+ else
40+ COMMIT_RANGE="${PREVIOUS_TAG}..HEAD"
41+ fi
42+
43+ declare -a FEATURES
44+ declare -a BUGS
45+ declare -a MAINTENANCE
46+ declare -A PROCESSED_PRS
47+
48+ COMMIT_SHAS=$(git log ${COMMIT_RANGE} --pretty=format:"%H" --no-merges)
49+
50+ for SHA in $COMMIT_SHAS; do
51+ PR_DATA=$(gh pr list --search "$SHA" --state merged --json number,title,body --limit 1 2>/dev/null || echo "[]")
52+ if [ "$PR_DATA" = "[]" ] || [ -z "$PR_DATA" ]; then
53+ continue
54+ fi
55+
56+ PR_NUMBER=$(echo "$PR_DATA" | jq -r '.[0].number // empty')
57+ PR_TITLE=$(echo "$PR_DATA" | jq -r '.[0].title // empty')
58+ PR_BODY=$(echo "$PR_DATA" | jq -r '.[0].body // empty')
59+
60+ if [ -z "$PR_NUMBER" ] || [ -z "$PR_TITLE" ]; then
61+ continue
62+ fi
63+
64+ if [ -n "${PROCESSED_PRS[$PR_NUMBER]}" ]; then
65+ continue
66+ fi
67+ PROCESSED_PRS[$PR_NUMBER]=1
68+
69+ if echo "$PR_TITLE" | grep -qE "^revert(\(|:)"; then
70+ continue
71+ fi
72+
73+ ISSUE_NUMS=$(echo "$PR_BODY" | grep -oiE "(fixes|closes|resolves)\s*#[0-9]+" | grep -oE "[0-9]+" | sort -n | uniq || echo "")
74+ if [ -n "$ISSUE_NUMS" ]; then
75+ ISSUE_LIST=$(echo "$ISSUE_NUMS" | sed 's/^/#/' | tr '\n' ',' | sed 's/,$//' | sed 's/,/, /g')
76+ ENTRY="- $PR_TITLE (${ISSUE_LIST})"
77+ else
78+ ENTRY="- $PR_TITLE"
79+ fi
80+
81+ if echo "$PR_TITLE" | grep -qE "^feat(\(|:)"; then
82+ FEATURES+=("$ENTRY")
83+ elif echo "$PR_TITLE" | grep -qE "^fix(\(|:)"; then
84+ BUGS+=("$ENTRY")
85+ else
86+ MAINTENANCE+=("$ENTRY")
87+ fi
88+ done
89+
90+ CHANGELOG=""
91+ if [ ${#FEATURES[@]} -gt 0 ]; then
92+ CHANGELOG="### 🎉 New Features"$'\n\n'
93+ for entry in "${FEATURES[@]}"; do
94+ CHANGELOG="${CHANGELOG}${entry}"$'\n'
95+ done
96+ CHANGELOG="${CHANGELOG}"$'\n'
97+ fi
98+
99+ if [ ${#BUGS[@]} -gt 0 ]; then
100+ CHANGELOG="${CHANGELOG}### 🐛 Bug Fixes"$'\n\n'
101+ for entry in "${BUGS[@]}"; do
102+ CHANGELOG="${CHANGELOG}${entry}"$'\n'
103+ done
104+ CHANGELOG="${CHANGELOG}"$'\n'
105+ fi
106+
107+ if [ ${#MAINTENANCE[@]} -gt 0 ]; then
108+ CHANGELOG="${CHANGELOG}### 🔧 Maintenance"$'\n\n'
109+ for entry in "${MAINTENANCE[@]}"; do
110+ CHANGELOG="${CHANGELOG}${entry}"$'\n'
111+ done
112+ CHANGELOG="${CHANGELOG}"$'\n'
113+ fi
114+
115+ if [ -z "$CHANGELOG" ]; then
116+ CHANGELOG="Initial release! 🎉"
117+ fi
118+
119+ echo "CHANGELOG<<EOF" >> $GITHUB_OUTPUT
120+ echo "$CHANGELOG" >> $GITHUB_OUTPUT
121+ echo "EOF" >> $GITHUB_OUTPUT
122+ shell : bash
123+ env :
124+ GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
125+
11126 publish :
127+ needs : changelog
128+ runs-on : windows-latest
12129 permissions :
13130 contents : write
14- actions : read
15- uses : CodingWithCalvin/.github/.github/workflows/vsix-publish.yml@main
131+ outputs :
132+ version : ${{ steps.artifact_manifest.outputs.version }}
133+ steps :
134+ - name : Checkout
135+ uses : actions/checkout@v4
136+
137+ - name : 1. Download artifact
138+ uses : dawidd6/action-download-artifact@v6
139+ with :
140+ workflow : build.yml
141+ workflow_conclusion : success
142+
143+ - name : 2. Parse Artifact Manifest
144+ id : artifact_manifest
145+ uses : ActionsTools/read-json-action@main
146+ with :
147+ file_path : ./artifact/${{ env.INFO_FILE }}
148+
149+ - name : 3. Create Tag & Release
150+ uses : ncipollo/release-action@v1.14.0
151+ with :
152+ artifacts : ./artifact/${{ env.VSIX_FILE }}
153+ body : ${{ needs.changelog.outputs.changelog }}
154+ makeLatest : true
155+ commit : ${{ steps.artifact_manifest.outputs.sha }}
156+ tag : ${{ steps.artifact_manifest.outputs.version }}
157+
158+ - name : 4. Publish Release to Marketplace
159+ if : success()
160+ uses : CodingWithCalvin/GHA-VSMarketplacePublisher@v1
161+ with :
162+ marketplace-pat : ${{ secrets.VS_PAT }}
163+ publish-manifest-path : ./resources/extension.manifest.json
164+ vsix-path : ./artifact/${{ env.VSIX_FILE }}
165+
166+ notify-bluesky :
167+ needs : publish
168+ uses : CodingWithCalvin/.github/.github/workflows/bluesky-post.yml@main
16169 with :
17- extension-name : VsixManifestDesigner
18- display-name : ' VSIX Manifest Designer'
19- marketplace-id : CodingWithCalvin.VS-VsixManifestDesigner
20- description : ' A Visual Studio extension providing a modern visual designer for VSIX manifest files!'
21- hashtags : ' '
22- secrets : inherit
170+ post_text : |
171+ 🚀 VSIX Manifest Designer v${{ needs.publish.outputs.version }} for #VisualStudio has been released!
172+
173+ [Check out the release notes here!](https://github.com/${{ github.repository }}/releases/tag/${{ needs.publish.outputs.version }})
174+
175+ #dotnet #vsix
176+ embed_title : VSIX Manifest Designer for Visual Studio
177+ embed_description : A Visual Studio extension providing a modern visual designer for VSIX manifest files!
178+ secrets :
179+ BLUESKY_USERNAME : ${{ secrets.BLUESKY_USERNAME }}
180+ BLUESKY_APP_PASSWORD : ${{ secrets.BLUESKY_APP_PASSWORD }}
181+
0 commit comments