Skip to content

Commit 74ad7d3

Browse files
authored
fix(ci): inline publish workflow to troubleshoot permissions (#16)
1 parent 7f04ede commit 74ad7d3

1 file changed

Lines changed: 167 additions & 8 deletions

File tree

.github/workflows/publish.yml

Lines changed: 167 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
1019
jobs:
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

Comments
 (0)