diff --git a/azure-pipelines-template.yml b/azure-pipelines-template.yml index 996be3b6..e238490d 100644 --- a/azure-pipelines-template.yml +++ b/azure-pipelines-template.yml @@ -3,29 +3,23 @@ parameters: jobs: - job: vs2017_${{ parameters.arch }} - variables: - ${{ if eq( parameters.arch, 'x64') }}: - winArch: " Win64" - ${{ if eq( parameters.arch, 'x86') }}: - winArch: "" pool: vmImage: 'vs2017-win2016' steps: - checkout: self clean: true submodules: true - - - task: CMake@1 - displayName: CMake configuration - inputs: - workingDirectory: 'build-${{ parameters.arch }}' - cmakeArgs: '-G "Visual Studio 15 2017${{ variables.winArch }}" -T v141_xp -DORC_BUILD_VCPKG=ON ..' - - - task: CMake@1 - displayName: CMake build - inputs: - workingDirectory: 'build-${{ parameters.arch }}' - cmakeArgs: '--build . --config MinSizeRel -- -maxcpucount' + - task: PowerShell@2 + inputs: + targetType: 'inline' + script: | + . $(Build.SourcesDirectory)/tools/ci/build.ps1 + Build-ORC ` + -Source $(Build.SourcesDirectory) ` + -Output $(Build.SourcesDirectory)/artifacts ` + -Toolchain vs2017 ` + -Architecture ${{ parameters.arch }} ` + -Configuration Debug,MinSizeRel - task: VSTest@2 inputs: @@ -36,28 +30,10 @@ jobs: - task: CopyFiles@2 inputs: - sourceFolder: '$(Build.SourcesDirectory)' - contents: 'build-${{ parameters.arch }}/MinSizeRel/dfir-orc_${{ parameters.arch }}.exe' - TargetFolder: '$(Build.ArtifactStagingDirectory)' - - - task: CopyFiles@2 - inputs: - sourceFolder: '$(Build.SourcesDirectory)' - contents: 'build-${{ parameters.arch }}/MinSizeRel/dfir-orc_${{ parameters.arch }}.pdb' + sourceFolder: '$(Build.SourcesDirectory)/artifacts' + contents: '**' TargetFolder: '$(Build.ArtifactStagingDirectory)' - - task: CopyFiles@2 - inputs: - sourceFolder: $(Build.SourcesDirectory) - contents: 'build-${{ parameters.arch }}/MinSizeRel/fastfind_${{ parameters.arch }}.exe' - TargetFolder: $(Build.ArtifactStagingDirectory) - - - task: CopyFiles@2 - inputs: - sourceFolder: $(Build.SourcesDirectory) - contents: 'build-${{ parameters.arch }}/MinSizeRel/fastfind_${{ parameters.arch }}.pdb' - TargetFolder: $(Build.ArtifactStagingDirectory) - - task: PublishBuildArtifacts@1 inputs: pathtoPublish: $(Build.ArtifactStagingDirectory) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index e6fd8079..96a99277 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -1,6 +1,11 @@ trigger: - master +parameters: +- name: PublishRelease + type: boolean + default: true + stages: - stage: Build jobs: @@ -13,6 +18,7 @@ stages: arch: "x86" - stage: Publish + condition: ${{parameters.PublishRelease}} jobs: - job: RetrieveAndPublish steps: @@ -43,13 +49,13 @@ stages: tagSource: 'auto' tagPattern: '^v?[0-9]+\.[0-9]+\.[0-9]+' assets: | - $(Build.ArtifactStagingDirectory)/drop_x64/build-x64/MinSizeRel/DFIR-Orc_x64.exe - $(Build.ArtifactStagingDirectory)/drop_x64/build-x64/MinSizeRel/DFIR-Orc_x64.pdb - $(Build.ArtifactStagingDirectory)/drop_x64/build-x64/MinSizeRel/FastFind_x64.exe - $(Build.ArtifactStagingDirectory)/drop_x64/build-x64/MinSizeRel/FastFind_x64.pdb - $(Build.ArtifactStagingDirectory)/drop_x86/build-x86/MinSizeRel/DFIR-Orc_x86.exe - $(Build.ArtifactStagingDirectory)/drop_x86/build-x86/MinSizeRel/DFIR-Orc_x86.pdb - $(Build.ArtifactStagingDirectory)/drop_x86/build-x86/MinSizeRel/FastFind_x86.exe - $(Build.ArtifactStagingDirectory)/drop_x86/build-x86/MinSizeRel/FastFind_x86.pdb + $(Build.ArtifactStagingDirectory)/drop_x64/bin/MinSizeRel/DFIR-Orc_x64.exe + $(Build.ArtifactStagingDirectory)/drop_x64/pdb/MinSizeRel/DFIR-Orc_x64.pdb + $(Build.ArtifactStagingDirectory)/drop_x64/bin/MinSizeRel/FastFind_x64.exe + $(Build.ArtifactStagingDirectory)/drop_x64/pdb/MinSizeRel/FastFind_x64.pdb + $(Build.ArtifactStagingDirectory)/drop_x86/bin/MinSizeRel/DFIR-Orc_x86.exe + $(Build.ArtifactStagingDirectory)/drop_x86/pdb/MinSizeRel/DFIR-Orc_x86.pdb + $(Build.ArtifactStagingDirectory)/drop_x86/bin/MinSizeRel/FastFind_x86.exe + $(Build.ArtifactStagingDirectory)/drop_x86/pdb/MinSizeRel/FastFind_x86.pdb changeLogCompareToRelease: 'lastFullRelease' changeLogType: 'commitBased' diff --git a/tools/ci/build.ps1 b/tools/ci/build.ps1 new file mode 100644 index 00000000..71be24b6 --- /dev/null +++ b/tools/ci/build.ps1 @@ -0,0 +1,178 @@ +function Build-Orc +{ + <# + .SYNOPSIS + Build wrapper around cmake to facilitate CI integration. + + .PARAMETER Source + Path to DFIR-ORC source root directory to build. + + .PARAMETER BuildDirectory + Output directory. Must be a subdirectory of Path. Relative path will be treated as relative to $Path. + Default value: '$Source/build'. + + .PARAMETER Output + Build artifacts output directory + + .PARAMETER Architecture + Target architecture (x86, x64). + + .PARAMETER Configuration + Target configuration (Debug, MinSizeRel, Release, RelWithDebInfo). + + .PARAMETER Runtime + Target runtime (static, dynamic). Default value: 'static'. + + .PARAMETER Clean + Clean build directory + + .OUTPUTS + None or error on failure. + + .EXAMPLE + Build DFIR-Orc in 'F:\dfir-orc\build-x64' and place artefacts in 'F:\dfir-orc\build-x64\Artefacts' + + . F:\Orc\tools\ci\build.ps1 + Build-Orc -Path F:\dfir-orc -Clean -Output build-x64 -Configuration Debug,MinSizeRel -Architecture x64 -Runtime static + #> + + [cmdletbinding()] + Param ( + [Parameter(Mandatory = $True)] + [ValidateNotNullOrEmpty()] + [System.IO.DirectoryInfo] + $Source, + [Parameter(Mandatory = $False)] + [ValidateNotNullOrEmpty()] + [System.IO.DirectoryInfo] + $BuildDirectory = "$Source/build", + [Parameter(Mandatory = $False)] + [ValidateNotNullOrEmpty()] + [System.IO.DirectoryInfo] + $Output, + [Parameter(Mandatory = $True)] + [ValidateSet('x86', 'x64')] + [String] + $Architecture, + [Parameter(Mandatory = $False)] + [ValidateSet('vs2017', 'vs2019')] + [String] + $Toolchain = 'vs2019', + [Parameter(Mandatory = $True)] + [ValidateSet('Debug', 'MinSizeRel', 'RelWithDebInfo')] + [String[]] + $Configuration, + [Parameter(Mandatory = $False)] + [ValidateSet('static', 'dynamic')] + [String] + $Runtime = 'static', + [Parameter(Mandatory = $False)] + [switch] + $Clean + ) + + $OrcPath = (Resolve-Path -Path $Source).Path + + # Map cmake architecture option against $Architecture + $CMakeArch = @{ + "x86" = "Win32"; + "x64" = "x64"; + } + + if(-not [System.IO.Path]::IsPathRooted($BuildDirectory)) + { + $BuildDirectory = "$OrcPath/$BuildDirectory" + } + + if(-not [System.IO.Path]::IsPathRooted($Output)) + { + $Output = "$OrcPath/$Output" + } + + $BuildDir = "$BuildDirectory/$Architecture" + + $Generators = @{ + "vs2017_x86" = @(("-G", "`"Visual Studio 15 2017`"")) + "vs2017_x64" = @(("-G", "`"Visual Studio 15 2017 Win64`"")) + "vs2019_x86" = @(("-G", "`"Visual Studio 16 2019`"")) + "vs2019_x64" = @(("-G", "`"Visual Studio 16 2019`""), ("-A", "x64")) + } + + $Generator = $Generators[$Toolchain + "_" + $Architecture] + + if($Clean) + { + Remove-Item -Force -Recurse -Path $BuildDir -ErrorAction Ignore + } + + New-Item -Force -ItemType Directory -Path $BuildDir | Out-Null + + Push-Location $BuildDir + try + { + $CMakeExe = Find-CMake + if(-not $CMakeExe) + { + Write-Error "Cannot find 'cmake.exe'" + return + } + + foreach($Config in $Configuration) + { + # if($Toolchain.Equals("vs2019")) + # { + # $ToolchainArch = "-A ${Architecture}" + # } + + # $CMakeGenerationArgs = @( + # ("-G", "${Generator}") + # ("-T", "v141_xp") + # "-DORC_BUILD_VCPKG=ON" + # "-DVCPKG_TARGET_TRIPLET=${Architecture}-windows-static" + # "-DCMAKE_TOOLCHAIN_FILE=${OrcPath}\external\vcpkg\scripts\buildsystems\vcpkg.cmake" + # "${OrcPath}" + # ) + # Write-Output @CMakeGenerationArgs + # . $CMakeExe @CMakeGenerationArgs + + . $CMakeExe ` + @Generator ` + -T v141_xp ` + -DORC_BUILD_VCPKG=ON ` + -DVCPKG_TARGET_TRIPLET="${Architecture}-windows-static" ` + -DCMAKE_TOOLCHAIN_FILE="${OrcPath}\external\vcpkg\scripts\buildsystems\vcpkg.cmake" ` + $OrcPath + + . $CMakeExe --build . --config $Config -- -maxcpucount + + . $CMakeExe --install . --prefix $Output --config $Config + } + } + finally + { + Pop-Location + } +} + +function Find-CMake +{ + $CMakeExe = Get-Command "cmake.exe" -ErrorAction SilentlyContinue + if($CMakeExe) + { + return $CMakeExe + } + + $Locations = @( + "c:\Program Files (x86)\Microsoft Visual Studio\2019\*\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" + "c:\Program Files (x86)\Microsoft Visual Studio\*\*\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" + ) + + foreach($Location in $Locations) + { + $Path = Get-Item -Path $Location + if($Path) + { + return $Path + } + } +}