diff --git a/.sync/Version.njk b/.sync/Version.njk index 0c6bec65..66f36422 100644 --- a/.sync/Version.njk +++ b/.sync/Version.njk @@ -30,7 +30,7 @@ #} {# The git ref value that files dependent on this repo will use. #} -{% set mu_devops = "v7.1.0" %} +{% set mu_devops = "v7.2.0" %} {# The latest Project Mu release branch value. #} {% set latest_mu_release_branch = "release/202302" %} diff --git a/.sync/azure_pipelines/MuDevOpsWrapper.yml b/.sync/azure_pipelines/MuDevOpsWrapper.yml index b0cf7e21..930abc68 100644 --- a/.sync/azure_pipelines/MuDevOpsWrapper.yml +++ b/.sync/azure_pipelines/MuDevOpsWrapper.yml @@ -45,6 +45,10 @@ parameters: - name: calculate_code_coverage displayName: Calculate Code Coverage From Unit Tests default: false +- name: coverage_publish_target + displayName: Code Coverage Publish Target + type: string + default: 'ado' # 'ado', 'codecov' - name: container_build displayName: Flag for whether this repo should do stuart_setup type: boolean @@ -93,6 +97,7 @@ jobs: do_ci_setup: ${{ parameters.do_ci_setup }} do_pr_eval: ${{ parameters.do_pr_eval }} calculate_code_coverage: ${{ parameters.calculate_code_coverage }} + coverage_publish_target: ${{ parameters.coverage_publish_target }} do_non_ci_setup: ${{ parameters.do_non_ci_setup }} do_non_ci_build: ${{ parameters.do_non_ci_build }} build_matrix: ${{ parameters.build_matrix }} diff --git a/Jobs/PrGate.yml b/Jobs/PrGate.yml index 2ef5bc0f..54c2ebac 100644 --- a/Jobs/PrGate.yml +++ b/Jobs/PrGate.yml @@ -39,6 +39,10 @@ parameters: displayName: Calculate Code Coverage type: boolean default: false +- name: coverage_publish_target + displayName: Code Coverage Publish Target + type: string + default: 'ado' # 'ado', 'codecov' - name: extra_post_build_steps displayName: Extra Post-Build Steps type: stepList @@ -159,6 +163,10 @@ jobs: do_non_ci_build: ${{ parameters.do_non_ci_build }} do_non_ci_setup: ${{ parameters.do_non_ci_setup }} do_pr_eval: ${{ parameters.do_pr_eval }} + ${{ if and(eq(parameters.calculate_code_coverage, true), eq(parameters.coverage_publish_target, 'codecov')) }}: + publish_coverage: true + ${{ else }}: + publish_coverage: false tool_chain_tag: ${{ parameters.tool_chain_tag }} install_tools: ${{ and(not(eq(item.Value.SelfHostAgent, true)), not(parameters.container_build)) }} extra_install_step: ${{ parameters.extra_install_step }} @@ -173,7 +181,7 @@ jobs: ${{ else }}: extra_build_args: '' -- ${{ if eq(parameters.calculate_code_coverage, true) }}: +- ${{ if and(eq(parameters.calculate_code_coverage, true), eq(parameters.coverage_publish_target, 'ado')) }}: - job: PublishCoverage dependsOn: - ${{ each item in parameters.build_matrix }}: @@ -188,7 +196,3 @@ jobs: steps: - template: ../Steps/PublishCodeCoverage.yml - parameters: - reorganize_by_inf: true - extra_parse_args: -t NOOPT TOOL_CHAIN_TAG=$(tool_chain_tag) - build_file: ${{ parameters.build_file }} diff --git a/Steps/PrGate.yml b/Steps/PrGate.yml index a020568e..dec9aa33 100644 --- a/Steps/PrGate.yml +++ b/Steps/PrGate.yml @@ -54,6 +54,10 @@ parameters: displayName: Perform Stuart PR Evaluation type: boolean default: true +- name: publish_coverage + displayName: Publish Code Coverage to codecov.io + type: boolean + default: false - name: extra_build_args displayName: Extra Build Command Arguments type: string @@ -162,6 +166,13 @@ steps: script: stuart_ci_build -c ${{ parameters.build_file }} -p $(pkgs_to_build) -t ${{ parameters.build_targets}} -a ${{ parameters.build_archs}} TOOL_CHAIN_TAG=${{ parameters.tool_chain_tag}} ${{ parameters.extra_build_args}} condition: and(gt(variables.pkg_count, 0), succeeded()) +- ${{ if eq(parameters.publish_coverage, true) }}: + - ${{ each pkg in split(parameters.build_pkgs, ',') }}: + - template: UploadCodeCoverage.yml + parameters: + report_dir: 'Build/${{ pkg }}' + flag: ${{ pkg }} + # Potential post-build steps - ${{ parameters.extra_post_build_steps }} diff --git a/Steps/PublishCodeCoverage.yml b/Steps/PublishCodeCoverage.yml index 7a86bbf0..d43046ce 100644 --- a/Steps/PublishCodeCoverage.yml +++ b/Steps/PublishCodeCoverage.yml @@ -14,18 +14,6 @@ parameters: displayName: Setup Python type: boolean default: true -- name: reorganize_by_inf - displayName: Reorganize cobertura report by INF # Requires stuart_report & stuart_parse - type: boolean - default: false -- name: extra_parse_args - displayName: Extra arguments for stuart_parse - type: string - default: '' -- name: build_file - displayName: Stuart Build File - type: string - default: ".pytool/CISettings.py" steps: - ${{ if eq(parameters.checkout_self, true) }}: @@ -46,10 +34,10 @@ steps: inputs: buildType: 'current' targetPath: '$(Build.ArtifactStagingDirectory)/coverage/' - itemPattern: "**/*coverage.xml" + itemPattern: "**/*_coverage.xml" - powershell: | - $coverage_file_count=(Get-ChildItem $(Build.ArtifactStagingDirectory)/coverage/ -Recurse -Include *coverage.xml).count + $coverage_file_count=(Get-ChildItem $(Build.ArtifactStagingDirectory)/coverage/ -Recurse -Include *_coverage.xml).count Write-Host echo "##vso[task.setvariable variable=coverage_file_count]$coverage_file_count" displayName: Check For Coverage Files @@ -58,22 +46,9 @@ steps: inputs: script: | dotnet tool install -g dotnet-reportgenerator-globaltool - reportgenerator -reports:$(Build.ArtifactStagingDirectory)/coverage/**/*coverage.xml -targetdir:$(Build.ArtifactStagingDirectory)/Coverage -reporttypes:Cobertura + reportgenerator -reports:$(Build.ArtifactStagingDirectory)/coverage/**/*_coverage.xml -targetdir:$(Build.ArtifactStagingDirectory)/Coverage -reporttypes:Cobertura condition: gt(variables.coverage_file_count, 0) -- ${{ if eq(parameters.reorganize_by_inf, true) }}: - - task: CmdLine@2 - displayName: Parse Workspace - inputs: - script: stuart_parse -c ${{ parameters.build_file }} ${{ parameters.extra_parse_args }} - condition: gt(variables.coverage_file_count, 0) - - - task: CmdLine@2 - displayName: Organize report by INF - inputs: - script: stuart_report coverage $(Build.ArtifactStagingDirectory)/Coverage/Cobertura.xml --by-package -o $(Build.ArtifactStagingDirectory)/Coverage/Cobertura.xml - condition: gt(variables.coverage_file_count, 0) - - task: PublishCodeCoverageResults@1 displayName: Publish Code Coverage inputs: diff --git a/Steps/UploadCodeCoverage.yml b/Steps/UploadCodeCoverage.yml index 2135cb7a..761b6fb7 100644 --- a/Steps/UploadCodeCoverage.yml +++ b/Steps/UploadCodeCoverage.yml @@ -17,6 +17,10 @@ parameters: displayName: Code Coverage Report type: string default: '' +- name: flag + displayName: Use Package Flags + type: string + default: '' - name: install_dependencies displayName: Install Pypi Dependencies type: boolean @@ -87,6 +91,27 @@ steps: if system == 'Linux': os.chmod(filename, 0o755) -- script: | - $(codecov_uploader_cmd) -t ${{ parameters.codecov_token }} -s ${{ parameters.report_dir }} -Z - displayName: Upload Code Coverage to Codecov.io +- task: PythonScript@0 + displayName: Run Codecov Uploader ${{ parameters.flag }} + env: + COV_FLAG: ${{ parameters.flag }} + REPORT_DIR: ${{ parameters.report_dir }} + UPLOAD_CMD: $(codecov_uploader_cmd) + inputs: + scriptSource: inline + script: | + from pathlib import Path + from edk2toollib.utility_functions import RunCmd + import io + import os + + COV_FLAG = os.environ['COV_FLAG'] + REPORT_DIR = os.environ['REPORT_DIR'] + UPLOAD_CMD = os.environ['UPLOAD_CMD'] + + for cov_file in Path(REPORT_DIR).rglob('*coverage.xml'): + outstream = io.StringIO() + params = f'-f {cov_file} -Z' + if COV_FLAG: + params += f' -F {COV_FLAG}' + RunCmd(UPLOAD_CMD, params, outstream=outstream, raise_exception_on_nonzero=True)