blob: 82dc4e8e9ceeb2797ad662b581e0f5a9fc78d8ed [file] [log] [blame]
#-------------------------------------------------------------------------------------------------------
# Copyright (C) Microsoft. All rights reserved.
# Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
#-------------------------------------------------------------------------------------------------------
# Pre-Build script
#
# This script is fairly simple. It checks if it's running
# in a VSO. If it is, it uses the VSO environment variables
# to figure out the commit that triggered the build, and if
# such a commit exists, it saves it's description to the build
# output to make it easy to inspect builds.
#
# Require Environment:
# $Env:TF_BUILD_SOURCEGETVERSION
# $Env:TF_BUILD_DROPLOCATION
#
# Inferable Environment (if not specified, inferred by pre_post_util.ps1):
# $Env:TF_BUILD_SOURCESDIRECTORY (a.k.a. $srcpath)
# $Env:TF_BUILD_BUILDDIRECTORY (a.k.a. $objpath)
# $Env:TF_BUILD_BINARIESDIRECTORY (a.k.a. $binpath)
#
# Optional information (metadata only):
# $Env:TF_BUILD_BUILDDEFINITIONNAME
# $Env:TF_BUILD_BUILDNUMBER
# $Env:TF_BUILD_BUILDURI
param (
[Parameter(Mandatory=$True)]
[ValidateSet("x86", "x64", "arm", "arm64")]
[string]$arch,
[Parameter(Mandatory=$True)]
[ValidateSet("debug", "release", "test", "codecoverage")]
[string]$flavor,
[ValidateSet("default", "codecoverage", "pogo")]
[string]$subtype = "default",
[string]$srcpath = "",
[string]$binpath = "",
[string]$objpath = "",
[string]$logFile = "",
[string]$corePath = "core",
[string]$oauth
)
. $PSScriptRoot\pre_post_util.ps1
$srcpath, $buildRoot, $objpath, $binpath = `
ComputePaths `
-arch $arch -flavor $flavor -subtype $subtype -OuterScriptRoot $PSScriptRoot `
-srcpath $srcpath -buildRoot $buildRoot -objpath $objpath -binpath $binpath
WriteCommonArguments
$buildName = ConstructBuildName $arch $flavor $subtype
if (($logFile -eq "") -and (Test-Path $buildRoot)) {
if (-not(Test-Path -Path "${buildRoot}\logs")) {
$dummy = New-Item -Path "${buildRoot}\logs" -ItemType Directory -Force
}
$logFile = "${buildRoot}\logs\pre_build.${buildName}.log"
if (Test-Path -Path $logFile) {
Remove-Item $logFile -Force
}
}
#
# Create packages.config files
#
$packagesConfigFileText = @"
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="MicroBuild.Core" version="0.2.0" targetFramework="native" developmentDependency="true" />
</packages>
"@
$packagesFiles = Get-ChildItem -Path $Env:TF_BUILD_SOURCESDIRECTORY *.vcxproj -Recurse `
| ForEach-Object { Join-Path $_.DirectoryName "packages.config" }
foreach ($file in $packagesFiles) {
if (-not (Test-Path $file)) {
Write-Output $packagesConfigFileText | Out-File $file -Encoding utf8
}
}
#
# Create build metadata
#
if (Test-Path Env:\TF_BUILD_SOURCEGETVERSION)
{
$commitHash = ($Env:TF_BUILD_SOURCEGETVERSION).split(':')[2]
$gitExe = GetGitPath
$CoreHash = ""
if (Test-Path $corePath) {
$CoreHash = Invoke-Expression "$gitExe rev-parse ${commitHash}:core"
if (-not $?) {
$CoreHash = ""
}
}
$outputDir = $Env:TF_BUILD_DROPLOCATION
if (-not(Test-Path -Path $outputDir)) {
$dummy = New-Item -Path $outputDir -ItemType Directory -Force
}
Push-Location $srcpath
$info = GetBuildInfo $oauth $commitHash
$BuildDate = ([DateTime]$info.push.date).toString("yyMMdd-HHmm")
$buildPushId, $buildPushIdPart1, $buildPushIdPart2, $buildPushIdString = GetBuildPushId $info
# commit message
$command = "$gitExe log -1 --name-status -m --first-parent -p $commitHash"
$CommitMessageLines = Invoke-Expression $command
$CommitMessage = $CommitMessageLines -join "`r`n"
$changeTextFile = Join-Path -Path $outputDir -ChildPath "change.txt"
$changeTextFileContent = @"
TF_BUILD_BUILDDEFINITIONNAME = $Env:TF_BUILD_BUILDDEFINITIONNAME
TF_BUILD_BUILDNUMBER = $Env:TF_BUILD_BUILDNUMBER
TF_BUILD_SOURCEGETVERSION = $Env:TF_BUILD_SOURCEGETVERSION
TF_BUILD_BUILDURI = $Env:TF_BUILD_BUILDURI
PushId = $buildPushId $buildPushIdString
PushDate = $buildDate
$CommitMessage
"@
Write-Output "-----"
Write-Output $changeTextFile
Write-Output $changeTextFileContent
Write-Output $changeTextFileContent | Out-File $changeTextFile -Encoding utf8 -Append
Pop-Location
# commit hash
$buildCommit = ($Env:TF_BUILD_SOURCEGETVERSION).SubString(14)
$CommitHash = $buildCommit.Split(":")[1]
$outputJsonFile = Join-Path -Path $outputDir -ChildPath "change.json"
$changeJson = New-Object System.Object
$changeJson | Add-Member -type NoteProperty -name BuildDefinitionName -value $Env:TF_BUILD_BUILDDEFINITIONNAME
$changeJson | Add-Member -type NoteProperty -name BuildNumber -value $Env:TF_BUILD_BUILDNUMBER
$changeJson | Add-Member -type NoteProperty -name BuildUri -value $Env:TF_BUILD_BUILDURI
$changeJson | Add-Member -type NoteProperty -name BuildDate -value $BuildDate
$changeJson | Add-Member -type NoteProperty -name Branch -value $Env:BranchName
$changeJson | Add-Member -type NoteProperty -name CommitHash -value $CommitHash
$changeJson | Add-Member -type NoteProperty -name CoreHash -value $CoreHash
$changeJson | Add-Member -type NoteProperty -name PushId -value $BuildPushId
$changeJson | Add-Member -type NoteProperty -name PushIdPart1 -value $BuildPushIdPart1
$changeJson | Add-Member -type NoteProperty -name PushIdPart2 -value $BuildPushIdPart2
$changeJson | Add-Member -type NoteProperty -name PushIdString -value $BuildPushIdString
$changeJson | Add-Member -type NoteProperty -name Username -value $Env:Username
$changeJson | Add-Member -type NoteProperty -name CommitMessage -value $CommitMessageLines
## Look for a git note that requests a cirro run.
## We assume that, when this script is called in the context of a full build, the working directory
## is the root of the local full checkout.
## It's a bit of a layering violation to have this logic, which only applies to full builds, in the
## core pre_build script, but there's not an obviously better place to put it. There is a pre_build
## script in the full repo, but it doesn't seem to be executed as part of a VSO build, and it's not
## clear if anyone else uses it.
##
## Since we have to handle the case where a full build doesn't have a ChakraHub note anyway, just
## add the logic to the core script.
## Without the OAuth token, the git fetch command hangs, causing the entire build to time out. Per
## https://docs.microsoft.com/en-us/vsts/build-release/concepts/definitions/release/variables?view=vsts&tabs=shell#using-default-variables,
## we expect to find the auth token in System_AccessToken instead of System.AccessToken.
if (${Env:System_AccessToken})
{
git -c http.extraheader="AUTHORIZATION: bearer ${Env:System_AccessToken}" fetch origin refs/notes/ChakraHub:refs/notes/ChakraHub
Write-Output "looking for notes"
## One might be tempted to redirect the output of the "git notes" command on the next line to $null. Don't do that;
## it causes the check to fail even when git notes are present. However, we do have to redirect stderr, because
## git prints something to stderr if it doesn't find a note, and that would cause VSTS to think that the build failed.
if (git notes --ref=ChakraHub list HEAD 2>&1)
{
Write-Output "found git notes; adding to change.json"
$testConfig = (git notes --ref=ChakraHub show HEAD) -join "`n" | ConvertFrom-Json
$changeJson | Add-Member -type NoteProperty -name TestConfig -value $testConfig
}
else
{
Write-Output "no git notes found"
}
}
else
{
Write-Output "No OAuth token found; skipping check for git note that requests a cirro run"
}
Write-Output "-----"
Write-Output $outputJsonFile
$changeJson | ConvertTo-Json -depth 100 | Write-Output
$changeJson | ConvertTo-Json -depth 100 | Out-File $outputJsonFile -Encoding utf8
$buildInfoOutputDir = $objpath
if (-not(Test-Path -Path $buildInfoOutputDir)) {
$dummy = New-Item -Path $buildInfoOutputDir -ItemType Directory -Force
}
# generate build version prop file
$propsFile = Join-Path -Path $buildInfoOutputDir -ChildPath "Chakra.Generated.BuildInfo.props"
$propsFileTemplate = @"
<?xml version="1.0" encoding="utf-16"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<OutBaseDir>{0}</OutBaseDir>
<IntBaseDir>{1}</IntBaseDir>
<ChakraVersionBuildNumber>{2}</ChakraVersionBuildNumber>
<ChakraVersionBuildQFENumber>{3}</ChakraVersionBuildQFENumber>
<ChakraVersionBuildCommit>{4}</ChakraVersionBuildCommit>
<ChakraVersionBuildDate>{5}</ChakraVersionBuildDate>
</PropertyGroup>
</Project>
"@
$propsFileContent = $propsFileTemplate -f $buildRoot, $objpath, $buildPushIdPart1, $buildPushIdPart2, $buildCommit, $buildDate
Write-Output "-----"
Write-Output $propsFile
Write-Output $propsFileContent
Write-Output $propsFileContent | Out-File $propsFile
}
#
# Clean up code analysis summary files in case they get left behind
#
if (($objpath -ne "") -and (Test-Path $objpath)) {
Get-ChildItem $objpath -Include vc.nativecodeanalysis.all.xml -Recurse | Remove-Item -Verbose
}