# Release pipeline (must be triggered manually) # * Builds for all platforms (with code signing) # * Creates packages for Python and NuGet # * Uploads build products to stores (GitHub, NuGet, PyPI) trigger: none variables: ReleaseVersion: '4.12.3' stages: # Builds Z3 on various platforms - stage: Build jobs: - job: MacBuild displayName: "macOS Build" pool: vmImage: "macOS-11" steps: - task: PythonScript@0 displayName: Build inputs: scriptSource: 'filepath' scriptPath: scripts/mk_unix_dist.py arguments: --dotnet-key=$(Build.SourcesDirectory)/resources/z3.snk - script: git clone https://github.com/z3prover/z3test z3test displayName: 'Clone z3test' - task: PythonScript@0 displayName: Test inputs: scriptSource: 'filepath' scriptPath: z3test/scripts/test_benchmarks.py arguments: build-dist/z3 z3test/regressions/smt2 - task: CopyFiles@2 inputs: sourceFolder: dist contents: '*.zip' targetFolder: $(Build.ArtifactStagingDirectory) - task: PublishPipelineArtifact@0 inputs: artifactName: 'macOSBuild' targetPath: $(Build.ArtifactStagingDirectory) - job: MacBuildArm64 displayName: "macOS ARM64 Build" pool: vmImage: "macOS-11" steps: - script: python scripts/mk_unix_dist.py --dotnet-key=$(Build.SourcesDirectory)/resources/z3.snk --arch=arm64 --os=osx-11.0 - script: git clone https://github.com/z3prover/z3test z3test - script: cp dist/*.zip $(Build.ArtifactStagingDirectory)/. - task: PublishPipelineArtifact@1 inputs: artifactName: 'MacArm64' targetPath: $(Build.ArtifactStagingDirectory) - job: UbuntuBuild displayName: "Ubuntu build" pool: vmImage: "ubuntu-latest" steps: - task: PythonScript@0 displayName: Build inputs: scriptSource: 'filepath' scriptPath: scripts/mk_unix_dist.py arguments: --dotnet-key=$(Build.SourcesDirectory)/resources/z3.snk - script: git clone https://github.com/z3prover/z3test z3test displayName: 'Clone z3test' - task: PythonScript@0 displayName: Test inputs: scriptSource: 'filepath' scriptPath: z3test/scripts/test_benchmarks.py arguments: build-dist/z3 z3test/regressions/smt2 - task: CopyFiles@2 inputs: sourceFolder: dist contents: '*.zip' targetFolder: $(Build.ArtifactStagingDirectory) - task: PublishPipelineArtifact@0 inputs: artifactName: 'UbuntuBuild' targetPath: $(Build.ArtifactStagingDirectory) - job: UbuntuBuild20 displayName: "Ubuntu build 20" pool: vmImage: "ubuntu-20.04" steps: - task: PythonScript@0 displayName: Build inputs: scriptSource: 'filepath' scriptPath: scripts/mk_unix_dist.py arguments: --dotnet-key=$(Build.SourcesDirectory)/resources/z3.snk - script: git clone https://github.com/z3prover/z3test z3test displayName: 'Clone z3test' - task: PythonScript@0 displayName: Test inputs: scriptSource: 'filepath' scriptPath: z3test/scripts/test_benchmarks.py arguments: build-dist/z3 z3test/regressions/smt2 - task: CopyFiles@2 inputs: sourceFolder: dist contents: '*.zip' targetFolder: $(Build.ArtifactStagingDirectory) - task: PublishPipelineArtifact@0 inputs: artifactName: 'UbuntuBuild20' targetPath: $(Build.ArtifactStagingDirectory) - job: UbuntuArm64 displayName: "Ubuntu ARM64 build" pool: vmImage: "ubuntu-latest" steps: - script: python scripts/mk_unix_dist.py --dotnet-key=$(Build.SourcesDirectory)/resources/z3.snk --arch=arm64 - script: git clone https://github.com/z3prover/z3test z3test - script: python z3test/scripts/test_benchmarks.py build-dist/z3 z3test/regressions/smt2 - script: cp dist/*.zip $(Build.ArtifactStagingDirectory)/. - task: PublishPipelineArtifact@0 inputs: artifactName: 'UbuntuArm64' targetPath: $(Build.ArtifactStagingDirectory) - job: UbuntuDoc displayName: "Ubuntu Doc build" pool: vmImage: "ubuntu-latest" steps: - script: pip3 install importlib-resources - script: sudo apt-get install ocaml opam libgmp-dev - script: opam init -y - script: eval `opam config env`; opam install zarith ocamlfind -y - script: eval `opam config env`; python scripts/mk_make.py --ml - script: sudo apt-get install doxygen - script: sudo apt-get install graphviz - script: | set -e cd build eval `opam config env` make -j3 make -j3 examples make -j3 test-z3 cd .. - script: | set -e eval `opam config env` cd doc python3 mk_api_doc.py --mld --z3py-package-path=../build/python/z3 python3 mk_params_doc.py mkdir api/html/ml ocamldoc -html -d api/html/ml -sort -hide Z3 -I $( ocamlfind query zarith ) -I ../build/api/ml ../build/api/ml/z3enums.mli ../build/api/ml/z3.mli cd .. - script: zip -r z3doc.zip doc/api - script: cp z3doc.zip $(Build.ArtifactStagingDirectory)/. - task: PublishPipelineArtifact@0 inputs: artifactName: 'UbuntuDoc' targetPath: $(Build.ArtifactStagingDirectory) - job: LinuxBuilds displayName: "ManyLinux build" variables: name: ManyLinux python: "/opt/python/cp37-cp37m/bin/python" pool: vmImage: "ubuntu-latest" container: "quay.io/pypa/manylinux2014_x86_64:latest" steps: - task: PythonScript@0 displayName: Build inputs: scriptSource: 'filepath' scriptPath: scripts/mk_unix_dist.py arguments: --nodotnet --nojava pythonInterpreter: $(python) - script: git clone https://github.com/z3prover/z3test z3test displayName: 'Clone z3test' - task: PythonScript@0 displayName: Test inputs: scriptSource: 'filepath' scriptPath: z3test/scripts/test_benchmarks.py arguments: build-dist/z3 z3test/regressions/smt2 pythonInterpreter: $(python) - task: CopyFiles@2 inputs: sourceFolder: dist contents: '*.zip' targetFolder: $(Build.ArtifactStagingDirectory) - task: PublishPipelineArtifact@0 inputs: artifactName: 'ManyLinuxBuild' targetPath: $(Build.ArtifactStagingDirectory) - template: build-win-signed.yml parameters: ReleaseVersion: $(ReleaseVersion) BuildArchitecture: 'x64' - template: build-win-signed.yml parameters: ReleaseVersion: $(ReleaseVersion) BuildArchitecture: 'x86' # Creates Z3 packages in various formats - stage: Package jobs: - job: NuGet64 displayName: "NuGet 64 packaging" pool: vmImage: "windows-latest" steps: - powershell: write-host $(System.DefinitionId) displayName: 'System.DefinitionId' - powershell: write-host $(Build.BuildId) displayName: 'Build.BuildId' - powershell: write-host $(System.TeamProjectId) displayName: 'System.TeamProjectId' - task: DownloadPipelineArtifact@2 displayName: 'Download Win64 Build' inputs: artifact: 'WindowsBuild-x64' path: $(Agent.TempDirectory)\package - task: DownloadPipelineArtifact@2 displayName: 'Download Ubuntu Build' inputs: artifact: 'UbuntuBuild' path: $(Agent.TempDirectory)\package - task: DownloadPipelineArtifact@2 displayName: 'Download Ubuntu20 Build' inputs: artifact: 'UbuntuBuild20' path: $(Agent.TempDirectory)\package - task: DownloadPipelineArtifact@2 displayName: 'Download Ubuntu ARM64 Build' inputs: artifact: 'UbuntuArm64' path: $(Agent.TempDirectory)\package - task: DownloadPipelineArtifact@2 displayName: 'Download macOS Build' inputs: artifact: 'macOSBuild' path: $(Agent.TempDirectory)\package - task: NuGetToolInstaller@0 inputs: versionSpec: 5.x checkLatest: false - task: PythonScript@0 displayName: 'Python: assemble files' inputs: scriptSource: 'filepath' scriptPath: scripts\mk_nuget_task.py workingDirectory: $(Agent.TempDirectory)\package arguments: $(Agent.TempDirectory)\package $(ReleaseVersion) $(Build.Repository.Uri) $(Build.SourceBranchName) $(Build.SourceVersion) $(Build.SourcesDirectory) symbols - task: NugetCommand@2 displayName: 'NuGet Pack Symbols' inputs: command: custom arguments: 'pack $(Agent.TempDirectory)\package\out\Microsoft.Z3.sym.nuspec -OutputDirectory $(Build.ArtifactStagingDirectory) -Verbosity detailed -Symbols -SymbolPackageFormat snupkg -BasePath $(Agent.TempDirectory)\package\out' - task: EsrpCodeSigning@2 displayName: 'Sign Package' inputs: ConnectedServiceName: 'z3-esrp-signing-2' FolderPath: $(Build.ArtifactStagingDirectory) Pattern: Microsoft.Z3.$(ReleaseVersion).nupkg signConfigType: 'inlineSignParams' inlineOperation: | [ { "KeyCode" : "CP-401405", "OperationCode" : "NuGetSign", "Parameters" : {}, "ToolName" : "sign", "ToolVersion" : "2.0" }, { "KeyCode" : "CP-401405", "OperationCode" : "NuGetVerify", "Parameters" : {}, "ToolName" : "sign", "ToolVersion" : "2.0" } ] SessionTimeout: '60' MaxConcurrency: '50' MaxRetryAttempts: '5' - task: EsrpCodeSigning@2 displayName: 'Sign Symbol Package' inputs: ConnectedServiceName: 'z3-esrp-signing-2' FolderPath: $(Build.ArtifactStagingDirectory) Pattern: Microsoft.Z3.$(ReleaseVersion).snupkg signConfigType: 'inlineSignParams' inlineOperation: | [ { "KeyCode" : "CP-401405", "OperationCode" : "NuGetSign", "Parameters" : {}, "ToolName" : "sign", "ToolVersion" : "2.0" }, { "KeyCode" : "CP-401405", "OperationCode" : "NuGetVerify", "Parameters" : {}, "ToolName" : "sign", "ToolVersion" : "2.0" } ] SessionTimeout: '60' MaxConcurrency: '50' MaxRetryAttempts: '5' - task: PublishPipelineArtifact@1 inputs: targetPath: $(Build.ArtifactStagingDirectory) artifactName: 'NuGet' - job: NuGet32 displayName: "NuGet 32 packaging" pool: vmImage: "windows-latest" steps: - powershell: write-host $(System.DefinitionId) displayName: 'System.DefinitionId' - powershell: write-host $(Build.BuildId) displayName: 'Build.BuildId' - powershell: write-host $(System.TeamProjectId) displayName: 'System.TeamProjectId' - task: DownloadPipelineArtifact@2 displayName: 'Download Win32 Build' inputs: artifact: 'WindowsBuild-x86' path: $(Agent.TempDirectory)\package - task: NuGetToolInstaller@0 inputs: versionSpec: 5.x checkLatest: false - task: PythonScript@0 displayName: 'Python: assemble files' inputs: scriptSource: 'filepath' scriptPath: scripts\mk_nuget_task.py workingDirectory: $(Agent.TempDirectory)\package arguments: $(Agent.TempDirectory)\package $(ReleaseVersion) $(Build.Repository.Uri) $(Build.SourceBranchName) $(Build.SourceVersion) $(Build.SourcesDirectory) symbols x86 - task: NugetCommand@2 displayName: 'NuGet Pack Symbols' inputs: command: custom arguments: 'pack $(Agent.TempDirectory)\package\out\Microsoft.Z3.x86.sym.nuspec -OutputDirectory $(Build.ArtifactStagingDirectory) -Verbosity detailed -Symbols -SymbolPackageFormat snupkg -BasePath $(Agent.TempDirectory)\package\out' - task: EsrpCodeSigning@2 displayName: 'Sign Package' inputs: ConnectedServiceName: 'z3-esrp-signing-2' FolderPath: $(Build.ArtifactStagingDirectory) Pattern: Microsoft.Z3.x86.$(ReleaseVersion).nupkg signConfigType: 'inlineSignParams' inlineOperation: | [ { "KeyCode" : "CP-401405", "OperationCode" : "NuGetSign", "Parameters" : {}, "ToolName" : "sign", "ToolVersion" : "1.0" }, { "KeyCode" : "CP-401405", "OperationCode" : "NuGetVerify", "Parameters" : {}, "ToolName" : "sign", "ToolVersion" : "1.0" } ] SessionTimeout: '60' MaxConcurrency: '50' MaxRetryAttempts: '5' - task: EsrpCodeSigning@2 displayName: 'Sign Symbol Package' inputs: ConnectedServiceName: 'z3-esrp-signing-2' FolderPath: $(Build.ArtifactStagingDirectory) Pattern: Microsoft.Z3.x86.$(ReleaseVersion).snupkg signConfigType: 'inlineSignParams' inlineOperation: | [ { "KeyCode" : "CP-401405", "OperationCode" : "NuGetSign", "Parameters" : {}, "ToolName" : "sign", "ToolVersion" : "1.0" }, { "KeyCode" : "CP-401405", "OperationCode" : "NuGetVerify", "Parameters" : {}, "ToolName" : "sign", "ToolVersion" : "1.0" } ] SessionTimeout: '60' MaxConcurrency: '50' MaxRetryAttempts: '5' - task: PublishPipelineArtifact@1 inputs: targetPath: $(Build.ArtifactStagingDirectory) artifactName: 'NuGet32' - job: PythonPackage displayName: "Python packaging" pool: vmImage: "ubuntu-latest" steps: - task: DownloadPipelineArtifact@2 displayName: 'Download macOS Build' inputs: artifact: 'macOSBuild' path: $(Agent.TempDirectory) - task: DownloadPipelineArtifact@2 displayName: 'Download macOS Arm64 Build' inputs: artifact: 'MacArm64' path: $(Agent.TempDirectory) - task: DownloadPipelineArtifact@2 displayName: 'Download ManyLinux Build' inputs: artifact: 'ManyLinuxBuild' path: $(Agent.TempDirectory) - task: DownloadPipelineArtifact@2 displayName: 'Download Win32 Build' inputs: artifact: 'WindowsBuild-x86' path: $(Agent.TempDirectory) - task: DownloadPipelineArtifact@2 displayName: 'Download Win64 Build' inputs: artifact: 'WindowsBuild-x64' path: $(Agent.TempDirectory) - script: cd $(Agent.TempDirectory); mkdir osx-x64-bin; cd osx-x64-bin; unzip ../*x64-osx*.zip - script: cd $(Agent.TempDirectory); mkdir osx-arm64-bin; cd osx-arm64-bin; unzip ../*arm64-osx*.zip - script: cd $(Agent.TempDirectory); mkdir libc-bin; cd libc-bin; unzip ../*glibc*.zip - script: cd $(Agent.TempDirectory); mkdir win32-bin; cd win32-bin; unzip ../*x86-win*.zip - script: cd $(Agent.TempDirectory); mkdir win64-bin; cd win64-bin; unzip ../*x64-win*.zip - script: python3 -m pip install --user -U setuptools wheel - script: cd src/api/python; python3 setup.py sdist # 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 - script: cd src/api/python; echo $(Agent.TempDirectory)/osx-x64-bin/* | xargs printf 'PACKAGE_FROM_RELEASE=%s\n' | xargs -I '{}' env '{}' python3 setup.py bdist_wheel - script: cd src/api/python; echo $(Agent.TempDirectory)/osx-arm64-bin/* | xargs printf 'PACKAGE_FROM_RELEASE=%s\n' | xargs -I '{}' env '{}' python3 setup.py bdist_wheel - script: cd src/api/python; echo $(Agent.TempDirectory)/libc-bin/* | xargs printf 'PACKAGE_FROM_RELEASE=%s\n' | xargs -I '{}' env '{}' python3 setup.py bdist_wheel - 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 - 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 - task: PublishPipelineArtifact@0 inputs: artifactName: 'PythonPackage' targetPath: src/api/python/dist # Uploads Z3 packages to various package stores - stage: Publish jobs: - job: GitHubPublish condition: eq(1,1) displayName: "Publish to GitHub" pool: vmImage: "windows-latest" steps: - task: DownloadPipelineArtifact@2 displayName: 'Download Ubuntu Build' inputs: artifact: 'UbuntuBuild20' path: $(Agent.TempDirectory) - task: DownloadPipelineArtifact@2 displayName: 'Download Ubuntu Build' inputs: artifact: 'UbuntuBuild' path: $(Agent.TempDirectory) - task: DownloadPipelineArtifact@2 displayName: "Download Ubuntu Arm64" inputs: artifactName: 'UbuntuArm64' targetPath: tmp - task: DownloadPipelineArtifact@2 displayName: "Download Doc" inputs: artifact: 'UbuntuDoc' path: $(Agent.TempDirectory) - task: DownloadPipelineArtifact@2 displayName: 'Download macOS Build' inputs: artifact: 'macOSBuild' path: $(Agent.TempDirectory) - task: DownloadPipelineArtifact@2 displayName: 'Download macOSArm64 Build' inputs: artifact: 'MacArm64' path: $(Agent.TempDirectory) - task: DownloadPipelineArtifact@2 displayName: 'Download Win32 Build' inputs: artifact: 'WindowsBuild-x86' path: $(Agent.TempDirectory) - task: DownloadPipelineArtifact@2 displayName: "Download Python" inputs: artifactName: 'PythonPackage' path: $(Agent.TempDirectory) - task: DownloadPipelineArtifact@2 displayName: 'Download Win64 Build' inputs: artifact: 'WindowsBuild-x64' path: $(Agent.TempDirectory) - task: DownloadPipelineArtifact@2 displayName: 'Download NuGet64 Package' inputs: artifact: 'NuGet' path: $(Agent.TempDirectory) - task: DownloadPipelineArtifact@2 displayName: 'Download NuGet32 Package' inputs: artifact: 'NuGet32' path: $(Agent.TempDirectory) - task: GitHubRelease@0 inputs: gitHubConnection: Z3Prover repositoryName: $(Build.Repository.Name) action: 'create' target: '$(Build.SourceVersion)' tagSource: 'manual' tag: 'z3-$(ReleaseVersion)' title: 'z3-$(ReleaseVersion)' releaseNotesSource: 'input' releaseNotes: '$(ReleaseVersion) release' assets: '$(Agent.TempDirectory)/*.*' isDraft: true isPreRelease: true - job: NuGetPublish condition: eq(1,0) displayName: "Publish to NuGet.org" steps: - task: DownloadPipelineArtifact@2 displayName: 'Download NuGet Package' inputs: artifact: 'NuGetPackage' path: $(Agent.TempDirectory) - task: NuGetToolInstaller@0 inputs: versionSpec: 5.x checkLatest: false - task: NuGetCommand@2 inputs: command: push nuGetFeedType: External publishFeedCredentials: $(NugetZ3) packagesToPush: $(Agent.TempDirectory)/*.nupkg # Enable on release: - job: PyPIPublish condition: eq(1,1) displayName: "Publish to PyPI" pool: vmImage: "ubuntu-latest" steps: - task: DownloadPipelineArtifact@2 inputs: artifact: 'PythonPackage' path: dist - task: DownloadSecureFile@1 name: pypircs inputs: secureFile: 'pypircs' - script: python3 -m pip install --upgrade pip - script: python3 -m pip install --user -U setuptools importlib_metadata wheel twine - script: python3 -m twine upload --config-file $(pypircs.secureFilePath) -r $(pypiReleaseServer) dist/*