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/*