diff --git a/azure-pipelines-pr.yml b/azure-pipelines-pr.yml index 407d0044ed..cdf052e09b 100644 --- a/azure-pipelines-pr.yml +++ b/azure-pipelines-pr.yml @@ -163,6 +163,12 @@ stages: steps: - checkout: self clean: true + - bash: | + set -euo pipefail + bash eng/pipelines/linux-disk-usage.sh "Before SDK installation" + bash eng/pipelines/linux-sdk-staging.sh snapshot + displayName: Measure Linux disk usage before SDK installation + # UseDotNet downloads and extracts into Agent.TempDirectory before copying into .dotnet. - task: UseDotNet@2 displayName: Install .NET 8 SDK inputs: @@ -181,6 +187,15 @@ stages: packageType: sdk version: 10.x installationPath: $(Build.SourcesDirectory)/.dotnet + - bash: bash eng/pipelines/linux-disk-usage.sh "After SDK installation" + displayName: Measure Linux disk usage after SDK installation + condition: succeededOrFailed() + - bash: | + set -euo pipefail + bash eng/pipelines/linux-sdk-staging.sh clean + bash eng/pipelines/linux-disk-usage.sh "After SDK staging cleanup" + displayName: Clean Linux SDK download and extraction staging + condition: succeededOrFailed() - script: eng/common/build.sh --configuration $(_BuildConfig) --prepareMachine @@ -188,6 +203,9 @@ stages: name: Build displayName: Build condition: succeeded() + - bash: bash eng/pipelines/linux-disk-usage.sh "After build" + displayName: Measure Linux disk usage after build + condition: succeededOrFailed() - ${{ if or(eq(variables['System.TeamProject'], 'public'), in(variables['Build.Reason'], 'PullRequest')) }}: - stage: integration @@ -198,4 +216,3 @@ stages: parameters: buildConfig: Release poolVmImage: windows-latest - diff --git a/eng/pipelines/linux-disk-usage.sh b/eng/pipelines/linux-disk-usage.sh new file mode 100644 index 0000000000..3b7786a018 --- /dev/null +++ b/eng/pipelines/linux-disk-usage.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +set -euo pipefail + +echo "Disk usage: $1" +df -h / "$BUILD_SOURCESDIRECTORY" "$AGENT_TEMPDIRECTORY" +for path in \ + "$BUILD_SOURCESDIRECTORY/.dotnet" \ + "$BUILD_SOURCESDIRECTORY/artifacts" \ + "${NUGET_PACKAGES:-$HOME/.nuget/packages}" \ + "$AGENT_TEMPDIRECTORY"; do + if [[ -e "$path" ]]; then + du -sh "$path" + fi +done diff --git a/eng/pipelines/linux-sdk-staging.sh b/eng/pipelines/linux-sdk-staging.sh new file mode 100644 index 0000000000..cce67564d4 --- /dev/null +++ b/eng/pipelines/linux-sdk-staging.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash +set -euo pipefail + +snapshot="$PIPELINE_WORKSPACE/scaffolding-sdk-temp-before.txt" + +case "${1:-}" in + snapshot) + find "$AGENT_TEMPDIRECTORY" -mindepth 1 -maxdepth 1 -printf '%f\n' | sort > "$snapshot" + ;; + clean) + if [[ ! -f "$snapshot" ]]; then + echo "Missing SDK staging snapshot: $snapshot" >&2 + exit 1 + fi + + after="$(mktemp "$PIPELINE_WORKSPACE/scaffolding-sdk-temp-after.XXXXXX")" + new_entries="$(mktemp "$PIPELINE_WORKSPACE/scaffolding-sdk-temp-new.XXXXXX")" + trap 'rm -f -- "$after" "$new_entries"' EXIT + find "$AGENT_TEMPDIRECTORY" -mindepth 1 -maxdepth 1 -printf '%f\n' | sort > "$after" + comm -13 "$snapshot" "$after" > "$new_entries" + + while IFS= read -r name; do + [[ "$name" =~ ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$ ]] || continue + path="$AGENT_TEMPDIRECTORY/$name" + if [[ -d "$path" ]]; then + [[ -d "$path/sdk" && -d "$path/shared/Microsoft.NETCore.App" ]] || continue + sdk_dir="$(find "$path/sdk" -mindepth 1 -maxdepth 1 -type d \( -name '8.*' -o -name '9.*' -o -name '10.*' \) -print -quit)" + [[ -n "$sdk_dir" ]] || continue + elif [[ -f "$path" ]]; then + [[ "$(file -b --mime-type "$path")" == application/gzip ]] || continue + tar --force-local -tzf "$path" | awk '/(^|\/)sdk\/(8|9|10)\./ { found = 1 } END { exit !found }' || continue + else + continue + fi + + du -sh -- "$path" + rm -rf -- "$path" + done < "$new_entries" + rm -f -- "$snapshot" + ;; + *) + echo "Usage: $0 snapshot|clean" >&2 + exit 1 + ;; +esac