Publish generic HTML report in Azure DevOps release pipeline - azure-devops

I am working on publishing generic html report in Azure Devops release pipeline but not able to get any useful extension or approach to achieve it.
Also got a link in which same ticket is opened from two years in developer community.
Link: https://developercommunity.visualstudio.com/t/support-for-generic-html-publishing-inside-build-a/491426
Thank you,
Shivam

You have to use the following task :
PublishTestResults#2
E.g. This is what I use to publish a test result from the OWASP code analysis app
- task: PublishTestResults#2
displayName: 'Publish Dependency Check Test Results'
inputs:
testResultsFiles: 'dependency-check-junit.xml'
searchFolder: '/home/vsts/work/1/TestResults/dependency-check/'
testRunTitle: 'Dependency Check'
What you need to do is create a report following the formatting specification described in this link and target the directory where you saved (searchFolder) it (and possibly the name of the file in testResultsFiles) in the publishtestresults task.
The owasp task I am referencing is this:
dependency-check.dependencycheck.dependency-check-build-task.dependency-check-build-task#6
and here is the code for the whole task if you want to test it in your application (we analyze a package.json and package-lock.json in our case)
- task: dependency-check.dependencycheck.dependency-check-build-task.dependency-check-build-task#6
displayName: 'Dependency Check'
inputs:
projectName: dependencies-check
scanPath: '**/*.json'
warnOnCVSSViolation: true
format: 'ALL'
continueOnError: true
- task: PublishTestResults#2
displayName: 'Publish Dependency Check Test Results'
inputs:
testResultsFiles: 'dependency-check-junit.xml'
searchFolder: '/home/vsts/work/1/TestResults/dependency-check/'
testRunTitle: 'Dependency Check'
the result will be displayed in your pipeline screen under Tests

Related

Get Build Artifacts from Azure DevOps Microsoft-hosted Build Pipeline

I have quite a bit of experience with Azure DevOps on-premise and know where the build artifacts are stored when I run a build pipeline. However, we are moving to Microsoft-hosted build agents, and won't have any on-prem build server to store the artifacts from the build.
My question is, how do I get the build artifacts created from a build pipeline processed by a Microsoft-hosted build agent? Ultimately, I would like to download those artifacts to a file share that we have on-prem. Is this something that can be done?
I created a build pipeline in Azure DevOps (not on-prem) and ran the build. I added the marketplace extension Publish Build Artifact to the build pipeline and I expected that an artifact would be published so that I could download it to our company server. No artifact was produced.
In Azure yaml based pipelines, you can either use the pipeline artifacts method in this the artifacts are stored and associated with the pipeline or the universal method required additional steps to setup that uses the internal feed to store the artifacts. For pipeline artifacts you necessarily don't need to version the artifact since it is contained inside the pipeline. For universal unless you are overwriting the artifact you need to uniquely version them by any version mechanism you want to use, either to leverage off from app source code versioning or your own custom versioning.. like timestamp etc.
Below is an example of an dot. net build with both publish methods done in yaml pipeline.
# To run and store your build
- task: DotNetCoreCLI#2
displayName: "Build Project"
enabled: true
inputs:
command: "build"
projects: $(SolutionPath)
arguments: "--configuration Release --output $(Build.ArtifactStagingDirectory)"
# Here we start the postbuild steps
# This is to archive the build artifacts, stored by file number.
- task: ArchiveFiles#2
displayName: "Archive Artifacts"
inputs:
rootFolderOrFile: "$(Build.ArtifactStagingDirectory)"
includeRootFolder: false
archiveType: "zip"
archiveFile: "$(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip"
replaceExistingArchive: true
# This is to publish the artifact inside the pipeline, stored by file number.
- task: PublishBuildArtifacts#1
displayName: "Publish Artifacts"
inputs:
PathtoPublish: "$(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip"
ArtifactName: "drop"
publishLocation: "Container"
# This is to publish the artifact inside the universal artifacts feeds, stored by date/timestamp variable passed below as filename from another step.
- task: UniversalPackages#0
inputs:
command: 'publish'
publishDirectory: '$(Build.ArtifactStagingDirectory)'
feedsToUsePublish: 'internal'
vstsFeedPublish: 'your feed'
vstsFeedPackagePublish: 'azure-pipeline-dotnetapi'
versionOption: 'custom'
versionPublish: '$(setBuildValues.ApplicationVersion)'
packagePublishDescription: '$(setBuildValues.appVersion)'
For download of artifacts to a path you can use the below task and pass your network location as the path for download, i am not sure if it can use UNC paths might have to map the network path.
steps:
- task: DownloadBuildArtifacts#1
displayName: 'Download Build Artifacts'
inputs:
buildType: "current"
downloadType: "single"
downloadPath: ${{ parameters.DownloadPath }} #INSERT YOUR DOWNLOAD PATH HERE.

Azure SQL - DacPac Deployment

I am currently trying to test my DacPac deplyoment pipelines. However, I get error message all the time:
##[error]No files were found to deploy with search pattern C:\agent\_work\5\a\sqlproj_artifacts_1\DWH\DWH\bin\Release\database.dacpacCheck out how to troubleshoot failures at
I can't find what the problem is. Here the code, idea why it does not work? Have done before and worked perfectly....
steps:
- task: VSBuild#1
inputs:
solution: '$(solution)'
platform: '$(buildPlatform)'
configuration: '$(buildConfiguration)'
- task: PublishBuildArtifacts#1
inputs:
PathtoPublish: '$(Build.SourcesDirectory)'
ArtifactName: 'sqlproj_artifacts_$(System.JobAttempt)'
publishLocation: 'Container'
steps:
- task: DownloadBuildArtifacts#0
inputs:
buildType: 'current'
downloadType: 'single'
artifactName: 'sqlproj_artifacts_$(System.JobAttempt)'
downloadPath: '$(System.ArtifactsDirectory)'
deployType: 'DacpacTask'
DeploymentAction: 'Publish'
DacpacFile: '$(System.ArtifactsDirectory)/sqlproj_artifacts_$(System.JobAttempt)/DWH/DWH/bin/Release/$(azureSqlDBName).dacpac'
I'm using AuthenticationType: 'server'
And this is the local path where project is:
source\repos\DataWarehouse\DWH\DWH
Tried to adjust the path, but it still doesn't work.
Hope you can help me, thanks!
You can check the path of the artifact you are looking for on the build screen when you click on artifacts:
Here the $(azureSqlDBName).dacpac file name looks suspicious to me, as in if the dacpac is produced from a sql project, then probably the file will have the project name, not the azure sql db name.
In addition to this, I also would try to publish separate build artifacts for separate deployment, so instead of creating an artifact for the whole source artifact directory, I would copy the dacpac from the source to staging directory and then publish the dacpac artifact:
- task: CopyFiles#2
displayName: 'Copy DacPac Files'
inputs:
SourceFolder: '$(Build.SourcesDirectory)'
Contents: '**/*.dacpac'
TargetFolder: '$(Build.ArtifactStagingDirectory)/db'
CleanTargetFolder: true
OverWrite: true
flattenFolders: true
- task: PublishBuildArtifacts#1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)/db'
ArtifactName: 'sqlproj_artifacts_$(System.JobAttempt)'
publishLocation: 'Container'
Then it is easier to find what you are looking for when you need to use the artifact. Please note the flattenFolders flag which comes in handy when you are dealing with a single package within the artifact.
One more thing is the use of pipeline artifacts instead of build artifacts, since you are already working with yaml pipelines, and possibly multi-stage yamls, you can utilize pipeline artifacts which are automatically downloaded to the default workspace folder.
Hope it helps,

referencing pipeline in DownloadPipelineArtifact Step with variable wont work?

I have tried 2 different attempts to reference the correct pipeline when downloading specific artifacts via two different built in steps. and cannot seem to get it to work.
this first way, will error in the oddest way i have ever seen. the pipeline will show 'pending' when selecting the run itself, but when going back one level to view the pipeline as a whole it will show a red x as if the run has failed, but when trying to dig into it, i can get no output.
#attempt 1
- download: $(PIPELINE_NAME)
and. this second way will successfully download the package in <1sec.... meaning it isnt actually downloading anything. the next step will fail as no package is found.
- task: DownloadPipelineArtifact#2
name:
displayName: 'Download artifact test'
inputs:
buildtype: specific
project: <project name here>
pipeline: '$(PIPELINE_NAME)' #this just doesnt work for some reason
runVersion: specific
runId: $(resources.pipeline.$(PIPELINE_NAME).runID)
downloadPath: $(Pipeline.Workspace)
Is this just not meant to work? neither of these will resolve the variables and will fail. Anyone have any other suggestions? do these NEED to be hardcoded? or am i missing some syntax? We have several nearly identical micro-services that i would like to just share the same template between them if i could.
According to the arguments document of Download Pipeline Artifacts task, the value of pipeline parameter should be the definition ID of the build pipeline, not the source name. So this may be the reason that your parameter doesn't work.
To download artifact from another pipeline, you don't need to specify pipeline resources. This is my method of downloading artifacts from another pipeline:
Firstly, in my previous pipeline, I have a Publish pipeline artifact task:
- task: PublishPipelineArtifact#1
inputs:
targetPath: '$(Build.ArtifactStagingDirectory)'
artifact: 'drop'
publishLocation: 'pipeline'
And then, in another pipeline, I have a Download Pipeline Artifacts task:
- task: DownloadPipelineArtifact#2
inputs:
buildType: 'specific'
project: '$(project)'
definition: '$(pipelineID)'
buildVersionToDownload: 'specific'
pipelineId: '$(buildID)'
artifactName: 'drop'
targetPath: '$(Pipeline.Workspace)'
Tip:
You can click on "settings" above the task and fill in the information with UI if you don't need to use variables. UI will produce picklists of projects, pipelines, ... that you can choose.

Combine results of several pipeline jobs into azure web app package

We're in the process of moving our product to an azure web app. We have an extensive existing pipeline containing multiple parallel jobs. One of these jobs compiles a asp.net web application. Some others compile a vue.js website. Currently, the results of the web application and the vue projects are combined in a separate stage, using a powershell script.
Now I can convert the publish step of the web application to generate a deployment package for azure. But what is the best way of also adding the vue outputs into this package so I can deploy it to azure correctly, without losing the parallel jobs? I cannot include the is output files in my project, because they don't exist within the web application build job
You can use publish build artifact task to upload the build results of the web application and vue projects to azure devops server as #Krzysztof mentioned. And you can add a new job to download the artifacts.
Please check below simple example in yaml.
In order to combine the build results, you can use extract file task to extract the zipped artifacts and published the unpacked artifacts in Build_web job. And in the Combine job you can use copy file task to copy the results of vue artifacts to the web artifacts folder. And then you can use archive file task to pack the artifacts which now contains the results of web and vue application.
Combine job should dependsOn Build_web and Build_vue jobs
jobs:
- job: Build_Web
pool:
vmImage: "windows-latest"
steps:
- task: ExtractFiles#1
inputs:
archiveFilePatterns: '*.zip'
destinationFolder: '$(Build.ArtifactStagingDirectory)\unzip'
- task: PublishBuildArtifacts#1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)\unzip'
artifactName: webapp
- job: Build_Vue
pool:
vmImage: "windows-latest"
steps:
- task: PublishBuildArtifacts#1
inputs:
PathtoPublish: 'path to the build results'
artifactName: vueapp
- job: Combine
dependsOn:
- Build_Web
- Build_Vue
pool:
vmImage: "windows-latest"
steps:
- task: DownloadBuildArtifacts#0
inputs:
buildType: 'current'
artifactName: webapp
downloadPath: "$(System.ArtifactsDirectory)"
- task: DownloadBuildArtifacts#0
inputs:
buildType: 'current'
artifactName: vueapp
downloadPath: "$(System.ArtifactsDirectory)"
- task: CopyFiles#2
inputs:
SourceFolder: '$(System.ArtifactsDirectory)\vueapp'
TargetFolder: 'path to web application result folder' #eg. $(System.ArtifactsDirectory)\webapp\Content\d_C\a\1\s\AboutSite\AboutSite\obj\Release\netcoreapp2.0\PubTmp\Out\
- task: ArchiveFiles#2
inputs:
rootFolderOrFile: $(System.ArtifactsDirectory)\webapp
archiveType: 'zip'
archiveFile: '$(Build.ArtifactStagingDirectory)/webapplication.zip'
Above example only shows a general idea. You can aslo move the ExtractFile task to Combine job. In either way, you will have to use extract file, copy file and archive file task.
For TargetFolder parameter in copy file task, you can check the download build artifacts log for webapp artifact to get the full path. For example as below screenshot shows.
You can use PublishPipelineArtifact#1 to create artifacts for your projects and then in a separate job DownloadPipelineArtifact#2. By defining path you may compose your final artifact (if this mixing many projects is not more complicated than putting one inside another). And publish your artifact as build or pipeline artifact depending how you have roganized your release.
# Download an artifact named 'WebApp' to 'bin' in $(Build.SourcesDirectory)
- task: DownloadPipelineArtifact#2
inputs:
artifact: 'WebApp'
path: $(Build.SourcesDirectory)/bin
Here you have more info about publishing and downloding artifacts.

How to save Robot Framework tests' log files in release pipeline in Azure DevOps?

I have UI tests made by Robot Framework which we run after release in Azure DevOps. I can save test outputs, ie. passed and failed info. But how can I save logs, screenshots etc. outputs from those tests to release as files?
add below code in your yml file
- task: PublishTestResults#2
inputs:
testResultsFiles: outputxunit.xml
searchFolder: '/Users/runner/work/1/s/'
condition: succeededOrFailed()
displayName: 'Publish Test Results outputxunit.xml'