8000 Windows release build cleanup and PyManager support (#236) · python/release-tools@b63dc24 · GitHub
[go: up one dir, main page]

Skip to content

Commit b63dc24

Browse files
authored
Windows release build cleanup and PyManager support (#236)
1 parent 251083e commit b63dc24

30 files changed

+1385
-459
lines changed

.pre-commit-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ repos:
1818
- id: check-merge-conflict
1919
- id: check-toml
2020
- id: check-yaml
21-
exclude: windows-release/azure-pipelines.yml
21+
exclude: windows-release/(azure-pipelines|msi-steps).yml
2222
- id: debug-statements
2323
- id: end-of-file-fixer
2424
- id: forbid-submodules

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,6 @@ exclude = [
1616
"^tests/test_release_tag.py$",
1717
"^tests/test_run_release.py$",
1818
"^tests/test_sbom.py$",
19+
"^windows-release/merge-and-upload.py$",
1920
"^windows-release/purge.py$",
2021
]

sbom.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -696,7 +696,7 @@ def create_sbom_for_windows_artifact(
696696
artifact_path: str, cpython_source_dir: Path | str
697697
) -> SBOM:
698698
artifact_name = os.path.basename(artifact_path)
699-
if m := re.match(pat := r"^python-([0-9abrc.]+)(?:-|\.exe|\.zip)", artifact_name):
699+
if m := re.match(pat := r"^python-([0-9abrc.]+)t?(?:-|\.exe|\.zip)", artifact_name):
700700
cpython_version = m.group(1)
701701
else:
702702
raise ValueError(f"Invalid {artifact_name=}, expected {pat!r}")
@@ -731,8 +731,8 @@ def create_sbom_for_windows_artifact(
731731
sbom_cpython_package_spdx_id = spdx_id("SPDXRef-PACKAGE-cpython")
732732

733733
# The Windows embed artifacts don't contain pip/ensurepip,
734-
# but the MSI artifacts do. Add pip for MSI installers.
735-
if artifact_name.endswith(".exe"):
734+
# but the others do.
735+
if "-embed" not in artifact_name:
736736

737737
# Find the pip wheel in ensurepip in the source code
738738
for pathname in os.listdir(cpython_source_dir / "Lib/ensurepip/_bundled"):

windows-release/azure-pipelines.yml

Lines changed: 103 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ parameters:
1111
- 'Yhg1s'
1212
- 'pablogsal'
1313
- 'ambv'
14+
- 'zooba'
1415
- '(Other)'
1516
- name: GitRemote_Other
1617
displayName: "If Other, specify Git remote"
@@ -39,7 +40,7 @@ parameters:
3940
- name: SigningDescription
4041
displayName: "Signature description"
4142
type: string
42-
default: 'Built: $(Build.BuildNumber)'
43+
default: '(default)'
4344
- name: DoGPG
4445
displayName: "Include GPG signatures (3.13 and earlier)"
4546
type: boolean
@@ -52,14 +53,6 @@ parameters:
5253
displayName: "Publish ARM64 build (3.11 and later)"
5354
type: boolean
5455
default: true
55-
# Because there is no ARM64 Tcl/Tk pre-3.11, we need a separate option
56-
# to keep those builds working when the files are going to be absent.
57-
# Eventually when we stop releasing anything that old, we can drop this
58-
# argument (and make it implicitly always 'true')
59-
- name: ARM64TclTk
60-
displayName: "Use Tcl/Tk for ARM64 (3.11 and later)"
61-
type: boolean
62-
default: true
6356
- name: DoPGO
6457
displayName: "Run PGO"
6558
type: boolean
@@ -88,15 +81,32 @@ parameters:
8881
displayName: "Produce EXE/MSI installer"
8982
type: boolean
9083
default: true
84+
- name: DoPyManager
85+
displayName: "Produce PyManager package"
86+
type: boolean
87+
default: true
9188
- name: BuildToPublish
92-
displayName: "Build number to publish (0 to skip)"
93-
type: number
94-
default: '0'
89+
displayName: "Republish a build (select in Resources)"
90+
type: string
91+
default: current
92+
values: ['current', 'build_to_publish']
93+
- name: BuildToPackage
94+
displayName: "Repackage and publish a build (select in Resources)"
95+
type: string
96+
default: current
97+
values: ['current', 'build_to_package']
9598
- name: SignNuget
9699
displayName: "Enable Nuget signing (not recommended right now)"
97100
type: boolean
98101
default: false
99102

103+
resources:
104+
pipelines:
105+
- pipeline: build_to_publish
106+
source: 'Windows-Release'
107+
- pipeline: build_to_package
108+
source: 'Windows-Release'
109+
100110
variables:
101111
${{ if ne(parameters.GitRemote, '(Other)') }}:
102112
GitRemote: ${{ parameters.GitRemote }}
@@ -105,22 +115,12 @@ variables:
105115
SourceTag: ${{ parameters.SourceTag }}
106116
${{ if ne(parameters.SourceCommit, 'empty') }}:
107117
SourceCommit: ${{ parameters.SourceCommit }}
108-
${{ else }}:
109-
SourceCommit: ''
110-
${{ if ne(parameters.SigningCertificate, 'Unsigned') }}:
111-
SigningCertificate: ${{ parameters.SigningCertificate }}
112-
SigningDescription: ${{ parameters.SigningDescription }}
113118
${{ if eq(parameters.SigningCertificate, 'PythonSoftwareFoundation') }}:
114119
IsRealSigned: true
115120
${{ else }}:
116121
IsRealSigned: false
117-
DoFreethreaded: ${{ parameters.DoFreethreaded }}
118-
DoLayout: ${{ parameters.DoLayout }}
119-
DoMSIX: ${{ parameters.DoMSIX }}
120-
DoNuget: ${{ parameters.DoNuget }}
121-
DoEmbed: ${{ parameters.DoEmbed }}
122-
DoMSI: ${{ parameters.DoMSI }}
123-
DoPublish: ${{ parameters.DoPublish }}
122+
${{ if ne(parameters.SigningDescription, '(default)') }}:
123+
SigningDescription: ${{ parameters.SigningDescription }}
124124
PublishARM64: ${{ parameters.DoARM64 }}
125125
# QUEUE TIME VARIABLES
126126
# PyDotOrgUsername: ''
@@ -130,144 +130,133 @@ trigger: none
130130
pr: none
131131

132132
stages:
133-
- ${{ if eq(parameters.BuildToPublish, '0') }}:
133+
- ${{ if and(eq(parameters.BuildToPublish, 'current'), eq(parameters.BuildToPackage, 'current')) }}:
134134
- stage: Build
135135
displayName: Build binaries
136136
jobs:
137137
- template: stage-build.yml
138138
parameters:
139-
ARM64TclTk: ${{ parameters.ARM64TclTk }}
140139
DoFreethreaded: ${{ parameters.DoFreethreaded }}
141140
DoPGO: ${{ parameters.DoPGO }}
142141
DoPGOARM64: ${{ parameters.DoPGOARM64 }}
142+
${{ if and(parameters.SigningCertificate, ne(parameters.SigningCertificate, 'Unsigned')) }}:
143+
ToBeSigned: true
143144

144145
- stage: Sign
145146
displayName: Sign binaries
146147
dependsOn: Build
147148
jobs:
148149
- template: stage-sign.yml
149150
parameters:
150-
${{ if and(parameters.SigningCertificate, ne(parameters.SigningCertificate, 'Unsigned')) }}:
151-
SigningCertificate: ${{ parameters.SigningCertificate }}
151+
SigningCertificate: ${{ parameters.SigningCertificate }}
152152
DoFreethreaded: ${{ parameters.DoFreethreaded }}
153153

154+
- ${{ if eq(parameters.BuildToPublish, 'current') }}:
154155
- stage: Layout
155-
displayName: Generate layouts
156-
dependsOn: Sign
156+
${{ if eq(parameters.BuildToPackage, 'current') }}:
157+
displayName: Generate layouts
158+
dependsOn: Sign
159+
${{ else }}:
160+
displayName: Generate layouts from prior build
161+
dependsOn: []
157162
jobs:
158163
- template: stage-layout-full.yml
159164
parameters:
160-
ARM64TclTk: ${{ parameters.ARM64TclTk }}
165+
BuildToPackage: ${{ parameters.BuildToPackage }}
161166
DoFreethreaded: ${{ parameters.DoFreethreaded }}
162-
- template: stage-layout-embed.yml
163-
- template: stage-layout-nuget.yml
167+
- template: stage-layout-symbols.yml
164168
parameters:
169+
BuildToPackage: ${{ parameters.BuildToPackage }}
165170
DoFreethreaded: ${{ parameters.DoFreethreaded }}
171+
- ${{ if eq(parameters.DoEmbed, 'true') }}:
172+
- template: stage-layout-embed.yml
173+
parameters:
174+
BuildToPackage: ${{ parameters.BuildToPackage }}
175+
- ${{ if eq(parameters.DoNuget, 'true') }}:
176+
- template: stage-layout-nuget.yml
177+
parameters:
178+
BuildToPackage: ${{ parameters.BuildToPackage }}
179+
DoFreethreaded: ${{ parameters.DoFreethreaded }}
180+
- ${{ if eq(parameters.DoMSIX, 'true') }}:
181+
- template: stage-layout-msix.yml
182+
parameters:
183+
BuildToPackage: ${{ parameters.BuildToPackage }}
184+
- ${{ if eq(parameters.DoPyManager, 'true') }}:
185+
- template: stage-layout-pymanager.yml
186+
parameters:
187+
BuildToPackage: ${{ parameters.BuildToPackage }}
188+
DoFreethreaded: ${{ parameters.DoFreethreaded }}
189+
DoEmbed: ${{ parameters.DoEmbed }}
166190

167191
- stage: Pack
168192
dependsOn: Layout
193+
displayName: Pack
169194
jobs:
170-
- template: stage-pack-nuget.yml
171-
parameters:
172-
${{ if and(parameters.SigningCertificate, ne(parameters.SigningCertificate, 'Unsigned')) }}:
173-
${{ if eq(parameters.SignNuget, 'true') }}:
174-
SigningCertificate: ${{ parameters.SigningCertificate }}
175-
DoFreethreaded: ${{ parameters.DoFreethreaded }}
176-
177-
- stage: Test
178-
dependsOn: Pack
179-
jobs:
180-
- template: stage-test-embed.yml
181-
- template: stage-test-nuget.yml
182-
parameters:
183-
DoFreethreaded: ${{ parameters.DoFreethreaded }}
184-
185-
- ${{ if eq(parameters.DoMSIX, 'true') }}:
186-
- stage: Layout_MSIX
187-
displayName: Generate MSIX layouts
188-
dependsOn: Sign
189-
jobs:
190-
- template: stage-layout-msix.yml
195+
#- ${{ if eq(parameters.DoEmbed, 'true') }}:
196+
# - template: stage-pack-embed.yml
197+
- ${{ if eq(parameters.DoMSI, 'true') }}:
198+
- template: stage-msi.yml
191199
parameters:
192-
ARM64TclTk: ${{ parameters.ARM64TclTk }}
193-
194-
- stage: Pack_MSIX
195-
displayName: Package MSIX
196-
dependsOn: Layout_MSIX
197-
jobs:
200+
BuildToPackage: ${{ parameters.BuildToPackage }}
201+
DoARM64: ${{ parameters.DoARM64}}
202+
DoFreethreaded: ${{ parameters.DoFreethreaded }}
203+
- ${{ if eq(parameters.DoMSIX, 'true') }}:
198204
- template: stage-pack-msix.yml
199205
parameters:
200206
${{ if and(parameters.SigningCertificate, ne(parameters.SigningCertificate, 'Unsigned')) }}:
201207
SigningCertificate: ${{ parameters.SigningCertificate }}
202-
203-
- ${{ if eq(parameters.DoMSI, 'true') }}:
204-
- stage: Build_MSI
205-
displayName: Build MSI installer
206-
dependsOn: Sign
207-
jobs:
208-
- template: stage-msi.yml
208+
- ${{ if eq(parameters.DoNuget, 'true') }}:
209+
- template: stage-pack-nuget.yml
209210
parameters:
210-
ARM64TclTk: ${{ parameters.ARM64TclTk }}
211-
${{ if and(parameters.SigningCertificate, ne(parameters.SigningCertificate, 'Unsigned')) }}:
212-
SigningCertificate: ${{ parameters.SigningCertificate }}
213-
DoARM64: ${{ parameters.DoARM64}}
211+
${{ if eq(parameters.SignNuget, 'true') }}:
212+
${{ if and(parameters.SigningCertificate, ne(parameters.SigningCertificate, 'Unsigned')) }}:
213+
SigningCertificate: ${{ parameters.SigningCertificate }}
214214
DoFreethreaded: ${{ parameters.DoFreethreaded }}
215-
216-
- stage: Test_MSI
217-
displayName: Test MSI installer
218-
dependsOn: Build_MSI
219-
jobs:
220-
- template: stage-test-msi.yml
215+
- ${{ if eq(parameters.DoPyManager, 'true') }}:
216+
- template: stage-pack-pymanager.yml
221217
parameters:
222218
DoFreethreaded: ${{ parameters.DoFreethreaded }}
219+
DoEmbed: ${{ parameters.DoEmbed }}
223220

224-
- ${{ if eq(parameters.DoPublish, 'true') }}:
221+
- stage: Test
222+
dependsOn: Pack
223+
jobs:
224+
- ${{ if eq(parameters.DoEmbed, 'true') }}:
225+
- template: stage-test-embed.yml
225226
- ${{ if eq(parameters.DoMSI, 'true') }}:
226-
- stage: PublishPyDotOrg
227-
displayName: Publish to python.org
228-
dependsOn: ['Test_MSI', 'Test']
229-
jobs:
230-
- template: stage-publish-pythonorg.yml
231-
parameters:
232-
IncludeGPG: ${{ parameters.DoGPG }}
233-
227+
- template: stage-test-msi.yml
228+
parameters:
229+
DoFreethreaded: ${{ parameters.DoFreethreaded }}
234230
- ${{ if eq(parameters.DoNuget, 'true') }}:
235-
- stage: PublishNuget
236-
displayName: Publish to nuget.org
237-
${{ if eq(parameters.DoMSI, 'true') }}:
238-
dependsOn: ['Test_MSI', 'Test']
239-
${{ else }}:
240-
dependsOn: 'Test'
241-
jobs:
242-
- template: stage-publish-nugetorg.yml
243-
244-
- ${{ if eq(parameters.DoMSIX, 'true') }}:
245-
- stage: PublishStore
246-
displayName: Publish to Store
247-
${{ if eq(parameters.DoMSI, 'true') }}:
248-
dependsOn: ['Test_MSI', 'Pack_MSIX']
249-
${{ else }}:
250-
dependsOn: 'Pack_MSIX'
251-
jobs:
252-
- template: stage-publish-store.yml
231+
- template: stage-test-nuget.yml
232+
parameters:
233+
DoFreethreaded: ${{ parameters.DoFreethreaded }}
234+
- ${{ if eq(parameters.DoPyManager, 'true') }}:
235+
- template: stage-test-pymanager.yml
236+
parameters:
237+
DoEmbed: ${{ parameters.DoEmbed }}
238+
DoFreethreaded: ${{ parameters.DoFreethreaded }}
253239

254-
- ${{ else }}:
255-
- stage: PublishExisting
256-
displayName: Publish existing build
257-
dependsOn: []
240+
- ${{ if eq(parameters.DoPublish, 'true') }}:
241+
- stage: Publish
242+
displayName: Publish
243+
dependsOn:
244+
- ${{ if eq(parameters.BuildToPublish, 'current') }}:
245+
- Test
258246
jobs:
247+
- ${{ if eq(parameters.DoPyManager, 'true') }}:
248+
- template: stage-publish-pymanager.yml
249+
parameters:
250+
BuildToPublish: ${{ parameters.BuildToPublish }}
251+
DoEmbed: ${{ parameters.DoEmbed }}
252+
DoFreethreaded: ${{ parameters.DoFreethreaded }}
259253
- ${{ if eq(parameters.DoMSI, 'true') }}:
260254
- template: stage-publish-pythonorg.yml
261255
parameters:
262256
BuildToPublish: ${{ parameters.BuildToPublish }}
257+
DoEmbed: ${{ parameters.DoEmbed }}
263258
IncludeGPG: ${{ parameters.DoGPG }}
264-
265259
- ${{ if eq(parameters.DoNuget, 'true') }}:
266260
- template: stage-publish-nugetorg.yml
267261
parameters:
268262
BuildToPublish: ${{ parameters.BuildToPublish }}
269-
270-
- ${{ if eq(parameters.DoMSIX, 'true') }}:
271-
- template: stage-publish-store.yml
272-
parameters:
273-
BuildToPublish: ${{ parameters.BuildToPublish }}

0 commit comments

Comments
 (0)
0