1name: Release_$(Build.SourceBranchName)_$(SourceTag)_$(Date:yyyyMMdd)$(Rev:.rr)
2
3parameters:
4- name: GitRemote
5  displayName: "Git remote"
6  type: string
7  default: python
8  values:
9  - 'python'
10  - 'pablogsal'
11  - 'ambv'
12  - '(Other)'
13- name: GitRemote_Other
14  displayName: "If Other, specify Git remote"
15  type: string
16  default: 'python'
17- name: SourceTag
18  displayName: "Git tag"
19  type: string
20  default: main
21- name: DoPublish
22  displayName: "Publish release"
23  type: boolean
24  default: false
25- name: SigningCertificate
26  displayName: "Code signing certificate"
27  type: string
28  default: 'Python Software Foundation'
29  values:
30  - 'Python Software Foundation'
31  - 'TestSign'
32  - 'Unsigned'
33- name: SigningDescription
34  displayName: "Signature description"
35  type: string
36  default: 'Built: $(Build.BuildNumber)'
37- name: DoARM64
38  displayName: "Publish ARM64 build"
39  type: boolean
40  default: true
41# Because there is no ARM64 Tcl/Tk pre-3.11, we need a separate option
42# to keep those builds working when the files are going to be absent.
43# Eventually when we stop releasing anything that old, we can drop this
44# argument (and make it implicitly always 'true')
45- name: ARM64TclTk
46  displayName: "Use Tcl/Tk for ARM64 (3.11 and later)"
47  type: boolean
48  default: true
49- name: DoPGO
50  displayName: "Run PGO"
51  type: boolean
52  default: true
53- name: DoCHM
54  displayName: "Produce compiled help document (pre-3.11)"
55  type: boolean
56  default: false
57- name: DoLayout
58  displayName: "Produce full layout artifact"
59  type: boolean
60  default: true
61- name: DoMSIX
62  displayName: "Produce Store packages"
63  type: boolean
64  default: true
65- name: DoNuget
66  displayName: "Produce Nuget packages"
67  type: boolean
68  default: true
69- name: DoEmbed
70  displayName: "Produce embeddable package"
71  type: boolean
72  default: true
73- name: DoMSI
74  displayName: "Produce EXE/MSI installer"
75  type: boolean
76  default: true
77- name: BuildToPublish
78  displayName: "Build number to publish (0 to skip)"
79  type: number
80  default: '0'
81
82variables:
83  __RealSigningCertificate: 'Python Software Foundation'
84  ${{ if ne(parameters.GitRemote, '(Other)') }}:
85    GitRemote: ${{ parameters.GitRemote }}
86  ${{ else }}:
87    GitRemote: ${{ parameters.GitRemote_Other }}
88  SourceTag: ${{ parameters.SourceTag }}
89  DoPGO: ${{ parameters.DoPGO }}
90  ${{ if ne(parameters.SigningCertificate, 'Unsigned') }}:
91    SigningCertificate: ${{ parameters.SigningCertificate }}
92  SigningDescription: ${{ parameters.SigningDescription }}
93  DoCHM: ${{ parameters.DoCHM }}
94  DoLayout: ${{ parameters.DoLayout }}
95  DoMSIX: ${{ parameters.DoMSIX }}
96  DoNuget: ${{ parameters.DoNuget }}
97  DoEmbed: ${{ parameters.DoEmbed }}
98  DoMSI: ${{ parameters.DoMSI }}
99  DoPublish: ${{ parameters.DoPublish }}
100  PublishARM64: ${{ parameters.DoARM64 }}
101# QUEUE TIME VARIABLES
102#  PyDotOrgUsername: ''
103#  PyDotOrgServer: ''
104
105trigger: none
106pr: none
107
108stages:
109- ${{ if eq(parameters.BuildToPublish, '0') }}:
110  - stage: Build
111    displayName: Build binaries
112    jobs:
113    - template: windows-release/stage-build.yml
114      parameters:
115        ARM64TclTk: ${{ parameters.ARM64TclTk }}
116
117  - stage: Sign
118    displayName: Sign binaries
119    dependsOn: Build
120    jobs:
121    - template: windows-release/stage-sign.yml
122
123  - stage: Layout
124    displayName: Generate layouts
125    dependsOn: Sign
126    jobs:
127    - template: windows-release/stage-layout-full.yml
128      parameters:
129        ARM64TclTk: ${{ parameters.ARM64TclTk }}
130    - template: windows-release/stage-layout-embed.yml
131    - template: windows-release/stage-layout-nuget.yml
132
133  - stage: Pack
134    dependsOn: Layout
135    jobs:
136    - template: windows-release/stage-pack-nuget.yml
137
138  - stage: Test
139    dependsOn: Pack
140    jobs:
141    - template: windows-release/stage-test-embed.yml
142    - template: windows-release/stage-test-nuget.yml
143
144  - ${{ if eq(parameters.DoMSIX, 'true') }}:
145    - stage: Layout_MSIX
146      displayName: Generate MSIX layouts
147      dependsOn: Sign
148      jobs:
149      - template: windows-release/stage-layout-msix.yml
150        parameters:
151          ARM64TclTk: ${{ parameters.ARM64TclTk }}
152
153    - stage: Pack_MSIX
154      displayName: Package MSIX
155      dependsOn: Layout_MSIX
156      jobs:
157      - template: windows-release/stage-pack-msix.yml
158
159  - ${{ if eq(parameters.DoMSI, 'true') }}:
160    - stage: Build_MSI
161      displayName: Build MSI installer
162      dependsOn: Sign
163      jobs:
164      - template: windows-release/stage-msi.yml
165        parameters:
166          ARM64TclTk: ${{ parameters.ARM64TclTk }}
167
168    - stage: Test_MSI
169      displayName: Test MSI installer
170      dependsOn: Build_MSI
171      jobs:
172      - template: windows-release/stage-test-msi.yml
173
174  - ${{ if eq(parameters.DoPublish, 'true') }}:
175    - ${{ if eq(parameters.DoMSI, 'true') }}:
176      - stage: PublishPyDotOrg
177        displayName: Publish to python.org
178        dependsOn: ['Test_MSI', 'Test']
179        jobs:
180        - template: windows-release/stage-publish-pythonorg.yml
181
182    - ${{ if eq(parameters.DoNuget, 'true') }}:
183      - stage: PublishNuget
184        displayName: Publish to nuget.org
185        ${{ if eq(parameters.DoMSI, 'true') }}:
186          dependsOn: ['Test_MSI', 'Test']
187        ${{ else }}:
188          dependsOn: 'Test'
189        jobs:
190        - template: windows-release/stage-publish-nugetorg.yml
191
192    - ${{ if eq(parameters.DoMSIX, 'true') }}:
193      - stage: PublishStore
194        displayName: Publish to Store
195        ${{ if eq(parameters.DoMSI, 'true') }}:
196          dependsOn: ['Test_MSI', 'Pack_MSIX']
197        ${{ else }}:
198          dependsOn: 'Pack_MSIX'
199        jobs:
200        - template: windows-release/stage-publish-store.yml
201
202- ${{ else }}:
203  - stage: PublishExisting
204    displayName: Publish existing build
205    dependsOn: []
206    jobs:
207    - ${{ if eq(parameters.DoMSI, 'true') }}:
208      - template: windows-release/stage-publish-pythonorg.yml
209        parameters:
210          BuildToPublish: ${{ parameters.BuildToPublish }}
211
212    - ${{ if eq(parameters.DoNuget, 'true') }}:
213      - template: windows-release/stage-publish-nugetorg.yml
214        parameters:
215          BuildToPublish: ${{ parameters.BuildToPublish }}
216
217    - ${{ if eq(parameters.DoMSIX, 'true') }}:
218      - template: windows-release/stage-publish-store.yml
219        parameters:
220          BuildToPublish: ${{ parameters.BuildToPublish }}
221