Skip to content

Add tests to validate DT headers #2557

Add tests to validate DT headers

Add tests to validate DT headers #2557

name: Build and Package Profiler
on:
# run this workflow on a push to any branch so we can get code coverage reports
#
# NOTE: On a push, only the build jobs will execute; the NuGet jobs will not run.
# Manually run this workflow on your branch when you want it to update the
# NuGet package and create a PR to update the package version reference in
# Home.csproj.
push:
branches:
- main
- "feature/**"
paths-ignore:
- ".github/**" # skip changes to the .github branch (workflows, etc.)
pull_request:
paths-ignore:
- ".github/**" # skip changes to the .github branch (workflows, etc.)
# this workflow can be called from another workflow
workflow_call:
inputs:
deploy:
description: 'Deploy NuGet Package'
required: true
default: false
type: boolean
# this workflow can be invoked manually
workflow_dispatch:
inputs:
deploy:
description: 'Deploy NuGet Package'
required: true
default: false
type: boolean
permissions:
contents: read
# only allow one instance of this workflow to be running per PR or branch, cancels any that are already running
concurrency:
group: build-profiler-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
env:
scripts_path: ${{ github.workspace }}\build\scripts
tools_path: ${{ github.workspace }}\build\Tools
DOTNET_NOLOGO: true
jobs:
build-windows-profiler:
name: Build Windows Profiler & Run Unit Tests / Code Coverage
runs-on: windows-latest
env:
tests_base_path: ${{ github.workspace }}\src\Agent\NewRelic
profiler_solution_path: ${{ github.workspace }}\src\Agent\NewRelic\Profiler\NewRelic.Profiler.sln
output_path: ${{ github.workspace }}\src\Agent\_profilerBuild
test_results_path: ${{ github.workspace }}\src\Agent\NewRelic\TestResults
steps:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
fetch-depth: 0
- name: Add msbuild to PATH
uses: microsoft/setup-msbuild@6fb02220983dee41ce7ae257b6f4d8f9bf5ed4ce # v2.0.0
- name: Clean out _profilerBuild directory
run: |
Remove-Item -Path "${{ github.workspace }}\src\Agent\_profilerBuild\*.*" -Force -Recurse -ErrorAction SilentlyContinue
shell: powershell
- name: Build x64
run: |
Write-Host "List NuGet Sources"
dotnet nuget list source # For unknown reasons, this step is necessary to avoid subsequent problems with NuGet package restore
Write-Host "MSBuild.exe -restore -m -p:Platform=x64 -p:Configuration=Release ${{ env.profiler_solution_path }}"
MSBuild.exe -restore -m -p:Platform=x64 -p:Configuration=Release ${{ env.profiler_solution_path }}
shell: powershell
- name: Build x86
run: |
Write-Host "MSBuild.exe -restore -m -p:Platform=Win32 -p:Configuration=Release ${{ env.profiler_solution_path }}"
MSBuild.exe -restore -m -p:Platform=Win32 -p:Configuration=Release ${{ env.profiler_solution_path }}
shell: powershell
- name: Setup VSTest and add to PATH
uses: darenm/Setup-VSTest@3a16d909a1f3bbc65b52f8270d475d905e7d3e44 # 1.3
id: setup_vstest
- name: Setup OpenCppCoverage and add to PATH
id: setup_opencppcoverage
run: |
choco install OpenCppCoverage -y
echo "C:\Program Files\OpenCppCoverage" >> $env:GITHUB_PATH
- name: Generate Report
id: generate_test_report
shell: cmd
run: |
cd ${{ env.tests_base_path }}
OpenCppCoverage.exe --sources Profiler --excluded_sources rapidxml --excluded_sources Profiler\SystemCalls.h --excluded_sources test --modules NewRelic\Profiler --export_type cobertura:${{ env.test_results_path }}\profilerx86.xml -- "vstest.console.exe" /Platform:x86 "Profiler\CommonTest\bin\x86\Release\CommonTest.dll" "Profiler\ConfigurationTest\bin\x86\Release\ConfigurationTest.dll" "Profiler\LoggingTest\bin\x86\Release\LoggingTest.dll" "Profiler\MethodRewriterTest\bin\x86\Release\MethodRewriterTest.dll" "Profiler\SignatureParserTest\bin\x86\Release\SignatureParserTest.dll" "Profiler\Sicily\SicilyTest\bin\x86\Release\SicilyTest.dll"
mv ${{ env.tests_base_path}}\LastCoverageResults.log ${{ env.tests_base_path}}\LastCoverageResults_x86.log
OpenCppCoverage.exe --sources Profiler --cover_children --excluded_sources rapidxml --excluded_sources Profiler\SystemCalls.h --excluded_sources test --modules NewRelic\Profiler --export_type cobertura:${{ env.test_results_path }}\profilerx64.xml -- "vstest.console.exe" /Platform:x64 "Profiler\CommonTest\bin\x64\Release\CommonTest.dll" "Profiler\ConfigurationTest\bin\x64\Release\ConfigurationTest.dll" "Profiler\LoggingTest\bin\x64\Release\LoggingTest.dll" "Profiler\MethodRewriterTest\bin\x64\Release\MethodRewriterTest.dll" "Profiler\SignatureParserTest\bin\x64\Release\SignatureParserTest.dll" "Profiler\Sicily\SicilyTest\bin\x64\Release\SicilyTest.dll"
mv ${{ env.tests_base_path}}\LastCoverageResults.log ${{ env.tests_base_path}}\LastCoverageResults_x64.log
- name: Upload coverage reports to Codecov.io
uses: codecov/codecov-action@b9fd7d16f6d7d1b5d2bec1a2887e65ceed900238 # v4.6.0
with:
flags: Profiler
files: ${{ env.test_results_path }}/profilerx86.xml,${{ env.test_results_path }}/profilerx64.xml
token: ${{ secrets.CODECOV_TOKEN }}
- name: Archive Build Artifacts
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3
with:
name: profiler-windows
path: ${{ github.workspace }}\src\Agent\_profilerBuild\**\*
if-no-files-found: error
- name: Archive Code Coverage Artifacts
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3
with:
name: profiler-code-coverage
path: |
${{ env.test_results_path }}\*.xml
${{ env.tests_base_path }}\*.log
if-no-files-found: error
build-linux-x64-profiler:
name: Build Linux x64 Profiler
runs-on: ubuntu-22.04
permissions:
contents: read
env:
profiler_path: ${{ github.workspace }}/src/Agent/NewRelic/Profiler
CORECLR_NEW_RELIC_HOME: ${{ github.workspace }}/src/Agent/NewRelic/newrelichome_x64_coreclr_linux # not used but required by Profiler/docker-compose.yml
steps:
# intentionally disabled for this job, when enabled it causes a failure in the Build Linux Profiler step
# - name: Harden Runner
# uses: step-security/harden-runner@03bee3930647ebbf994244c21ddbc0d4933aab4f # v2.3.0
# with:
# egress-policy: audit
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
fetch-depth: 0
- name: Clean out _profilerBuild directory
run: |
rm -f ${{ github.workspace }}/src/Agent/_profilerBuild/*.* || true
rm -rf ${{ github.workspace }}/src/Agent/_profilerBuild/linux-x64-release || true
rm -rf ${{ github.workspace }}/src/Agent/_profilerBuild/linux-arm64-release || true
rm -rf ${{ github.workspace }}/src/Agent/_profilerBuild/x64-Release || true
rm -rf ${{ github.workspace }}/src/Agent/_profilerBuild/x86-Release || true
shell: bash
- name: Build Linux Profiler
run: |
cd ${{ env.profiler_path }}
docker compose build build
docker compose run build
shell: bash
- name: Move Profiler to staging folder
run: |
mkdir --parents ${{ github.workspace }}/src/Agent/_profilerBuild/linux-x64-release/
mv -f ${{ env.profiler_path }}/libNewRelicProfiler.so ${{ github.workspace }}/src/Agent/_profilerBuild/linux-x64-release/libNewRelicProfiler.so
shell: bash
- name: Archive Artifacts
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3
with:
name: profiler-amd64
path: ${{ github.workspace }}/src/Agent/_profilerBuild/
if-no-files-found: error
build-linux-arm64-profiler:
name: Build Linux ARM64 Profiler
runs-on: ubuntu-22.04
permissions:
contents: read # for actions/checkout to fetch code
packages: write # for uraimo/run-on-arch-action to cache docker images
env:
profiler_path: ${{ github.workspace }}/src/Agent/NewRelic/Profiler
steps:
- name: Harden Runner
uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1
with:
egress-policy: audit
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
fetch-depth: 0
- name: Clean out _profilerBuild directory
run: |
rm -f ${{ github.workspace }}/src/Agent/_profilerBuild/*.* || true
rm -rf ${{ github.workspace }}/src/Agent/_profilerBuild/linux-x64-release || true
rm -rf ${{ github.workspace }}/src/Agent/_profilerBuild/linux-arm64-release || true
rm -rf ${{ github.workspace }}/src/Agent/_profilerBuild/x64-Release || true
rm -rf ${{ github.workspace }}/src/Agent/_profilerBuild/x86-Release || true
shell: bash
- uses: uraimo/run-on-arch-action@5397f9e30a9b62422f302092631c99ae1effcd9e # v2.8.1
name: Run commands
id: runcmd
with:
arch: aarch64
distro: ubuntu18.04
githubToken: ${{ github.token }}
install: |
apt-get update -q -y
apt-get install -q -y wget curl git dos2unix software-properties-common make binutils libc++-dev clang-3.9 lldb-3.9 build-essential
echo "deb https://apt.llvm.org/trusty/ llvm-toolchain-trusty-3.9 main" | tee /etc/apt/sources.list.d/llvm.list
wget --no-cache --no-cookies -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add -
mkdir /root/git
cd /root/git
git clone --branch release/3.1 https://github.com/dotnet/coreclr.git
curl -sSL https://virtuoso-testing.s3.us-west-2.amazonaws.com/cmake-3.9.0-rc3-aarch64.tar.gz | tar -xzC ~
chmod 777 ~/cmake-3.9.0-rc3-aarch64/bin/cmake
ln -s ~/cmake-3.9.0-rc3-aarch64/bin/cmake /usr/bin/cmake || true
rm /usr/bin/cc || true
ln -s /usr/bin/clang-3.9 /usr/bin/cc
rm /usr/bin/c++ || true
ln -s /usr/bin/clang++-3.9 /usr/bin/c++
dockerRunArgs: |
--volume "${{ env.profiler_path }}:/profiler"
run: |
cd /profiler
chmod 777 ./linux/build_profiler.sh
./linux/build_profiler.sh
- name: Move Profiler to staging folder
run: |
mkdir --parents ${{ github.workspace }}/src/Agent/_profilerBuild/linux-arm64-release/
mv -f ${{ env.profiler_path }}/libNewRelicProfiler.so ${{ github.workspace }}/src/Agent/_profilerBuild/linux-arm64-release/libNewRelicProfiler.so
shell: bash
- name: Archive Artifacts
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3
with:
name: profiler-arm64
path: ${{ github.workspace }}/src/Agent/_profilerBuild/
if-no-files-found: error
package-and-deploy:
needs:
[
build-windows-profiler,
build-linux-x64-profiler,
build-linux-arm64-profiler,
]
if: ${{ inputs.deploy }}
name: Package and Deploy Profiler NuGet
runs-on: windows-2022
env:
nuget_source: https://www.nuget.org
outputs:
package_version: ${{ steps.agentVersion.outputs.version }}
steps:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
fetch-depth: 0
- name: Download Windows Profiler Artifacts to working Directory
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
with:
name: profiler-windows
path: ${{ github.workspace }}/_workingDir
- name: Download Linux amd64 Profiler Artifacts to working Directory
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
with:
name: profiler-amd64
path: ${{ github.workspace }}/_workingDir
- name: Download Linux arm64 Profiler Artifacts to working Directory
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
with:
name: profiler-arm64
path: ${{ github.workspace }}/_workingDir
- name: Determine Package Version from Git history
id: agentVersion
run: |
# get latest agent version tag
$agentVersion = git describe --match v* --abbrev=0 HEAD --tags
# get commit count since that tag
$getRevCmd = "git rev-list $agentVersion..HEAD --count HEAD"
$agentRev = Invoke-Expression $getRevCmd
# if count is > 0, add the rev to the version
if ($agentRev -gt 0) { $agentVersion = $agentVersion + "." + $agentRev}
# remove the leading "v" from the version number
$agentVersion = $agentVersion.substring(1)
echo "version=$agentVersion" >> $env:GITHUB_OUTPUT
shell: powershell
- name: Stage files in working directory
run: |
New-Item "${{ github.workspace }}/_workingDir/images" -Type "directory"
Copy-Item -Path "${{ github.workspace }}/build/Packaging/NugetProfiler/images/*.*" -Destination "${{ github.workspace }}/_workingDir/images"
New-Item "${{ github.workspace }}/_workingDir/build" -Type "directory"
Copy-Item -Path "${{ github.workspace }}/build/Packaging/NugetProfiler/build/*.*" -Destination "${{ github.workspace }}/_workingDir/build"
Copy-Item -Path "${{ github.workspace }}/build/Packaging/NugetProfiler/readme.md" -Destination "${{ github.workspace }}/_workingDir"
- name: Pack Profiler NuGet Package
run: |
New-Item "${{ github.workspace }}/_workingDir/NugetProfiler" -Type "directory"
nuget pack ${{ github.workspace }}/build/Packaging/NugetProfiler/NewRelic.Profiler.nuspec -BasePath ${{ github.workspace }}/_workingDir -OutputDirectory ${{ github.workspace }}/_workingDir/NugetProfiler -Version ${{ steps.agentVersion.outputs.version }} -Verbosity detailed
shell: powershell
- name: Setup NuGet API Key
run: |
nuget.exe setApiKey ${{ secrets.NUGET_APIKEY }} -Source ${{ env.nuget_source }}
shell: pwsh
- name: Deploy Profiler Package to Nuget
run: |
$packageName = Get-ChildItem ${{ github.workspace }}/_workingDir/NugetProfiler/NewRelic.Agent.Internal.Profiler.*.nupkg -Name
$packagePath = Convert-Path ${{ github.workspace }}//_workingDir/NugetProfiler/$packageName
$version = $packageName.TrimStart('NewRelic.Agent.Internal.Profiler').TrimStart('.').TrimEnd('.nupkg')
nuget.exe push $packagePath -Source ${{ env.nuget_source }}
shell: powershell
update-nuget-reference:
name: Update Profiler Nuget Reference
runs-on: ubuntu-22.04
needs: package-and-deploy
if: ${{ inputs.deploy }}
permissions:
contents: write
pull-requests: write
steps:
- name: Harden Runner
uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1
with:
egress-policy: audit
- name: Install xmlstarlet
run: |
sudo apt-get install -y xmlstarlet
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
fetch-depth: 0
- name: Update Profiler Package Reference to Latest Version
run: |
cat ${{ github.workspace }}/src/Agent/NewRelic/Home/Home.csproj | \
xmlstarlet edit --pf --omit-decl \
--update "//PackageReference[@Include='NewRelic.Agent.Internal.Profiler']/@Version" \
--value "${{ needs.package-and-deploy.outputs.package_version }}" > ${{ github.workspace }}/src/Agent/NewRelic/Home/_temp &&
cat ${{ github.workspace }}/src/Agent/NewRelic/Home/_temp > ${{ github.workspace }}/src/Agent/NewRelic/Home/Home.csproj &&
rm -f ${{ github.workspace }}/src/Agent/NewRelic/Home/_temp
- name: Create Pull Request
uses: peter-evans/create-pull-request@5e914681df9dc83aa4e4905692ca88beb2f9e91f # v7.0.5
with:
commit-message: "chore: Update Profiler NuGet Package Reference to v${{ needs.package-and-deploy.outputs.package_version }}."
title: "chore: Update Profiler NuGet Package Reference to v${{ needs.package-and-deploy.outputs.package_version }}"
branch: profiler-nuget-updates/${{ github.ref_name }}
labels: |
profiler nuget
automated pr
delete-branch: true
add-paths: |
src/Agent/NewRelic/Home/Home.csproj