Skip to content

Instantly share code, notes, and snippets.

@anuraj
Created January 6, 2020 04:54
Show Gist options
  • Save anuraj/89c9275cb180d53c1f2d899219d7ed0f to your computer and use it in GitHub Desktop.
Save anuraj/89c9275cb180d53c1f2d899219d7ed0f to your computer and use it in GitHub Desktop.
Google Lighthouse Azure DevOps build pipeline
pool:
name: Azure Pipelines
demands: npm
steps:
- task: Npm@1
displayName: 'npm install'
inputs:
workingDir: '$(Build.SourcesDirectory)'
verbose: false
- task: Npm@1
displayName: 'npm custom'
inputs:
command: custom
workingDir: '$(Build.SourcesDirectory)'
verbose: false
customCommand: 'run scan-dotnetthoughts'
- powershell: |
function Get-ObjectMembers {
[CmdletBinding()]
Param(
[Parameter(Mandatory=$True, ValueFromPipeline=$True)]
[PSCustomObject]$obj
)
$obj | Get-Member -MemberType NoteProperty | ForEach-Object {
$key = $_.Name
[PSCustomObject]@{Key = $key; Value = $obj."$key"}
}
}
$lighthouse_report = Get-Content dotnetthoughts.report.json | ConvertFrom-Json
$audits = $lighthouse_report.audits
$timingEntries = $lighthouse_report.timing.entries
$junitTemplate = @'
<testsuite name="">
<testcase id="" name="" time="">
<failure></failure>
</testcase>
</testsuite>
'@
$xml = New-Object xml
$xml.LoadXml($junitTemplate)
$testCaseTemplate = (@($xml.testsuite.testcase)[0]).Clone()
$xml.testsuite.name = $lighthouse_report.requestedUrl.ToString()
$audits | Get-ObjectMembers | foreach {
if($_.Value.scoreDisplayMode -and
$_.Value.scoreDisplayMode -ne "manual" -and $_.Value.scoreDisplayMode -eq "binary"){
$testCase = $testCaseTemplate.clone()
$testCase.id = $_.Value.id.ToString()
$testCase.name = $_.Value.title.ToString()
$entryName = "lh:audit:" + $_.Value.id.ToString()
$timingEntries | foreach {
if($_.name -eq $entryName){
$testCase.time = $_.duration.ToString()
}
}
if(-not $_.Value.score){
$testCase.ChildNodes[0].innerText = $_.Value.description.ToString()
} else {
$testCase.RemoveChild($testCase.ChildNodes[0]) | Out-Null
}
$xml.testsuite.AppendChild($testCase) > $null
}
}
$xml.testsuite.testcase | Where-Object { $_.Name -eq "" } | ForEach-Object { [void]$xml.testsuite.RemoveChild($_) }
$outputFileName = "junit-report-test.xml"
$outputFile = Join-Path $(Build.ArtifactStagingDirectory) $outputFileName
$xml.Save($outputFile)
Write-Output $outputFile
displayName: 'PowerShell Script'
- task: CopyFiles@2
displayName: 'Copy Files to: $(Build.ArtifactStagingDirectory)'
inputs:
SourceFolder: '$(Build.SourcesDirectory)'
Contents: |
dotnetthoughts*.html
dotnetthoughts*.json
junit-report-*.xml
TargetFolder: '$(Build.ArtifactStagingDirectory)'
- task: PublishTestResults@2
displayName: 'Publish Test Results junit-report-test.xml'
inputs:
testResultsFiles: 'junit-report-test.xml'
searchFolder: '$(Build.ArtifactStagingDirectory)'
- task: PublishBuildArtifacts@1
displayName: 'Publish Artifact: light-house-scan-output'
inputs:
ArtifactName: 'light-house-scan-output'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment