Skip to content

Commit 1975675

Browse files
committed
Merge remote-tracking branch 'origin/main' into dev/jorobich/remove-source-map-support-dep
2 parents 0f8f165 + 088c8f3 commit 1975675

File tree

7 files changed

+180
-352
lines changed

7 files changed

+180
-352
lines changed

.github/workflows/create-release.yml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
name: Create GitHub Release
2+
on:
3+
push:
4+
tags:
5+
- 'v2.*'
6+
7+
permissions:
8+
contents: write
9+
10+
jobs:
11+
# This job runs against the yaml defined in the tag we were triggered on.
12+
# So we can modify the release creation without having to wait for the change to flow into the commit
13+
# that we're tagging, we call a reusable workflow from main
14+
create-release:
15+
uses: dotnet/vscode-csharp/.github/workflows/release-reusable.yml@main
16+
with:
17+
tag: ${{ github.ref_name }}
18+
secrets: inherit
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
name: Reusable - Create Release from Changelog
2+
3+
on:
4+
workflow_call:
5+
inputs:
6+
tag:
7+
description: Tag name to create a release for (e.g. v2.88.0 or v2.88.0-prerelease)
8+
required: true
9+
type: string
10+
11+
permissions:
12+
contents: write
13+
14+
jobs:
15+
create-release:
16+
runs-on: ubuntu-latest
17+
steps:
18+
- name: Checkout tag
19+
uses: actions/checkout@v4
20+
with:
21+
ref: refs/tags/${{ inputs.tag }}
22+
23+
- name: Create release from CHANGELOG
24+
uses: actions/github-script@v7
25+
env:
26+
TAG: ${{ inputs.tag }}
27+
with:
28+
github-token: ${{ secrets.GITHUB_TOKEN }}
29+
script: |
30+
const { readFile } = require('fs/promises');
31+
32+
const tag = process.env.TAG;
33+
core.info(`Creating release for tag: ${tag}`);
34+
35+
if (!tag || !tag.startsWith('v2.')) {
36+
core.setFailed('Invalid tag name. Tag name must start with "v2."');
37+
return;
38+
}
39+
40+
// Read CHANGELOG.md and extract the latest section (first single '#' header)
41+
const changelog = await readFile('CHANGELOG.md', 'utf8');
42+
const headerMatch = changelog.match(/^# .+$/m);
43+
if (!headerMatch) {
44+
core.setFailed('Could not find a top-level # header in CHANGELOG.md');
45+
return;
46+
}
47+
const startIdx = changelog.indexOf(headerMatch[0]);
48+
let endIdx = changelog.indexOf('\n# ', startIdx + headerMatch[0].length);
49+
if (endIdx === -1) {
50+
endIdx = changelog.length;
51+
}
52+
const releaseNotes = changelog.substring(startIdx, endIdx).trim();
53+
54+
const isPrerelease = tag.includes('-prerelease');
55+
core.info(`Prerelease: ${isPrerelease}`);
56+
57+
try {
58+
const response = await github.rest.repos.createRelease({
59+
owner: context.repo.owner,
60+
repo: context.repo.repo,
61+
tag_name: tag,
62+
name: tag,
63+
body: releaseNotes,
64+
prerelease: isPrerelease,
65+
});
66+
core.info(`Release created: ${response.data.html_url}`);
67+
} catch (err) {
68+
if (err && err.status === 422 && err.message && String(err.message).includes('already_exists')) {
69+
core.warning(`Release for tag '${tag}' already exists.`);
70+
} else {
71+
core.setFailed(`Error creating release: ${err?.message ?? err}`);
72+
}
73+
}

azure-pipelines/release.yml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ extends:
7878
displayName: 'Install vsce'
7979
- task: AzureCLI@2
8080
displayName: '🚀 Publish to Marketplace'
81+
name: PublishToMarketplaceStep
8182
inputs:
8283
azureSubscription: 'VSCode Marketplace Publishing'
8384
scriptType: "pscore"
@@ -112,8 +113,10 @@ extends:
112113
If ( $uploadPrerelease ) {
113114
$basePublishArgs += "--pre-release"
114115
Write-Host "Publish to pre-release channel."
116+
Write-Host "##vso[task.setvariable variable=isPrerelease;isOutput=true]true"
115117
} Else {
116118
Write-Host "Publish to release channel."
119+
Write-Host "##vso[task.setvariable variable=isPrerelease;isOutput=true]false"
117120
}
118121
$basePublishArgs += '--azure-credential'
119122
$basePublishArgs += '--packagePath'
@@ -139,6 +142,9 @@ extends:
139142
displayName: 'Tag release of vscode-csharp'
140143
dependsOn: 'PublishStage'
141144
condition: succeeded('PublishStage')
145+
variables:
146+
- name: isPrerelease
147+
value: $[ stageDependencies.PublishStage.PublishToMarketplace.outputs['PublishToMarketplace.PublishToMarketplaceStep.isPrerelease'] ]
142148
jobs:
143149
- job: 'Tag'
144150
pool:
@@ -163,7 +169,7 @@ extends:
163169
displayName: 'Install dependencies.'
164170
- pwsh: |
165171
# build number is generated by nerdbank git versioning and set to AzureDev
166-
gulp createTags --releaseVersion $(resources.pipeline.officialBuildCI.runName) --releaseCommit $(resources.pipeline.officialBuildCI.sourceCommit) --dryRun ${{ parameters.test }}
172+
gulp createTags --releaseVersion $(resources.pipeline.officialBuildCI.runName) --releaseCommit $(resources.pipeline.officialBuildCI.sourceCommit) --dryRun ${{ parameters.test }} --prerelease $(isPrerelease)
167173
env:
168174
GitHubPAT: $(BotAccount-dotnet-bot-content-rw-grained-pat)
169175
displayName: 'Create release tags'

0 commit comments

Comments
 (0)