1# Release pipeline (must be triggered manually)
2# * Builds for all platforms (with code signing)
3# * Creates packages for Python and NuGet
4# * Uploads build products to stores (GitHub, NuGet, PyPI)
5
6trigger: none
7
8variables:
9  ReleaseVersion: '4.8.10'
10
11stages:
12
13# Builds Z3 on various platforms
14- stage: Build
15  jobs:
16
17  - job: MacBuild
18    displayName: "macOS Build"
19    pool:
20      vmImage: "macOS-latest"
21    steps:
22    - task: PythonScript@0
23      displayName: Build
24      inputs:
25        scriptSource: 'filepath'
26        scriptPath: scripts/mk_unix_dist.py
27        arguments: --dotnet-key=$(Build.SourcesDirectory)/resources/z3.snk
28    - script: git clone https://github.com/z3prover/z3test z3test
29      displayName: 'Clone z3test'
30    - task: PythonScript@0
31      displayName: Test
32      inputs:
33        scriptSource: 'filepath'
34        scriptPath: z3test/scripts/test_benchmarks.py
35        arguments: build-dist/z3 z3test/regressions/smt2
36    - task: CopyFiles@2
37      inputs:
38        sourceFolder: dist
39        contents: '*.zip'
40        targetFolder: $(Build.ArtifactStagingDirectory)
41    - task: PublishPipelineArtifact@0
42      inputs:
43        artifactName: 'macOSBuild'
44        targetPath: $(Build.ArtifactStagingDirectory)
45
46  - job: UbuntuBuild
47    displayName: "Ubuntu build"
48    pool:
49      vmImage: "ubuntu-latest"
50    steps:
51    - task: PythonScript@0
52      displayName: Build
53      inputs:
54        scriptSource: 'filepath'
55        scriptPath: scripts/mk_unix_dist.py
56        arguments: --dotnet-key=$(Build.SourcesDirectory)/resources/z3.snk
57    - script: git clone https://github.com/z3prover/z3test z3test
58      displayName: 'Clone z3test'
59    - task: PythonScript@0
60      displayName: Test
61      inputs:
62        scriptSource: 'filepath'
63        scriptPath: z3test/scripts/test_benchmarks.py
64        arguments: build-dist/z3 z3test/regressions/smt2
65    - task: CopyFiles@2
66      inputs:
67        sourceFolder: dist
68        contents: '*.zip'
69        targetFolder: $(Build.ArtifactStagingDirectory)
70    - task: PublishPipelineArtifact@0
71      inputs:
72        artifactName: 'UbuntuBuild'
73        targetPath: $(Build.ArtifactStagingDirectory)
74
75  - job: ManyLinuxBuild
76    displayName: "ManyLinux build"
77    pool:
78      vmImage: "ubuntu-latest"
79    container: "quay.io/pypa/manylinux2010_x86_64:latest"
80    variables:
81      python: "/opt/python/cp35-cp35m/bin/python"
82    steps:
83    - task: PythonScript@0
84      displayName: Build
85      inputs:
86        scriptSource: 'filepath'
87        scriptPath: scripts/mk_unix_dist.py
88        arguments: --nodotnet --nojava
89        pythonInterpreter: $(python)
90    - script: git clone https://github.com/z3prover/z3test z3test
91      displayName: 'Clone z3test'
92    - task: PythonScript@0
93      displayName: Test
94      inputs:
95        scriptSource: 'filepath'
96        scriptPath: z3test/scripts/test_benchmarks.py
97        arguments: build-dist/z3 z3test/regressions/smt2
98        pythonInterpreter: $(python)
99    - task: CopyFiles@2
100      inputs:
101        sourceFolder: dist
102        contents: '*.zip'
103        targetFolder: $(Build.ArtifactStagingDirectory)
104    - task: PublishPipelineArtifact@0
105      inputs:
106        artifactName: 'ManyLinuxBuild'
107        targetPath: $(Build.ArtifactStagingDirectory)
108
109  - template: build-win-signed.yml
110    parameters:
111      ReleaseVersion: $(ReleaseVersion)
112      BuildArchitecture: 'x64'
113
114  - template: build-win-signed.yml
115    parameters:
116      ReleaseVersion: $(ReleaseVersion)
117      BuildArchitecture: 'x86'
118
119# Creates Z3 packages in various formats
120- stage: Package
121  jobs:
122
123  - job: NuGetPackage
124    displayName: "NuGet packaging"
125    pool:
126      vmImage: "windows-latest"
127    steps:
128    - powershell: write-host $(System.DefinitionId)
129      displayName: 'System.DefinitionId'
130    - powershell: write-host $(Build.BuildId)
131      displayName: 'Build.BuildId'
132    - powershell: write-host $(System.TeamProjectId)
133      displayName: 'System.TeamProjectId'
134    - task: DownloadPipelineArtifact@2
135      displayName: 'Download Win64 Build'
136      inputs:
137        artifact: 'WindowsBuild-x64'
138        path: $(Agent.TempDirectory)\package
139    - task: DownloadPipelineArtifact@2
140      displayName: 'Download Ubuntu Build'
141      inputs:
142        artifact: 'UbuntuBuild'
143        path: $(Agent.TempDirectory)\package
144    - task: DownloadPipelineArtifact@2
145      displayName: 'Download macOS Build'
146      inputs:
147        artifact: 'macOSBuild'
148        path: $(Agent.TempDirectory)\package
149    - task: PythonScript@0
150      displayName: 'Python: assemble files'
151      inputs:
152        scriptSource: 'filepath'
153        scriptPath: scripts\mk_nuget_task.py
154        workingDirectory: $(Agent.TempDirectory)\package
155        arguments:
156          $(Agent.TempDirectory)\package
157          $(ReleaseVersion)
158          $(Build.Repository.Uri)
159          $(Build.SourceBranchName)
160          $(Build.SourceVersion)
161          $(Build.SourcesDirectory)
162          symbols
163    - task: NuGetToolInstaller@0
164      inputs:
165        versionSpec: 5.x
166        checkLatest: false
167    - task: NugetCommand@2
168      displayName: 'NuGet Pack Symbols'
169      inputs:
170        command: custom
171        arguments: 'pack $(Agent.TempDirectory)\package\out\Microsoft.Z3.x64.sym.nuspec -OutputDirectory $(Build.ArtifactStagingDirectory) -Verbosity detailed -Symbols -SymbolPackageFormat snupkg -BasePath $(Agent.TempDirectory)\package\out'
172    - task: EsrpCodeSigning@1
173      displayName: 'Sign Package'
174      inputs:
175        ConnectedServiceName: 'z3-esrp-signing'
176        FolderPath: $(Build.ArtifactStagingDirectory)
177        Pattern: Microsoft.Z3.x64.$(ReleaseVersion).nupkg
178        signConfigType: 'inlineSignParams'
179        inlineOperation: |
180          [
181            {
182              "KeyCode" : "CP-401405",
183              "OperationCode" : "NuGetSign",
184              "Parameters" : {},
185              "ToolName" : "sign",
186              "ToolVersion" : "1.0"
187            },
188            {
189              "KeyCode" : "CP-401405",
190              "OperationCode" : "NuGetVerify",
191              "Parameters" : {},
192              "ToolName" : "sign",
193              "ToolVersion" : "1.0"
194            }
195          ]
196        SessionTimeout: '60'
197        MaxConcurrency: '50'
198        MaxRetryAttempts: '5'
199    - task: EsrpCodeSigning@1
200      displayName: 'Sign Symbol Package'
201      inputs:
202        ConnectedServiceName: 'z3-esrp-signing'
203        FolderPath: $(Build.ArtifactStagingDirectory)
204        Pattern: Microsoft.Z3.x64.$(ReleaseVersion).snupkg
205        signConfigType: 'inlineSignParams'
206        inlineOperation: |
207          [
208            {
209              "KeyCode" : "CP-401405",
210              "OperationCode" : "NuGetSign",
211              "Parameters" : {},
212              "ToolName" : "sign",
213              "ToolVersion" : "1.0"
214            },
215            {
216              "KeyCode" : "CP-401405",
217              "OperationCode" : "NuGetVerify",
218              "Parameters" : {},
219              "ToolName" : "sign",
220              "ToolVersion" : "1.0"
221            }
222          ]
223        SessionTimeout: '60'
224        MaxConcurrency: '50'
225        MaxRetryAttempts: '5'
226    - task: PublishPipelineArtifact@1
227      inputs:
228        targetPath: $(Build.ArtifactStagingDirectory)
229        artifactName: 'NuGetPackage'
230
231  - job: PythonPackage
232    displayName: "Python packaging"
233    pool:
234      vmImage: "ubuntu-latest"
235    steps:
236    - task: DownloadPipelineArtifact@2
237      displayName: 'Download macOS Build'
238      inputs:
239        artifact: 'macOSBuild'
240        path: $(Agent.TempDirectory)
241    - task: DownloadPipelineArtifact@2
242      displayName: 'Download ManyLinux Build'
243      inputs:
244        artifact: 'ManyLinuxBuild'
245        path: $(Agent.TempDirectory)
246    - task: DownloadPipelineArtifact@2
247      displayName: 'Download Win32 Build'
248      inputs:
249        artifact: 'WindowsBuild-x86'
250        path: $(Agent.TempDirectory)
251    - task: DownloadPipelineArtifact@2
252      displayName: 'Download Win64 Build'
253      inputs:
254        artifact: 'WindowsBuild-x64'
255        path: $(Agent.TempDirectory)
256    - script: cd $(Agent.TempDirectory); mkdir osx-bin; cd osx-bin; unzip ../*osx*.zip
257    - script: cd $(Agent.TempDirectory); mkdir linux-bin; cd linux-bin; unzip ../*centos*.zip
258    - script: cd $(Agent.TempDirectory); mkdir win32-bin; cd win32-bin; unzip ../*x86-win*.zip
259    - script: cd $(Agent.TempDirectory); mkdir win64-bin; cd win64-bin; unzip ../*x64-win*.zip
260    - script: python3 -m pip install --user -U setuptools wheel
261    - script: cd src/api/python; python3 setup.py sdist
262    # take a look at this PREMIUM HACK I came up with to get around the fact that the azure variable syntax overloads the bash syntax for subshells
263    - script: cd src/api/python; echo $(Agent.TempDirectory)/osx-bin/* | xargs printf 'PACKAGE_FROM_RELEASE=%s\n' | xargs -I '{}' env '{}' python3 setup.py bdist_wheel
264    - script: cd src/api/python; echo $(Agent.TempDirectory)/linux-bin/* | xargs printf 'PACKAGE_FROM_RELEASE=%s\n' | xargs -I '{}' env '{}' python3 setup.py bdist_wheel
265    - script: cd src/api/python; echo $(Agent.TempDirectory)/win32-bin/* | xargs printf 'PACKAGE_FROM_RELEASE=%s\n' | xargs -I '{}' env '{}' python3 setup.py bdist_wheel
266    - script: cd src/api/python; echo $(Agent.TempDirectory)/win64-bin/* | xargs printf 'PACKAGE_FROM_RELEASE=%s\n' | xargs -I '{}' env '{}' python3 setup.py bdist_wheel
267    - task: PublishPipelineArtifact@0
268      inputs:
269        artifactName: 'PythonPackage'
270        targetPath: src/api/python/dist
271
272# Uploads Z3 packages to various package stores
273- stage: Publish
274  jobs:
275
276  - job: GitHubPublish
277    displayName: "Publish to GitHub"
278    pool:
279      vmImage: "windows-latest"
280    steps:
281    - task: DownloadPipelineArtifact@2
282      displayName: 'Download Ubuntu Build'
283      inputs:
284        artifact: 'UbuntuBuild'
285        path: $(Agent.TempDirectory)
286    - task: DownloadPipelineArtifact@2
287      displayName: 'Download macOS Build'
288      inputs:
289        artifact: 'macOSBuild'
290        path: $(Agent.TempDirectory)
291    - task: DownloadPipelineArtifact@2
292      displayName: 'Download Win32 Build'
293      inputs:
294        artifact: 'WindowsBuild-x86'
295        path: $(Agent.TempDirectory)
296    - task: DownloadPipelineArtifact@2
297      displayName: "Download Python"
298      inputs:
299        artifactName: 'PythonPackage'
300        path: $(Agent.TempDirectory)
301    - task: DownloadPipelineArtifact@2
302      displayName: 'Download Win64 Build'
303      inputs:
304        artifact: 'WindowsBuild-x64'
305        path: $(Agent.TempDirectory)
306    - task: DownloadPipelineArtifact@2
307      displayName: 'Download NuGet Package'
308      inputs:
309        artifact: 'NuGetPackage'
310        path: $(Agent.TempDirectory)
311    - task: GitHubRelease@0
312      inputs:
313        gitHubConnection: Z3GitHub
314        repositoryName: $(Build.Repository.Name)
315        action: 'create'
316        target: '$(Build.SourceVersion)'
317        tagSource: 'manual'
318        tag: 'z3-$(ReleaseVersion)'
319        title: 'z3-$(ReleaseVersion)'
320        releaseNotesSource: 'input'
321        releaseNotes: '$(ReleaseVersion) release'
322        assets: '$(Agent.TempDirectory)/*.*'
323        isDraft: true
324        isPreRelease: false
325
326  # Enable on release:
327  - job: NuGetPublish
328    condition: eq(0,1)
329    displayName: "Publish to NuGet.org"
330    steps:
331    - task: DownloadPipelineArtifact@2
332      displayName: 'Download NuGet Package'
333      inputs:
334        artifact: 'NuGetPackage'
335        path: $(Agent.TempDirectory)
336    - task: NuGetToolInstaller@0
337      inputs:
338        versionSpec: 5.x
339        checkLatest: false
340    - task: NuGetCommand@2
341      inputs:
342        command: push
343        nuGetFeedType: External
344        publishFeedCredentials: Z3Nuget
345        packagesToPush: $(Agent.TempDirectory)/*.nupkg
346
347  # Enable on release:
348  - job: PyPIPublish
349    condition: eq(1,1)
350    displayName: "Publish to PyPI"
351    pool:
352      vmImage: "ubuntu-latest"
353    steps:
354    - task: DownloadPipelineArtifact@2
355      inputs:
356        artifact: 'PythonPackage'
357        path: dist
358    - task: DownloadSecureFile@1
359      name: pypirc
360      inputs:
361        secureFile: 'pypirc'
362    - script: python3 -m pip install --upgrade pip
363    - script: python3 -m pip install --user -U setuptools importlib_metadata wheel twine
364    - script: python3 -m twine upload --config-file $(pypirc.secureFilePath) -r $(pypiReleaseServer) dist/*