From f0d8ddf279a84a15aab5fd9389b1c5994d0d8795 Mon Sep 17 00:00:00 2001 From: Kevin Gosse Date: Fri, 9 Jul 2021 13:05:34 +0200 Subject: [PATCH] Revert "Delete old unused pipelines and files (#1513)" This reverts commit 3d3269ca212ff053607e8b121160c19ba4713b92. --- .azure-pipelines/benchmarks.yml | 79 +++ .azure-pipelines/crank.yml | 190 ++++++ .azure-pipelines/integration-tests.yml | 599 ++++++++++++++++++ .azure-pipelines/packages.yml | 319 ++++++++++ .azure-pipelines/runner.yml | 301 +++++++++ .azure-pipelines/ultimate-pipeline.yml | 22 +- .azure-pipelines/unit-tests.yml | 339 ++++++++++ Datadog.Trace.proj | 227 ++++++- Datadog.Trace.sln | 38 ++ azure-pipelines.yml | 20 + ...race.ClrProfiler.IntegrationTests.arm64.sh | 36 ++ ...adog.Trace.ClrProfiler.IntegrationTests.sh | 39 ++ .../Datadog.Trace.ClrProfiler.Native.sh | 30 + .../IIS/LoaderOptimizationRegKey.dockerfile} | 0 build/docker/IIS/build.ps1 | 38 ++ build/docker/build.arm64.sh | 46 ++ build/docker/build.sh | 58 ++ build/docker/dotnet.alpine.core21.dockerfile | 6 + build/docker/dotnet.alpine.core30.dockerfile | 6 + build/docker/dotnet.alpine.core31.dockerfile | 6 + build/docker/dotnet.alpine.core50.dockerfile | 6 + build/docker/dotnet.arm64.core50.dockerfile | 4 + build/docker/dotnet.arm64.dockerfile | 12 + build/docker/dotnet.dockerfile | 16 + build/docker/linux-build.bash | 16 + build/docker/linux-build.dockerfile | 92 +++ build/docker/native.alpine.dockerfile | 5 + build/docker/native.dockerfile | 14 + build/docker/package.alpine.dockerfile | 7 + build/docker/package.dockerfile | 11 + build/docker/package.sh | 53 ++ build/docker/with-profiler-logs.bash | 16 + build/docker/with-profiler.bash | 12 + build/tools/PrepareRelease/SetAllVersions.cs | 4 + docker-compose.yml | 431 ++++++++++++- test/test-applications/aspnet/samples-iis.sln | 118 ++++ 36 files changed, 3184 insertions(+), 32 deletions(-) create mode 100644 .azure-pipelines/benchmarks.yml create mode 100644 .azure-pipelines/crank.yml create mode 100644 .azure-pipelines/integration-tests.yml create mode 100644 .azure-pipelines/packages.yml create mode 100644 .azure-pipelines/runner.yml create mode 100644 .azure-pipelines/unit-tests.yml create mode 100644 azure-pipelines.yml create mode 100755 build/docker/Datadog.Trace.ClrProfiler.IntegrationTests.arm64.sh create mode 100755 build/docker/Datadog.Trace.ClrProfiler.IntegrationTests.sh create mode 100755 build/docker/Datadog.Trace.ClrProfiler.Native.sh rename build/{_build/docker/iis.dockerfile => docker/IIS/LoaderOptimizationRegKey.dockerfile} (100%) create mode 100644 build/docker/IIS/build.ps1 create mode 100755 build/docker/build.arm64.sh create mode 100755 build/docker/build.sh create mode 100644 build/docker/dotnet.alpine.core21.dockerfile create mode 100644 build/docker/dotnet.alpine.core30.dockerfile create mode 100644 build/docker/dotnet.alpine.core31.dockerfile create mode 100644 build/docker/dotnet.alpine.core50.dockerfile create mode 100644 build/docker/dotnet.arm64.core50.dockerfile create mode 100644 build/docker/dotnet.arm64.dockerfile create mode 100644 build/docker/dotnet.dockerfile create mode 100755 build/docker/linux-build.bash create mode 100644 build/docker/linux-build.dockerfile create mode 100644 build/docker/native.alpine.dockerfile create mode 100644 build/docker/native.dockerfile create mode 100644 build/docker/package.alpine.dockerfile create mode 100644 build/docker/package.dockerfile create mode 100755 build/docker/package.sh create mode 100755 build/docker/with-profiler-logs.bash create mode 100755 build/docker/with-profiler.bash create mode 100644 test/test-applications/aspnet/samples-iis.sln diff --git a/.azure-pipelines/benchmarks.yml b/.azure-pipelines/benchmarks.yml new file mode 100644 index 000000000000..7b5200d1fcf1 --- /dev/null +++ b/.azure-pipelines/benchmarks.yml @@ -0,0 +1,79 @@ +trigger: none +pr: none + +variables: + buildConfiguration: release + dotnetCoreSdkVersion: 5.0.103 + ddApiKey: $(DD_API_KEY) + publishOutput: $(Build.SourcesDirectory)/src/bin/managed-publish + +# Declare the datadog agent as a resource to be used as a pipeline service +resources: + containers: + - container: dd_agent + image: datadog/agent + ports: + - 8126:8126 + env: + DD_API_KEY: $(ddApiKey) + DD_INSIDE_CI: true + +stages: +- stage: build + jobs: + + #### Windows + + - job: Windows + pool: Benchmarks + + workspace: + clean: all + + # Enable the Datadog Agent service for this job + services: + dd_agent: dd_agent + variables: + tracerHomeName: windows-tracer-home + tracerHome: $(System.DefaultWorkingDirectory)/src/bin/$(tracerHomeName) + msiHome: $(System.DefaultWorkingDirectory)/src/bin/msi + nuget_packages: $(Pipeline.Workspace)/.nuget/packages + + steps: + + - task: UseDotNet@2 + displayName: install dotnet core sdk + inputs: + packageType: sdk + version: $(dotnetCoreSdkVersion) + + - task: NuGetToolInstaller@1 + displayName: install nuget + + - task: DotNetCoreCLI@2 + displayName: dotnet restore + inputs: + command: restore + projects: src/**/*.csproj + + # native projects must be restored with nuget.exe + - task: NuGetCommand@2 + displayName: nuget restore native + inputs: + restoreSolution: Datadog.Trace.Native.sln + verbosityRestore: Normal + + - task: DotNetCoreCLI@2 + displayName: Benchmarks + inputs: + command: 'run' + projects: '$(System.DefaultWorkingDirectory)/test/benchmarks/Benchmarks.Trace/Benchmarks.Trace.csproj' + arguments: '-c Release -f netcoreapp3.1 -- -r net472 netcoreapp3.1 -m -f * --iterationTime 2000' + env: + DD_ENV: CI + DD_SERVICE: dd-trace-dotnet + + - task: PowerShell@2 + inputs: + targetType: 'inline' + script: 'Start-Sleep -s 120' \ No newline at end of file diff --git a/.azure-pipelines/crank.yml b/.azure-pipelines/crank.yml new file mode 100644 index 000000000000..033a1827561b --- /dev/null +++ b/.azure-pipelines/crank.yml @@ -0,0 +1,190 @@ +trigger: none +pr: none + +jobs: + +- job: windows_profiler + pool: + vmImage: windows-2019 + + steps: + + - task: UseDotNet@2 + displayName: install dotnet core runtime 3.1 + inputs: + packageType: runtime + version: 3.1.x + + - task: UseDotNet@2 + displayName: install dotnet core sdk 5.0.103 + inputs: + packageType: sdk + version: 5.0.103 + + - task: DotNetCoreCLI@2 + displayName: dotnet build + inputs: + command: build + configuration: Release + arguments: /nowarn:netsdk1138 + projects: | + src/Datadog.Trace.ClrProfiler.Managed.Loader/Datadog.Trace.ClrProfiler.Managed.Loader.csproj + sample-libs/**/Samples.ExampleLibrary*.csproj + + - task: NuGetToolInstaller@1 + displayName: install nuget + + - task: NuGetCommand@2 + displayName: nuget restore + inputs: + restoreSolution: Datadog.Trace.Native.sln + verbosityRestore: Normal + + - task: MSBuild@1 + displayName: msbuild + inputs: + solution: Datadog.Trace.proj + platform: x64 + configuration: Release + msbuildArguments: /t:BuildCpp + maximumCpuCount: true + + - publish: $(System.DefaultWorkingDirectory)/src/Datadog.Trace.ClrProfiler.Native/bin/Release/x64 + artifact: windows-native + + +- job: linux_profiler + pool: + vmImage: ubuntu-20.04 + steps: + + - task: UseDotNet@2 + displayName: install dotnet core runtime 3.1 + inputs: + packageType: runtime + version: 3.1.x + + - task: UseDotNet@2 + displayName: install dotnet core sdk 5.0 + inputs: + packageType: sdk + version: 5.0.x + + - task: DotNetCoreCLI@2 + displayName: dotnet build + inputs: + command: build + configuration: Release + arguments: /nowarn:netsdk1138 + projects: | + src/Datadog.Trace.ClrProfiler.Managed.Loader/Datadog.Trace.ClrProfiler.Managed.Loader.csproj + + - script: | + sudo apt-get update + sudo apt-get install -y llvm clang + sudo apt-get remove -y cmake + curl -L -o /tmp/cmake.sh https://github.com/Kitware/CMake/releases/download/v3.19.8/cmake-3.19.8-Linux-x86_64.sh + sudo sh /tmp/cmake.sh --prefix=/usr/local --exclude-subdir --skip-license + displayName: install_dependencies + + - script: | + cd ./src/Datadog.Trace.ClrProfiler.Native + CXX=clang++ CC=clang cmake . -DCMAKE_BUILD_TYPE=Release + make + displayName: build_profiler + + - publish: $(System.DefaultWorkingDirectory)/src/Datadog.Trace.ClrProfiler.Native/bin + artifact: linux-native + + +- job: linux_arm64_profiler + pool: Arm64 + workspace: + clean: all + + steps: + + - task: DotNetCoreCLI@2 + displayName: dotnet build Datadog.Trace.ClrProfiler.Managed.Loader + inputs: + command: build + configuration: Release + arguments: /nowarn:netsdk1138 + projects: | + src/Datadog.Trace.ClrProfiler.Managed.Loader/Datadog.Trace.ClrProfiler.Managed.Loader.csproj + + - task: DotNetCoreCLI@2 + displayName: dotnet publish Datadog.Trace.ClrProfiler.Managed 2.0 + inputs: + command: publish + publishWebProjects: false + modifyOutputPath: false + zipAfterPublish: false + projects: src/Datadog.Trace.ClrProfiler.Managed/Datadog.Trace.ClrProfiler.Managed.csproj + arguments: --configuration Release --framework netstandard2.0 --output $(System.DefaultWorkingDirectory)/src/bin/managed-publish/netstandard2.0 + + - task: DotNetCoreCLI@2 + displayName: dotnet publish Datadog.Trace.ClrProfiler.Managed 3.1 + inputs: + command: publish + publishWebProjects: false + modifyOutputPath: false + zipAfterPublish: false + projects: src/Datadog.Trace.ClrProfiler.Managed/Datadog.Trace.ClrProfiler.Managed.csproj + arguments: --configuration Release --framework netcoreapp3.1 --output $(System.DefaultWorkingDirectory)/src/bin/managed-publish/netcoreapp3.1 + + - task: DockerCompose@0 + displayName: docker-compose run Profiler + inputs: + containerregistrytype: Container Registry + dockerComposeCommand: run -e buildConfiguration=Release Profiler + + - publish: $(System.DefaultWorkingDirectory)/src/Datadog.Trace.ClrProfiler.Native/bin/Release/x64 + artifact: linux-native-arm64 + + + +- job: crank + pool: Throughput + workspace: + clean: all + dependsOn: + - linux_arm64_profiler + - linux_profiler + - windows_profiler + condition: succeeded() + + steps: + - download: current + artifact: linux-native + + - task: CopyFiles@2 + inputs: + sourceFolder: $(Pipeline.Workspace)/linux-native + targetFolder: $(System.DefaultWorkingDirectory)/ + + + - download: current + artifact: windows-native + + - task: CopyFiles@2 + inputs: + sourceFolder: $(Pipeline.Workspace)/windows-native + targetFolder: $(System.DefaultWorkingDirectory)/ + + + - download: current + artifact: linux-native-arm64 + + - task: CopyFiles@2 + inputs: + sourceFolder: $(Pipeline.Workspace)/linux-native-arm64 + targetFolder: $(System.DefaultWorkingDirectory)/arm64 + + + - script: | + cd ./build/crank + chmod +x ./run.sh + ./run.sh + env: + DD_SERVICE: dd-trace-dotnet diff --git a/.azure-pipelines/integration-tests.yml b/.azure-pipelines/integration-tests.yml new file mode 100644 index 000000000000..0f348669ad0e --- /dev/null +++ b/.azure-pipelines/integration-tests.yml @@ -0,0 +1,599 @@ +trigger: + branches: + include: + - master + - release/* + - hotfix/* + paths: + exclude: + - docs/* + - .github/* +pr: + branches: + include: + - master + - release/* + - hotfix/* + paths: + exclude: + - docs/* + - .github/* + +pool: + vmImage: ubuntu-18.04 + +variables: + buildConfiguration: Release + publishOutput: $(System.DefaultWorkingDirectory)/src/bin/managed-publish + dotnetCoreSdk5Version: 5.0.103 + +jobs: + +- job: build_linux_profiler + + steps: + - task: UseDotNet@2 + displayName: install dotnet core runtime 3.1 + inputs: + packageType: runtime + version: 3.1.x + + - task: UseDotNet@2 + displayName: install dotnet core sdk 5 + inputs: + packageType: sdk + version: $(dotnetCoreSdk5Version) + includePreviewVersions: true + + - task: DotNetCoreCLI@2 + displayName: dotnet build Datadog.Trace.ClrProfiler.Managed.Loader + inputs: + command: build + projects: src/Datadog.Trace.ClrProfiler.Managed.Loader/Datadog.Trace.ClrProfiler.Managed.Loader.csproj + arguments: --configuration $(buildConfiguration) /nowarn:netsdk1138 + + - task: DotNetCoreCLI@2 + displayName: dotnet publish Datadog.Trace.ClrProfiler.Managed 2.0 + inputs: + command: publish + publishWebProjects: false + modifyOutputPath: false + zipAfterPublish: false + projects: src/Datadog.Trace.ClrProfiler.Managed/Datadog.Trace.ClrProfiler.Managed.csproj + arguments: --configuration $(buildConfiguration) --framework netstandard2.0 --output $(publishOutput)/netstandard2.0 + + - task: DotNetCoreCLI@2 + displayName: dotnet publish Datadog.Trace.ClrProfiler.Managed 3.1 + inputs: + command: publish + publishWebProjects: false + modifyOutputPath: false + zipAfterPublish: false + projects: src/Datadog.Trace.ClrProfiler.Managed/Datadog.Trace.ClrProfiler.Managed.csproj + arguments: --configuration $(buildConfiguration) --framework netcoreapp3.1 --output $(publishOutput)/netcoreapp3.1 + + - task: DockerCompose@0 + displayName: docker-compose run Profiler + inputs: + containerregistrytype: Container Registry + dockerComposeCommand: run -e buildConfiguration=$(buildConfiguration) Profiler + + - publish: $(System.DefaultWorkingDirectory)/src/Datadog.Trace.ClrProfiler.Native/bin/$(buildConfiguration)/x64 + artifact: linux-tracer-home + +- job: Linux + dependsOn: build_linux_profiler + condition: succeeded() + strategy: + matrix: + netcoreapp2_1: + publishTargetFramework: netcoreapp2.1 + netcoreapp3_0: + publishTargetFramework: netcoreapp3.0 + netcoreapp3_1: + publishTargetFramework: netcoreapp3.1 + net5_0: + publishTargetFramework: net5.0 + + variables: + TestAllPackageVersions: true + + steps: + - download: current + artifact: linux-tracer-home + + - task: CopyFiles@2 + inputs: + sourceFolder: $(Pipeline.Workspace)/linux-tracer-home + targetFolder: $(System.DefaultWorkingDirectory)/src/Datadog.Trace.ClrProfiler.Native/bin/$(buildConfiguration)/x64 + + - task: DockerCompose@0 + displayName: docker-compose run build + inputs: + containerregistrytype: Container Registry + dockerComposeCommand: run -e TestAllPackageVersions=true -e buildConfiguration=$(buildConfiguration) -e publishTargetFramework=$(publishTargetFramework) build + + - task: DockerCompose@0 + displayName: docker-compose run IntegrationTests + inputs: + containerregistrytype: Container Registry + dockerComposeCommand: run -e TestAllPackageVersions=true -e buildConfiguration=$(buildConfiguration) -e publishTargetFramework=$(publishTargetFramework) IntegrationTests + + - publish: build_data + artifact: $(Agent.JobName)_profiler-logs-$(System.JobAttempt) + condition: succeededOrFailed() + + - task: PublishTestResults@2 + displayName: publish test results + inputs: + testResultsFormat: VSTest + testResultsFiles: test/**/*.trx + condition: succeededOrFailed() + +- job: build_alpine_linux_profiler + + steps: + - task: UseDotNet@2 + displayName: install dotnet core runtime 3.1 + inputs: + packageType: runtime + version: 3.1.x + + - task: UseDotNet@2 + displayName: install dotnet core sdk 5 + inputs: + packageType: sdk + version: $(dotnetCoreSdk5Version) + includePreviewVersions: true + + - task: DotNetCoreCLI@2 + displayName: dotnet build Datadog.Trace.ClrProfiler.Managed.Loader + inputs: + command: build + projects: src/Datadog.Trace.ClrProfiler.Managed.Loader/Datadog.Trace.ClrProfiler.Managed.Loader.csproj + arguments: --configuration $(buildConfiguration) /nowarn:netsdk1138 + + - task: DotNetCoreCLI@2 + displayName: dotnet publish Datadog.Trace.ClrProfiler.Managed 2.0 + inputs: + command: publish + publishWebProjects: false + modifyOutputPath: false + zipAfterPublish: false + projects: src/Datadog.Trace.ClrProfiler.Managed/Datadog.Trace.ClrProfiler.Managed.csproj + arguments: --configuration $(buildConfiguration) --framework netstandard2.0 --output $(publishOutput)/netstandard2.0 + + - task: DotNetCoreCLI@2 + displayName: dotnet publish Datadog.Trace.ClrProfiler.Managed 3.1 + inputs: + command: publish + publishWebProjects: false + modifyOutputPath: false + zipAfterPublish: false + projects: src/Datadog.Trace.ClrProfiler.Managed/Datadog.Trace.ClrProfiler.Managed.csproj + arguments: --configuration $(buildConfiguration) --framework netcoreapp3.1 --output $(publishOutput)/netcoreapp3.1 + + - task: DockerCompose@0 + displayName: docker-compose run Profiler.Alpine + inputs: + containerregistrytype: Container Registry + dockerComposeCommand: run -e buildConfiguration=$(buildConfiguration) Profiler.Alpine + + - publish: $(System.DefaultWorkingDirectory)/src/Datadog.Trace.ClrProfiler.Native/bin/$(buildConfiguration)/x64 + artifact: alpine-linux-tracer-home + +- job: Alpine_Linux + dependsOn: build_alpine_linux_profiler + condition: succeeded() + strategy: + matrix: + netcoreapp2_1: + publishTargetFramework: netcoreapp2.1 + netcoreapp3_0: + publishTargetFramework: netcoreapp3.0 + netcoreapp3_1: + publishTargetFramework: netcoreapp3.1 + net5_0: + publishTargetFramework: net5.0 + + variables: + TestAllPackageVersions: true + + steps: + - download: current + artifact: alpine-linux-tracer-home + + - task: CopyFiles@2 + inputs: + sourceFolder: $(Pipeline.Workspace)/alpine-linux-tracer-home + targetFolder: $(System.DefaultWorkingDirectory)/src/Datadog.Trace.ClrProfiler.Native/bin/$(buildConfiguration)/x64 + + - task: DockerCompose@0 + displayName: docker-compose run build + inputs: + containerregistrytype: Container Registry + dockerComposeCommand: run -e TestAllPackageVersions=true -e buildConfiguration=$(buildConfiguration) -e publishTargetFramework=$(publishTargetFramework) build + + - task: DockerCompose@0 + displayName: docker-compose run IntegrationTests.Alpine.Core21 + condition: eq(variables['publishTargetFramework'], 'netcoreapp2.1') + inputs: + containerregistrytype: Container Registry + dockerComposeCommand: run -e TestAllPackageVersions=true -e buildConfiguration=$(buildConfiguration) IntegrationTests.Alpine.Core21 + + - task: DockerCompose@0 + displayName: docker-compose run IntegrationTests.Alpine.Core30 + condition: eq(variables['publishTargetFramework'], 'netcoreapp3.0') + inputs: + containerregistrytype: Container Registry + dockerComposeCommand: run -e TestAllPackageVersions=true -e buildConfiguration=$(buildConfiguration) IntegrationTests.Alpine.Core30 + + - task: DockerCompose@0 + displayName: docker-compose run IntegrationTests.Alpine.Core31 + condition: eq(variables['publishTargetFramework'], 'netcoreapp3.1') + inputs: + containerregistrytype: Container Registry + dockerComposeCommand: run -e TestAllPackageVersions=true -e buildConfiguration=$(buildConfiguration) IntegrationTests.Alpine.Core31 + + - task: DockerCompose@0 + displayName: docker-compose run IntegrationTests.Alpine.Core50 + condition: eq(variables['publishTargetFramework'], 'net5.0') + inputs: + containerregistrytype: Container Registry + dockerComposeCommand: run -e TestAllPackageVersions=true -e buildConfiguration=$(buildConfiguration) IntegrationTests.Alpine.Core50 + + - publish: build_data + artifact: $(Agent.JobName)_profiler-logs-$(System.JobAttempt) + condition: succeededOrFailed() + + - task: PublishTestResults@2 + displayName: publish test results + inputs: + testResultsFormat: VSTest + testResultsFiles: test/**/*.trx + condition: succeededOrFailed() + +- job: Windows + timeoutInMinutes: 100 + strategy: + matrix: + x64: + buildPlatform: x64 + enable32bit: false + x86: + buildPlatform: x86 + enable32bit: true + pool: + vmImage: windows-2019 + variables: + msiOutputDirectory: src/WindowsInstaller/bin/$(buildConfiguration)/$(buildPlatform)/en-us + + steps: + - task: UseDotNet@2 + displayName: install dotnet core sdk 2.1 + inputs: + packageType: sdk + version: 2.1.x + + - task: UseDotNet@2 + displayName: install dotnet core sdk 3.0 + inputs: + packageType: sdk + version: 3.0.x + + - task: UseDotNet@2 + displayName: install dotnet core sdk 3.1 + inputs: + packageType: sdk + version: 3.1.x + + - task: UseDotNet@2 + displayName: install dotnet core sdk 5 + inputs: + packageType: sdk + version: $(dotnetCoreSdk5Version) + includePreviewVersions: true + + - task: PowerShell@2 + displayName: 'Starting Cosmos Emulator' + inputs: + targetType: 'inline' + workingDirectory: $(Pipeline.Workspace) + script: | + Write-Host "Starting CosmosDB Emulator" + Import-Module "C:/Program Files/Azure Cosmos DB Emulator/PSModules/Microsoft.Azure.CosmosDB.Emulator" + Start-CosmosDbEmulator + + - task: NuGetToolInstaller@1 + displayName: install nuget + + - task: NuGetCommand@2 + displayName: nuget restore + inputs: + restoreSolution: Datadog.Trace.sln + verbosityRestore: Normal + + # this triggers a dependency chain that builds all the managed and native dlls + - task: MSBuild@1 + displayName: msbuild tracer-home + inputs: + solution: Datadog.Trace.proj + platform: $(buildPlatform) + configuration: $(buildConfiguration) + msbuildArguments: /t:msi /p:RunWixToolsOutOfProc=true /p:TracerHomeDirectory=$(publishOutput) + maximumCpuCount: true + + - task: MSBuild@1 + displayName: Build .NET Framework projects (not SDK-based projects) + inputs: + solution: Datadog.Trace.proj + platform: $(buildPlatform) + configuration: $(buildConfiguration) + msbuildArguments: /t:BuildFrameworkReproductions + maximumCpuCount: true + + - task: DotNetCoreCLI@2 + displayName: dotnet build integration tests + inputs: + command: build + projects: | + test/test-applications/regression/**/*.csproj + test/*.IntegrationTests/*.IntegrationTests.csproj + !test/test-applications/regression/**/ExpenseItDemo*.csproj + !test/test-applications/regression/**/EntityFramework6x*.csproj + !test/test-applications/regression/**/StackExchange.Redis.AssemblyConflict.LegacyProject.csproj + arguments: --configuration $(buildConfiguration) -p:Platform=$(buildPlatform) -p:ManagedProfilerOutputDirectory=$(publishOutput) /nowarn:netsdk1138 + + - task: DotNetCoreCLI@2 + displayName: dotnet build samples + inputs: + command: build + projects: | + test/test-applications/integrations/**/*.csproj + !test/test-applications/integrations/dependency-libs/**/*.csproj + arguments: --configuration $(buildConfiguration) -p:Platform=$(buildPlatform) -p:ManagedProfilerOutputDirectory=$(publishOutput) -p:BuildInParallel=false /nowarn:netsdk1138 -p:ExcludeManagedProfiler=true -p:ExcludeNativeProfiler=true -p:LoadManagedProfilerFromProfilerDirectory=false + + - task: DotNetCoreCLI@2 + displayName: dotnet test + inputs: + command: test + projects: | + test/Datadog.Trace.IntegrationTests/Datadog.Trace.IntegrationTests.csproj + test/Datadog.Trace.OpenTracing.IntegrationTests/Datadog.Trace.OpenTracing.IntegrationTests.csproj + arguments: -c $(buildConfiguration) -p:Platform=$(buildPlatform) + + - task: DotNetCoreCLI@2 + displayName: dotnet test + inputs: + command: test + projects: test/Datadog.Trace.ClrProfiler.IntegrationTests/Datadog.Trace.ClrProfiler.IntegrationTests.csproj + arguments: -c $(buildConfiguration) --filter "(RunOnWindows=True|Category=Smoke)&LoadFromGAC!=True&IIS!=True" -p:Platform=$(buildPlatform) + + - task: DockerCompose@0 + displayName: docker-compose stop services + inputs: + containerregistrytype: Container Registry + dockerComposeCommand: down + condition: succeededOrFailed() + +- job: Windows_IIS + timeoutInMinutes: 100 + strategy: + matrix: + x64: + buildPlatform: x64 + enable32bit: false + x86: + buildPlatform: x86 + enable32bit: true + pool: + vmImage: windows-2019 + variables: + msiOutputDirectory: src/WindowsInstaller/bin/$(buildConfiguration)/$(buildPlatform)/en-us + + steps: + - task: UseDotNet@2 + displayName: install dotnet core runtime 2.1 + inputs: + packageType: runtime + version: 2.1.x + + - task: UseDotNet@2 + displayName: install dotnet core runtime 3.0 + inputs: + packageType: runtime + version: 3.0.x + + - task: UseDotNet@2 + displayName: install dotnet core runtime 3.1 + inputs: + packageType: runtime + version: 3.1.x + + - task: UseDotNet@2 + displayName: install dotnet core sdk 5 + inputs: + packageType: sdk + version: $(dotnetCoreSdk5Version) + includePreviewVersions: true + + - task: NuGetToolInstaller@1 + displayName: install nuget + + - task: NuGetCommand@2 + displayName: nuget restore + inputs: + restoreSolution: Datadog.Trace.sln + verbosityRestore: Normal + + # this triggers a dependency chain that builds all the managed and native dlls + - task: MSBuild@1 + displayName: msbuild tracer-home + inputs: + solution: Datadog.Trace.proj + platform: $(buildPlatform) + configuration: $(buildConfiguration) + msbuildArguments: /t:msi /p:RunWixToolsOutOfProc=true /p:TracerHomeDirectory=$(publishOutput) + maximumCpuCount: true + + - task: MSBuild@1 + displayName: Build .NET Framework projects (not SDK-based projects) + inputs: + solution: Datadog.Trace.proj + platform: $(buildPlatform) + configuration: $(buildConfiguration) + msbuildArguments: /t:BuildFrameworkReproductions + maximumCpuCount: true + + - task: DotNetCoreCLI@2 + displayName: dotnet build integration tests + inputs: + command: build + projects: | + test/test-applications/regression/**/*.csproj + test/*.IntegrationTests/*.IntegrationTests.csproj + !test/test-applications/regression/**/ExpenseItDemo*.csproj + !test/test-applications/regression/**/EntityFramework6x*.csproj + !test/test-applications/regression/**/StackExchange.Redis.AssemblyConflict.LegacyProject.csproj + arguments: --configuration $(buildConfiguration) -p:Platform=$(buildPlatform) -p:ManagedProfilerOutputDirectory=$(publishOutput) /nowarn:netsdk1138 + + - task: DotNetCoreCLI@2 + displayName: dotnet build samples + inputs: + command: build + projects: | + test/test-applications/integrations/**/*.csproj + !test/test-applications/integrations/dependency-libs/**/*.csproj + arguments: --configuration $(buildConfiguration) -p:Platform=$(buildPlatform) -p:ManagedProfilerOutputDirectory=$(publishOutput) -p:BuildInParallel=false /nowarn:netsdk1138 -p:ExcludeManagedProfiler=true -p:ExcludeNativeProfiler=true -p:LoadManagedProfilerFromProfilerDirectory=false + + - task: NuGetCommand@2 + displayName: nuget restore IIS samples + inputs: + restoreSolution: test/test-applications/aspnet/samples-iis.sln + verbosityRestore: Normal + + - task: MSBuild@1 + displayName: Publish IIS samples + inputs: + solution: test/test-applications/aspnet/samples-iis.sln + configuration: '$(buildConfiguration)' + msbuildArguments: '/p:DeployOnBuild=true /p:PublishProfile=$(System.DefaultWorkingDirectory)/test/test-applications/aspnet/PublishProfiles/FolderProfile.pubxml' + maximumCpuCount: true + + - task: DockerCompose@0 + displayName: docker-compose build IIS containers + inputs: + containerregistrytype: Container Registry + dockerComposeCommand: build --build-arg DOTNET_TRACER_MSI=$(msiOutputDirectory)/*.msi --build-arg ENABLE_32_BIT=$(enable32bit) IntegrationTests.IIS.LoaderOptimizationRegKey + + - task: DockerCompose@0 + displayName: docker-compose start IIS containers + inputs: + containerregistrytype: Container Registry + dockerComposeCommand: up -d IntegrationTests.IIS.LoaderOptimizationRegKey + + - powershell: | + [System.Reflection.Assembly]::Load("System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a") + $publish = New-Object System.EnterpriseServices.Internal.Publish + Get-ChildItem $(publishOutput)/net45 -Filter *.dll | Foreach-Object { $publish.GacInstall($_.FullName) } + displayName: Add net45 Datadog.Trace.ClrProfiler.Managed assets to the GAC + + - task: DotNetCoreCLI@2 + displayName: dotnet test --filter LoadFromGAC=True + inputs: + command: test + projects: test/Datadog.Trace.ClrProfiler.IntegrationTests/Datadog.Trace.ClrProfiler.IntegrationTests.csproj + arguments: -c $(buildConfiguration) --filter "(RunOnWindows=True|Category=Smoke)&LoadFromGAC=True" -p:Platform=$(buildPlatform) + + - task: DockerCompose@0 + displayName: docker-compose stop services + inputs: + containerregistrytype: Container Registry + dockerComposeCommand: down + condition: succeededOrFailed() + +- job: build_linux_profiler_arm64 + pool: Arm64 + workspace: + clean: all + + steps: + + - task: DotNetCoreCLI@2 + displayName: dotnet build Datadog.Trace.ClrProfiler.Managed.Loader + inputs: + command: build + projects: src/Datadog.Trace.ClrProfiler.Managed.Loader/Datadog.Trace.ClrProfiler.Managed.Loader.csproj + arguments: --configuration $(buildConfiguration) /nowarn:netsdk1138 + + - task: DotNetCoreCLI@2 + displayName: dotnet publish Datadog.Trace.ClrProfiler.Managed 2.0 + inputs: + command: publish + publishWebProjects: false + modifyOutputPath: false + zipAfterPublish: false + projects: src/Datadog.Trace.ClrProfiler.Managed/Datadog.Trace.ClrProfiler.Managed.csproj + arguments: --configuration $(buildConfiguration) --framework netstandard2.0 --output $(publishOutput)/netstandard2.0 + + - task: DotNetCoreCLI@2 + displayName: dotnet publish Datadog.Trace.ClrProfiler.Managed 3.1 + inputs: + command: publish + publishWebProjects: false + modifyOutputPath: false + zipAfterPublish: false + projects: src/Datadog.Trace.ClrProfiler.Managed/Datadog.Trace.ClrProfiler.Managed.csproj + arguments: --configuration $(buildConfiguration) --framework netcoreapp3.1 --output $(publishOutput)/netcoreapp3.1 + + - task: DockerCompose@0 + displayName: docker-compose run Profiler + inputs: + containerregistrytype: Container Registry + dockerComposeCommand: run -e buildConfiguration=$(buildConfiguration) Profiler + + - publish: $(System.DefaultWorkingDirectory)/src/Datadog.Trace.ClrProfiler.Native/bin/$(buildConfiguration)/x64 + artifact: linux-tracer-home_arm + +- job: Linux_arm64 + pool: Arm64 + workspace: + clean: all + + dependsOn: build_linux_profiler_arm64 + condition: succeeded() + + variables: + TestAllPackageVersions: true + + steps: + - download: current + artifact: linux-tracer-home_arm + + - task: CopyFiles@2 + inputs: + sourceFolder: $(Pipeline.Workspace)/linux-tracer-home_arm + targetFolder: $(System.DefaultWorkingDirectory)/src/Datadog.Trace.ClrProfiler.Native/bin/$(buildConfiguration)/arm64 + + - task: DockerCompose@0 + displayName: docker-compose run build.arm64 + inputs: + containerregistrytype: Container Registry + dockerComposeCommand: run -e TestAllPackageVersions=true -e buildConfiguration=$(buildConfiguration) -e publishTargetFramework=net5.0 build.arm64 + + - task: DockerCompose@0 + displayName: docker-compose run IntegrationTests.ARM64.Core50 + inputs: + containerregistrytype: Container Registry + dockerComposeCommand: run -e TestAllPackageVersions=true -e buildConfiguration=$(buildConfiguration) IntegrationTests.ARM64.Core50 + + - publish: build_data + artifact: $(Agent.JobName)_profiler-logs-$(System.JobAttempt) + condition: succeededOrFailed() + + - task: PublishTestResults@2 + displayName: publish test results + inputs: + testResultsFormat: VSTest + testResultsFiles: test/**/*.trx + condition: succeededOrFailed() diff --git a/.azure-pipelines/packages.yml b/.azure-pipelines/packages.yml new file mode 100644 index 000000000000..61678bd97d06 --- /dev/null +++ b/.azure-pipelines/packages.yml @@ -0,0 +1,319 @@ +trigger: none +pr: none + +variables: + buildConfiguration: release + dotnetCoreSdkVersion: 5.0.103 + publishOutput: $(Build.SourcesDirectory)/src/bin/managed-publish + +stages: +- stage: build + jobs: + + #### Windows and NuGet packages + + - job: windows_packages_and_nuget + pool: + vmImage: windows-2019 + variables: + tracerHomeName: windows-tracer-home + tracerHome: $(System.DefaultWorkingDirectory)/src/bin/$(tracerHomeName) + msiHome: $(System.DefaultWorkingDirectory)/src/bin/msi + nuget_packages: $(Pipeline.Workspace)/.nuget/packages + + steps: + + - task: UseDotNet@2 + displayName: install dotnet core sdk 5.0 + inputs: + packageType: sdk + version: $(dotnetCoreSdkVersion) + + - task: NuGetToolInstaller@1 + displayName: install nuget + + - task: DotNetCoreCLI@2 + displayName: dotnet restore + inputs: + command: restore + projects: src/**/*.csproj + + # native projects must be restored with nuget.exe + - task: NuGetCommand@2 + displayName: nuget restore native + inputs: + restoreSolution: Datadog.Trace.Native.sln + verbosityRestore: Normal + + # this triggers a dependency chain that builds all the managed, x64, and x86 dlls, and the zip and msi files + - task: MSBuild@1 + displayName: build both msi + inputs: + solution: Datadog.Trace.proj + configuration: $(buildConfiguration) + msbuildArguments: /t:msi /p:Platform=All;ZipHomeDirectory=true;TracerHomeDirectory=$(tracerHome);RunWixToolsOutOfProc=true;MsiOutputPath=$(msiHome) + maximumCpuCount: true + + - publish: $(msiHome)/en-us + artifact: windows-msi + + - publish: $(tracerHome).zip + artifact: $(tracerHomeName) + + - task: DotNetCoreCLI@2 + displayName: dotnet pack + inputs: + command: pack + packagesToPack: src/Datadog.Trace/Datadog.Trace.csproj;src/Datadog.Trace.OpenTracing/Datadog.Trace.OpenTracing.csproj + packDirectory: $(System.DefaultWorkingDirectory)/nuget-output + configuration: $(buildConfiguration) + + - publish: $(System.DefaultWorkingDirectory)/nuget-output + artifact: nuget-packages + + #### Linux packages + + - job: linux_packages + pool: + vmImage: ubuntu-18.04 + variables: + tracerHome: $(System.DefaultWorkingDirectory)/src/bin/managed-publish + + steps: + - task: UseDotNet@2 + displayName: install dotnet core sdk + inputs: + version: $(dotnetCoreSdkVersion) + + - task: DotNetCoreCLI@2 + displayName: dotnet build Datadog.Trace.ClrProfiler.Managed.Loader + inputs: + command: build + projects: src/Datadog.Trace.ClrProfiler.Managed.Loader/Datadog.Trace.ClrProfiler.Managed.Loader.csproj + arguments: --configuration $(buildConfiguration) + + - task: DotNetCoreCLI@2 + displayName: dotnet publish Datadog.Trace.ClrProfiler.Managed netstandard 2.0 + inputs: + command: publish + publishWebProjects: false + modifyOutputPath: false + zipAfterPublish: false + projects: src/Datadog.Trace.ClrProfiler.Managed/Datadog.Trace.ClrProfiler.Managed.csproj + arguments: --configuration $(buildConfiguration) --framework netstandard2.0 --output $(tracerHome)/netstandard2.0 + + - task: DotNetCoreCLI@2 + displayName: dotnet publish Datadog.Trace.ClrProfiler.Managed netcoreapp 3.1 + inputs: + command: publish + publishWebProjects: false + modifyOutputPath: false + zipAfterPublish: false + projects: src/Datadog.Trace.ClrProfiler.Managed/Datadog.Trace.ClrProfiler.Managed.csproj + arguments: --configuration $(buildConfiguration) --framework netcoreapp3.1 --output $(tracerHome)/netcoreapp3.1 + + - task: DockerCompose@0 + displayName: docker-compose run Profiler + inputs: + containerregistrytype: Container Registry + dockerComposeCommand: run -e buildConfiguration=$(buildConfiguration) Profiler + + - task: DockerCompose@0 + displayName: docker-compose run package + inputs: + containerregistrytype: Container Registry + dockerComposeCommand: run -e buildConfiguration=$(buildConfiguration) -e ARCHITECTURE=x64 package + + - publish: deploy/linux + artifact: linux-packages + + - job: linux_alpine_packages + pool: + vmImage: ubuntu-18.04 + variables: + tracerHome: $(System.DefaultWorkingDirectory)/src/bin/managed-publish + + steps: + - task: UseDotNet@2 + displayName: install dotnet core sdk + inputs: + version: $(dotnetCoreSdkVersion) + + - task: DotNetCoreCLI@2 + displayName: dotnet build Datadog.Trace.ClrProfiler.Managed.Loader + inputs: + command: build + projects: src/Datadog.Trace.ClrProfiler.Managed.Loader/Datadog.Trace.ClrProfiler.Managed.Loader.csproj + arguments: --configuration $(buildConfiguration) + + - task: DotNetCoreCLI@2 + displayName: dotnet publish Datadog.Trace.ClrProfiler.Managed 2.0 + inputs: + command: publish + publishWebProjects: false + modifyOutputPath: false + zipAfterPublish: false + projects: src/Datadog.Trace.ClrProfiler.Managed/Datadog.Trace.ClrProfiler.Managed.csproj + arguments: --configuration $(buildConfiguration) --framework netstandard2.0 --output $(tracerHome)/netstandard2.0 + + - task: DotNetCoreCLI@2 + displayName: dotnet publish Datadog.Trace.ClrProfiler.Managed 3.1 + inputs: + command: publish + publishWebProjects: false + modifyOutputPath: false + zipAfterPublish: false + projects: src/Datadog.Trace.ClrProfiler.Managed/Datadog.Trace.ClrProfiler.Managed.csproj + arguments: --configuration $(buildConfiguration) --framework netcoreapp3.1 --output $(tracerHome)/netcoreapp3.1 + + - task: DockerCompose@0 + displayName: docker-compose run Profiler.Alpine + inputs: + containerregistrytype: Container Registry + dockerComposeCommand: run -e buildConfiguration=$(buildConfiguration) Profiler.Alpine + + - task: DockerCompose@0 + displayName: docker-compose run package.alpine + inputs: + containerregistrytype: Container Registry + dockerComposeCommand: run -e buildConfiguration=$(buildConfiguration) package.alpine + + - publish: deploy/linux + artifact: linux-alpine-packages + + - job: linux_arm64_packages + pool: Arm64 + workspace: + clean: all + variables: + tracerHome: $(System.DefaultWorkingDirectory)/src/bin/managed-publish + + steps: + + - task: DotNetCoreCLI@2 + displayName: dotnet build Datadog.Trace.ClrProfiler.Managed.Loader + inputs: + command: build + projects: src/Datadog.Trace.ClrProfiler.Managed.Loader/Datadog.Trace.ClrProfiler.Managed.Loader.csproj + arguments: --configuration $(buildConfiguration) /nowarn:netsdk1138 + + - task: DotNetCoreCLI@2 + displayName: dotnet publish Datadog.Trace.ClrProfiler.Managed netstandard 2.0 + inputs: + command: publish + publishWebProjects: false + modifyOutputPath: false + zipAfterPublish: false + projects: src/Datadog.Trace.ClrProfiler.Managed/Datadog.Trace.ClrProfiler.Managed.csproj + arguments: --configuration $(buildConfiguration) --framework netstandard2.0 --output $(tracerHome)/netstandard2.0 + + - task: DotNetCoreCLI@2 + displayName: dotnet publish Datadog.Trace.ClrProfiler.Managed netcoreapp 3.1 + inputs: + command: publish + publishWebProjects: false + modifyOutputPath: false + zipAfterPublish: false + projects: src/Datadog.Trace.ClrProfiler.Managed/Datadog.Trace.ClrProfiler.Managed.csproj + arguments: --configuration $(buildConfiguration) --framework netcoreapp3.1 --output $(tracerHome)/netcoreapp3.1 + + - task: DockerCompose@0 + displayName: docker-compose run Profiler + inputs: + containerregistrytype: Container Registry + dockerComposeCommand: run -e buildConfiguration=$(buildConfiguration) Profiler + + - task: DockerCompose@0 + displayName: docker-compose run package + inputs: + containerregistrytype: Container Registry + dockerComposeCommand: run -e buildConfiguration=$(buildConfiguration) -e ARCHITECTURE=arm64 package + + - publish: deploy/linux + artifact: linux-arm64-packages + + #### Upload artifacts to S3 + +- stage: upload + jobs: + - job: s3_upload + + pool: + vmImage: ubuntu-18.04 + + steps: + - download: current + artifact: windows-msi + patterns: '**/*x64.msi' + + - download: current + artifact: linux-packages + patterns: '**/*amd64.deb' + + - script: | + mkdir s3_upload + mv $(Pipeline.Workspace)/windows-msi/*.msi s3_upload/ + mv $(Pipeline.Workspace)/linux-packages/*.deb s3_upload/ + displayName: Move deb package and MSI to s3_upload folder + + # for prerelease versions, rename datadog-dotnet-apm-{version}-amd64.deb + # to datadog-dotnet-apm-{version}-{tag}-amd64.deb (i.e. add the prerelease tag) + # by copying most of the filename from datadog-dotnet-apm-{version}-{tag}-x64.msi + - script: | + MSI_NAME=$(ls s3_upload/*.msi) + PACKAGE_NAME=${MSI_NAME::-8} + echo Renaming deb package to $PACKAGE_NAME-amd64.deb + mv s3_upload/*.deb $PACKAGE_NAME-amd64.deb + displayName: Rename deb package name to match MSI name + + # Create index.txt file with the following format: + # BRANCH_NAME + # SHA + # ARTIFACT WILDCARD (datadog-dotnet-apm-vX.X.X-*) + # COMMIT AUTHOR + # Note: For the branch name, normalize 'refs/heads/' to '' and 'refs/tags/' to 'tags/' + - script: | + INDEX_FILE=$(pwd)/s3_upload/index.txt + echo $(Build.SourceBranch) | sed 's/refs\/heads\///g' | sed 's/refs\/tags\//tags\//g' >> $INDEX_FILE + git rev-parse HEAD >> $INDEX_FILE + pushd s3_upload && name=$(ls *.deb) && echo "${name::-9}*" >> $INDEX_FILE && popd + git show -s --format='%ae' HEAD >> $INDEX_FILE + echo Generated index.txt file: + cat $INDEX_FILE + displayName: Write index.txt + + - script: | + sudo apt-get install -y unzip python3-setuptools + curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip" + unzip awscli-bundle.zip + sudo python3 ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws + aws --version + displayName: Install AWS CLI + + - script: aws configure set aws_access_key_id $SECRET + displayName: Authenticate aws_access_key_id + env: + SECRET: $(AWS_ACCESS_KEY_ID) + + - script: aws configure set aws_secret_access_key $SECRET + displayName: Authenticate aws_secret_access_key + env: + SECRET: $(AWS_SECRET_ACCESS_KEY) + + # by default, run this step on master branch only. + # use "push_artifacts_to_s3" to override: + # "true": run this step + # "false": do NOT run this step + # else: run this stage if branch is master + + - script: aws s3 cp s3_upload s3://datadog-reliability-env/dotnet/ --recursive + displayName: Upload deb, MSI, index.txt to s3 + condition: > + and( + succeeded(), + ne(variables['push_artifacts_to_s3'], 'false'), + or( + eq(variables['push_artifacts_to_s3'], 'true'), + eq(variables['Build.SourceBranch'], 'refs/heads/master') + ) + ) diff --git a/.azure-pipelines/runner.yml b/.azure-pipelines/runner.yml new file mode 100644 index 000000000000..72a96515527c --- /dev/null +++ b/.azure-pipelines/runner.yml @@ -0,0 +1,301 @@ +trigger: none +pr: none + +variables: + publishOutput: $(System.DefaultWorkingDirectory)/src/bin/managed-publish + dotnetCoreSdk5Version: 5.0.103 + ddApiKey: $(DD_API_KEY) + DD_DOTNET_TRACER_MSBUILD: + +# Declare the datadog agent as a resource to be used as a pipeline service +resources: + containers: + - container: dd_agent + image: datadog/agent + ports: + - 8126:8126 + env: + DD_API_KEY: $(ddApiKey) + DD_INSIDE_CI: true + +jobs: + +- job: build_linux_profiler + + steps: + - task: UseDotNet@2 + displayName: install dotnet core sdk 5.0 + inputs: + packageType: sdk + version: $(dotnetCoreSdk5Version) + includePreviewVersions: true + + - task: DotNetCoreCLI@2 + displayName: dotnet build Datadog.Trace.ClrProfiler.Managed.Loader + inputs: + command: build + projects: src/Datadog.Trace.ClrProfiler.Managed.Loader/Datadog.Trace.ClrProfiler.Managed.Loader.csproj + arguments: --configuration Release + + - task: DotNetCoreCLI@2 + displayName: dotnet publish Datadog.Trace.ClrProfiler.Managed 2.0 + inputs: + command: publish + publishWebProjects: false + modifyOutputPath: false + zipAfterPublish: false + projects: src/Datadog.Trace.ClrProfiler.Managed/Datadog.Trace.ClrProfiler.Managed.csproj + arguments: --configuration Release --framework netstandard2.0 --output $(publishOutput)/netstandard2.0 + + - task: DotNetCoreCLI@2 + displayName: dotnet publish Datadog.Trace.ClrProfiler.Managed 3.1 + inputs: + command: publish + publishWebProjects: false + modifyOutputPath: false + zipAfterPublish: false + projects: src/Datadog.Trace.ClrProfiler.Managed/Datadog.Trace.ClrProfiler.Managed.csproj + arguments: --configuration Release --framework netcoreapp3.1 --output $(publishOutput)/netcoreapp3.1 + + - task: DockerCompose@0 + displayName: docker-compose run Profiler + inputs: + containerregistrytype: Container Registry + dockerComposeCommand: run -e buildConfiguration=Release Profiler + + - publish: $(System.DefaultWorkingDirectory)/src/Datadog.Trace.ClrProfiler.Native/bin/Release/x64 + displayName: Uploading linux tracer home artifact + artifact: linux-tracer-home + +- job: build_linux_profiler_arm64 + pool: Arm64 + workspace: + clean: all + + steps: + + - task: DotNetCoreCLI@2 + displayName: dotnet build Datadog.Trace.ClrProfiler.Managed.Loader + inputs: + command: build + projects: src/Datadog.Trace.ClrProfiler.Managed.Loader/Datadog.Trace.ClrProfiler.Managed.Loader.csproj + arguments: --configuration Release + + - task: DotNetCoreCLI@2 + displayName: dotnet publish Datadog.Trace.ClrProfiler.Managed 2.0 + inputs: + command: publish + publishWebProjects: false + modifyOutputPath: false + zipAfterPublish: false + projects: src/Datadog.Trace.ClrProfiler.Managed/Datadog.Trace.ClrProfiler.Managed.csproj + arguments: --configuration Release --framework netstandard2.0 --output $(publishOutput)/netstandard2.0 + + - task: DotNetCoreCLI@2 + displayName: dotnet publish Datadog.Trace.ClrProfiler.Managed 3.1 + inputs: + command: publish + publishWebProjects: false + modifyOutputPath: false + zipAfterPublish: false + projects: src/Datadog.Trace.ClrProfiler.Managed/Datadog.Trace.ClrProfiler.Managed.csproj + arguments: --configuration Release --framework netcoreapp3.1 --output $(publishOutput)/netcoreapp3.1 + + - task: DockerCompose@0 + displayName: docker-compose run Profiler + inputs: + containerregistrytype: Container Registry + dockerComposeCommand: run -e buildConfiguration=Release Profiler + + - publish: $(System.DefaultWorkingDirectory)/src/Datadog.Trace.ClrProfiler.Native/bin/Release/x64 + artifact: linux-tracer-home_arm64 + +- job: macos_profiler + pool: + vmImage: macOS-10.15 + steps: + - template: steps/downgrade-macos-cmake.yml + + - task: UseDotNet@2 + displayName: install dotnet core runtime 3.1 + inputs: + packageType: runtime + version: 3.1.x + + - task: UseDotNet@2 + displayName: install dotnet core sdk 5.0 + inputs: + packageType: sdk + version: $(dotnetCoreSdk5Version) + + - task: DotNetCoreCLI@2 + displayName: dotnet build + inputs: + command: build + configuration: Release + arguments: /nowarn:netsdk1138 + projects: | + src/Datadog.Trace.ClrProfiler.Managed.Loader/Datadog.Trace.ClrProfiler.Managed.Loader.csproj + + - script: | + cd ./src/Datadog.Trace.ClrProfiler.Native + cmake . -DCMAKE_BUILD_TYPE=Release + make + displayName: build_profiler + + - publish: $(System.DefaultWorkingDirectory)/src/Datadog.Trace.ClrProfiler.Native/bin + displayName: Uploading macos profiler artifact + artifact: macos-profiler + +- job: build_runner_tool_and_standalone + dependsOn: + - build_linux_profiler + - build_linux_profiler_arm64 + - macos_profiler + condition: succeeded() + + pool: + vmImage: windows-2019 + + # Enable the Datadog Agent service for this job + services: + dd_agent: dd_agent + + steps: + - download: current + artifact: linux-tracer-home + patterns: '**/*.so' + + - task: CopyFiles@2 + displayName: Copying native linux binary from previous job + inputs: + sourceFolder: $(Pipeline.Workspace)/linux-tracer-home + targetFolder: $(System.DefaultWorkingDirectory)/src/Datadog.Trace.Tools.Runner/home/linux-x64 + + - download: current + artifact: linux-tracer-home_arm64 + patterns: '**/*.so' + + - task: CopyFiles@2 + displayName: Copying native linux arm64 binary from previous job + inputs: + sourceFolder: $(Pipeline.Workspace)/linux-tracer-home_arm64 + targetFolder: $(System.DefaultWorkingDirectory)/src/Datadog.Trace.Tools.Runner/home/linux-arm64 + + - download: current + artifact: macos-profiler + patterns: '**/*.dylib' + + - task: CopyFiles@2 + displayName: Copying native macos binary from previous job + inputs: + sourceFolder: $(Pipeline.Workspace)/macos-profiler + targetFolder: $(System.DefaultWorkingDirectory)/src/Datadog.Trace.Tools.Runner/home/osx-x64 + + # Install the tracer latest stable release to attach the profiler to the build and test steps. + # The script exposes the required environment variables to the following steps + - task: PowerShell@2 + displayName: Install profiler latest release + inputs: + filePath: ./.azure-pipelines/setup_tracer.ps1 + + - task: UseDotNet@2 + displayName: install dotnet core runtime 2.1 + inputs: + packageType: runtime + version: 2.1.x + + - task: UseDotNet@2 + displayName: install dotnet core runtime 3.0 + inputs: + packageType: runtime + version: 3.0.x + + - task: UseDotNet@2 + displayName: install dotnet core runtime 3.1 + inputs: + packageType: runtime + version: 3.1.x + + - task: UseDotNet@2 + displayName: install dotnet core sdk 5.0 + inputs: + packageType: sdk + version: $(dotnetCoreSdk5Version) + includePreviewVersions: true + + - task: DotNetCoreCLI@2 + displayName: dotnet build + inputs: + command: build + configuration: Release + arguments: -l:DatadogLogger,"$(DD_DOTNET_TRACER_MSBUILD)" + projects: | + src/**/*.csproj + test/**/*.Tests.csproj + benchmarks/**/*.csproj + !src/Datadog.Trace.Tools.Runner/*.csproj + env: + DD_SERVICE: dd-trace-dotnet + + - task: NuGetToolInstaller@1 + displayName: install nuget + + - task: NuGetCommand@2 + displayName: nuget restore + inputs: + restoreSolution: Datadog.Trace.Native.sln + verbosityRestore: Normal + + - task: MSBuild@1 + displayName: tool build + inputs: + solution: src/Datadog.Trace.Tools.Runner/Datadog.Trace.Tools.Runner.proj + msbuildArguments: /t:BuildTool /l:DatadogLogger,"$(DD_DOTNET_TRACER_MSBUILD)" + maximumCpuCount: true + env: + DD_SERVICE: dd-trace-dotnet-runner-tool + + - task: MSBuild@1 + displayName: standalone build + inputs: + solution: src/Datadog.Trace.Tools.Runner/Datadog.Trace.Tools.Runner.proj + msbuildArguments: /t:BuildStandalone /l:DatadogLogger,"$(DD_DOTNET_TRACER_MSBUILD)" + maximumCpuCount: true + env: + DD_SERVICE: dd-trace-dotnet-runner-tool + + - task: DeleteFiles@1 + displayName: 'Remove unneeded files' + inputs: + Contents: | + $(System.DefaultWorkingDirectory)/src/Datadog.Trace.Tools.Runner/bin/Release/Tool/!(*.nupkg) + $(System.DefaultWorkingDirectory)/src/Datadog.Trace.Tools.Runner/bin/Release/Console/publish/win-x64/home* + $(System.DefaultWorkingDirectory)/src/Datadog.Trace.Tools.Runner/bin/Release/Console/publish/win-x86/home* + $(System.DefaultWorkingDirectory)/src/Datadog.Trace.Tools.Runner/bin/Release/Console/publish/linux-x64/home* + $(System.DefaultWorkingDirectory)/src/Datadog.Trace.Tools.Runner/bin/Release/Console/publish/linux-arm64/home* + $(System.DefaultWorkingDirectory)/src/Datadog.Trace.Tools.Runner/bin/Release/Console/publish/osx-x64/home* + + - publish: $(System.DefaultWorkingDirectory)/src/Datadog.Trace.Tools.Runner/bin/Release/Tool + displayName: Uploading runner dotnet tool artifact + artifact: runner-dotnet-tool + + - publish: $(System.DefaultWorkingDirectory)/src/Datadog.Trace.Tools.Runner/bin/Release/Console/publish/win-x64 + displayName: Uploading runner standalone win-x64 artifact + artifact: runner-standalone-win-x64 + + - publish: $(System.DefaultWorkingDirectory)/src/Datadog.Trace.Tools.Runner/bin/Release/Console/publish/win-x86 + displayName: Uploading runner standalone win-x86 artifact + artifact: runner-standalone-win-x86 + + - publish: $(System.DefaultWorkingDirectory)/src/Datadog.Trace.Tools.Runner/bin/Release/Console/publish/linux-x64 + displayName: Uploading runner standalone linux-x64 artifact + artifact: runner-standalone-linux-x64 + + - publish: $(System.DefaultWorkingDirectory)/src/Datadog.Trace.Tools.Runner/bin/Release/Console/publish/linux-arm64 + displayName: Uploading runner standalone linux-arm64 artifact + artifact: runner-standalone-linux-arm64 + + - publish: $(System.DefaultWorkingDirectory)/src/Datadog.Trace.Tools.Runner/bin/Release/Console/publish/osx-x64 + displayName: Uploading runner standalone osx-x64 artifact + artifact: runner-standalone-osx-x64 \ No newline at end of file diff --git a/.azure-pipelines/ultimate-pipeline.yml b/.azure-pipelines/ultimate-pipeline.yml index 5040b7e19e38..1f2a1c59a29c 100644 --- a/.azure-pipelines/ultimate-pipeline.yml +++ b/.azure-pipelines/ultimate-pipeline.yml @@ -400,13 +400,13 @@ stages: displayName: docker-compose build IIS containers inputs: containerregistrytype: Container Registry - dockerComposeCommand: build --build-arg dotnet_tracer_msi=.$(relativeMsiOutputDirectory)/*.msi --build-arg ENABLE_32_BIT=$(enable32bit) IntegrationTests.IIS + dockerComposeCommand: build --build-arg dotnet_tracer_msi=.$(relativeMsiOutputDirectory)/*.msi --build-arg ENABLE_32_BIT=$(enable32bit) IntegrationTests.IIS.LoaderOptimizationRegKey - task: DockerCompose@0 displayName: docker-compose start IIS containers inputs: containerregistrytype: Container Registry - dockerComposeCommand: up -d IntegrationTests.IIS + dockerComposeCommand: up -d IntegrationTests.IIS.LoaderOptimizationRegKey - powershell: | [System.Reflection.Assembly]::Load("System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a") @@ -491,10 +491,10 @@ stages: command: "BuildLinuxIntegrationTests --framework $(publishTargetFramework)" - task: DockerCompose@0 - displayName: docker-compose build IntegrationTests + displayName: docker-compose build NukeIntegrationTests inputs: containerregistrytype: Container Registry - dockerComposeCommand: build --build-arg baseImage=$(baseImage) --build-arg framework=$(publishTargetFramework) IntegrationTests + dockerComposeCommand: build --build-arg baseImage=$(baseImage) --build-arg framework=$(publishTargetFramework) NukeIntegrationTests - task: DockerCompose@0 displayName: docker-compose start dependencies @@ -503,13 +503,13 @@ stages: dockerComposeCommand: run --rm StartDependencies - task: DockerCompose@0 - displayName: docker-compose run IntegrationTests + displayName: docker-compose run NukeIntegrationTests inputs: containerregistrytype: Container Registry dockerComposeFileArgs: | baseImage=$(baseImage) framework=$(publishTargetFramework) - dockerComposeCommand: run --rm -e baseImage=$(baseImage) -e framework=$(publishTargetFramework) IntegrationTests + dockerComposeCommand: run --rm -e baseImage=$(baseImage) -e framework=$(publishTargetFramework) NukeIntegrationTests - task: DockerCompose@0 displayName: docker-compose stop services @@ -564,10 +564,10 @@ stages: command: "BuildLinuxIntegrationTests --framework $(publishTargetFramework)" - task: DockerCompose@0 - displayName: docker-compose build IntegrationTests + displayName: docker-compose build NukeIntegrationTests inputs: containerregistrytype: Container Registry - dockerComposeCommand: build --build-arg baseImage=$(baseImage) --build-arg framework=$(publishTargetFramework) IntegrationTests.ARM64 + dockerComposeCommand: build --build-arg baseImage=$(baseImage) --build-arg framework=$(publishTargetFramework) NukeIntegrationTests.ARM64 - task: DockerCompose@0 displayName: docker-compose start dependencies @@ -576,13 +576,13 @@ stages: dockerComposeCommand: run --rm StartDependencies.ARM64 - task: DockerCompose@0 - displayName: docker-compose run IntegrationTests + displayName: docker-compose run NukeIntegrationTests inputs: containerregistrytype: Container Registry dockerComposeFileArgs: | baseImage=$(baseImage) framework=$(publishTargetFramework) - dockerComposeCommand: run --rm -e baseImage=$(baseImage) -e framework=$(publishTargetFramework) IntegrationTests.ARM64 + dockerComposeCommand: run --rm -e baseImage=$(baseImage) -e framework=$(publishTargetFramework) NukeIntegrationTests.ARM64 - task: DockerCompose@0 displayName: docker-compose stop services @@ -891,7 +891,7 @@ stages: - publish: "$(Build.ArtifactStagingDirectory)" displayName: Publish release artifacts artifact: $(tracer_version)-release-artifacts - + # We don't include the MSI artifacts as they're not signed - task: DownloadPipelineArtifact@2 displayName: Download x64 MSI diff --git a/.azure-pipelines/unit-tests.yml b/.azure-pipelines/unit-tests.yml new file mode 100644 index 000000000000..2374b2f166a1 --- /dev/null +++ b/.azure-pipelines/unit-tests.yml @@ -0,0 +1,339 @@ +trigger: + branches: + include: + - master + - release/* + - hotfix/* + - refs/tags/* + exclude: + - refs/pull/*/head + paths: + exclude: + - docs/* + - .github/* + +variables: + buildConfiguration: Debug + dotnetCoreSdk5Version: 5.0.103 + ddApiKey: $(DD_API_KEY) + DD_DOTNET_TRACER_MSBUILD: + +# Declare the datadog agent as a resource to be used as a pipeline service +resources: + containers: + - container: dd_agent + image: datadog/agent + ports: + - 8126:8126 + env: + DD_API_KEY: $(ddApiKey) + DD_INSIDE_CI: true + +jobs: + +- job: managed + strategy: + matrix: + windows: + imageName: windows-2019 + linux: + imageName: ubuntu-18.04 + pool: + vmImage: $(imageName) + + # Enable the Datadog Agent service for this job + services: + dd_agent: dd_agent + + steps: + + # Install the tracer latest stable release to attach the profiler to the build and test steps. + # The script exposes the required environment variables to the following steps + - task: PowerShell@2 + displayName: Install profiler latest release + inputs: + filePath: ./.azure-pipelines/setup_tracer.ps1 + + - task: UseDotNet@2 + displayName: install dotnet core runtime 2.1 + inputs: + packageType: runtime + version: 2.1.x + + - task: UseDotNet@2 + displayName: install dotnet core runtime 3.0 + inputs: + packageType: runtime + version: 3.0.x + + - task: UseDotNet@2 + displayName: install dotnet core runtime 3.1 + inputs: + packageType: runtime + version: 3.1.x + + - task: UseDotNet@2 + displayName: install dotnet core sdk 5.0 + inputs: + packageType: sdk + version: $(dotnetCoreSdk5Version) + + - task: DotNetCoreCLI@2 + displayName: dotnet build + inputs: + command: build + configuration: $(buildConfiguration) + arguments: /nowarn:netsdk1138 #-l:DatadogLogger,"$(DD_DOTNET_TRACER_MSBUILD)" + projects: | + src/**/*.csproj + test/**/*.Tests.csproj + test/benchmarks/**/*.csproj + !src/Datadog.Trace.Tools.Runner/*.csproj + env: + DD_SERVICE: dd-trace-dotnet + + - task: DotNetCoreCLI@2 + displayName: dotnet test + inputs: + command: test + configuration: $(buildConfiguration) + projects: test/**/*.Tests.csproj + env: + DD_SERVICE: dd-trace-dotnet + +- job: managed_linux_arm64 + pool: Arm64 + workspace: + clean: all + + steps: + + - task: DotNetCoreCLI@2 + displayName: dotnet build + inputs: + command: build + configuration: $(buildConfiguration) + arguments: /nowarn:netsdk1138 + projects: | + src/**/*.csproj + test/**/*.Tests.csproj + benchmarks/**/*.csproj + !src/Datadog.Trace.Tools.Runner/*.csproj + env: + DD_SERVICE: dd-trace-dotnet + + - task: DotNetCoreCLI@2 + displayName: dotnet test + inputs: + command: test + configuration: $(buildConfiguration) + projects: test/**/*.Tests.csproj + env: + DD_SERVICE: dd-trace-dotnet + +- job: managed_macos + pool: + vmImage: macOS-10.15 + + steps: + + - task: UseDotNet@2 + displayName: install dotnet core runtime 2.1 + inputs: + packageType: runtime + version: 2.1.x + + - task: UseDotNet@2 + displayName: install dotnet core runtime 3.0 + inputs: + packageType: runtime + version: 3.0.x + + - task: UseDotNet@2 + displayName: install dotnet core runtime 3.1 + inputs: + packageType: runtime + version: 3.1.x + + - task: UseDotNet@2 + displayName: install dotnet core sdk 5.0 + inputs: + packageType: sdk + version: $(dotnetCoreSdk5Version) + + - task: DotNetCoreCLI@2 + displayName: dotnet build + inputs: + command: build + configuration: $(buildConfiguration) + arguments: /nowarn:netsdk1138 + projects: | + src/**/*.csproj + test/**/*.Tests.csproj + benchmarks/**/*.csproj + !src/Datadog.Trace.Tools.Runner/*.csproj + + - task: DotNetCoreCLI@2 + displayName: dotnet test + inputs: + command: test + configuration: $(buildConfiguration) + projects: test/**/*.Tests.csproj + env: + DD_SERVICE: dd-trace-dotnet + + +- job: windows_profiler + strategy: + matrix: + x64: + buildPlatform: x64 + x86: + buildPlatform: x86 + pool: + vmImage: windows-2019 + + steps: + + - task: UseDotNet@2 + displayName: install dotnet core runtime 3.1 + inputs: + packageType: runtime + version: 3.1.x + + - task: UseDotNet@2 + displayName: install dotnet core sdk 5.0 + inputs: + packageType: sdk + version: $(dotnetCoreSdk5Version) + + - task: DotNetCoreCLI@2 + displayName: dotnet build + inputs: + command: build + configuration: $(buildConfiguration) + arguments: /nowarn:netsdk1138 + projects: | + src/Datadog.Trace.ClrProfiler.Managed.Loader/Datadog.Trace.ClrProfiler.Managed.Loader.csproj + sample-libs/**/Samples.ExampleLibrary*.csproj + + - task: NuGetToolInstaller@1 + displayName: install nuget + + - task: NuGetCommand@2 + displayName: nuget restore + inputs: + restoreSolution: Datadog.Trace.Native.sln + verbosityRestore: Normal + + - task: MSBuild@1 + displayName: msbuild + inputs: + solution: Datadog.Trace.proj + platform: $(buildPlatform) + configuration: $(buildConfiguration) + msbuildArguments: /t:BuildCpp;BuildCppTests + maximumCpuCount: true + + - script: Datadog.Trace.ClrProfiler.Native.Tests.exe --gtest_output=xml + displayName: run tests + workingDirectory: $(System.DefaultWorkingDirectory)/test/Datadog.Trace.ClrProfiler.Native.Tests/bin/$(buildConfiguration)/$(buildPlatform) + + - task: PublishTestResults@2 + displayName: publish test results + inputs: + testResultsFiles: test/**/test*.xml + buildPlatform: $(buildPlatform) + buildConfiguration: $(buildConfiguration) + condition: succeededOrFailed() + +- job: linux_profiler + pool: + vmImage: ubuntu-20.04 + steps: + + - task: UseDotNet@2 + displayName: install dotnet core runtime 3.1 + inputs: + packageType: runtime + version: 3.1.x + + - task: UseDotNet@2 + displayName: install dotnet core sdk 5.0 + inputs: + packageType: sdk + version: $(dotnetCoreSdk5Version) + + - task: DotNetCoreCLI@2 + displayName: dotnet build + inputs: + command: build + configuration: $(buildConfiguration) + arguments: /nowarn:netsdk1138 + projects: | + src/Datadog.Trace.ClrProfiler.Managed.Loader/Datadog.Trace.ClrProfiler.Managed.Loader.csproj + + - script: | + sudo apt-get update + sudo apt-get install -y llvm clang + displayName: install_dependencies + + - script: | + cd ./src/Datadog.Trace.ClrProfiler.Native + CXX=clang++ CC=clang cmake . + make + displayName: build_profiler + +- job: linux_profiler_arm64 + pool: Arm64 + workspace: + clean: all + + steps: + + - task: DotNetCoreCLI@2 + displayName: dotnet build + inputs: + command: build + configuration: $(buildConfiguration) + arguments: /nowarn:netsdk1138 + projects: | + src/Datadog.Trace.ClrProfiler.Managed.Loader/Datadog.Trace.ClrProfiler.Managed.Loader.csproj + + - script: | + cd ./src/Datadog.Trace.ClrProfiler.Native + CXX=clang++ CC=clang cmake . + make + displayName: build_profiler + +- job: macos_profiler + pool: + vmImage: macOS-10.15 + steps: + + - task: UseDotNet@2 + displayName: install dotnet core runtime 3.1 + inputs: + packageType: runtime + version: 3.1.x + + - task: UseDotNet@2 + displayName: install dotnet core sdk 5.0 + inputs: + packageType: sdk + version: $(dotnetCoreSdk5Version) + + - task: DotNetCoreCLI@2 + displayName: dotnet build + inputs: + command: build + configuration: $(buildConfiguration) + arguments: /nowarn:netsdk1138 + projects: | + src/Datadog.Trace.ClrProfiler.Managed.Loader/Datadog.Trace.ClrProfiler.Managed.Loader.csproj + + - script: | + cd ./src/Datadog.Trace.ClrProfiler.Native + cmake . + make + displayName: build_profiler diff --git a/Datadog.Trace.proj b/Datadog.Trace.proj index a39c96c657ff..edc20ec2624f 100644 --- a/Datadog.Trace.proj +++ b/Datadog.Trace.proj @@ -7,6 +7,7 @@ + @@ -17,80 +18,170 @@ + + - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -103,7 +194,6 @@ - @@ -118,7 +208,108 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + Platform=AnyCPU;TargetFramework=net45;PublishDir=$(TracerHomeDirectory)\net45 + + + + Platform=AnyCPU;TargetFramework=net461;PublishDir=$(TracerHomeDirectory)\net461 + + + + Platform=AnyCPU;TargetFramework=netstandard2.0;PublishDir=$(TracerHomeDirectory)\netstandard2.0 + + + + Platform=AnyCPU;TargetFramework=netcoreapp3.1;PublishDir=$(TracerHomeDirectory)\netcoreapp3.1 + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Datadog.Trace.sln b/Datadog.Trace.sln index b3f2431d0954..cb120de0976a 100644 --- a/Datadog.Trace.sln +++ b/Datadog.Trace.sln @@ -196,6 +196,42 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Datadog.Trace.ClrProfiler.M EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AssemblyLoad.FileNotFoundException", "test\test-applications\regression\AssemblyLoad.FileNotFoundException\AssemblyLoad.FileNotFoundException.csproj", "{1A5E9F40-F3A5-4B59-9898-3DCD65C459C3}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docker", "docker", "{6ABAD006-E206-488E-ACA1-1AA73F9B5146}" + ProjectSection(SolutionItems) = preProject + build\docker\build.arm64.sh = build\docker\build.arm64.sh + build\docker\build.sh = build\docker\build.sh + build\docker\Datadog.Trace.ClrProfiler.IntegrationTests.arm64.sh = build\docker\Datadog.Trace.ClrProfiler.IntegrationTests.arm64.sh + build\docker\Datadog.Trace.ClrProfiler.IntegrationTests.sh = build\docker\Datadog.Trace.ClrProfiler.IntegrationTests.sh + build\docker\Datadog.Trace.ClrProfiler.Native.sh = build\docker\Datadog.Trace.ClrProfiler.Native.sh + build\docker\dotnet.alpine.core21.dockerfile = build\docker\dotnet.alpine.core21.dockerfile + build\docker\dotnet.alpine.core30.dockerfile = build\docker\dotnet.alpine.core30.dockerfile + build\docker\dotnet.alpine.core31.dockerfile = build\docker\dotnet.alpine.core31.dockerfile + build\docker\dotnet.alpine.core50.dockerfile = build\docker\dotnet.alpine.core50.dockerfile + build\docker\dotnet.arm64.core50.dockerfile = build\docker\dotnet.arm64.core50.dockerfile + build\docker\dotnet.arm64.dockerfile = build\docker\dotnet.arm64.dockerfile + build\docker\dotnet.dockerfile = build\docker\dotnet.dockerfile + build\docker\linux-build.bash = build\docker\linux-build.bash + build\docker\linux-build.dockerfile = build\docker\linux-build.dockerfile + build\docker\native.alpine.dockerfile = build\docker\native.alpine.dockerfile + build\docker\native.dockerfile = build\docker\native.dockerfile + build\docker\package.alpine.dockerfile = build\docker\package.alpine.dockerfile + build\docker\package.dockerfile = build\docker\package.dockerfile + build\docker\package.sh = build\docker\package.sh + build\docker\with-profiler-logs.bash = build\docker\with-profiler-logs.bash + build\docker\with-profiler.bash = build\docker\with-profiler.bash + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".azure-pipelines", ".azure-pipelines", "{C52D6695-4E05-4930-88F8-0EFF8056A967}" + ProjectSection(SolutionItems) = preProject + .azure-pipelines\benchmarks.yml = .azure-pipelines\benchmarks.yml + .azure-pipelines\crank.yml = .azure-pipelines\crank.yml + .azure-pipelines\integration-tests.yml = .azure-pipelines\integration-tests.yml + .azure-pipelines\packages.yml = .azure-pipelines\packages.yml + .azure-pipelines\runner.yml = .azure-pipelines\runner.yml + .azure-pipelines\setup_tracer.ps1 = .azure-pipelines\setup_tracer.ps1 + .azure-pipelines\unit-tests.yml = .azure-pipelines\unit-tests.yml + EndProjectSection +EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Samples.MySql", "test\test-applications\integrations\Samples.MySql\Samples.MySql.csproj", "{42FA33DD-AEA3-4FF3-8319-F30244A666A4}" ProjectSection(ProjectDependencies) = postProject {C0C8D381-D6B9-4C76-9428-F40F2FA93A9A} = {C0C8D381-D6B9-4C76-9428-F40F2FA93A9A} @@ -1700,6 +1736,8 @@ Global {BB3F7D85-7E20-4AEB-A32A-8AF150CC37B2} = {EFE48691-1FBA-41D5-9BFD-676771973F0C} {AB8596C1-CFDA-4A5E-9E9C-74A3DF9AED77} = {9E5F0022-0A50-40BF-AC6A-C3078585ECAB} {1A5E9F40-F3A5-4B59-9898-3DCD65C459C3} = {498A300E-D036-49B7-A43D-821D1CAF11A5} + {6ABAD006-E206-488E-ACA1-1AA73F9B5146} = {A0C5FBBB-CFB2-4FB9-B8F0-55676E9DCF06} + {C52D6695-4E05-4930-88F8-0EFF8056A967} = {FEBCE7DC-9FD1-48A6-B911-71ABB240A030} {42FA33DD-AEA3-4FF3-8319-F30244A666A4} = {BAF8F246-3645-42AD-B1D0-0F7EAFBAB34A} {DF923186-5397-4E15-A95B-F15C8327ED53} = {498A300E-D036-49B7-A43D-821D1CAF11A5} {E1706893-D3A5-43B9-9036-AEF49DB9600B} = {498A300E-D036-49B7-A43D-821D1CAF11A5} diff --git a/azure-pipelines.yml b/azure-pipelines.yml new file mode 100644 index 000000000000..2c460966a938 --- /dev/null +++ b/azure-pipelines.yml @@ -0,0 +1,20 @@ +# Starter pipeline +# Start with a minimal pipeline that you can customize to build and deploy your code. +# Add steps that build, run tests, deploy, and more: +# https://aka.ms/yaml + +trigger: +- master +pr: +- master + +pool: + vmImage: 'ubuntu-latest' + +steps: +- script: echo Hello, world! + displayName: 'Run a one-line script' + +- script: | + echo Add other tasks to build, test, and deploy your project. + displayName: 'Run a multi-line script' \ No newline at end of file diff --git a/build/docker/Datadog.Trace.ClrProfiler.IntegrationTests.arm64.sh b/build/docker/Datadog.Trace.ClrProfiler.IntegrationTests.arm64.sh new file mode 100755 index 000000000000..b4f342be5023 --- /dev/null +++ b/build/docker/Datadog.Trace.ClrProfiler.IntegrationTests.arm64.sh @@ -0,0 +1,36 @@ +#!/bin/bash +set -euxo pipefail + +cd "$( dirname "${BASH_SOURCE[0]}" )"/../../ + +buildConfiguration=${buildConfiguration:-Debug} +publishTargetFramework=${publishTargetFramework:-netcoreapp3.1} + +mkdir -p /var/log/datadog/dotnet + +#https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dumps#collecting-dumps-on-crash +export COMPlus_DbgEnableMiniDump=1 +export COMPlus_DbgMiniDumpType=4 + +cleanup() { + + # Collect run data + mkdir /project/build_data + + cp /var/log/datadog/dotnet/* /project/build_data/ + cp /tmp/coredump* /project/build_data/ 2>/dev/null || : +} + +trap cleanup SIGINT SIGTERM EXIT + +dotnet vstest test/Datadog.Trace.IntegrationTests/bin/$buildConfiguration/$publishTargetFramework/publish/Datadog.Trace.IntegrationTests.dll --logger:trx --ResultsDirectory:test/Datadog.Trace.IntegrationTests/results + +dotnet vstest test/Datadog.Trace.OpenTracing.IntegrationTests/bin/$buildConfiguration/$publishTargetFramework/publish/Datadog.Trace.OpenTracing.IntegrationTests.dll --logger:trx --ResultsDirectory:test/Datadog.Trace.OpenTracing.IntegrationTests/results + +wait-for-it servicestackredis:6379 -- \ +wait-for-it stackexchangeredis:6379 -- \ +wait-for-it elasticsearch7_arm64:9200 -- \ +wait-for-it sqledge:1433 -- \ +wait-for-it mongo:27017 -- \ +wait-for-it postgres:5432 -- \ +dotnet vstest test/Datadog.Trace.ClrProfiler.IntegrationTests/bin/$buildConfiguration/$publishTargetFramework/publish/Datadog.Trace.ClrProfiler.IntegrationTests.dll --logger:trx --ResultsDirectory:test/Datadog.Trace.ClrProfiler.IntegrationTests/results --TestCaseFilter:"!((Category=ArmUnsupported)|(Category=LinuxUnsupported))" diff --git a/build/docker/Datadog.Trace.ClrProfiler.IntegrationTests.sh b/build/docker/Datadog.Trace.ClrProfiler.IntegrationTests.sh new file mode 100755 index 000000000000..97fa7e887381 --- /dev/null +++ b/build/docker/Datadog.Trace.ClrProfiler.IntegrationTests.sh @@ -0,0 +1,39 @@ +#!/bin/bash +set -euxo pipefail + +cd "$( dirname "${BASH_SOURCE[0]}" )"/../../ + +buildConfiguration=${buildConfiguration:-Debug} +publishTargetFramework=${publishTargetFramework:-netcoreapp3.1} + +mkdir -p /var/log/datadog/dotnet + +#https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dumps#collecting-dumps-on-crash +export COMPlus_DbgEnableMiniDump=1 +export COMPlus_DbgMiniDumpType=4 + +cleanup() { + + # Collect run data + mkdir /project/build_data + + cp /var/log/datadog/dotnet/* /project/build_data/ + cp /tmp/coredump* /project/build_data/ 2>/dev/null || : +} + +trap cleanup SIGINT SIGTERM EXIT + +dotnet vstest test/Datadog.Trace.IntegrationTests/bin/$buildConfiguration/$publishTargetFramework/publish/Datadog.Trace.IntegrationTests.dll --logger:trx --ResultsDirectory:test/Datadog.Trace.IntegrationTests/results + +dotnet vstest test/Datadog.Trace.OpenTracing.IntegrationTests/bin/$buildConfiguration/$publishTargetFramework/publish/Datadog.Trace.OpenTracing.IntegrationTests.dll --logger:trx --ResultsDirectory:test/Datadog.Trace.OpenTracing.IntegrationTests/results + +wait-for-it servicestackredis:6379 -- \ +wait-for-it stackexchangeredis:6379 -- \ +wait-for-it elasticsearch6:9200 -- \ +wait-for-it elasticsearch5:9200 -- \ +wait-for-it sqlserver:1433 -- \ +wait-for-it mongo:27017 -- \ +wait-for-it postgres:5432 -- \ +wait-for-it -t 60 kafka-zookeeper:2181 -- \ +wait-for-it -t 60 kafka-broker:9092 -- \ +dotnet vstest test/Datadog.Trace.ClrProfiler.IntegrationTests/bin/$buildConfiguration/$publishTargetFramework/publish/Datadog.Trace.ClrProfiler.IntegrationTests.dll --logger:trx --ResultsDirectory:test/Datadog.Trace.ClrProfiler.IntegrationTests/results --TestCaseFilter:Category!=LinuxUnsupported diff --git a/build/docker/Datadog.Trace.ClrProfiler.Native.sh b/build/docker/Datadog.Trace.ClrProfiler.Native.sh new file mode 100755 index 000000000000..b99167c9eed3 --- /dev/null +++ b/build/docker/Datadog.Trace.ClrProfiler.Native.sh @@ -0,0 +1,30 @@ +#!/bin/bash +set -euxo pipefail + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" + +cd "$DIR/../.." + +# TODO Remove this from the native build as it should be logically separate +# This is unnecessary in the unified pipeline as it's already done via the package.sh script +PUBLISH_OUTPUT_NET2="$( pwd )/src/bin/managed-publish/netstandard2.0" +PUBLISH_OUTPUT_NET31="$( pwd )/src/bin/managed-publish/netcoreapp3.1" +BUILD_TYPE=${buildConfiguration:-Debug} + +cd src/Datadog.Trace.ClrProfiler.Native +mkdir -p build +(cd build && cmake ../ -DCMAKE_BUILD_TYPE=${BUILD_TYPE} && make) + +mkdir -p bin/${BUILD_TYPE}/x64 +cp -f build/bin/Datadog.Trace.ClrProfiler.Native.so bin/${BUILD_TYPE}/x64/Datadog.Trace.ClrProfiler.Native.so + +# If running the unified pipeline, do not copy managed assets yet. Do so during the package build step +if [ -z "${UNIFIED_PIPELINE-}" ]; then + mkdir -p bin/${BUILD_TYPE}/x64/netstandard2.0 + cp -f $PUBLISH_OUTPUT_NET2/*.dll bin/${BUILD_TYPE}/x64/netstandard2.0/ + cp -f $PUBLISH_OUTPUT_NET2/*.pdb bin/${BUILD_TYPE}/x64/netstandard2.0/ + + mkdir -p bin/${BUILD_TYPE}/x64/netcoreapp3.1 + cp -f $PUBLISH_OUTPUT_NET31/*.dll bin/${BUILD_TYPE}/x64/netcoreapp3.1/ + cp -f $PUBLISH_OUTPUT_NET31/*.pdb bin/${BUILD_TYPE}/x64/netcoreapp3.1/ +fi diff --git a/build/_build/docker/iis.dockerfile b/build/docker/IIS/LoaderOptimizationRegKey.dockerfile similarity index 100% rename from build/_build/docker/iis.dockerfile rename to build/docker/IIS/LoaderOptimizationRegKey.dockerfile diff --git a/build/docker/IIS/build.ps1 b/build/docker/IIS/build.ps1 new file mode 100644 index 000000000000..456889b9d5bb --- /dev/null +++ b/build/docker/IIS/build.ps1 @@ -0,0 +1,38 @@ +$ProgressPreference = 'SilentlyContinue' + +$nuget_found = [bool] (Get-Command -ErrorAction Ignore -Type Application nuget) +if (!$nuget_found) +{ + Write-Error 'nuget not found in $env:PATH. Exiting.' -ErrorAction Stop +} + +$msbuild_found = [bool] (Get-Command -ErrorAction Ignore -Type Application msbuild) +if (!$msbuild_found) +{ + Write-Error 'msbuild not found in $env:PATH. Exiting.' -ErrorAction Stop +} + +$docker_compose_found = [bool] (Get-Command -ErrorAction Ignore -Type Application docker-compose) +if (!$docker_compose_found) +{ + Write-Error 'docker-compose not found in $env:PATH. Exiting.' -ErrorAction Stop +} + +$repo_root = Resolve-Path ../../.. +$trace_solution = Join-Path $repo_root Datadog.Trace.sln +$trace_proj = Join-Path $repo_root Datadog.Trace.proj +$solution = Join-Path $repo_root test/test-applications/aspnet/samples-iis.sln + +# Build IIS samples +nuget restore $solution +msbuild $solution /p:DeployOnBuild=true /p:PublishProfile=FolderProfile.pubxml + +# Build Datadog MSI's +nuget restore $trace_solution +msbuild $trace_proj /t:msi /p:"Configuration=Release;Platform=All" + +# Build IIS container +pushd $repo_root +$relative_msi = "src/WindowsInstaller/bin/Release/x64/en-us/*.msi" +docker-compose build --build-arg DOTNET_TRACER_MSI=$relative_msi IntegrationTests.IIS.LoaderOptimizationRegKey +popd \ No newline at end of file diff --git a/build/docker/build.arm64.sh b/build/docker/build.arm64.sh new file mode 100755 index 000000000000..48d94cc1f9ca --- /dev/null +++ b/build/docker/build.arm64.sh @@ -0,0 +1,46 @@ +#!/bin/bash +set -euxo pipefail + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" + +cd "$DIR/../.." + +buildConfiguration=${buildConfiguration:-Debug} +publishTargetFramework=${publishTargetFramework:-netcoreapp3.1} +PUBLISH_OUTPUT="$( pwd )/src/bin/managed-publish" + +mkdir -p "$PUBLISH_OUTPUT/netstandard2.0" +mkdir -p "$PUBLISH_OUTPUT/netcoreapp3.1" + +dotnet build -c $buildConfiguration src/Datadog.Trace.ClrProfiler.Managed.Loader/Datadog.Trace.ClrProfiler.Managed.Loader.csproj + +for proj in Datadog.Trace Datadog.Trace.OpenTracing ; do + dotnet publish -f netstandard2.0 -c $buildConfiguration src/$proj/$proj.csproj + dotnet publish -f netcoreapp3.1 -c $buildConfiguration src/$proj/$proj.csproj +done + +dotnet publish -f netstandard2.0 -c $buildConfiguration src/Datadog.Trace.ClrProfiler.Managed/Datadog.Trace.ClrProfiler.Managed.csproj -o "$PUBLISH_OUTPUT/netstandard2.0" +dotnet publish -f netcoreapp3.1 -c $buildConfiguration src/Datadog.Trace.ClrProfiler.Managed/Datadog.Trace.ClrProfiler.Managed.csproj -o "$PUBLISH_OUTPUT/netcoreapp3.1" + +# Only build Samples.AspNetCoreMvc31 for netcoreapp3.1 +if [ "$publishTargetFramework" == "netcoreapp3.1" ] +then + dotnet publish -f $publishTargetFramework -c $buildConfiguration test/test-applications/integrations/Samples.AspNetCoreMvc31/Samples.AspNetCoreMvc31.csproj -p:Configuration=$buildConfiguration -p:ManagedProfilerOutputDirectory="$PUBLISH_OUTPUT" +fi + +dotnet publish -f $publishTargetFramework -c $buildConfiguration test/test-applications/instrumentation/CallTargetNativeTest/CallTargetNativeTest.csproj -p:Configuration=$buildConfiguration -p:ManagedProfilerOutputDirectory="$PUBLISH_OUTPUT" + +for sample in Samples.Elasticsearch Samples.Elasticsearch.V5 Samples.ServiceStack.Redis Samples.StackExchange.Redis Samples.SqlServer Samples.Microsoft.Data.SqlClient Samples.MongoDB Samples.HttpMessageHandler Samples.WebRequest Samples.Npgsql Samples.MySql Samples.GraphQL Samples.Dapper Samples.NoMultiLoader Samples.RabbitMQ Samples.RuntimeMetrics Samples.FakeDbCommand Samples.XUnitTests Samples.NUnitTests Samples.MSTestTests Samples.AWS.SQS ; do + dotnet publish -f $publishTargetFramework -c $buildConfiguration test/test-applications/integrations/$sample/$sample.csproj -p:Configuration=$buildConfiguration -p:ManagedProfilerOutputDirectory="$PUBLISH_OUTPUT" +done + +for sample in DataDogThreadTest HttpMessageHandler.StackOverflowException StackExchange.Redis.StackOverflowException AspNetMvcCorePerformance AssemblyLoad.FileNotFoundException TraceContext.InvalidOperationException AssemblyResolveMscorlibResources.InfiniteRecursionCrash StackExchange.Redis.AssemblyConflict.SdkProject NetCoreAssemblyLoadFailureOlderNuGet DuplicateTypeProxy ; do + dotnet publish -f $publishTargetFramework -c $buildConfiguration test/test-applications/regression/$sample/$sample.csproj -p:Configuration=$buildConfiguration -p:ManagedProfilerOutputDirectory="$PUBLISH_OUTPUT" +done + +dotnet msbuild Datadog.Trace.proj -t:RestoreSamplesForPackageVersions -p:Configuration=$buildConfiguration -p:ManagedProfilerOutputDirectory="$PUBLISH_OUTPUT" -p:TargetFramework=$publishTargetFramework +dotnet msbuild Datadog.Trace.proj -t:PublishSamplesForPackageVersions -p:Configuration=$buildConfiguration -p:ManagedProfilerOutputDirectory="$PUBLISH_OUTPUT" -p:TargetFramework=$publishTargetFramework + +for proj in Datadog.Trace.IntegrationTests Datadog.Trace.OpenTracing.IntegrationTests Datadog.Trace.ClrProfiler.IntegrationTests ; do + dotnet publish -f $publishTargetFramework -c $buildConfiguration test/$proj/$proj.csproj +done \ No newline at end of file diff --git a/build/docker/build.sh b/build/docker/build.sh new file mode 100755 index 000000000000..efa3efe1b57d --- /dev/null +++ b/build/docker/build.sh @@ -0,0 +1,58 @@ +#!/bin/bash +set -euxo pipefail + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" + +cd "$DIR/../.." + +buildConfiguration=${buildConfiguration:-Debug} +publishTargetFramework=${publishTargetFramework:-netcoreapp3.1} +PUBLISH_OUTPUT="$( pwd )/src/bin/managed-publish" + +mkdir -p "$PUBLISH_OUTPUT/netstandard2.0" +mkdir -p "$PUBLISH_OUTPUT/netcoreapp3.1" + +dotnet build -c $buildConfiguration src/Datadog.Trace.ClrProfiler.Managed.Loader/Datadog.Trace.ClrProfiler.Managed.Loader.csproj + +for proj in Datadog.Trace Datadog.Trace.OpenTracing ; do + dotnet publish -f netstandard2.0 -c $buildConfiguration src/$proj/$proj.csproj + dotnet publish -f netcoreapp3.1 -c $buildConfiguration src/$proj/$proj.csproj +done + +dotnet publish -f netstandard2.0 -c $buildConfiguration src/Datadog.Trace.ClrProfiler.Managed/Datadog.Trace.ClrProfiler.Managed.csproj -o "$PUBLISH_OUTPUT/netstandard2.0" +dotnet publish -f netcoreapp3.1 -c $buildConfiguration src/Datadog.Trace.ClrProfiler.Managed/Datadog.Trace.ClrProfiler.Managed.csproj -o "$PUBLISH_OUTPUT/netcoreapp3.1" + +# Only build Samples.AspNetCoreMvc21 for netcoreapp2.1 +if [ "$publishTargetFramework" == "netcoreapp2.1" ] +then + dotnet publish -f $publishTargetFramework -c $buildConfiguration test/test-applications/integrations/Samples.AspNetCoreMvc21/Samples.AspNetCoreMvc21.csproj -p:Configuration=$buildConfiguration -p:ManagedProfilerOutputDirectory="$PUBLISH_OUTPUT" +fi + +# Only build Samples.AspNetCoreMvc30 for netcoreapp3.0 +if [ "$publishTargetFramework" == "netcoreapp3.0" ] +then + dotnet publish -f $publishTargetFramework -c $buildConfiguration test/test-applications/integrations/Samples.AspNetCoreMvc30/Samples.AspNetCoreMvc30.csproj -p:Configuration=$buildConfiguration -p:ManagedProfilerOutputDirectory="$PUBLISH_OUTPUT" +fi + +# Only build Samples.AspNetCoreMvc31 for netcoreapp3.1 +if [ "$publishTargetFramework" == "netcoreapp3.1" ] +then + dotnet publish -f $publishTargetFramework -c $buildConfiguration test/test-applications/integrations/Samples.AspNetCoreMvc31/Samples.AspNetCoreMvc31.csproj -p:Configuration=$buildConfiguration -p:ManagedProfilerOutputDirectory="$PUBLISH_OUTPUT" +fi + +dotnet publish -f $publishTargetFramework -c $buildConfiguration test/test-applications/instrumentation/CallTargetNativeTest/CallTargetNativeTest.csproj -p:Configuration=$buildConfiguration -p:ManagedProfilerOutputDirectory="$PUBLISH_OUTPUT" + +for sample in Samples.Elasticsearch Samples.Elasticsearch.V5 Samples.ServiceStack.Redis Samples.StackExchange.Redis Samples.SqlServer Samples.Microsoft.Data.SqlClient Samples.MongoDB Samples.HttpMessageHandler Samples.WebRequest Samples.Npgsql Samples.MySql Samples.GraphQL Samples.Dapper Samples.NoMultiLoader Samples.RabbitMQ Samples.RuntimeMetrics Samples.FakeDbCommand Samples.Microsoft.Data.Sqlite Samples.SQLite.Core Samples.XUnitTests Samples.NUnitTests Samples.MSTestTests Samples.Kafka Samples.AWS.SQS ; do + dotnet publish -f $publishTargetFramework -c $buildConfiguration test/test-applications/integrations/$sample/$sample.csproj -p:Configuration=$buildConfiguration -p:ManagedProfilerOutputDirectory="$PUBLISH_OUTPUT" +done + +for sample in DataDogThreadTest HttpMessageHandler.StackOverflowException StackExchange.Redis.StackOverflowException AspNetMvcCorePerformance AssemblyLoad.FileNotFoundException TraceContext.InvalidOperationException AssemblyResolveMscorlibResources.InfiniteRecursionCrash StackExchange.Redis.AssemblyConflict.SdkProject NetCoreAssemblyLoadFailureOlderNuGet DuplicateTypeProxy ; do + dotnet publish -f $publishTargetFramework -c $buildConfiguration test/test-applications/regression/$sample/$sample.csproj -p:Configuration=$buildConfiguration -p:ManagedProfilerOutputDirectory="$PUBLISH_OUTPUT" +done + +dotnet msbuild Datadog.Trace.proj -t:RestoreSamplesForPackageVersions -p:Configuration=$buildConfiguration -p:ManagedProfilerOutputDirectory="$PUBLISH_OUTPUT" -p:TargetFramework=$publishTargetFramework +dotnet msbuild Datadog.Trace.proj -t:PublishSamplesForPackageVersions -p:Configuration=$buildConfiguration -p:ManagedProfilerOutputDirectory="$PUBLISH_OUTPUT" -p:TargetFramework=$publishTargetFramework + +for proj in Datadog.Trace.IntegrationTests Datadog.Trace.OpenTracing.IntegrationTests Datadog.Trace.ClrProfiler.IntegrationTests ; do + dotnet publish -f $publishTargetFramework -c $buildConfiguration test/$proj/$proj.csproj +done diff --git a/build/docker/dotnet.alpine.core21.dockerfile b/build/docker/dotnet.alpine.core21.dockerfile new file mode 100644 index 000000000000..aa06119b5264 --- /dev/null +++ b/build/docker/dotnet.alpine.core21.dockerfile @@ -0,0 +1,6 @@ +FROM mcr.microsoft.com/dotnet/core/sdk:2.1-alpine3.9 + +RUN apk update && apk upgrade && apk add --no-cache --update bash curl + +ADD https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh /bin/wait-for-it +RUN chmod +x /bin/wait-for-it diff --git a/build/docker/dotnet.alpine.core30.dockerfile b/build/docker/dotnet.alpine.core30.dockerfile new file mode 100644 index 000000000000..5bfbbf069b25 --- /dev/null +++ b/build/docker/dotnet.alpine.core30.dockerfile @@ -0,0 +1,6 @@ +FROM mcr.microsoft.com/dotnet/core/sdk:3.0-alpine3.10 + +RUN apk update && apk upgrade && apk add --no-cache --update bash curl + +ADD https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh /bin/wait-for-it +RUN chmod +x /bin/wait-for-it diff --git a/build/docker/dotnet.alpine.core31.dockerfile b/build/docker/dotnet.alpine.core31.dockerfile new file mode 100644 index 000000000000..5d33b060acc2 --- /dev/null +++ b/build/docker/dotnet.alpine.core31.dockerfile @@ -0,0 +1,6 @@ +FROM mcr.microsoft.com/dotnet/core/sdk:3.1-alpine3.10 + +RUN apk update && apk upgrade && apk add --no-cache --update bash curl + +ADD https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh /bin/wait-for-it +RUN chmod +x /bin/wait-for-it diff --git a/build/docker/dotnet.alpine.core50.dockerfile b/build/docker/dotnet.alpine.core50.dockerfile new file mode 100644 index 000000000000..b2d05868956e --- /dev/null +++ b/build/docker/dotnet.alpine.core50.dockerfile @@ -0,0 +1,6 @@ +FROM mcr.microsoft.com/dotnet/sdk:5.0-alpine3.12 + +RUN apk update && apk upgrade && apk add --no-cache --update bash + +ADD https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh /bin/wait-for-it +RUN chmod +x /bin/wait-for-it diff --git a/build/docker/dotnet.arm64.core50.dockerfile b/build/docker/dotnet.arm64.core50.dockerfile new file mode 100644 index 000000000000..ded7063816fd --- /dev/null +++ b/build/docker/dotnet.arm64.core50.dockerfile @@ -0,0 +1,4 @@ +FROM mcr.microsoft.com/dotnet/sdk:5.0.102-ca-patch-buster-slim + +ADD https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh /bin/wait-for-it +RUN chmod +x /bin/wait-for-it \ No newline at end of file diff --git a/build/docker/dotnet.arm64.dockerfile b/build/docker/dotnet.arm64.dockerfile new file mode 100644 index 000000000000..23ca6aea8349 --- /dev/null +++ b/build/docker/dotnet.arm64.dockerfile @@ -0,0 +1,12 @@ +FROM mcr.microsoft.com/dotnet/sdk:5.0.102-ca-patch-buster-slim + +# Install aspnetcore-runtime-3.1.10 +RUN wget https://download.visualstudio.microsoft.com/download/pr/936a9563-1dad-4c4b-b366-c7fcc3e28215/a1edcaf4c35bce760d07e3f1f3d0b9cf/aspnetcore-runtime-3.1.10-linux-arm64.tar.gz && \ + tar zxf aspnetcore-runtime-3.1.10-linux-arm64.tar.gz -C "/usr/share/dotnet" + +# Install aspnetcore-runtime-5.0.1 +RUN wget https://download.visualstudio.microsoft.com/download/pr/e12f9b23-cb47-4718-9903-8a000f85a442/d1a6a6c75cc832ad8187f5bce0d6234a/aspnetcore-runtime-5.0.1-linux-arm64.tar.gz && \ + tar zxf aspnetcore-runtime-5.0.1-linux-arm64.tar.gz -C "/usr/share/dotnet" + +ADD https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh /bin/wait-for-it +RUN chmod +x /bin/wait-for-it \ No newline at end of file diff --git a/build/docker/dotnet.dockerfile b/build/docker/dotnet.dockerfile new file mode 100644 index 000000000000..e5aae50a91c6 --- /dev/null +++ b/build/docker/dotnet.dockerfile @@ -0,0 +1,16 @@ +FROM mcr.microsoft.com/dotnet/sdk:5.0.102-ca-patch-buster-slim + +# Instructions to install .NET Core runtimes from +# https://docs.microsoft.com/en-us/dotnet/core/install/linux-package-manager-debian10 +RUN wget https://packages.microsoft.com/config/debian/10/packages-microsoft-prod.deb -O packages-microsoft-prod.deb && \ + dpkg -i packages-microsoft-prod.deb + +RUN apt-get update && \ + apt-get install -y apt-transport-https && \ + apt-get update && \ + apt-get install -y aspnetcore-runtime-2.1 && \ + apt-get install -y aspnetcore-runtime-3.0 && \ + apt-get install -y aspnetcore-runtime-3.1 + +ADD https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh /bin/wait-for-it +RUN chmod +x /bin/wait-for-it diff --git a/build/docker/linux-build.bash b/build/docker/linux-build.bash new file mode 100755 index 000000000000..e327d421c8fa --- /dev/null +++ b/build/docker/linux-build.bash @@ -0,0 +1,16 @@ +#!/bin/bash +set -euxo pipefail + +# The purpose of this bash is to build two docker images based on the current git branch +# The first image has SCRATCH as a based image and contains only the /dd-tracer-dotnet +# folder with the publish version of the tracer. Useful to use in a dockerfile as a CopyFrom image. +# The second image has the dotnet sdk 3.1 as a base image + the /dd-tracer-dotnet folder. +# Because is a linux build we try to use BuildKit as engine to parallelize the building process. + +BRANCH="$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')" +SOURCEFOLDER="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" +ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." >/dev/null && pwd )" +export DOCKER_BUILDKIT=1 + +docker build -f $SOURCEFOLDER/linux-build.dockerfile --target tracer-build -t dd-trace-dotnet:$BRANCH $ROOT +docker build -f $SOURCEFOLDER/linux-build.dockerfile -t dotnet-sdk-with-dd-tracer:$BRANCH $ROOT diff --git a/build/docker/linux-build.dockerfile b/build/docker/linux-build.dockerfile new file mode 100644 index 000000000000..e934b17db287 --- /dev/null +++ b/build/docker/linux-build.dockerfile @@ -0,0 +1,92 @@ +# This is a multistage docker file, used by the linux-build.bash file to create the two images from two different stages +# The 'tracer-build' stage contains only the result of building the tracer (managed+native) without any other files (from scratch) +# The 'dotnet-sdk-with-dd-tracer' stage contains the dotnet sdk 3.1 as a base image. +# Also the dockerfile contains arguments to customize the build process. + +ARG BUILD_CONFIGURATION=Release +ARG WORKSPACE=/workspace +ARG PUBLISH_FOLDER=/workspace/publish +ARG TRACER_HOME=/dd-tracer-dotnet + +FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-managed-base +# Instructions to install .NET Core runtimes from +# https://docs.microsoft.com/en-us/dotnet/core/install/linux-package-manager-debian10 +RUN wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.asc.gpg && \ + mv microsoft.asc.gpg /etc/apt/trusted.gpg.d/ && \ + wget -q https://packages.microsoft.com/config/debian/10/prod.list && \ + mv prod.list /etc/apt/sources.list.d/microsoft-prod.list && \ + chown root:root /etc/apt/trusted.gpg.d/microsoft.asc.gpg && \ + chown root:root /etc/apt/sources.list.d/microsoft-prod.list +RUN apt-get update && \ + apt-get install -y apt-transport-https && \ + apt-get update && \ + apt-get install -y aspnetcore-runtime-2.1 && \ + apt-get install -y aspnetcore-runtime-3.0 +ADD https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh /bin/wait-for-it +RUN chmod +x /bin/wait-for-it + + + +FROM ubuntu:20.04 AS build-native-base +RUN apt-get update && \ + DEBIAN_FRONTEND=noninteractive apt-get install -y \ + git \ + wget \ + curl \ + cmake \ + make \ + llvm \ + clang \ + gcc +ENV CXX=clang++ +ENV CC=clang + + +FROM build-managed-base as build-managed +ARG BUILD_CONFIGURATION +ARG WORKSPACE +ARG PUBLISH_FOLDER +WORKDIR ${WORKSPACE} +COPY . ./ + +RUN mkdir -p "${PUBLISH_FOLDER}" +RUN cp ./integrations.json ${PUBLISH_FOLDER}/ +RUN dotnet build -c ${BUILD_CONFIGURATION} src/Datadog.Trace.ClrProfiler.Managed.Loader/Datadog.Trace.ClrProfiler.Managed.Loader.csproj + +RUN mkdir -p "${PUBLISH_FOLDER}/netstandard2.0" +RUN dotnet publish -f netstandard2.0 -c ${BUILD_CONFIGURATION} src/Datadog.Trace/Datadog.Trace.csproj && \ + dotnet publish -f netstandard2.0 -c ${BUILD_CONFIGURATION} src/Datadog.Trace.OpenTracing/Datadog.Trace.OpenTracing.csproj && \ + dotnet publish -f netstandard2.0 -c ${BUILD_CONFIGURATION} src/Datadog.Trace.ClrProfiler.Managed/Datadog.Trace.ClrProfiler.Managed.csproj -o "${PUBLISH_FOLDER}/netstandard2.0" + + + +FROM build-native-base as build-native +ARG WORKSPACE +ARG PUBLISH_FOLDER +ARG TRACER_HOME +COPY --from=build-managed ${WORKSPACE} ${WORKSPACE} +WORKDIR ${WORKSPACE}/src/Datadog.Trace.ClrProfiler.Native/build +RUN cmake .. && make && cp -f ./bin/Datadog.Trace.ClrProfiler.Native.so ${PUBLISH_FOLDER}/ +RUN mkdir -p /var/log/datadog/dotnet +WORKDIR ${PUBLISH_FOLDER} +RUN echo "#!/bin/bash\n set -euxo pipefail\n export CORECLR_ENABLE_PROFILING=\"1\"\n export CORECLR_PROFILER=\"{846F5F1C-F9AE-4B07-969E-05C26BC060D8}\"\n export DD_DOTNET_TRACER_HOME=\"${TRACER_HOME}\"\n export CORECLR_PROFILER_PATH=\"\${DD_DOTNET_TRACER_HOME}/Datadog.Trace.ClrProfiler.Native.so\"\n export DD_INTEGRATIONS=\"\${DD_DOTNET_TRACER_HOME}/integrations.json\"\n eval \"\$@\"\n" > dd-trace.bash +RUN chmod +x dd-trace.bash + + +FROM scratch as tracer-build +ARG PUBLISH_FOLDER +ARG TRACER_HOME +COPY --from=build-native ${PUBLISH_FOLDER} ${TRACER_HOME} +COPY --from=build-native /var/log/datadog/ /var/log/datadog/ + + +FROM build-native as native-linux-binary +ARG PUBLISH_FOLDER +COPY --from=build-native ${PUBLISH_FOLDER}/Datadog.Trace.ClrProfiler.Native.so Datadog.Trace.ClrProfiler.Native.so +CMD cp -f Datadog.Trace.ClrProfiler.Native.so /home/linux-x64/Datadog.Trace.ClrProfiler.Native.so + + +FROM build-managed-base as dotnet-sdk-with-dd-tracer +ARG TRACER_HOME +COPY --from=tracer-build . ./ +RUN ls ${TRACER_HOME} \ No newline at end of file diff --git a/build/docker/native.alpine.dockerfile b/build/docker/native.alpine.dockerfile new file mode 100644 index 000000000000..d2ad18ed6986 --- /dev/null +++ b/build/docker/native.alpine.dockerfile @@ -0,0 +1,5 @@ +FROM alpine:3.11 + +RUN apk update && apk upgrade + +RUN apk add --no-cache --update clang cmake git bash make alpine-sdk diff --git a/build/docker/native.dockerfile b/build/docker/native.dockerfile new file mode 100644 index 000000000000..97d712460f1c --- /dev/null +++ b/build/docker/native.dockerfile @@ -0,0 +1,14 @@ +FROM ubuntu:20.04 + +RUN apt-get update && \ + DEBIAN_FRONTEND=noninteractive apt-get install -y \ + git \ + wget \ + curl \ + cmake \ + make \ + llvm \ + clang \ + gcc +ENV CXX=clang++ +ENV CC=clang \ No newline at end of file diff --git a/build/docker/package.alpine.dockerfile b/build/docker/package.alpine.dockerfile new file mode 100644 index 000000000000..f2aee2bbddc3 --- /dev/null +++ b/build/docker/package.alpine.dockerfile @@ -0,0 +1,7 @@ +FROM alpine:3.11 + +RUN apk update && apk upgrade + +RUN apk add --no-cache --update bash alpine-sdk ruby ruby-dev ruby-etc + +RUN gem install fpm diff --git a/build/docker/package.dockerfile b/build/docker/package.dockerfile new file mode 100644 index 000000000000..95724fdb7b35 --- /dev/null +++ b/build/docker/package.dockerfile @@ -0,0 +1,11 @@ +FROM ubuntu:18.04 + +RUN apt-get update && apt-get install -y --fix-missing \ + build-essential \ + rpm \ + ruby \ + ruby-dev \ + rubygems \ + git + +RUN gem install --no-ri --no-rdoc fpm diff --git a/build/docker/package.sh b/build/docker/package.sh new file mode 100755 index 000000000000..840287dac424 --- /dev/null +++ b/build/docker/package.sh @@ -0,0 +1,53 @@ +#!/bin/bash +set -euxo pipefail + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" +VERSION=1.27.1 +BUILD_TYPE=${buildConfiguration:-Debug} +ARCH=${ARCHITECTURE:-x64} + +mkdir -p $DIR/../../deploy/linux +cp $DIR/../../integrations.json $DIR/../../src/Datadog.Trace.ClrProfiler.Native/bin/${BUILD_TYPE}/x64/ +cp $DIR/../../build/artifacts/createLogPath.sh $DIR/../../src/Datadog.Trace.ClrProfiler.Native/bin/${BUILD_TYPE}/x64/ + +# If running the unified pipeline, copy managed assets now instead of in the profiler build step +if [ -n "${UNIFIED_PIPELINE-}" ]; then + mkdir -p $DIR/../../src/Datadog.Trace.ClrProfiler.Native/bin/${BUILD_TYPE}/x64/netstandard2.0 + cp $DIR/../../src/bin/windows-tracer-home/netstandard2.0/*.dll $DIR/../../src/Datadog.Trace.ClrProfiler.Native/bin/${BUILD_TYPE}/x64/netstandard2.0/ + + mkdir -p $DIR/../../src/Datadog.Trace.ClrProfiler.Native/bin/${BUILD_TYPE}/x64/netcoreapp3.1 + cp $DIR/../../src/bin/windows-tracer-home/netcoreapp3.1/*.dll $DIR/../../src/Datadog.Trace.ClrProfiler.Native/bin/${BUILD_TYPE}/x64/netcoreapp3.1/ +fi + +cd $DIR/../../deploy/linux +for pkgtype in $PKGTYPES ; do + fpm \ + -f \ + -s dir \ + -t $pkgtype \ + -n datadog-dotnet-apm \ + -v $VERSION \ + $(if [ $pkgtype != 'tar' ] ; then echo --prefix /opt/datadog ; fi) \ + --chdir $DIR/../../src/Datadog.Trace.ClrProfiler.Native/bin/${BUILD_TYPE}/x64 \ + netstandard2.0/ \ + netcoreapp3.1/ \ + Datadog.Trace.ClrProfiler.Native.so \ + integrations.json \ + createLogPath.sh +done + +gzip -f datadog-dotnet-apm.tar + +if [ -z "${MUSL-}" ]; then + if [ "$ARCH" == "x64" ]; then + mv datadog-dotnet-apm.tar.gz datadog-dotnet-apm-$VERSION.tar.gz + else + mv datadog-dotnet-apm.tar.gz datadog-dotnet-apm-$VERSION.$ARCH.tar.gz + fi +else + if [ "$ARCH" == "x64" ]; then + mv datadog-dotnet-apm.tar.gz datadog-dotnet-apm-$VERSION-musl.tar.gz + else + mv datadog-dotnet-apm.tar.gz datadog-dotnet-apm-$VERSION-musl.$ARCH.tar.gz + fi +fi diff --git a/build/docker/with-profiler-logs.bash b/build/docker/with-profiler-logs.bash new file mode 100755 index 000000000000..05addb04a828 --- /dev/null +++ b/build/docker/with-profiler-logs.bash @@ -0,0 +1,16 @@ +#!/bin/bash +set -euxo pipefail + +mkdir -p /var/log/datadog/dotnet + +cleanup() { + cat /var/log/datadog/dotnet/dotnet-tracer-native* \ + | awk ' + /info/ {print "\033[32m" $0 "\033[39m"} + /warn/ {print "\033[31m" $0 "\033[39m"} + ' +} + +trap cleanup SIGINT SIGTERM EXIT + +eval "$@" diff --git a/build/docker/with-profiler.bash b/build/docker/with-profiler.bash new file mode 100755 index 000000000000..293b7daf717d --- /dev/null +++ b/build/docker/with-profiler.bash @@ -0,0 +1,12 @@ +#!/bin/bash +set -euxo pipefail + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../.." >/dev/null && pwd )" + +export CORECLR_ENABLE_PROFILING="1" +export CORECLR_PROFILER="{846F5F1C-F9AE-4B07-969E-05C26BC060D8}" +export CORECLR_PROFILER_PATH="${DIR}/src/Datadog.Trace.ClrProfiler.Native/obj/Debug/x64/Datadog.Trace.ClrProfiler.Native.so" +export DD_DOTNET_TRACER_HOME="${DIR}" +export DD_INTEGRATIONS="${DD_DOTNET_TRACER_HOME}/integrations.json" + +eval "$@" diff --git a/build/tools/PrepareRelease/SetAllVersions.cs b/build/tools/PrepareRelease/SetAllVersions.cs index 3b2312e84939..a09f715b6696 100644 --- a/build/tools/PrepareRelease/SetAllVersions.cs +++ b/build/tools/PrepareRelease/SetAllVersions.cs @@ -165,6 +165,10 @@ public void Run() "integrations.json", FullAssemblyNameReplace); + SynchronizeVersion( + "build/docker/package.sh", + text => Regex.Replace(text, $"VERSION={VersionPattern()}", $"VERSION={VersionString()}")); + SynchronizeVersion( "src/WindowsInstaller/WindowsInstaller.wixproj", WixProjReplace); diff --git a/docker-compose.yml b/docker-compose.yml index 04ba378c10f0..4bfb255f9528 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -197,20 +197,412 @@ services: KAFKA_REST_LISTENERS: "http://0.0.0.0:8082" KAFKA_REST_SCHEMA_REGISTRY_URL: 'http://kafka-schema-registry:8081' + build: + build: + context: ./ + dockerfile: ./build/docker/dotnet.dockerfile + image: datadog-dotnet + environment: + - buildConfiguration=${buildConfiguration} + - publishTargetFramework=${publishTargetFramework} + command: /project/build/docker/build.sh + volumes: + - ./:/project + + build.arm64: + build: + context: ./ + dockerfile: ./build/docker/dotnet.arm64.dockerfile + image: datadog-dotnet + environment: + - buildConfiguration=${buildConfiguration} + - publishTargetFramework=${publishTargetFramework} + command: /project/build/docker/build.arm64.sh + volumes: + - ./:/project + + package: + build: + context: ./ + dockerfile: ./build/docker/package.dockerfile + image: datadog-package + environment: + - PKGTYPES=deb rpm tar + command: /project/build/docker/package.sh + volumes: + - ./:/project + + package.alpine: + build: + context: ./ + dockerfile: ./build/docker/package.alpine.dockerfile + image: datadog-package-alpine + environment: + - PKGTYPES=tar + - MUSL=true + command: /project/build/docker/package.sh + volumes: + - ./:/project + + Profiler: + build: + context: ./ + dockerfile: ./build/docker/native.dockerfile + image: datadog-native + environment: + - buildConfiguration=${buildConfiguration} + command: /project/build/docker/Datadog.Trace.ClrProfiler.Native.sh + volumes: + - ./:/project + + Profiler.Alpine: + build: + context: ./ + dockerfile: ./build/docker/native.alpine.dockerfile + image: datadog-native-alpine + environment: + - buildConfiguration=${buildConfiguration} + command: /project/build/docker/Datadog.Trace.ClrProfiler.Native.sh + volumes: + - ./:/project + + Samples.ServiceStack.Redis: + build: + context: ./ + dockerfile: ./build/docker/dotnet.dockerfile + image: datadog-dotnet + command: bash -c "/project/build/docker/with-profiler-logs.bash wait-for-it servicestackredis:6379 -- /project/build/docker/with-profiler.bash dotnet /project/samples/Samples.ServiceStack.Redis/bin/${buildConfiguration}/${publishTargetFramework}/publish/Samples.ServiceStack.Redis.dll" + volumes: + - ./:/project + environment: + - SERVICESTACK_REDIS_HOST=servicestackredis:6379 + depends_on: + - servicestackredis + + Samples.StackExchange.Redis: + build: + context: ./ + dockerfile: ./build/docker/dotnet.dockerfile + image: datadog-dotnet + command: bash -c "/project/build/docker/with-profiler-logs.bash wait-for-it stackexchangeredis:6379 -- /project/build/docker/with-profiler.bash dotnet /project/samples/Samples.StackExchange.Redis/bin/${buildConfiguration}/${publishTargetFramework}/publish/Samples.StackExchange.Redis.dll" + volumes: + - ./:/project + environment: + - STACKEXCHANGE_REDIS_HOST=stackexchangeredis:6379 + depends_on: + - stackexchangeredis + + Samples.Elasticsearch: + build: + context: ./ + dockerfile: ./build/docker/dotnet.dockerfile + image: datadog-dotnet + command: bash -c "/project/build/docker/with-profiler-logs.bash wait-for-it elasticsearch6:9200 -- /project/build/docker/with-profiler.bash dotnet /project/samples/Samples.Elasticsearch/bin/${buildConfiguration}/${publishTargetFramework}/publish/Samples.Elasticsearch.dll" + volumes: + - ./:/project + environment: + - ELASTICSEARCH6_HOST=elasticsearch6:9200 + depends_on: + - elasticsearch6 + + + Samples.Elasticsearch.V5: + build: + context: ./ + dockerfile: ./build/docker/dotnet.dockerfile + image: datadog-dotnet + command: bash -c "/project/build/docker/with-profiler-logs.bash wait-for-it elasticsearch5:9200 -- /project/build/docker/with-profiler.bash dotnet /project/samples/Samples.Elasticsearch.V5/bin/${buildConfiguration}/${publishTargetFramework}/publish/Samples.Elasticsearch.V5.dll" + volumes: + - ./:/project + environment: + - ELASTICSEARCH5_HOST=elasticsearch5:9200 + depends_on: + - elasticsearch5 + + Samples.SqlServer: + build: + context: ./ + dockerfile: ./build/docker/dotnet.dockerfile + image: datadog-dotnet + command: bash -c "/project/build/docker/with-profiler-logs.bash wait-for-it sqlserver:1433 -- /project/build/docker/with-profiler.bash dotnet /project/samples/Samples.SqlServer/bin/${buildConfiguration}/${publishTargetFramework}/publish/Samples.SqlServer.dll" + volumes: + - ./:/project + environment: + - SQLSERVER_CONNECTION_STRING=Server=sqlserver;User=sa;Password=Strong!Passw0rd + depends_on: + - sqlserver + + Samples.Npgsql: + build: + context: ./ + dockerfile: ./build/docker/dotnet.dockerfile + image: datadog-dotnet + command: bash -c "/project/build/docker/with-profiler-logs.bash wait-for-it postgres:5432 -- /project/build/docker/with-profiler.bash dotnet /project/samples/Samples.NpgSql/bin/${buildConfiguration}/${publishTargetFramework}/publish/Samples.NpgSql.dll" + volumes: + - ./:/project + environment: + - POSTGRES_HOST=postgres + depends_on: + - postgres + + Samples.MySql: + build: + context: ./ + dockerfile: ./build/docker/dotnet.dockerfile + image: datadog-dotnet + command: bash -c "/project/build/docker/with-profiler-logs.bash wait-for-it mysql:3306 -- /project/build/docker/with-profiler.bash dotnet /project/samples/Samples.MySql/bin/${buildConfiguration}/${publishTargetFramework}/publish/Samples.MySql.dll" + volumes: + - ./:/project + environment: + - MYSQL_HOST=mysql + - MYSQL_PORT=3306 + depends_on: + - mysql + + Samples.MongoDB: + build: + context: ./ + dockerfile: ./build/docker/dotnet.dockerfile + image: datadog-dotnet + command: bash -c "/project/build/docker/with-profiler-logs.bash wait-for-it mongo:27017 -- /project/build/docker/with-profiler.bash dotnet /project/samples/Samples.MongoDB/bin/${buildConfiguration}/${publishTargetFramework}/publish/Samples.MongoDB.dll" + volumes: + - ./:/project + environment: + - MONGO_HOST=mongo + depends_on: + - mongo + + Samples.RabbitMQ: + build: + context: ./ + dockerfile: ./build/docker/dotnet.dockerfile + image: datadog-dotnet + command: bash -c "/project/build/docker/with-profiler-logs.bash wait-for-it rabbitmq:5672 -- /project/build/docker/with-profiler.bash dotnet /project/test/test-applications/integrations/Samples.RabbitMQ/bin/${buildConfiguration}/${publishTargetFramework}/publish/Samples.RabbitMQ.dll" + volumes: + - ./:/project + environment: + - RABBITMQ_HOST=rabbitmq + - DD_TRACE_CALLTARGET_ENABLED=true + depends_on: + - rabbitmq + # The IIS images are based on Windows images, so they can only be run on Docker for Windows, # and only after switching to run Windows containers - IntegrationTests.IIS: + IntegrationTests.IIS.LoaderOptimizationRegKey: build: context: ./ args: - ENABLE_32_BIT - DOTNET_TRACER_MSI - dockerfile: ./build/_build/docker/iis.dockerfile + dockerfile: ./build/docker/iis/LoaderOptimizationRegKey.dockerfile image: datadog-iis-loaderoptimizationregkey ports: - "8080:80" + # .NET Core does not have apk packages for .NET Core runtimes, they only have base images + # Until it's resolved, have a separate Dockerfile for each runtime + # (see: https://github.com/dotnet/runtime/issues/3406) + IntegrationTests.Alpine.Core21: + build: + context: ./ + dockerfile: ./build/docker/dotnet.alpine.core21.dockerfile + image: datadog-dotnet-alpine-core21 + command: /project/build/docker/Datadog.Trace.ClrProfiler.IntegrationTests.sh + volumes: + - ./:/project + environment: + - MONGO_HOST=mongo + - SERVICESTACK_REDIS_HOST=servicestackredis:6379 + - STACKEXCHANGE_REDIS_HOST=stackexchangeredis:6379 + - ELASTICSEARCH6_HOST=elasticsearch6:9200 + - ELASTICSEARCH5_HOST=elasticsearch5:9200 + - SQLSERVER_CONNECTION_STRING=Server=sqlserver;User=sa;Password=Strong!Passw0rd + - POSTGRES_HOST=postgres + - MYSQL_HOST=mysql + - MYSQL_PORT=3306 + - MYSQL57_HOST=mysql57 + - MYSQL57_PORT=3306 + - RABBITMQ_HOST=rabbitmq + - AWS_SQS_HOST=aws_sqs:9324 + - KAFKA_BROKER_HOST=kafka-broker:29092 + - buildConfiguration=${buildConfiguration} + - publishTargetFramework=netcoreapp2.1 + depends_on: + - servicestackredis + - stackexchangeredis + - elasticsearch6 + - elasticsearch5 + - sqlserver + - mongo + - postgres + - mysql + - mysql57 + - rabbitmq + - aws_sqs + - kafka-broker + - kafka-zookeeper + + IntegrationTests.Alpine.Core30: + build: + context: ./ + dockerfile: ./build/docker/dotnet.alpine.core30.dockerfile + image: datadog-dotnet-alpine-core30 + command: /project/build/docker/Datadog.Trace.ClrProfiler.IntegrationTests.sh + volumes: + - ./:/project + environment: + - MONGO_HOST=mongo + - SERVICESTACK_REDIS_HOST=servicestackredis:6379 + - STACKEXCHANGE_REDIS_HOST=stackexchangeredis:6379 + - ELASTICSEARCH6_HOST=elasticsearch6:9200 + - ELASTICSEARCH5_HOST=elasticsearch5:9200 + - SQLSERVER_CONNECTION_STRING=Server=sqlserver;User=sa;Password=Strong!Passw0rd + - POSTGRES_HOST=postgres + - MYSQL_HOST=mysql + - MYSQL_PORT=3306 + - MYSQL57_HOST=mysql57 + - MYSQL57_PORT=3306 + - RABBITMQ_HOST=rabbitmq + - AWS_SQS_HOST=aws_sqs:9324 + - KAFKA_BROKER_HOST=kafka-broker:29092 + - buildConfiguration=${buildConfiguration} + - publishTargetFramework=netcoreapp3.0 + depends_on: + - servicestackredis + - stackexchangeredis + - elasticsearch6 + - elasticsearch5 + - sqlserver + - mongo + - postgres + - mysql + - mysql57 + - rabbitmq + - aws_sqs + - kafka-broker + - kafka-zookeeper + + IntegrationTests.Alpine.Core31: + build: + context: ./ + dockerfile: ./build/docker/dotnet.alpine.core31.dockerfile + image: datadog-dotnet-alpine-core31 + command: /project/build/docker/Datadog.Trace.ClrProfiler.IntegrationTests.sh + volumes: + - ./:/project + environment: + - MONGO_HOST=mongo + - SERVICESTACK_REDIS_HOST=servicestackredis:6379 + - STACKEXCHANGE_REDIS_HOST=stackexchangeredis:6379 + - ELASTICSEARCH6_HOST=elasticsearch6:9200 + - ELASTICSEARCH5_HOST=elasticsearch5:9200 + - SQLSERVER_CONNECTION_STRING=Server=sqlserver;User=sa;Password=Strong!Passw0rd + - POSTGRES_HOST=postgres + - MYSQL_HOST=mysql + - MYSQL_PORT=3306 + - MYSQL57_HOST=mysql57 + - MYSQL57_PORT=3306 + - RABBITMQ_HOST=rabbitmq + - AWS_SQS_HOST=aws_sqs:9324 + - KAFKA_BROKER_HOST=kafka-broker:29092 + - buildConfiguration=${buildConfiguration} + - publishTargetFramework=netcoreapp3.1 + depends_on: + - servicestackredis + - stackexchangeredis + - elasticsearch6 + - elasticsearch5 + - sqlserver + - mongo + - postgres + - mysql + - mysql57 + - rabbitmq + - aws_sqs + - kafka-broker + - kafka-zookeeper + + IntegrationTests.Alpine.Core50: + build: + context: ./ + dockerfile: ./build/docker/dotnet.alpine.core50.dockerfile + image: datadog-dotnet-alpine-core50 + command: /project/build/docker/Datadog.Trace.ClrProfiler.IntegrationTests.sh + volumes: + - ./:/project + environment: + - MONGO_HOST=mongo + - SERVICESTACK_REDIS_HOST=servicestackredis:6379 + - STACKEXCHANGE_REDIS_HOST=stackexchangeredis:6379 + - ELASTICSEARCH6_HOST=elasticsearch6:9200 + - ELASTICSEARCH5_HOST=elasticsearch5:9200 + - SQLSERVER_CONNECTION_STRING=Server=sqlserver;User=sa;Password=Strong!Passw0rd + - POSTGRES_HOST=postgres + - MYSQL_HOST=mysql + - MYSQL_PORT=3306 + - MYSQL57_HOST=mysql57 + - MYSQL57_PORT=3306 + - RABBITMQ_HOST=rabbitmq + - AWS_SQS_HOST=aws_sqs:9324 + - KAFKA_BROKER_HOST=kafka-broker:29092 + - buildConfiguration=${buildConfiguration} + - publishTargetFramework=net5.0 + depends_on: + - servicestackredis + - stackexchangeredis + - elasticsearch6 + - elasticsearch5 + - sqlserver + - mongo + - postgres + - mysql + - mysql57 + - rabbitmq + - aws_sqs + - kafka-broker + - kafka-zookeeper + IntegrationTests: + build: + context: ./ + dockerfile: ./build/docker/dotnet.dockerfile + image: datadog-dotnet + command: /project/build/docker/Datadog.Trace.ClrProfiler.IntegrationTests.sh + volumes: + - ./:/project + environment: + - MONGO_HOST=mongo + - SERVICESTACK_REDIS_HOST=servicestackredis:6379 + - STACKEXCHANGE_REDIS_HOST=stackexchangeredis:6379 + - ELASTICSEARCH6_HOST=elasticsearch6:9200 + - ELASTICSEARCH5_HOST=elasticsearch5:9200 + - SQLSERVER_CONNECTION_STRING=Server=sqlserver;User=sa;Password=Strong!Passw0rd + - POSTGRES_HOST=postgres + - MYSQL_HOST=mysql + - MYSQL_PORT=3306 + - MYSQL57_HOST=mysql57 + - MYSQL57_PORT=3306 + - RABBITMQ_HOST=rabbitmq + - AWS_SQS_HOST=aws_sqs:9324 + - KAFKA_BROKER_HOST=kafka-broker:29092 + - buildConfiguration=${buildConfiguration} + - publishTargetFramework=${publishTargetFramework} + depends_on: + - servicestackredis + - stackexchangeredis + - elasticsearch6 + - elasticsearch5 + - sqlserver + - mongo + - postgres + - mysql + - mysql57 + - rabbitmq + - aws_sqs + - kafka-broker + - kafka-zookeeper + + NukeIntegrationTests: build: context: ./build/_build/ dockerfile: docker/${baseImage:-debian}.dockerfile @@ -275,7 +667,7 @@ services: - TIMEOUT_LENGTH=120 command: servicestackredis:6379 stackexchangeredis:6379 elasticsearch5:9200 elasticsearch6:9200 sqlserver:1433 mongo:27017 postgres:5432 mysql:3306 mysql57:3306 rabbitmq:5672 kafka-broker:9092 kafka-zookeeper:2181 aws_sqs:9324 - IntegrationTests.ARM64: + NukeIntegrationTests.ARM64: build: context: ./build/_build/ dockerfile: docker/${baseImage:-debian}.dockerfile @@ -325,3 +717,36 @@ services: environment: - TIMEOUT_LENGTH=120 command: servicestackredis:6379 stackexchangeredis:6379 elasticsearch7_arm64:9200 sqledge:1433 mongo:27017 postgres:5432 mysql:3306 rabbitmq:5672 + + IntegrationTests.ARM64.Core50: + build: + context: ./ + dockerfile: ./build/docker/dotnet.arm64.core50.dockerfile + image: datadog-dotnet-arm64-core50 + command: /project/build/docker/Datadog.Trace.ClrProfiler.IntegrationTests.arm64.sh + volumes: + - ./:/project + environment: + - MONGO_HOST=mongo + - SERVICESTACK_REDIS_HOST=servicestackredis:6379 + - STACKEXCHANGE_REDIS_HOST=stackexchangeredis:6379 + - ELASTICSEARCH6_HOST=elasticsearch7_arm64:9200 + - ELASTICSEARCH5_HOST=elasticsearch7_arm64:9200 + - SQLSERVER_CONNECTION_STRING=Server=sqledge;User=sa;Password=Strong!Passw0rd + - POSTGRES_HOST=postgres + - MYSQL_HOST=mysql + - MYSQL_PORT=3306 + - RABBITMQ_HOST=rabbitmq + - AWS_SQS_HOST=aws_sqs:9324 + - buildConfiguration=${buildConfiguration} + - publishTargetFramework=net5.0 + depends_on: + - servicestackredis + - stackexchangeredis + - elasticsearch7_arm64 + - sqledge + - mongo + - postgres + - mysql + - rabbitmq + - aws_sqs diff --git a/test/test-applications/aspnet/samples-iis.sln b/test/test-applications/aspnet/samples-iis.sln new file mode 100644 index 000000000000..adf0b87f2a2f --- /dev/null +++ b/test/test-applications/aspnet/samples-iis.sln @@ -0,0 +1,118 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29613.14 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{CB2BB1C3-36DF-4368-A925-74C0E4FDB5EE}" + ProjectSection(SolutionItems) = preProject + Directory.Build.props = Directory.Build.props + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples.AspNetMvc5", "Samples.AspNetMvc5\Samples.AspNetMvc5.csproj", "{3C6DD42E-9214-4747-92BA-78DE29AACE59}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples.AspNetMvc4", "Samples.AspNetMvc4\Samples.AspNetMvc4.csproj", "{6D86109F-B7C9-477D-86D7-45735A3A0818}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples.WebForms", "Samples.WebForms\Samples.WebForms.csproj", "{99A62CCF-8E7F-4D57-8383-D38C371C8087}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dependency-libs", "dependency-libs", "{A7843DE3-5647-4354-8443-EF22BDEEB450}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Samples.Shared", "..\integrations\dependency-libs\Samples.Shared\Samples.Shared.csproj", "{539BE627-E17E-47BD-BB5F-71788E36B962}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Datadog.Trace", "..\..\..\src\Datadog.Trace\Datadog.Trace.csproj", "{8E1BAA6A-47CC-47F0-A7D6-74741118EB7C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples.AspNet472.LoaderOptimizationRegKey", "Samples.AspNet472.LoaderOptimizationRegKey\Samples.AspNet472.LoaderOptimizationRegKey.csproj", "{BBB60B0F-BF01-4499-936A-4A299A9ACFD4}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3C6DD42E-9214-4747-92BA-78DE29AACE59}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3C6DD42E-9214-4747-92BA-78DE29AACE59}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3C6DD42E-9214-4747-92BA-78DE29AACE59}.Debug|x64.ActiveCfg = Debug|x64 + {3C6DD42E-9214-4747-92BA-78DE29AACE59}.Debug|x64.Build.0 = Debug|x64 + {3C6DD42E-9214-4747-92BA-78DE29AACE59}.Debug|x86.ActiveCfg = Debug|x86 + {3C6DD42E-9214-4747-92BA-78DE29AACE59}.Debug|x86.Build.0 = Debug|x86 + {3C6DD42E-9214-4747-92BA-78DE29AACE59}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3C6DD42E-9214-4747-92BA-78DE29AACE59}.Release|Any CPU.Build.0 = Release|Any CPU + {3C6DD42E-9214-4747-92BA-78DE29AACE59}.Release|x64.ActiveCfg = Release|x64 + {3C6DD42E-9214-4747-92BA-78DE29AACE59}.Release|x64.Build.0 = Release|x64 + {3C6DD42E-9214-4747-92BA-78DE29AACE59}.Release|x86.ActiveCfg = Release|x86 + {3C6DD42E-9214-4747-92BA-78DE29AACE59}.Release|x86.Build.0 = Release|x86 + {6D86109F-B7C9-477D-86D7-45735A3A0818}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6D86109F-B7C9-477D-86D7-45735A3A0818}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6D86109F-B7C9-477D-86D7-45735A3A0818}.Debug|x64.ActiveCfg = Debug|x64 + {6D86109F-B7C9-477D-86D7-45735A3A0818}.Debug|x64.Build.0 = Debug|x64 + {6D86109F-B7C9-477D-86D7-45735A3A0818}.Debug|x86.ActiveCfg = Debug|x86 + {6D86109F-B7C9-477D-86D7-45735A3A0818}.Debug|x86.Build.0 = Debug|x86 + {6D86109F-B7C9-477D-86D7-45735A3A0818}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6D86109F-B7C9-477D-86D7-45735A3A0818}.Release|Any CPU.Build.0 = Release|Any CPU + {6D86109F-B7C9-477D-86D7-45735A3A0818}.Release|x64.ActiveCfg = Release|x64 + {6D86109F-B7C9-477D-86D7-45735A3A0818}.Release|x64.Build.0 = Release|x64 + {6D86109F-B7C9-477D-86D7-45735A3A0818}.Release|x86.ActiveCfg = Release|x86 + {6D86109F-B7C9-477D-86D7-45735A3A0818}.Release|x86.Build.0 = Release|x86 + {99A62CCF-8E7F-4D57-8383-D38C371C8087}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {99A62CCF-8E7F-4D57-8383-D38C371C8087}.Debug|Any CPU.Build.0 = Debug|Any CPU + {99A62CCF-8E7F-4D57-8383-D38C371C8087}.Debug|x64.ActiveCfg = Debug|Any CPU + {99A62CCF-8E7F-4D57-8383-D38C371C8087}.Debug|x64.Build.0 = Debug|Any CPU + {99A62CCF-8E7F-4D57-8383-D38C371C8087}.Debug|x86.ActiveCfg = Debug|Any CPU + {99A62CCF-8E7F-4D57-8383-D38C371C8087}.Debug|x86.Build.0 = Debug|Any CPU + {99A62CCF-8E7F-4D57-8383-D38C371C8087}.Release|Any CPU.ActiveCfg = Release|Any CPU + {99A62CCF-8E7F-4D57-8383-D38C371C8087}.Release|Any CPU.Build.0 = Release|Any CPU + {99A62CCF-8E7F-4D57-8383-D38C371C8087}.Release|x64.ActiveCfg = Release|Any CPU + {99A62CCF-8E7F-4D57-8383-D38C371C8087}.Release|x64.Build.0 = Release|Any CPU + {99A62CCF-8E7F-4D57-8383-D38C371C8087}.Release|x86.ActiveCfg = Release|Any CPU + {99A62CCF-8E7F-4D57-8383-D38C371C8087}.Release|x86.Build.0 = Release|Any CPU + {539BE627-E17E-47BD-BB5F-71788E36B962}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {539BE627-E17E-47BD-BB5F-71788E36B962}.Debug|Any CPU.Build.0 = Debug|Any CPU + {539BE627-E17E-47BD-BB5F-71788E36B962}.Debug|x64.ActiveCfg = Debug|Any CPU + {539BE627-E17E-47BD-BB5F-71788E36B962}.Debug|x64.Build.0 = Debug|Any CPU + {539BE627-E17E-47BD-BB5F-71788E36B962}.Debug|x86.ActiveCfg = Debug|Any CPU + {539BE627-E17E-47BD-BB5F-71788E36B962}.Debug|x86.Build.0 = Debug|Any CPU + {539BE627-E17E-47BD-BB5F-71788E36B962}.Release|Any CPU.ActiveCfg = Release|Any CPU + {539BE627-E17E-47BD-BB5F-71788E36B962}.Release|Any CPU.Build.0 = Release|Any CPU + {539BE627-E17E-47BD-BB5F-71788E36B962}.Release|x64.ActiveCfg = Release|Any CPU + {539BE627-E17E-47BD-BB5F-71788E36B962}.Release|x64.Build.0 = Release|Any CPU + {539BE627-E17E-47BD-BB5F-71788E36B962}.Release|x86.ActiveCfg = Release|Any CPU + {539BE627-E17E-47BD-BB5F-71788E36B962}.Release|x86.Build.0 = Release|Any CPU + {8E1BAA6A-47CC-47F0-A7D6-74741118EB7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8E1BAA6A-47CC-47F0-A7D6-74741118EB7C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8E1BAA6A-47CC-47F0-A7D6-74741118EB7C}.Debug|x64.ActiveCfg = Debug|Any CPU + {8E1BAA6A-47CC-47F0-A7D6-74741118EB7C}.Debug|x64.Build.0 = Debug|Any CPU + {8E1BAA6A-47CC-47F0-A7D6-74741118EB7C}.Debug|x86.ActiveCfg = Debug|Any CPU + {8E1BAA6A-47CC-47F0-A7D6-74741118EB7C}.Debug|x86.Build.0 = Debug|Any CPU + {8E1BAA6A-47CC-47F0-A7D6-74741118EB7C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8E1BAA6A-47CC-47F0-A7D6-74741118EB7C}.Release|Any CPU.Build.0 = Release|Any CPU + {8E1BAA6A-47CC-47F0-A7D6-74741118EB7C}.Release|x64.ActiveCfg = Release|Any CPU + {8E1BAA6A-47CC-47F0-A7D6-74741118EB7C}.Release|x64.Build.0 = Release|Any CPU + {8E1BAA6A-47CC-47F0-A7D6-74741118EB7C}.Release|x86.ActiveCfg = Release|Any CPU + {8E1BAA6A-47CC-47F0-A7D6-74741118EB7C}.Release|x86.Build.0 = Release|Any CPU + {BBB60B0F-BF01-4499-936A-4A299A9ACFD4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BBB60B0F-BF01-4499-936A-4A299A9ACFD4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BBB60B0F-BF01-4499-936A-4A299A9ACFD4}.Debug|x64.ActiveCfg = Debug|Any CPU + {BBB60B0F-BF01-4499-936A-4A299A9ACFD4}.Debug|x64.Build.0 = Debug|Any CPU + {BBB60B0F-BF01-4499-936A-4A299A9ACFD4}.Debug|x86.ActiveCfg = Debug|Any CPU + {BBB60B0F-BF01-4499-936A-4A299A9ACFD4}.Debug|x86.Build.0 = Debug|Any CPU + {BBB60B0F-BF01-4499-936A-4A299A9ACFD4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BBB60B0F-BF01-4499-936A-4A299A9ACFD4}.Release|Any CPU.Build.0 = Release|Any CPU + {BBB60B0F-BF01-4499-936A-4A299A9ACFD4}.Release|x64.ActiveCfg = Release|Any CPU + {BBB60B0F-BF01-4499-936A-4A299A9ACFD4}.Release|x64.Build.0 = Release|Any CPU + {BBB60B0F-BF01-4499-936A-4A299A9ACFD4}.Release|x86.ActiveCfg = Release|Any CPU + {BBB60B0F-BF01-4499-936A-4A299A9ACFD4}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {539BE627-E17E-47BD-BB5F-71788E36B962} = {A7843DE3-5647-4354-8443-EF22BDEEB450} + {8E1BAA6A-47CC-47F0-A7D6-74741118EB7C} = {A7843DE3-5647-4354-8443-EF22BDEEB450} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {81EC8DA4-0E99-483E-AAF2-B1184DF6E2B5} + EndGlobalSection +EndGlobal