@@ -14,6 +14,12 @@ name: RNW NuGet Release $(Date:yyyyMMdd).$(Rev:r)
1414trigger : none
1515pr : none
1616
17+ parameters :
18+ - name : forceRelease
19+ displayName : ' Force release (override CI flag — emergency use only)'
20+ type : boolean
21+ default : false
22+
1723resources :
1824 pipelines :
1925 - pipeline : ' Publish'
@@ -52,6 +58,12 @@ extends:
5258 jobs :
5359 - job : Evaluate
5460 displayName : Check if release should proceed
61+ templateContext :
62+ inputs :
63+ - input : pipelineArtifact
64+ pipeline : ' Publish'
65+ artifactName : ' VersionEnvVars'
66+ targetPath : ' $(Pipeline.Workspace)/VersionEnvVars'
5567 steps :
5668 - checkout : none
5769
@@ -94,10 +106,15 @@ extends:
94106 PUBLISH_REQUESTEDFOR: $(resources.pipeline.Publish.requestedFor)
95107 PUBLISH_REQUESTEDFORID: $(resources.pipeline.Publish.requestedForID)
96108
109+ # Apply version variables from the CI artifact (sets IsReleaseBuild, npmVersion, etc.)
110+ - task : CmdLine@2
111+ displayName : Apply CI version variables
112+ inputs :
113+ script : node $(Pipeline.Workspace)/VersionEnvVars/versionEnvVars.js
114+
97115 - pwsh : |
98- $buildReason = $env:BUILD_REASON
99- # Use only the first line of the commit message
100- $sourceMessage = ($env:SOURCE_MESSAGE -split "`n")[0].Trim()
116+ $forceRelease = '${{ parameters.forceRelease }}'
117+ $isReleaseBuild = $env:IS_RELEASE_BUILD
101118 $publishRunName = $env:PUBLISH_RUN_NAME
102119 $sourceBranch = $env:SOURCE_BRANCH -replace '^refs/heads/', ''
103120
@@ -106,25 +123,42 @@ extends:
106123 $originalBuildNumber = $env:BUILD_BUILDNUMBER
107124 $dateStamp = if ($originalBuildNumber -match '(\d{8}\.\d+)$') { $Matches[1] } else { "" }
108125
126+ # Fallback: if IsReleaseBuild is not in the CI artifact (old branches),
127+ # fall back to commit message detection for backward compatibility.
128+ if (-not $isReleaseBuild) {
129+ $sourceMessage = ($env:SOURCE_MESSAGE -split "`n")[0].Trim()
130+ $isReleaseBuild = if ($sourceMessage.StartsWith("RELEASE:")) { 'True' } else { 'False' }
131+ Write-Host "##[warning]IsReleaseBuild not found in CI artifact, fell back to commit message detection: $isReleaseBuild"
132+ }
133+
134+ Write-Host "isReleaseBuild (from CI): $isReleaseBuild"
135+ Write-Host "forceRelease (param): $forceRelease"
136+
109137 $shouldRelease = $false
110138 $buildNumber = ""
111139
112- if ($buildReason -eq "Manual") {
140+ if ($forceRelease -eq 'True') {
141+ # Emergency override — allow publishing regardless of CI flag
113142 $shouldRelease = $true
114143 if ($publishRunName) {
115- $buildNumber = "$publishRunName ($sourceBranch) - $dateStamp"
144+ $buildNumber = "$publishRunName [FORCED] ($sourceBranch) - $dateStamp"
116145 } else {
117- $buildNumber = "Release ($sourceBranch) - $dateStamp"
146+ $buildNumber = "Release [FORCED] ($sourceBranch) - $dateStamp"
118147 }
148+ Write-Host "##[warning]Release forced by parameter override"
119149 }
120- elseif ($sourceMessage.StartsWith("RELEASE:") ) {
150+ elseif ($isReleaseBuild -eq 'True' ) {
121151 $shouldRelease = $true
122- $buildNumber = "$publishRunName ($sourceBranch) - $dateStamp"
152+ if ($publishRunName) {
153+ $buildNumber = "$publishRunName ($sourceBranch) - $dateStamp"
154+ } else {
155+ $buildNumber = "Release ($sourceBranch) - $dateStamp"
156+ }
123157 }
124158 else {
125159 $shouldRelease = $false
126160 # Truncate commit message for readability
127- $shortMsg = $sourceMessage
161+ $shortMsg = ($env:SOURCE_MESSAGE -split "`n")[0].Trim()
128162 if ($shortMsg.Length -gt 60) {
129163 $shortMsg = $shortMsg.Substring(0, 57) + "..."
130164 }
@@ -142,20 +176,20 @@ extends:
142176 Write-Host "##vso[build.updatebuildnumber]$buildNumber"
143177 Write-Host "##vso[task.setvariable variable=shouldRelease;isOutput=true]$shouldRelease"
144178 name: gate
145- displayName: Determine release eligibility and set build number
179+ displayName: Determine release eligibility from CI artifact
146180 env:
147- BUILD_REASON: $(Build.Reason)
148181 BUILD_BUILDNUMBER: $(Build.BuildNumber)
149- SOURCE_MESSAGE : $(Build.SourceVersionMessage )
182+ IS_RELEASE_BUILD : $(IsReleaseBuild )
150183 PUBLISH_RUN_NAME: $(resources.pipeline.Publish.runName)
151184 SOURCE_BRANCH: $(resources.pipeline.Publish.sourceBranch)
185+ SOURCE_MESSAGE: $(Build.SourceVersionMessage)
152186
153187 - script : echo Proceeding with release
154188 displayName : RELEASING - proceeding to publish
155189 condition : eq(variables['gate.shouldRelease'], 'True')
156190
157191 - script : echo Skipping release
158- displayName : SKIPPED - not a RELEASE commit
192+ displayName : SKIPPED - not a release build
159193 condition : eq(variables['gate.shouldRelease'], 'False')
160194
161195 - stage : Release
0 commit comments