blob: c04533bd49f35d824d9d35a89c1223f9fe8cb23b [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
name: 'vNext$(rev:.r)' # Format for build number (will be overridden)
# DevOps Setup: Define the following pipeline level variables in Azure DevOps build pipeline
#
# ArtifactFeedID: (Optional - set to your Azure DevOps Artifact (NuGet) feed. If not provided, publish job will be skipped.)
# BuildConfiguration: (Optional. Defaults to 'Release')
# BuildPlatform: (Optional. Defaults to 'Any CPU')
# GenerateDocs: (Optional. Only builds documentation website if set to 'true'.)
# GenerateWebsite: (Optional. Only builds lucene.net website if set to 'true'.)
# IsRelease: (Optional. By default the Release job is disabled, setting this to 'true' will enable it)
# RunTests: 'true' (Optional - set to 'false' to disable test jobs - useful for debugging. If not provided, tests will be run.)
# Versioning Variables
# BuildCounterSeed: (Optional - Set in conjunction with VersionSuffix, will cause the build counter to begin at this value. Note that it is set once, to reset is an API call.)
# PackageVersion: (Optional - This can be used to explicitly set the whole version number to a specific version, i.e. 4.8.0-beta00005. It overrides all other version settings.)
# PreReleaseCounterPattern: (Optional. Set to '0000000000' in ci pipeline or '00000' in release pipeline. The default is '0000000000'. This setting has no effect if VersionSuffix is ''.)
# VersionSuffix: (Optional. Defaults to 'ci'. Set to 'beta' or 'rc' or '' in production pipeline.)
variables:
- name: BuildCounter
value: $[counter(variables['VersionSuffix'],coalesce(variables['BuildCounterSeed'], 1250))]
- name: DocumentationArtifactName
value: 'docs'
- name: DocumentationArtifactZipFileName
value: 'documentation.zip'
- name: WebsiteArtifactName
value: 'website'
- name: WebsiteArtifactZipFileName
value: 'website.zip'
- name: BinaryArtifactName
value: 'testbinaries'
- name: NuGetArtifactName
value: 'nuget'
- name: DebugArtifactName # For .pdb symbols
value: 'debug'
- name: ReleaseArtifactName
value: 'release'
- name: TestResultsArtifactName
value: 'testresults'
- name: VersionArtifactName
value: 'version'
- name: BuildNumberFileName
value: 'buildNumber.txt'
- name: PackageVersionFileName
value: 'packageVersion.txt'
- name: FileVersionFileName
value: 'fileVersion.txt'
- name: BuildDirectory # Where the build scripts and configs are
value: '$(System.DefaultWorkingDirectory)/build'
- name: PublishDirectory # Test binaries directory
value: '$(Build.ArtifactStagingDirectory)/$(BinaryArtifactName)'
- name: NuGetArtifactDirectory # NuGet binaries directory
value: '$(Build.ArtifactStagingDirectory)/$(NuGetArtifactName)'
- name: PublishedArtifactZipFileName
value: 'published.zip'
stages:
- stage: Build_Stage
displayName: 'Build Stage:'
jobs:
- job: Build
pool:
vmImage: 'windows-2019'
variables:
PublishTempDirectory: '$(Build.BinariesDirectory)/publish'
steps:
- powershell: |
$configuration = if ($env:BUILDCONFIGURATION) { $env:BUILDCONFIGURATION } else { "Release" }
Write-Host "##vso[task.setvariable variable=BuildConfiguration;]$configuration"
displayName: 'Setup Default Variable Values'
- task: DotNetCoreInstaller@0
displayName: 'Use .NET Core sdk 3.1.100'
inputs:
version: 3.1.100
- powershell: |
Import-Module "$(BuildDirectory)/psake.psm1"
$generateBuildBat = if ($Env:ISRELEASE -eq 'true') { 'true' } else { 'false' }
$parameters = @{}
$properties = @{
backup_files='false';
publish_directory='$(PublishTempDirectory)';
nuget_package_directory='$(NuGetArtifactDirectory)'
# Lock the build.bat so it only builds this version in the release distribution
generateBuildBat=$generateBuildBat
}
[string[]]$tasks = 'Pack'
if ($Env:RunTests -ne 'false') {
[string[]]$tasks = 'Pack','Publish'
}
Invoke-psake $(BuildDirectory)/build.ps1 -Task $tasks -properties $properties -parameters $parameters
exit !($psake.build_success)
displayName: 'PSake Build, Pack, and Publish'
- template: 'build/azure-templates/show-all-environment-variables.yml'
- task: ArchiveFiles@2
displayName: 'Zip $(PublishTempDirectory)'
inputs:
rootFolderOrFile: '$(PublishTempDirectory)'
includeRootFolder: false
archiveFile: '$(PublishDirectory)/$(PublishedArtifactZipFileName)'
condition: and(succeeded(), ne(variables['RunTests'], 'false'))
- powershell: |
$dir = '$(Build.ArtifactStagingDirectory)/$(VersionArtifactName)'
if (!(Test-Path $dir)) { New-Item -ItemType Directory -Path "$dir" -Force }
'$(PackageVersion)' | Out-File -FilePath "$dir/$(PackageVersionFileName)" -Force
'$(FileVersion)' | Out-File -FilePath "$dir/$(FileVersionFileName)" -Force
'$(Build.BuildNumber)' | Out-File -FilePath "$dir/$(BuildNumberFileName)" -Force
displayName: 'Write Versions to Files'
# If this is a release pipeline, copy the build.bat and Version.props files as version artifacts, which will
# overwrite the build.bat and Version.props files of the release.
- task: CopyFiles@2
displayName: 'Copy build.bat and Version.props Files to: /$(VersionArtifactName)'
inputs:
SourceFolder: '$(System.DefaultWorkingDirectory)'
Contents: |
build.bat
Version.props
TargetFolder: '$(Build.ArtifactStagingDirectory)/$(VersionArtifactName)'
condition: and(succeeded(), eq(variables['IsRelease'], 'true'))
- task: PublishBuildArtifacts@1
displayName: 'Publish Artifact: $(VersionArtifactName)'
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)/$(VersionArtifactName)'
ArtifactName: '$(VersionArtifactName)'
# Copy the .pdb files as build artifacts, which will
# later be used to push to the Azure Artifacts symbol server.
- task: CopyFiles@2
displayName: 'Copy .pdb Files to: /$(DebugArtifactName)'
inputs:
SourceFolder: '$(System.DefaultWorkingDirectory)'
Contents: '**/bin/$(BuildConfiguration)/**/*.pdb'
TargetFolder: '$(Build.ArtifactStagingDirectory)/$(DebugArtifactName)'
- task: PublishBuildArtifacts@1
displayName: 'Publish Artifact: $(BinaryArtifactName)'
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)/$(BinaryArtifactName)'
ArtifactName: '$(BinaryArtifactName)'
condition: and(succeeded(), ne(variables['RunTests'], 'false'))
- task: PublishBuildArtifacts@1
displayName: 'Publish Artifact: $(NuGetArtifactName)'
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)/$(NuGetArtifactName)'
ArtifactName: '$(NuGetArtifactName)'
- task: PublishBuildArtifacts@1
displayName: 'Publish Artifact: $(DebugArtifactName)'
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)/$(DebugArtifactName)'
ArtifactName: '$(DebugArtifactName)'
- job: Docs
condition: and(succeeded(), eq(variables['GenerateDocs'], 'true'))
pool:
vmImage: 'vs2017-win2016'
steps:
- powershell: |
$(Build.SourcesDirectory)/websites/apidocs/docs.ps1 0 1
errorActionPreference: 'continue'
ignoreLASTEXITCODE: true
failOnStderr: false
displayName: 'Generate Documentation'
- task: ArchiveFiles@2
displayName: 'Zip Documenation Files'
inputs:
rootFolderOrFile: '$(Build.SourcesDirectory)/websites/apidocs/_site'
includeRootFolder: false
archiveFile: '$(Build.ArtifactStagingDirectory)/$(DocumentationArtifactName)/$(DocumentationArtifactZipFileName)'
- task: PublishBuildArtifacts@1
displayName: 'Publish Artifact: $(DocumentationArtifactName)'
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)/$(DocumentationArtifactName)'
ArtifactName: '$(DocumentationArtifactName)'
- job: Website
condition: and(succeeded(), eq(variables['GenerateWebsite'], 'true'))
pool:
vmImage: 'vs2017-win2016'
steps:
- powershell: |
$(Build.SourcesDirectory)/websites/site/site.ps1 0 1
errorActionPreference: 'continue'
ignoreLASTEXITCODE: true
failOnStderr: false
displayName: 'Generate Website'
- task: ArchiveFiles@2
displayName: 'Zip Website Files'
inputs:
rootFolderOrFile: '$(Build.SourcesDirectory)/websites/site/_site'
includeRootFolder: false
archiveFile: '$(Build.ArtifactStagingDirectory)/$(WebsiteArtifactName)/$(WebsiteArtifactZipFileName)'
- task: PublishBuildArtifacts@1
displayName: 'Publish Artifact: $(WebsiteArtifactName)'
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)/$(WebsiteArtifactName)'
ArtifactName: '$(WebsiteArtifactName)'
- stage: Test_Stage
displayName: 'Test Stage:'
jobs:
- job: Test_netcoreapp3_1
condition: and(succeeded(), ne(variables['RunTests'], 'false'))
strategy:
matrix:
Windows:
osName: 'Windows'
imageName: 'windows-2019'
maximumAllowedFailures: 4 # Maximum allowed failures for a successful build
Linux:
osName: 'Linux'
imageName: 'ubuntu-16.04'
maximumAllowedFailures: 4 # Maximum allowed failures for a successful build
macOS:
osName: 'macOS'
imageName: 'macOS-10.14'
maximumAllowedFailures: 4 # Maximum allowed failures for a successful build
displayName: 'Test netcoreapp3.1 on'
pool:
vmImage: $(imageName)
steps:
- template: 'build/azure-templates/run-tests-on-os.yml'
parameters:
osName: $(osName)
testTargetFrameworks: 'netcoreapp3.1'
testResultsArtifactName: '$(TestResultsArtifactName)'
publishedArtifactZipFileName: '$(PublishedArtifactZipFileName)'
maximumParallelJobs: 7
maximumAllowedFailures: $(maximumAllowedFailures)
- job: Test_netcoreapp2_2
condition: and(succeeded(), ne(variables['RunTests'], 'false'))
strategy:
matrix:
Windows:
osName: 'Windows'
imageName: 'windows-2019'
maximumAllowedFailures: 4 # Maximum allowed failures for a successful build
Linux:
osName: 'Linux'
imageName: 'ubuntu-16.04'
maximumAllowedFailures: 4 # Maximum allowed failures for a successful build
macOS:
osName: 'macOS'
imageName: 'macOS-10.14'
maximumAllowedFailures: 4 # Maximum allowed failures for a successful build
displayName: 'Test netcoreapp2.2 on'
pool:
vmImage: $(imageName)
steps:
- template: 'build/azure-templates/run-tests-on-os.yml'
parameters:
osName: $(osName)
testTargetFrameworks: 'netcoreapp2.2'
testResultsArtifactName: '$(TestResultsArtifactName)'
publishedArtifactZipFileName: '$(PublishedArtifactZipFileName)'
maximumParallelJobs: 7
maximumAllowedFailures: $(maximumAllowedFailures)
- job: Test_net48_Windows
condition: and(succeeded(), ne(variables['RunTests'], 'false'))
displayName: 'Test net48 on Windows'
pool:
vmImage: 'windows-2019'
steps:
- template: 'build/azure-templates/run-tests-on-os.yml'
parameters:
osName: 'Windows'
testTargetFrameworks: 'net48'
testResultsArtifactName: '$(TestResultsArtifactName)'
publishedArtifactZipFileName: '$(PublishedArtifactZipFileName)'
maximumParallelJobs: 8
maximumAllowedFailures: 4 # Maximum allowed failures for a successful build
- stage: Publish_Stage
displayName: 'Publish Stage:'
jobs:
# Optional job to push to Azure Artifact feed. Just pass in
# the GUID of the artifact feed as ArtifactFeedID to enable.
- job: Publish_Azure_Artifacts
condition: and(succeeded(), ne(variables['ArtifactFeedID'], ''))
pool:
vmImage: 'windows-2019'
steps:
- template: 'build/azure-templates/show-all-environment-variables.yml'
- task: DownloadBuildArtifacts@0
displayName: 'Download Build Artifacts: $(VersionArtifactName)'
inputs:
artifactName: '$(VersionArtifactName)'
downloadPath: '$(Build.ArtifactStagingDirectory)'
# NOTE: We are setting Build.BuildNumber here to the NuGet package version to work around the limitation that
# the version cannot be passed to the Index Sources & Publish Symbols task.
- powershell: |
$version = Get-Content '$(Build.ArtifactStagingDirectory)/$(VersionArtifactName)/$(PackageVersionFileName)' -Raw
Write-Host "##vso[task.setvariable variable=PackageVersion;]$version"
Write-Host "##vso[task.setvariable variable=Build.BuildNumber;]$version"
displayName: 'Read PackageVersion from File to Build.BuildNumber'
- template: 'build/azure-templates/show-all-environment-variables.yml'
- template: 'build/azure-templates/publish-nuget-packages.yml'
parameters:
artifactFeedID: '$(ArtifactFeedID)'
nugetArtifactName: '$(NuGetArtifactName)'
debugArtifactName: '$(DebugArtifactName)'
- stage: Release_Stage
displayName: 'Release Stage:'
jobs:
- job: Release
condition: and(succeeded(), eq(variables['IsRelease'], 'true'))
displayName: 'Build Release Artifacts for [VOTE]'
pool:
vmImage: 'windows-2019'
steps:
- template: 'build/azure-templates/show-all-environment-variables.yml'
- task: DownloadBuildArtifacts@0
displayName: 'Download Build Artifacts: $(NuGetArtifactName)'
inputs:
artifactName: '$(NuGetArtifactName)'
downloadPath: '$(Build.ArtifactStagingDirectory)'
- task: DownloadBuildArtifacts@0
displayName: 'Download Build Artifacts: $(VersionArtifactName)'
inputs:
artifactName: '$(VersionArtifactName)'
downloadPath: '$(Build.ArtifactStagingDirectory)'
- template: 'build/azure-templates/show-all-files.yml' # Uncomment for debugging
# NOTE: We are setting Build.BuildNumber here to the NuGet package version to work around the limitation that
# the version cannot be passed to the Index Sources & Publish Symbols task.
- powershell: |
$version = Get-Content '$(Build.ArtifactStagingDirectory)/$(VersionArtifactName)/$(PackageVersionFileName)' -Raw
$vcsLabel = 'Lucene.Net_' + $version.Replace('.', '_').Replace('-', '_')
Write-Host "##vso[task.setvariable variable=VCSLabel;]$vcsLabel"
Write-Host "##vso[task.setvariable variable=PackageVersion;]$version"
Write-Host "##vso[task.setvariable variable=Build.BuildNumber;]$version"
displayName: 'Build VCS Label and Rehydrate Version Variables'
- powershell: |
$files = 'build.bat','Version.props'
foreach ($file in $files) {
Copy-Item -Path "$(Build.ArtifactStagingDirectory)/$(VersionArtifactName)/$file" -Destination "$(Build.SourcesDirectory)/$file" -Force -ErrorAction Continue
}
displayName: 'Update build.bat and Version.props to build only version $(PackageVersion)'
- template: 'build/azure-templates/show-all-environment-variables.yml'
- task: CopyFiles@2
displayName: 'Copy Source Code Files to: $(Build.ArtifactStagingDirectory)/srctemp'
inputs:
SourceFolder: '$(Build.SourcesDirectory)'
Contents: |
**
!.git/**/*
!branding/**/*
!release/**/*
!src/**/bin/**/*
!src/**/obj/**/*
branding/logo/lucene-net-icon-128x128.png
TargetFolder: '$(Build.ArtifactStagingDirectory)/srctemp'
- task: ArchiveFiles@2
displayName: 'Archive Source Code Files'
inputs:
rootFolderOrFile: '$(Build.ArtifactStagingDirectory)/srctemp'
includeRootFolder: false
archiveFile: '$(Build.ArtifactStagingDirectory)/$(ReleaseArtifactName)/Apache-Lucene.Net-$(PackageVersion).src.zip'
- task: CopyFiles@2
displayName: 'Copy License/Notice Files to: $(Build.ArtifactStagingDirectory)/$(NuGetArtifactName)'
inputs:
SourceFolder: '$(Build.SourcesDirectory)'
Contents: |
LICENSE.txt
NOTICE.txt
TargetFolder: '$(Build.ArtifactStagingDirectory)/$(NuGetArtifactName)'
- task: ArchiveFiles@2
displayName: 'Archive Binary Files'
inputs:
rootFolderOrFile: '$(Build.ArtifactStagingDirectory)/$(NuGetArtifactName)'
includeRootFolder: false
archiveFile: '$(Build.ArtifactStagingDirectory)/$(ReleaseArtifactName)/Apache-Lucene.Net-$(PackageVersion).bin.zip'
- powershell: |
$dir = '$(Build.ArtifactStagingDirectory)/$(ReleaseArtifactName)'
if (!(Test-Path $dir)) { New-Item -ItemType Directory -Path "$dir" -Force }
$nl = [Environment]::NewLine
"TODO: Review: http://www.apache.org/legal/release-policy.html" + $nl + `
"TODO: Tag Repository" + $nl + `
" commit: $(Build.SourceVersion)" + $nl + `
" tag: $(VCSLabel)" + $nl + `
"TODO: Sign release artifacts (see https://www.apache.org/dev/release-signing.html)" + $nl + `
"TODO: Push release artifacts to dev (https://dist.apache.org/repos/dist/dev/lucenenet/)" + $nl + `
"TODO: Start release [VOTE] (see https://www.apache.org/foundation/voting.html)" + $nl | Out-File -FilePath "$dir/RELEASE-TODO.txt" -Force
displayName: 'Write RELEASE-TODO.txt'
- task: PublishBuildArtifacts@1
displayName: 'Publish Artifact: $(ReleaseArtifactName)'
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)/$(ReleaseArtifactName)'
ArtifactName: '$(ReleaseArtifactName)'
# LUCENENET TODO: Write VCS Label (git tag) automatically