├── .config └── tsaoptions.json ├── .dockerignore ├── .editorconfig ├── .gitattributes ├── .github ├── labeler-config.yml ├── linters │ └── .hadolint.yaml └── workflows │ ├── labeler.yml │ ├── linter.yml │ └── run-tests.yml ├── .gitignore ├── CODE-OF-CONDUCT.md ├── CODEOWNERS ├── Directory.Build.props ├── Directory.Packages.props ├── LICENSE ├── NuGet.config ├── README.md ├── build.ps1 ├── eng ├── common │ ├── Dockerfile.WithRepo │ ├── Get-BaseImageStatus.ps1 │ ├── Get-ImageBuilder.ps1 │ ├── Get-ImageNameVars.ps1 │ ├── Install-DotNetSdk.ps1 │ ├── Invoke-CleanupDocker.ps1 │ ├── Invoke-ImageBuilder.ps1 │ ├── Invoke-WithRetry.ps1 │ ├── Retain-Build.ps1 │ ├── build.ps1 │ ├── pull-image.sh │ ├── readme.md │ └── templates │ │ ├── 1es-official.yml │ │ ├── 1es-unofficial.yml │ │ ├── jobs │ │ ├── build-images.yml │ │ ├── cg-build-projects.yml │ │ ├── copy-base-images-staging.yml │ │ ├── copy-base-images.yml │ │ ├── generate-matrix.yml │ │ ├── post-build.yml │ │ ├── publish.yml │ │ ├── test-images-linux-client.yml │ │ ├── test-images-windows-client.yml │ │ └── validate-image-sizes.yml │ │ ├── stages │ │ ├── build-and-test.yml │ │ ├── build-test-publish-repo.yml │ │ ├── dotnet │ │ │ ├── build-and-test.yml │ │ │ ├── build-test-publish-repo.yml │ │ │ └── publish.yml │ │ └── publish.yml │ │ ├── steps │ │ ├── annotate-eol-digests.yml │ │ ├── clean-acr-images.yml │ │ ├── cleanup-docker-linux.yml │ │ ├── cleanup-docker-windows.yml │ │ ├── common-init-for-matrix-and-build.yml │ │ ├── copy-base-images.yml │ │ ├── download-build-artifact.yml │ │ ├── init-common.yml │ │ ├── init-docker-linux.yml │ │ ├── init-docker-windows.yml │ │ ├── parse-test-arg-arrays.yml │ │ ├── publish-artifact.yml │ │ ├── publish-readmes.yml │ │ ├── retain-build.yml │ │ ├── run-imagebuilder.yml │ │ ├── run-pwsh-with-auth.yml │ │ ├── set-dry-run.yml │ │ ├── set-image-info-path-var.yml │ │ ├── test-images-linux-client.yml │ │ ├── test-images-windows-client.yml │ │ ├── validate-branch.yml │ │ ├── validate-image-sizes.yml │ │ ├── wait-for-mcr-doc-ingestion.yml │ │ └── wait-for-mcr-image-ingestion.yml │ │ ├── task-prefix-decorator.yml │ │ └── variables │ │ ├── common-paths.yml │ │ ├── common.yml │ │ ├── docker-images.yml │ │ └── dotnet │ │ ├── build-test-publish.yml │ │ └── common.yml └── pipelines │ ├── dotnet-buildtools-prereqs-all-pr.yml │ ├── dotnet-buildtools-prereqs-all.yml │ ├── dotnet-buildtools-prereqs-eng.yml │ ├── stages │ └── build-test-publish-repo.yml │ ├── steps │ ├── install-cross-build-prereqs.yml │ └── set-base-image-override-options.yml │ └── variables │ └── common.yml ├── lifecycle.md ├── manifest.json ├── run-tests.ps1 ├── src ├── almalinux │ ├── 8 │ │ ├── helix │ │ │ └── amd64 │ │ │ │ └── Dockerfile │ │ └── source-build │ │ │ └── amd64 │ │ │ └── Dockerfile │ ├── 9 │ │ ├── helix │ │ │ └── amd64 │ │ │ │ └── Dockerfile │ │ └── source-build │ │ │ └── amd64 │ │ │ └── Dockerfile │ ├── 10 │ │ ├── helix │ │ │ └── amd64 │ │ │ │ └── Dockerfile │ │ └── source-build │ │ │ └── amd64 │ │ │ └── Dockerfile │ └── manifest.json ├── alpine │ ├── 3.19 │ │ ├── WithNode │ │ │ └── amd64 │ │ │ │ └── Dockerfile │ │ └── amd64 │ │ │ └── Dockerfile │ ├── 3.20 │ │ └── helix │ │ │ └── Dockerfile │ ├── 3.21 │ │ ├── amd64 │ │ │ └── Dockerfile │ │ └── helix │ │ │ └── Dockerfile │ ├── 3.22 │ │ ├── amd64 │ │ │ └── Dockerfile │ │ └── helix │ │ │ └── Dockerfile │ ├── edge │ │ └── helix │ │ │ └── Dockerfile │ └── manifest.json ├── azurelinux │ ├── 3.0 │ │ ├── docker-testrunner │ │ │ └── Dockerfile │ │ ├── helix │ │ │ └── Dockerfile │ │ ├── net10.0 │ │ │ ├── android │ │ │ │ ├── amd64 │ │ │ │ │ └── Dockerfile │ │ │ │ └── docker │ │ │ │ │ └── amd64 │ │ │ │ │ └── Dockerfile │ │ │ ├── build │ │ │ │ └── amd64 │ │ │ │ │ └── Dockerfile │ │ │ ├── cross │ │ │ │ ├── amd64-musl │ │ │ │ │ └── Dockerfile │ │ │ │ ├── amd64-sanitizer │ │ │ │ │ └── Dockerfile │ │ │ │ ├── amd64 │ │ │ │ │ └── Dockerfile │ │ │ │ ├── android │ │ │ │ │ ├── amd64 │ │ │ │ │ │ └── Dockerfile │ │ │ │ │ └── openssl │ │ │ │ │ │ └── amd64 │ │ │ │ │ │ └── Dockerfile │ │ │ │ ├── arm-musl │ │ │ │ │ └── Dockerfile │ │ │ │ ├── arm │ │ │ │ │ └── Dockerfile │ │ │ │ ├── arm64-musl │ │ │ │ │ └── Dockerfile │ │ │ │ ├── arm64 │ │ │ │ │ └── Dockerfile │ │ │ │ ├── armv6 │ │ │ │ │ └── Dockerfile │ │ │ │ ├── freebsd │ │ │ │ │ └── 14 │ │ │ │ │ │ ├── amd64 │ │ │ │ │ │ └── Dockerfile │ │ │ │ │ │ └── arm64 │ │ │ │ │ │ └── Dockerfile │ │ │ │ ├── loongarch64-musl │ │ │ │ │ └── Dockerfile │ │ │ │ ├── loongarch64 │ │ │ │ │ └── Dockerfile │ │ │ │ ├── ppc64le │ │ │ │ │ └── Dockerfile │ │ │ │ ├── riscv64-musl │ │ │ │ │ └── Dockerfile │ │ │ │ ├── riscv64 │ │ │ │ │ └── Dockerfile │ │ │ │ ├── s390x │ │ │ │ │ └── Dockerfile │ │ │ │ └── x86 │ │ │ │ │ └── Dockerfile │ │ │ ├── crossdeps-builder │ │ │ │ └── amd64 │ │ │ │ │ ├── Dockerfile │ │ │ │ │ └── dimitri_john_ledkov.asc │ │ │ ├── crossdeps-llvm │ │ │ │ └── amd64 │ │ │ │ │ └── Dockerfile │ │ │ ├── crossdeps │ │ │ │ └── amd64 │ │ │ │ │ └── Dockerfile │ │ │ ├── fpm │ │ │ │ └── amd64 │ │ │ │ │ └── Dockerfile │ │ │ ├── opt │ │ │ │ └── Dockerfile │ │ │ ├── source-build-test │ │ │ │ └── amd64 │ │ │ │ │ ├── Dockerfile │ │ │ │ │ └── run-scancode.sh │ │ │ └── webassembly │ │ │ │ └── amd64 │ │ │ │ └── Dockerfile │ │ ├── net8.0 │ │ │ ├── android │ │ │ │ ├── amd64 │ │ │ │ │ └── Dockerfile │ │ │ │ └── docker │ │ │ │ │ └── amd64 │ │ │ │ │ └── Dockerfile │ │ │ ├── build │ │ │ │ └── amd64 │ │ │ │ │ └── Dockerfile │ │ │ ├── cross │ │ │ │ ├── amd64-musl │ │ │ │ │ └── Dockerfile │ │ │ │ ├── amd64 │ │ │ │ │ └── Dockerfile │ │ │ │ ├── android │ │ │ │ │ ├── amd64 │ │ │ │ │ │ └── Dockerfile │ │ │ │ │ └── openssl │ │ │ │ │ │ └── amd64 │ │ │ │ │ │ └── Dockerfile │ │ │ │ ├── arm-musl │ │ │ │ │ └── Dockerfile │ │ │ │ ├── arm │ │ │ │ │ └── Dockerfile │ │ │ │ ├── arm64-musl │ │ │ │ │ └── Dockerfile │ │ │ │ ├── arm64 │ │ │ │ │ └── Dockerfile │ │ │ │ ├── freebsd │ │ │ │ │ └── 14 │ │ │ │ │ │ └── amd64 │ │ │ │ │ │ └── Dockerfile │ │ │ │ ├── ppc64le │ │ │ │ │ └── Dockerfile │ │ │ │ ├── riscv64 │ │ │ │ │ └── Dockerfile │ │ │ │ ├── s390x │ │ │ │ │ └── Dockerfile │ │ │ │ └── x86 │ │ │ │ │ └── Dockerfile │ │ │ ├── crossdeps-builder │ │ │ │ └── amd64 │ │ │ │ │ ├── Dockerfile │ │ │ │ │ └── dimitri_john_ledkov.asc │ │ │ ├── crossdeps-llvm │ │ │ │ └── amd64 │ │ │ │ │ └── Dockerfile │ │ │ ├── crossdeps │ │ │ │ └── amd64 │ │ │ │ │ └── Dockerfile │ │ │ ├── fpm │ │ │ │ └── amd64 │ │ │ │ │ └── Dockerfile │ │ │ └── webassembly │ │ │ │ └── amd64 │ │ │ │ └── Dockerfile │ │ └── net9.0 │ │ │ ├── android │ │ │ ├── amd64 │ │ │ │ └── Dockerfile │ │ │ └── docker │ │ │ │ └── amd64 │ │ │ │ └── Dockerfile │ │ │ ├── build │ │ │ └── amd64 │ │ │ │ └── Dockerfile │ │ │ ├── cross │ │ │ ├── amd64-musl │ │ │ │ └── Dockerfile │ │ │ ├── amd64-sanitizer │ │ │ │ └── Dockerfile │ │ │ ├── amd64 │ │ │ │ └── Dockerfile │ │ │ ├── android │ │ │ │ ├── amd64 │ │ │ │ │ └── Dockerfile │ │ │ │ └── openssl │ │ │ │ │ └── amd64 │ │ │ │ │ └── Dockerfile │ │ │ ├── arm-musl │ │ │ │ └── Dockerfile │ │ │ ├── arm │ │ │ │ └── Dockerfile │ │ │ ├── arm64-musl │ │ │ │ └── Dockerfile │ │ │ ├── arm64 │ │ │ │ └── Dockerfile │ │ │ ├── armv6 │ │ │ │ └── Dockerfile │ │ │ ├── freebsd │ │ │ │ └── 14 │ │ │ │ │ ├── amd64 │ │ │ │ │ └── Dockerfile │ │ │ │ │ └── arm64 │ │ │ │ │ └── Dockerfile │ │ │ ├── ppc64le │ │ │ │ └── Dockerfile │ │ │ ├── riscv64-musl │ │ │ │ └── Dockerfile │ │ │ ├── riscv64 │ │ │ │ └── Dockerfile │ │ │ ├── s390x │ │ │ │ └── Dockerfile │ │ │ └── x86 │ │ │ │ └── Dockerfile │ │ │ ├── crossdeps-builder │ │ │ └── amd64 │ │ │ │ ├── Dockerfile │ │ │ │ └── dimitri_john_ledkov.asc │ │ │ ├── crossdeps-llvm │ │ │ └── amd64 │ │ │ │ └── Dockerfile │ │ │ ├── crossdeps │ │ │ └── amd64 │ │ │ │ └── Dockerfile │ │ │ ├── fpm │ │ │ └── amd64 │ │ │ │ └── Dockerfile │ │ │ ├── opt │ │ │ └── Dockerfile │ │ │ └── webassembly │ │ │ └── amd64 │ │ │ └── Dockerfile │ └── manifest.json ├── cbl-mariner │ ├── 2.0 │ │ ├── amd64 │ │ │ └── Dockerfile │ │ ├── android │ │ │ └── amd64 │ │ │ │ └── Dockerfile │ │ ├── cross │ │ │ ├── amd64-alpine │ │ │ │ └── Dockerfile │ │ │ ├── amd64 │ │ │ │ └── Dockerfile │ │ │ ├── android │ │ │ │ └── amd64 │ │ │ │ │ └── Dockerfile │ │ │ ├── arm-alpine │ │ │ │ └── Dockerfile │ │ │ ├── arm │ │ │ │ └── Dockerfile │ │ │ ├── arm64-alpine │ │ │ │ └── Dockerfile │ │ │ ├── arm64 │ │ │ │ └── Dockerfile │ │ │ └── ubuntu │ │ │ │ └── 18.04 │ │ │ │ ├── amd64 │ │ │ │ └── Dockerfile │ │ │ │ ├── arm │ │ │ │ └── Dockerfile │ │ │ │ └── arm64 │ │ │ │ └── Dockerfile │ │ ├── crossdeps-builder │ │ │ └── amd64 │ │ │ │ ├── Dockerfile │ │ │ │ └── dimitri_john_ledkov.asc │ │ ├── crossdeps-llvm │ │ │ └── amd64 │ │ │ │ └── Dockerfile │ │ ├── crossdeps │ │ │ └── amd64 │ │ │ │ └── Dockerfile │ │ ├── fpm │ │ │ └── amd64 │ │ │ │ └── Dockerfile │ │ ├── helix │ │ │ └── amd64 │ │ │ │ └── Dockerfile │ │ └── opt │ │ │ └── arm64 │ │ │ └── Dockerfile │ └── manifest.json ├── centos-stream │ ├── 9 │ │ ├── amd64 │ │ │ └── Dockerfile │ │ ├── helix │ │ │ └── amd64 │ │ │ │ └── Dockerfile │ │ └── mlnet │ │ │ └── helix │ │ │ └── amd64 │ │ │ └── Dockerfile │ ├── 10 │ │ ├── amd64 │ │ │ └── Dockerfile │ │ └── helix │ │ │ └── Dockerfile │ └── manifest.json ├── debian │ ├── 11 │ │ ├── amd64 │ │ │ └── Dockerfile │ │ └── helix │ │ │ ├── amd64 │ │ │ └── Dockerfile │ │ │ └── arm64v8 │ │ │ └── Dockerfile │ ├── 12 │ │ ├── gcc15 │ │ │ └── amd64 │ │ │ │ └── Dockerfile │ │ └── helix │ │ │ ├── amd64 │ │ │ └── Dockerfile │ │ │ ├── arm32v7 │ │ │ └── Dockerfile │ │ │ └── arm64v8 │ │ │ └── Dockerfile │ ├── 13 │ │ └── helix │ │ │ └── Dockerfile │ └── manifest.json ├── fedora │ ├── 40 │ │ └── amd64 │ │ │ └── Dockerfile │ ├── 41 │ │ ├── amd64 │ │ │ └── Dockerfile │ │ └── helix │ │ │ └── amd64 │ │ │ └── Dockerfile │ ├── 42 │ │ └── helix │ │ │ └── amd64 │ │ │ └── Dockerfile │ └── manifest.json ├── nanoserver │ ├── 1809 │ │ └── helix │ │ │ └── amd64 │ │ │ └── Dockerfile │ └── manifest.json ├── opensuse │ ├── 15.6 │ │ └── helix │ │ │ └── amd64 │ │ │ └── Dockerfile │ └── manifest.json ├── ubuntu │ ├── 22.04 │ │ ├── amd64 │ │ │ └── Dockerfile │ │ ├── coredeps │ │ │ └── amd64 │ │ │ │ └── Dockerfile │ │ ├── cross │ │ │ └── armel-tizen │ │ │ │ └── Dockerfile │ │ ├── crossdeps │ │ │ └── amd64 │ │ │ │ └── Dockerfile │ │ ├── debpkg │ │ │ └── amd64 │ │ │ │ └── Dockerfile │ │ ├── helix │ │ │ ├── Dockerfile │ │ │ └── webassembly │ │ │ │ └── amd64 │ │ │ │ ├── Dockerfile │ │ │ │ └── setup-node-23.x.sh │ │ ├── mlnet │ │ │ ├── amd64 │ │ │ │ └── Dockerfile │ │ │ └── helix │ │ │ │ └── amd64 │ │ │ │ └── Dockerfile │ │ └── opt │ │ │ └── arm64v8 │ │ │ └── Dockerfile │ ├── 24.04 │ │ ├── Dockerfile │ │ └── helix │ │ │ ├── Dockerfile │ │ │ └── webassembly │ │ │ └── amd64 │ │ │ ├── Dockerfile │ │ │ └── setup-node-23.x.sh │ ├── 25.04 │ │ └── helix │ │ │ └── Dockerfile │ ├── 25.10 │ │ └── helix │ │ │ └── Dockerfile │ ├── build-scripts │ │ └── install-cross-build-prereqs.sh │ └── manifest.json └── windowsservercore │ ├── ltsc2019 │ └── helix │ │ └── amd64 │ │ └── Dockerfile │ ├── ltsc2022 │ └── helix │ │ ├── amd64 │ │ └── Dockerfile │ │ ├── webassembly-net8 │ │ └── amd64 │ │ │ ├── Dockerfile │ │ │ └── arial.ttf │ │ └── webassembly │ │ └── amd64 │ │ ├── Dockerfile │ │ └── arial.ttf │ ├── ltsc2025 │ └── helix │ │ ├── amd64 │ │ └── Dockerfile │ │ ├── webassembly-net8 │ │ └── amd64 │ │ │ ├── Dockerfile │ │ │ └── arial.ttf │ │ └── webassembly │ │ └── amd64 │ │ ├── Dockerfile │ │ └── arial.ttf │ └── manifest.json └── tests └── Microsoft.DotNet.BuildTools.Prereqs.Docker.Tests ├── CodeOwnersTests.cs ├── Config.cs ├── ManifestTests.cs ├── Microsoft.DotNet.BuildTools.Prereqs.Docker.Tests.csproj └── xunit.runner.json /.config/tsaoptions.json: -------------------------------------------------------------------------------- 1 | { 2 | "instanceUrl": "https://devdiv.visualstudio.com/", 3 | "template": "TFSDEVDIV", 4 | "projectName": "DEVDIV", 5 | "areaPath": "DevDiv\\NET Fundamentals\\.NET Acquisition\\Docker", 6 | "iterationPath": "DevDiv", 7 | "notificationAliases": [ "dotnetADTeam@microsoft.com" ], 8 | "repositoryName": "dotnet-buildtools-prereqs-docker", 9 | "codebaseName": "dotnet-buildtools-prereqs-docker" 10 | } 11 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | **/bin 2 | **/obj 3 | **/out 4 | **/.vscode 5 | **/.vs 6 | .dotnet 7 | .Microsoft.DotNet.ImageBuilder 8 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | setup-Alpine.sh eol=lf -------------------------------------------------------------------------------- /.github/labeler-config.yml: -------------------------------------------------------------------------------- 1 | # Add 'untriaged' label to any issue that gets opened 2 | untriaged: 3 | - '/.*/' 4 | -------------------------------------------------------------------------------- /.github/linters/.hadolint.yaml: -------------------------------------------------------------------------------- 1 | failure-threshold: error 2 | -------------------------------------------------------------------------------- /.github/workflows/labeler.yml: -------------------------------------------------------------------------------- 1 | name: "Issue Labeler" 2 | on: 3 | issues: 4 | types: [opened] 5 | 6 | permissions: 7 | issues: write 8 | contents: read 9 | 10 | jobs: 11 | triage: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: github/issue-labeler@v3.4 15 | with: 16 | configuration-path: .github/labeler-config.yml 17 | enable-versioned-regex: 0 18 | repo-token: ${{ github.token }} 19 | -------------------------------------------------------------------------------- /.github/workflows/linter.yml: -------------------------------------------------------------------------------- 1 | name: Lint Code Base 2 | 3 | on: 4 | pull_request: null 5 | 6 | permissions: {} 7 | 8 | jobs: 9 | run-lint: 10 | runs-on: ubuntu-latest 11 | 12 | permissions: 13 | contents: read 14 | packages: read 15 | # To report GitHub Actions status checks 16 | statuses: write 17 | 18 | steps: 19 | - name: Checkout code 20 | uses: actions/checkout@v4 21 | with: 22 | # Full git history is needed to get a proper list of changed files within `super-linter` 23 | fetch-depth: 0 24 | - name: Lint Code Base 25 | uses: github/super-linter@v6 # https://github.com/github/super-linter 26 | env: 27 | DEFAULT_BRANCH: main 28 | FILTER_REGEX_EXCLUDE: eng/common/.* 29 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 30 | VALIDATE_DOCKERFILE_HADOLINT: true 31 | VALIDATE_MARKDOWN: true 32 | -------------------------------------------------------------------------------- /.github/workflows/run-tests.yml: -------------------------------------------------------------------------------- 1 | name: Run Tests 2 | on: 3 | pull_request: 4 | branches: 5 | - main 6 | 7 | jobs: 8 | run-tests: 9 | name: Run Tests 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Check out repository code 13 | uses: actions/checkout@v4 14 | 15 | - name: Run Tests 16 | shell: pwsh 17 | run: ./run-tests.ps1 18 | 19 | - name: Upload test results 20 | if: always() 21 | uses: actions/upload-artifact@v4 22 | with: 23 | name: test-results 24 | path: ./artifacts/**/TestResults/* 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Build output 2 | [Bb]in/ 3 | [Oo]bj/ 4 | [Oo]ut/ 5 | 6 | # cache for misc downloads 7 | artifacts/ 8 | 9 | # dotnet install directory 10 | .dotnet/ 11 | 12 | # Visual Studio 2015 cache/options directory 13 | .vs/ 14 | 15 | # Visual Studio Code cache/options directory 16 | .vscode/ 17 | 18 | # Visual Studio debug profile 19 | **/launchSettings.json 20 | 21 | # Test files 22 | *.trx 23 | 24 | # User-specific files 25 | *.suo 26 | *.user 27 | 28 | # ImageBuilder directory 29 | .Microsoft.DotNet.ImageBuilder 30 | -------------------------------------------------------------------------------- /CODE-OF-CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Code of Conduct 2 | 3 | This project has adopted the code of conduct defined by the Contributor Covenant 4 | to clarify expected behavior in our community. 5 | 6 | For more information, see the [.NET Foundation Code of Conduct](https://dotnetfoundation.org/code-of-conduct). 7 | -------------------------------------------------------------------------------- /Directory.Build.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | true 4 | true 5 | enable 6 | $(MSBuildThisFileDirectory)artifacts\bin\$(Configuration)\$(MSBuildProjectName)\ 7 | $(MSBuildThisFileDirectory) 8 | $(RepoDirectory)src 9 | 10 | 11 | -------------------------------------------------------------------------------- /Directory.Packages.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 .NET Foundation 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /NuGet.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /build.ps1: -------------------------------------------------------------------------------- 1 | [cmdletbinding()] 2 | param( 3 | # Paths to the Dockerfiles to build 4 | [string[]]$Paths, 5 | 6 | # Additional args to pass to ImageBuilder 7 | [string]$OptionalImageBuilderArgs 8 | ) 9 | 10 | Set-StrictMode -Version Latest 11 | $ErrorActionPreference = 'Stop' 12 | pushd $PSScriptRoot 13 | try { 14 | ./eng/common/build.ps1 -Paths $Paths -OptionalImageBuilderArgs $OptionalImageBuilderArgs 15 | } 16 | finally { 17 | popd 18 | } 19 | -------------------------------------------------------------------------------- /eng/common/Dockerfile.WithRepo: -------------------------------------------------------------------------------- 1 | # Use this Dockerfile to create an ImageBuilder image 2 | ARG IMAGE 3 | FROM $IMAGE 4 | 5 | WORKDIR /repo 6 | COPY . . 7 | -------------------------------------------------------------------------------- /eng/common/Get-BaseImageStatus.ps1: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env pwsh 2 | 3 | <# 4 | .SYNOPSIS 5 | Outputs the status of external base images referenced in the Dockerfiles. 6 | #> 7 | [cmdletbinding()] 8 | param( 9 | # Path to the manifest file to use 10 | [string] 11 | $Manifest = "manifest.json", 12 | 13 | # Architecture to filter Dockerfiles to 14 | [string] 15 | $Architecture = "*", 16 | 17 | # A value indicating whether to run the script continously 18 | [switch] 19 | $Continuous, 20 | 21 | # Number of seconds to wait between each iteration 22 | [int] 23 | $ContinuousDelay = 10 24 | ) 25 | 26 | Set-StrictMode -Version Latest 27 | 28 | $imageBuilderArgs = "getBaseImageStatus --manifest $Manifest --architecture $Architecture" 29 | if ($Continuous) { 30 | $imageBuilderArgs += " --continuous --continuous-delay $ContinuousDelay" 31 | } 32 | 33 | & "$PSScriptRoot/Invoke-ImageBuilder.ps1" -ImageBuilderArgs $imageBuilderArgs 34 | -------------------------------------------------------------------------------- /eng/common/Get-ImageBuilder.ps1: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env pwsh 2 | 3 | # Load common image names 4 | $imageNameVars = & $PSScriptRoot/Get-ImageNameVars.ps1 5 | foreach ($varName in $imageNameVars.Keys) { 6 | Set-Variable -Name $varName -Value $imageNameVars[$varName] -Scope Global 7 | } 8 | 9 | & docker inspect ${imageNames.imagebuilderName} | Out-Null 10 | if (-not $?) { 11 | Write-Output "Pulling" 12 | & $PSScriptRoot/Invoke-WithRetry.ps1 "docker pull ${imageNames.imagebuilderName}" 13 | } 14 | -------------------------------------------------------------------------------- /eng/common/Get-ImageNameVars.ps1: -------------------------------------------------------------------------------- 1 | # Returns a hashtable of variable name-to-value mapping representing the image name variables 2 | # used by the common build infrastructure. 3 | 4 | $vars = @{} 5 | Get-Content $PSScriptRoot/templates/variables/docker-images.yml | 6 | Where-Object { $_.Trim().Length -gt 0 -and $_.Trim() -notlike 'variables:' -and $_.Trim() -notlike '# *' } | 7 | ForEach-Object { 8 | $parts = $_.Split(':', 2) 9 | $vars[$parts[0].Trim()] = $parts[1].Trim() 10 | } 11 | 12 | return $vars 13 | -------------------------------------------------------------------------------- /eng/common/Install-DotNetSdk.ps1: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env pwsh 2 | # 3 | # Copyright (c) .NET Foundation and contributors. All rights reserved. 4 | # Licensed under the MIT license. See LICENSE file in the project root for full license information. 5 | # 6 | 7 | <# 8 | .SYNOPSIS 9 | Install the .NET Core SDK at the specified path. 10 | 11 | .PARAMETER InstallPath 12 | The path where the .NET Core SDK is to be installed. 13 | 14 | .PARAMETER Channel 15 | The version of the .NET Core SDK to be installed. 16 | 17 | #> 18 | [cmdletbinding()] 19 | param( 20 | [string] 21 | $InstallPath, 22 | [string] 23 | $Channel = "9.0" 24 | ) 25 | 26 | Set-StrictMode -Version Latest 27 | $ErrorActionPreference = 'Stop' 28 | 29 | if (!(Test-Path "$InstallPath")) { 30 | mkdir "$InstallPath" | Out-Null 31 | } 32 | 33 | $IsRunningOnUnix = $PSVersionTable.contains("Platform") -and $PSVersionTable.Platform -eq "Unix" 34 | if ($IsRunningOnUnix) { 35 | $DotnetInstallScript = "dotnet-install.sh" 36 | } 37 | else { 38 | $DotnetInstallScript = "dotnet-install.ps1" 39 | } 40 | 41 | $DotnetInstallScriptPath = Join-Path -Path $InstallPath -ChildPath $DotnetInstallScript 42 | 43 | if (!(Test-Path $DotnetInstallScriptPath)) { 44 | [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; 45 | & "$PSScriptRoot/Invoke-WithRetry.ps1" "Invoke-WebRequest 'https://builds.dotnet.microsoft.com/dotnet/scripts/v1/$DotnetInstallScript' -OutFile $DotnetInstallScriptPath" 46 | } 47 | 48 | $DotnetChannel = $Channel 49 | 50 | $InstallFailed = $false 51 | if ($IsRunningOnUnix) { 52 | & chmod +x $DotnetInstallScriptPath 53 | & "$PSScriptRoot/Invoke-WithRetry.ps1" "$DotnetInstallScriptPath --channel $DotnetChannel --install-dir $InstallPath" -Retries 5 54 | $InstallFailed = ($LASTEXITCODE -ne 0) 55 | } 56 | else { 57 | & "$PSScriptRoot/Invoke-WithRetry.ps1" "$DotnetInstallScriptPath -Channel $DotnetChannel -InstallDir $InstallPath" -Retries 5 58 | $InstallFailed = (-not $?) 59 | } 60 | 61 | # See https://github.com/NuGet/NuGet.Client/pull/4259 62 | $Env:NUGET_EXPERIMENTAL_CHAIN_BUILD_RETRY_POLICY = "6,1500" 63 | 64 | if ($InstallFailed) { throw "Failed to install the .NET Core SDK" } 65 | -------------------------------------------------------------------------------- /eng/common/Invoke-CleanupDocker.ps1: -------------------------------------------------------------------------------- 1 | Set-StrictMode -Version Latest 2 | $ErrorActionPreference = 'Stop' 3 | 4 | docker ps -a -q | ForEach-Object { docker rm -f $_ } 5 | 6 | docker volume prune -f 7 | 8 | # Preserve the tagged Windows base images and the common eng infra images (e.g. ImageBuilder) 9 | # to avoid the expense of having to repull continuously. 10 | $imageNameVars = & $PSScriptRoot/Get-ImageNameVars.ps1 11 | 12 | docker images --format "{{.Repository}}:{{.Tag}} {{.ID}}" | 13 | Where-Object { 14 | $localImage = $_ 15 | $localImage.Contains(": ")` 16 | -Or -Not ($localImage.StartsWith("mcr.microsoft.com/windows")` 17 | -Or ($imageNameVars.Values.Where({ $localImage.StartsWith($_) }, 'First').Count -gt 0)) } | 18 | ForEach-Object { $_.Split(' ', [System.StringSplitOptions]::RemoveEmptyEntries)[1] } | 19 | Select-Object -Unique | 20 | ForEach-Object { docker rmi -f $_ } 21 | -------------------------------------------------------------------------------- /eng/common/Invoke-WithRetry.ps1: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env pwsh 2 | 3 | # Executes a command and retries if it fails. 4 | [cmdletbinding()] 5 | param ( 6 | [Parameter(Mandatory = $true)][string]$Cmd, 7 | [int]$Retries = 2, 8 | [int]$WaitFactor = 6 9 | ) 10 | 11 | Set-StrictMode -Version Latest 12 | $ErrorActionPreference = 'Stop' 13 | 14 | $count = 0 15 | $completed = $false 16 | 17 | Write-Output "Executing '$Cmd'" 18 | 19 | while (-not $completed) { 20 | try { 21 | Invoke-Expression $Cmd 22 | if (-not $(Test-Path variable:LASTEXITCODE) -or $LASTEXITCODE -eq 0) { 23 | $completed = $true 24 | continue 25 | } 26 | } 27 | catch { 28 | } 29 | 30 | $count++ 31 | 32 | if ($count -lt $Retries) { 33 | $wait = [Math]::Pow($WaitFactor, $count - 1) 34 | Write-Output "Retry $count/$Retries, retrying in $wait seconds..." 35 | Start-Sleep $wait 36 | } 37 | else { 38 | Write-Output "Retry $count/$Retries, no more retries left." 39 | throw "Failed to execute '$Cmd'" 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /eng/common/Retain-Build.ps1: -------------------------------------------------------------------------------- 1 | # Adapted from https://github.com/dotnet/arcade/blob/main/eng/common/retain-build.ps1 2 | Param( 3 | [Parameter(Mandatory = $true)][int] $BuildId, 4 | [Parameter(Mandatory = $true)][string] $AzdoOrgUri, 5 | [Parameter(Mandatory = $true)][string] $AzdoProject, 6 | [Parameter(Mandatory = $true)][string] $Token 7 | ) 8 | 9 | $ErrorActionPreference = 'Stop' 10 | Set-StrictMode -Version 2.0 11 | 12 | function Get-AzDOHeaders( 13 | [string] $Token) { 14 | $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":${Token}")) 15 | $headers = @{"Authorization" = "Basic $base64AuthInfo" } 16 | return $headers 17 | } 18 | 19 | function Update-BuildRetention( 20 | [string] $AzdoOrgUri, 21 | [string] $AzdoProject, 22 | [int] $BuildId, 23 | [string] $Token) { 24 | $headers = Get-AzDOHeaders -Token $Token 25 | $requestBody = "{ 26 | `"keepForever`": `"true`" 27 | }" 28 | 29 | $requestUri = "${AzdoOrgUri}/${AzdoProject}/_apis/build/builds/${BuildId}?api-version=6.0" 30 | Write-Host "Attempting to retain build using the following URI: ${requestUri} ..." 31 | 32 | try { 33 | Invoke-RestMethod -Uri $requestUri -Method Patch -Body $requestBody -Header $headers -contentType "application/json" 34 | Write-Host "Updated retention settings for build ${BuildId}." 35 | } 36 | catch { 37 | Write-Host "##[error] Failed to update retention settings for build: $($_.Exception.Response.StatusDescription)" 38 | exit 1 39 | } 40 | } 41 | 42 | Update-BuildRetention -AzdoOrgUri $AzdoOrgUri -AzdoProject $AzdoProject -BuildId $BuildId -Token $Token 43 | exit 0 44 | -------------------------------------------------------------------------------- /eng/common/build.ps1: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env pwsh 2 | 3 | <# 4 | .SYNOPSIS 5 | Builds the Dockerfiles 6 | #> 7 | 8 | [cmdletbinding()] 9 | param( 10 | # Product versions to filter by 11 | [string[]]$Version = "*", 12 | 13 | # Names of OS to filter by 14 | [string[]]$OS, 15 | 16 | # Type of architecture to filter by 17 | [string]$Architecture, 18 | 19 | # Additional custom path filters 20 | [string[]]$Paths, 21 | 22 | # Path to manifest file 23 | [string]$Manifest = "manifest.json", 24 | 25 | # Additional args to pass to ImageBuilder 26 | [string]$OptionalImageBuilderArgs 27 | ) 28 | 29 | Set-StrictMode -Version Latest 30 | $ErrorActionPreference = 'Stop' 31 | 32 | function Log { 33 | param ([string] $Message) 34 | 35 | Write-Output $Message 36 | } 37 | 38 | function Exec { 39 | param ([string] $Cmd) 40 | 41 | Log "Executing: '$Cmd'" 42 | Invoke-Expression $Cmd 43 | if ($LASTEXITCODE -ne 0) { 44 | throw "Failed: '$Cmd'" 45 | } 46 | } 47 | 48 | pushd $PSScriptRoot/../.. 49 | try { 50 | $args = $OptionalImageBuilderArgs 51 | 52 | if ($Version) { 53 | $args += ($Version | foreach { ' --version "{0}"' -f $_ }) 54 | } 55 | 56 | if ($OS) { 57 | $args += ($OS | foreach { ' --os-version "{0}"' -f $_ }) 58 | } 59 | 60 | if ($Architecture) { 61 | $args += ' --architecture "{0}"' -f $Architecture 62 | } 63 | 64 | if ($Paths) { 65 | $args += ($Paths | foreach { ' --path "{0}"' -f $_ }) 66 | } 67 | 68 | if ($Manifest) { 69 | $args += ' --manifest "{0}"' -f $Manifest 70 | } 71 | 72 | ./eng/common/Invoke-ImageBuilder.ps1 "build $args" 73 | } 74 | finally { 75 | popd 76 | } 77 | -------------------------------------------------------------------------------- /eng/common/pull-image.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Stop script on NZEC 4 | set -e 5 | # Stop script if unbound variable found (use ${var:-} if intentional) 6 | set -u 7 | 8 | say_err() { 9 | printf "%b\n" "Error: $1" >&2 10 | } 11 | 12 | # Executes a command and retries if it fails. 13 | execute() { 14 | local count=0 15 | until "$@"; do 16 | local exit=$? 17 | count=$(( $count + 1 )) 18 | if [ $count -lt $retries ]; then 19 | local wait=$(( waitFactor ** (( count - 1 )) )) 20 | echo "Retry $count/$retries exited $exit, retrying in $wait seconds..." 21 | sleep $wait 22 | else 23 | say_err "Retry $count/$retries exited $exit, no more retries left." 24 | return $exit 25 | fi 26 | done 27 | 28 | return 0 29 | } 30 | 31 | scriptName=$0 32 | retries=5 33 | waitFactor=6 34 | image=$1 35 | 36 | echo "Pulling Docker image $image" 37 | execute docker pull $image 38 | -------------------------------------------------------------------------------- /eng/common/readme.md: -------------------------------------------------------------------------------- 1 | # Don't touch this folder 2 | 3 | uuuuuuuuuuuuuuuuuuuu 4 | u" uuuuuuuuuuuuuuuuuu "u 5 | u" u$$$$$$$$$$$$$$$$$$$$u "u 6 | u" u$$$$$$$$$$$$$$$$$$$$$$$$u "u 7 | u" u$$$$$$$$$$$$$$$$$$$$$$$$$$$$u "u 8 | u" u$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$u "u 9 | u" u$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$u "u 10 | $ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $ 11 | $ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $ 12 | $ $$$" ... "$... ...$" ... "$$$ ... "$$$ $ 13 | $ $$$u `"$$$$$$$ $$$ $$$$$ $$ $$$ $$$ $ 14 | $ $$$$$$uu "$$$$ $$$ $$$$$ $$ """ u$$$ $ 15 | $ $$$""$$$ $$$$ $$$u "$$$" u$$ $$$$$$$$ $ 16 | $ $$$$....,$$$$$..$$$$$....,$$$$..$$$$$$$$ $ 17 | $ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $ 18 | "u "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" u" 19 | "u "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" u" 20 | "u "$$$$$$$$$$$$$$$$$$$$$$$$$$$$" u" 21 | "u "$$$$$$$$$$$$$$$$$$$$$$$$" u" 22 | "u "$$$$$$$$$$$$$$$$$$$$" u" 23 | "u """""""""""""""""" u" 24 | """""""""""""""""""" 25 | 26 | !!! Changes made in this directory are subject to being overwritten by automation !!! 27 | 28 | The files in this directory are shared by all .NET Docker repos. If you need to make changes to these files, open an issue or submit a pull request in https://github.com/dotnet/docker-tools. -------------------------------------------------------------------------------- /eng/common/templates/1es-official.yml: -------------------------------------------------------------------------------- 1 | # When extending this template, pipelines using a repository resource containing versions files for image caching must 2 | # do the following: 3 | # 4 | # - Do not rely on any source code from the versions repo so as to not circumvent SDL and CG guidelines 5 | # - The versions repo resource must be named `InternalVersionsRepo` or `PublicVersionsRepo` to avoid SDL scans 6 | # - The versions repo must be checked out to `$(Build.SourcesDirectory)/versions` to avoid CG scans 7 | # 8 | # If the pipeline is not using a separate repository resource, ensure that there is no source code checked out in 9 | # `$(Build.SourcesDirectory)/versions`, as it will not be scanned. 10 | # 11 | # The `cgDryRun` parameter will run CG but not submit the results, for testing purposes. 12 | 13 | parameters: 14 | - name: cgDryRun 15 | type: boolean 16 | default: false 17 | - name: stages 18 | type: stageList 19 | default: [] 20 | - name: pool 21 | type: object 22 | default: 23 | name: $(default1ESInternalPoolName) 24 | image: $(default1ESInternalPoolImage) 25 | os: linux 26 | - name: sourceAnalysisPool 27 | type: object 28 | default: 29 | name: $(defaultSourceAnalysisPoolName) 30 | image: $(defaultSourceAnalysisPoolImage) 31 | os: windows 32 | 33 | resources: 34 | repositories: 35 | - repository: 1ESPipelineTemplates 36 | type: git 37 | name: 1ESPipelineTemplates/1ESPipelineTemplates 38 | ref: refs/tags/release 39 | 40 | extends: 41 | template: /eng/common/templates/task-prefix-decorator.yml@self 42 | parameters: 43 | baseTemplate: v1/1ES.Official.PipelineTemplate.yml@1ESPipelineTemplates 44 | templateParameters: 45 | pool: ${{ parameters.pool }} 46 | sdl: 47 | binskim: 48 | enabled: true 49 | componentgovernance: 50 | ignoreDirectories: $(Build.SourcesDirectory)/versions 51 | whatIf: ${{ parameters.cgDryRun }} 52 | showAlertLink: true 53 | policheck: 54 | enabled: true 55 | sourceRepositoriesToScan: 56 | exclude: 57 | - repository: InternalVersionsRepo 58 | - repository: PublicVersionsRepo 59 | sourceAnalysisPool: ${{ parameters.sourceAnalysisPool }} 60 | tsa: 61 | enabled: true 62 | stages: ${{ parameters.stages }} 63 | -------------------------------------------------------------------------------- /eng/common/templates/jobs/copy-base-images-staging.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | - name: name 3 | type: string 4 | default: null 5 | - name: pool 6 | type: object 7 | default: {} 8 | - name: customInitSteps 9 | type: stepList 10 | default: [] 11 | - name: additionalOptions 12 | type: string 13 | default: '' 14 | - name: continueOnError 15 | type: string 16 | default: false 17 | 18 | jobs: 19 | - template: /eng/common/templates/jobs/copy-base-images.yml@self 20 | parameters: 21 | name: ${{ parameters.name }} 22 | pool: ${{ parameters.pool }} 23 | customInitSteps: ${{ parameters.customInitSteps }} 24 | additionalOptions: ${{ parameters.additionalOptions }} 25 | acr: 26 | server: $(acr-staging.server) 27 | serviceConnection: $(internal-mirror.serviceConnectionName) 28 | subscription: $(acr-staging.subscription) 29 | resourceGroup: $(acr-staging.resourceGroup) 30 | repoPrefix: $(mirrorRepoPrefix) 31 | -------------------------------------------------------------------------------- /eng/common/templates/jobs/copy-base-images.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | - name: name 3 | type: string 4 | default: null 5 | - name: pool 6 | type: object 7 | default: {} 8 | - name: acr 9 | type: object 10 | default: null 11 | - name: repoPrefix 12 | type: string 13 | default: null 14 | - name: customInitSteps 15 | type: stepList 16 | default: [] 17 | - name: additionalOptions 18 | type: string 19 | default: '' 20 | - name: continueOnError 21 | type: string 22 | default: false 23 | - name: forceDryRun 24 | type: boolean 25 | default: false 26 | 27 | jobs: 28 | - job: ${{ parameters.name }} 29 | pool: ${{ parameters.pool }} 30 | steps: 31 | - template: /eng/common/templates/steps/init-docker-linux.yml@self 32 | - ${{ parameters.customInitSteps }} 33 | - template: /eng/common/templates/steps/copy-base-images.yml@self 34 | parameters: 35 | acr: ${{ parameters.acr }} 36 | repoPrefix: ${{ parameters.repoPrefix }} 37 | additionalOptions: ${{ parameters.additionalOptions }} 38 | continueOnError: ${{ parameters.continueOnError }} 39 | forceDryRun: ${{ parameters.forceDryRun }} 40 | -------------------------------------------------------------------------------- /eng/common/templates/jobs/test-images-linux-client.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | name: null 3 | pool: {} 4 | matrix: {} 5 | testJobTimeout: 60 6 | preBuildValidation: false 7 | internalProjectName: null 8 | customInitSteps: [] 9 | 10 | jobs: 11 | - job: ${{ parameters.name }} 12 | ${{ if eq(parameters.preBuildValidation, 'false') }}: 13 | condition: and(succeeded(), ${{ parameters.matrix }}) 14 | dependsOn: GenerateTestMatrix 15 | strategy: 16 | matrix: $[ ${{ parameters.matrix }} ] 17 | ${{ if eq(parameters.preBuildValidation, 'true') }}: 18 | condition: and(succeeded(), ne(variables.testScriptPath, '')) 19 | pool: ${{ parameters.pool }} 20 | timeoutInMinutes: ${{ parameters.testJobTimeout }} 21 | steps: 22 | - template: /eng/common/templates/steps/test-images-linux-client.yml@self 23 | parameters: 24 | preBuildValidation: ${{ parameters.preBuildValidation }} 25 | internalProjectName: ${{ parameters.internalProjectName }} 26 | customInitSteps: ${{ parameters.customInitSteps }} 27 | -------------------------------------------------------------------------------- /eng/common/templates/jobs/test-images-windows-client.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | name: null 3 | pool: {} 4 | matrix: {} 5 | testJobTimeout: 60 6 | internalProjectName: null 7 | customInitSteps: [] 8 | 9 | jobs: 10 | - job: ${{ parameters.name }} 11 | condition: and(succeeded(), ${{ parameters.matrix }}) 12 | dependsOn: GenerateTestMatrix 13 | pool: ${{ parameters.pool }} 14 | strategy: 15 | matrix: $[ ${{ parameters.matrix }} ] 16 | timeoutInMinutes: ${{ parameters.testJobTimeout }} 17 | steps: 18 | - template: /eng/common/templates/steps/test-images-windows-client.yml@self 19 | parameters: 20 | internalProjectName: ${{ parameters.internalProjectName }} 21 | customInitSteps: ${{ parameters.customInitSteps }} 22 | -------------------------------------------------------------------------------- /eng/common/templates/jobs/validate-image-sizes.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | internalProjectName: null 3 | publicProjectName: null 4 | 5 | jobs: 6 | - ${{ if eq(variables['System.TeamProject'], parameters.internalProjectName) }}: 7 | # Split the Linux images into separate jobs in order to compensate for less 8 | # disk space on the Linux agents. See https://github.com/dotnet/dotnet-docker/issues/1588 9 | - job: LinuxAmd64PerfTests 10 | pool: 11 | vmImage: $(defaultLinuxAmd64PoolImage) 12 | workspace: 13 | clean: all 14 | steps: 15 | - template: ../steps/validate-image-sizes.yml 16 | parameters: 17 | dockerClientOS: linux 18 | architecture: amd64 19 | validationMode: size 20 | - job: LinuxArmPerfTests 21 | pool: 22 | vmImage: $(defaultLinuxAmd64PoolImage) 23 | workspace: 24 | clean: all 25 | steps: 26 | - template: ../steps/validate-image-sizes.yml 27 | parameters: 28 | dockerClientOS: linux 29 | architecture: arm* 30 | validationMode: size 31 | - job: LinuxBaselineIntegrityPerfTests 32 | pool: 33 | vmImage: $(defaultLinuxAmd64PoolImage) 34 | workspace: 35 | clean: all 36 | steps: 37 | - template: ../steps/validate-image-sizes.yml 38 | parameters: 39 | dockerClientOS: linux 40 | validationMode: integrity 41 | - job: WindowsPerfTests 42 | pool: Docker-2022-${{ variables['System.TeamProject'] }} 43 | workspace: 44 | clean: all 45 | steps: 46 | - template: ../steps/validate-image-sizes.yml 47 | parameters: 48 | dockerClientOS: windows 49 | ${{ if eq(variables['System.TeamProject'], parameters.publicProjectName) }}: 50 | validationMode: integrity 51 | -------------------------------------------------------------------------------- /eng/common/templates/stages/dotnet/publish.yml: -------------------------------------------------------------------------------- 1 | # This template wraps the common publish stage template with settings specific 2 | # to the .NET team's infrastructure. 3 | 4 | parameters: 5 | internalProjectName: null 6 | publicProjectName: null 7 | pool: "" 8 | isInternalServicingValidation: false 9 | customPublishInitSteps: [] 10 | 11 | stages: 12 | - template: /eng/common/templates/stages/publish.yml@self 13 | parameters: 14 | internalProjectName: ${{ parameters.internalProjectName }} 15 | publicProjectName: ${{ parameters.publicProjectName }} 16 | isInternalServicingValidation: ${{ parameters.isInternalServicingValidation }} 17 | 18 | customPublishInitSteps: 19 | - pwsh: | 20 | # When reporting the repo name in the publish notification, we don't want to include 21 | # the org part of the repo name (e.g. we want "dotnet-docker", not "dotnet-dotnet-docker"). 22 | # This also accounts for the different separators between AzDO and GitHub repo names. 23 | 24 | $repoName = "$(Build.Repository.Name)" 25 | 26 | $orgSeparatorIndex = $repoName.IndexOf("/") 27 | if ($orgSeparatorIndex -eq -1) { 28 | $orgSeparatorIndex = $repoName.IndexOf("-") 29 | } 30 | 31 | if ($orgSeparatorIndex -ge 0) { 32 | $repoName = $repoName.Substring($orgSeparatorIndex + 1) 33 | } 34 | echo "##vso[task.setvariable variable=publishNotificationRepoName]$repoName" 35 | displayName: "Set Custom Repo Name Var" 36 | - ${{ parameters.customPublishInitSteps }} 37 | 38 | ${{ if eq(variables['System.TeamProject'], parameters.internalProjectName) }}: 39 | customPublishVariables: 40 | - group: DotNet-AllOrgs-Darc-Pats 41 | 42 | pool: 43 | ${{ if ne(parameters.pool, '') }}: 44 | ${{ parameters.pool }} 45 | ${{ elseif eq(variables['System.TeamProject'], parameters.publicProjectName) }}: 46 | vmImage: $(defaultLinuxAmd64PoolImage) 47 | ${{ elseif eq(variables['System.TeamProject'], parameters.internalProjectName) }}: 48 | name: $(linuxAmd64InternalPoolName) 49 | image: $(linuxAmd64InternalPoolImage) 50 | os: linux 51 | -------------------------------------------------------------------------------- /eng/common/templates/stages/publish.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | customPublishInitSteps: [] 3 | customPublishVariables: [] 4 | 5 | internalProjectName: null 6 | publicProjectName: null 7 | 8 | isInternalServicingValidation: false 9 | 10 | pool: 11 | vmImage: $(defaultLinuxAmd64PoolImage) 12 | 13 | ################################################################################ 14 | # Publish Images 15 | ################################################################################ 16 | stages: 17 | - ${{ if eq(parameters.isInternalServicingValidation, 'false') }}: 18 | - stage: Publish 19 | ${{ if and(eq(variables['System.TeamProject'], parameters.internalProjectName), ne(variables['Build.Reason'], 'PullRequest')) }}: 20 | dependsOn: Test 21 | ${{ else }}: 22 | dependsOn: Post_Build 23 | condition: " 24 | and( 25 | not(canceled()), 26 | and( 27 | contains(variables['stages'], 'publish'), 28 | or( 29 | or( 30 | and( 31 | and( 32 | contains(variables['stages'], 'build'), 33 | succeeded('Post_Build')), 34 | and( 35 | contains(variables['stages'], 'test'), 36 | in(dependencies.Test.result, 'Succeeded', 'SucceededWithIssues', 'Skipped'))), 37 | or( 38 | and( 39 | not(contains(variables['stages'], 'build')), 40 | and( 41 | contains(variables['stages'], 'test'), 42 | in(dependencies.Test.result, 'Succeeded', 'SucceededWithIssues', 'Skipped'))), 43 | and( 44 | not(contains(variables['stages'], 'test')), 45 | and( 46 | contains(variables['stages'], 'build'), 47 | succeeded('Post_Build'))))), 48 | not( 49 | or( 50 | contains(variables['stages'], 'build'), 51 | contains(variables['stages'], 'test'))))))" 52 | jobs: 53 | - template: /eng/common/templates/jobs/publish.yml@self 54 | parameters: 55 | pool: ${{ parameters.pool }} 56 | internalProjectName: ${{ parameters.internalProjectName }} 57 | customPublishVariables: ${{ parameters.customPublishVariables }} 58 | customInitSteps: ${{ parameters.customPublishInitSteps }} 59 | -------------------------------------------------------------------------------- /eng/common/templates/steps/annotate-eol-digests.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | dataFile: null 3 | steps: 4 | - script: mkdir -p $(Build.ArtifactStagingDirectory)/annotation-digests 5 | displayName: Create Annotation Digests Directory 6 | - template: /eng/common/templates/steps/run-imagebuilder.yml@self 7 | parameters: 8 | name: AnnotateEOLImages 9 | displayName: Annotate EOL Images 10 | serviceConnection: $(publish.serviceConnectionName) 11 | internalProjectName: internal 12 | condition: and(succeeded(), eq(variables['publishEolAnnotations'], 'true')) 13 | args: > 14 | annotateEolDigests 15 | ${{ parameters.dataFile }} 16 | $(acr.server) 17 | $(publishRepoPrefix) 18 | $(artifactsPath)/annotation-digests/annotation-digests.txt 19 | $(dryRunArg) 20 | - template: /eng/common/templates/steps/publish-artifact.yml@self 21 | parameters: 22 | path: $(Build.ArtifactStagingDirectory)/annotation-digests 23 | artifactName: annotation-digests-$(System.JobAttempt) 24 | displayName: Publish Annotation Digests List 25 | internalProjectName: internal 26 | publicProjectName: public 27 | condition: and(succeeded(), eq(variables['publishEolAnnotations'], 'true')) 28 | - template: /eng/common/templates/steps/run-imagebuilder.yml@self 29 | parameters: 30 | displayName: Wait for Annotation Ingestion 31 | serviceConnection: $(marStatus.serviceConnectionName) 32 | internalProjectName: internal 33 | condition: and(succeeded(), eq(variables['publishEolAnnotations'], 'true')) 34 | args: > 35 | waitForMarAnnotationIngestion 36 | $(artifactsPath)/annotation-digests/annotation-digests.txt 37 | -------------------------------------------------------------------------------- /eng/common/templates/steps/clean-acr-images.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | repo: null 3 | subscription: null 4 | resourceGroup: null 5 | acr: null 6 | action: null 7 | age: null 8 | customArgs: "" 9 | internalProjectName: null 10 | steps: 11 | - template: /eng/common/templates/steps/run-imagebuilder.yml@self 12 | parameters: 13 | displayName: Clean ACR Images - ${{ parameters.repo }} 14 | serviceConnection: $(clean.serviceConnectionName) 15 | internalProjectName: ${{ parameters.internalProjectName }} 16 | args: > 17 | cleanAcrImages 18 | ${{ parameters.repo }} 19 | ${{ parameters.subscription }} 20 | ${{ parameters.resourceGroup }} 21 | ${{ parameters.acr }} 22 | --action ${{ parameters.action }} 23 | --age ${{ parameters.age }} 24 | ${{ parameters.customArgs }} 25 | -------------------------------------------------------------------------------- /eng/common/templates/steps/cleanup-docker-linux.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | condition: true 3 | 4 | steps: 5 | ################################################################################ 6 | # Cleanup local Docker server 7 | ################################################################################ 8 | - script: docker stop $(docker ps -q) || true 9 | displayName: Stop Running Containers 10 | condition: and(always(), ${{ parameters.condition }}) 11 | continueOnError: true 12 | - script: docker system prune -a -f --volumes 13 | displayName: Cleanup Docker 14 | condition: and(always(), ${{ parameters.condition }}) 15 | continueOnError: true 16 | -------------------------------------------------------------------------------- /eng/common/templates/steps/cleanup-docker-windows.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | condition: true 3 | 4 | steps: 5 | ################################################################################ 6 | # Cleanup Docker Resources 7 | ################################################################################ 8 | - powershell: $(engCommonPath)/Invoke-CleanupDocker.ps1 9 | displayName: Cleanup Docker Images 10 | condition: and(always(), ${{ parameters.condition }}) 11 | continueOnError: true 12 | - powershell: | 13 | if (Test-Path $(Build.BinariesDirectory)\.Microsoft.DotNet.ImageBuilder) { 14 | Remove-Item $(Build.BinariesDirectory)\.Microsoft.DotNet.ImageBuilder -Force -Recurse; 15 | } 16 | displayName: Cleanup Image Builder 17 | condition: and(always(), ${{ parameters.condition }}) 18 | continueOnError: true 19 | -------------------------------------------------------------------------------- /eng/common/templates/steps/copy-base-images.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | - name: acr 3 | type: object 4 | default: 5 | server: "" 6 | serviceConnection: "" 7 | subscription: "" 8 | resourceGroup: "" 9 | - name: repoPrefix 10 | type: string 11 | default: null 12 | - name: additionalOptions 13 | type: string 14 | default: "" 15 | - name: continueOnError 16 | type: string 17 | default: false 18 | - name: forceDryRun 19 | type: boolean 20 | default: false 21 | 22 | steps: 23 | - ${{ if or(eq(parameters.forceDryRun, true), eq(variables['System.TeamProject'], 'public'), eq(variables['Build.Reason'], 'PullRequest')) }}: 24 | - script: echo "##vso[task.setvariable variable=dryRunArg]--dry-run" 25 | - template: /eng/common/templates/steps/run-imagebuilder.yml@self 26 | parameters: 27 | displayName: Copy Base Images 28 | serviceConnection: ${{ parameters.acr.serviceConnection }} 29 | continueOnError: ${{ parameters.continueOnError }} 30 | internalProjectName: 'internal' 31 | # Use environment variable to reference $(dryRunArg). Since $(dryRunArg) might be undefined, 32 | # PowerShell will treat the Azure Pipelines variable macro syntax as a command and throw an 33 | # error 34 | args: > 35 | copyBaseImages 36 | '${{ parameters.acr.subscription }}' 37 | '${{ parameters.acr.resourceGroup }}' 38 | $(dockerHubRegistryCreds) 39 | $(customCopyBaseImagesArgs) 40 | --repo-prefix '${{ parameters.repoPrefix }}' 41 | --registry-override '${{ parameters.acr.server }}' 42 | --os-type 'linux' 43 | --architecture '*' 44 | $env:DRYRUNARG 45 | ${{ parameters.additionalOptions }} 46 | -------------------------------------------------------------------------------- /eng/common/templates/steps/download-build-artifact.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | targetPath: "" 3 | artifactName: "" 4 | condition: true 5 | continueOnError: false 6 | 7 | steps: 8 | - task: DownloadPipelineArtifact@1 9 | inputs: 10 | buildType: specific 11 | project: $(System.TeamProject) 12 | pipline: $(System.DefinitionId) 13 | buildVersionToDownload: specific 14 | buildId: $(sourceBuildId) 15 | targetPath: ${{ parameters.targetPath }} 16 | artifactName: ${{ parameters.artifactName }} 17 | displayName: Download Build Artifact(s) 18 | condition: and(succeeded(), ${{ parameters.condition }}) 19 | continueOnError: ${{ parameters.continueOnError }} 20 | -------------------------------------------------------------------------------- /eng/common/templates/steps/init-common.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | condition: true 3 | 4 | steps: 5 | - powershell: | 6 | $sourceBranch=$Env:BUILD_SOURCEBRANCH -replace "refs/heads/","" -replace "refs/tags/","" -replace "refs/pull/","" 7 | echo "##vso[task.setvariable variable=sourceBranch]$sourceBranch" 8 | displayName: Define Source Branch Variable 9 | condition: and(succeeded(), ${{ parameters.condition }}) 10 | -------------------------------------------------------------------------------- /eng/common/templates/steps/parse-test-arg-arrays.yml: -------------------------------------------------------------------------------- 1 | steps: 2 | - powershell: | 3 | # Formats the OS versions in a compact human-readable form (e.g. "os1/os2") 4 | $osVersionsDisplayName = '$(osVersions)' -Replace '--os-version ', '' -Replace ' ', '/' 5 | 6 | # Defines a PowerShell snippet in string-form that can be used to initialize an array of the OS versions 7 | $osVersionsArrayInitStr = "@('" + $($osVersionsDisplayName -Replace "/", "', '") + "')" 8 | 9 | echo "##vso[task.setvariable variable=osVersionsDisplayName]$osVersionsDisplayName" 10 | echo "##vso[task.setvariable variable=osVersionsArrayInitStr]$osVersionsArrayInitStr" 11 | 12 | # Defines a PowerShell snippet in string-form that can be used to initialize an array of the image builder paths 13 | $pathInitStr = "@('" + $('$(imageBuilderPaths)' -Replace '--path', '' -Replace " ", "', '") + "')" 14 | echo "##vso[task.setvariable variable=imageBuilderPathsArrayInitStr]$pathInitStr" 15 | displayName: Parse Test Arg Arrays 16 | -------------------------------------------------------------------------------- /eng/common/templates/steps/publish-artifact.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | - name: path 3 | type: string 4 | - name: artifactName 5 | type: string 6 | - name: displayName 7 | type: string 8 | - name: internalProjectName 9 | type: string 10 | - name: publicProjectName 11 | type: string 12 | - name: condition 13 | type: string 14 | default: 'true' 15 | 16 | steps: 17 | - ${{ if eq(variables['System.TeamProject'], parameters.internalProjectName) }}: 18 | - task: 1ES.PublishPipelineArtifact@1 19 | inputs: 20 | path: ${{ parameters.path }} 21 | artifact: ${{ parameters.artifactName }} 22 | displayName: ${{ parameters.displayName }} 23 | condition: and(succeeded(), ${{ parameters.condition }}) 24 | - ${{ if eq(variables['System.TeamProject'], parameters.publicProjectName) }}: 25 | - publish: ${{ parameters.path }} 26 | artifact: ${{ parameters.artifactName }} 27 | displayName: ${{ parameters.displayName }} 28 | condition: and(succeeded(), ${{ parameters.condition }}) 29 | -------------------------------------------------------------------------------- /eng/common/templates/steps/publish-readmes.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | dryRunArg: "" 3 | condition: true 4 | 5 | steps: 6 | - script: > 7 | $(runImageBuilderCmd) publishMcrDocs 8 | --manifest '$(manifest)' 9 | --registry-override '$(acr.server)' 10 | '$(mcrDocsRepoInfo.userName)' 11 | '$(mcrDocsRepoInfo.email)' 12 | $(mcrDocsRepoInfo.authArgs) 13 | '$(publicGitRepoUri)' 14 | ${{ parameters.dryRunArg }} 15 | $(manifestVariables) 16 | $(imageBuilder.queueArgs) 17 | --git-owner 'Microsoft' 18 | --git-repo 'mcrdocs' 19 | --git-branch 'main' 20 | --git-path 'teams' 21 | $(additionalPublishMcrDocsArgs) 22 | name: PublishReadmes 23 | displayName: Publish Readmes 24 | condition: ${{ parameters.condition }} 25 | - template: /eng/common/templates/steps/wait-for-mcr-doc-ingestion.yml@self 26 | parameters: 27 | commitDigest: $(PublishReadmes.readmeCommitDigest) 28 | condition: and(${{ parameters.condition }}, ne(variables['PublishReadmes.readmeCommitDigest'], '')) 29 | dryRunArg: ${{ parameters.dryRunArg }} 30 | -------------------------------------------------------------------------------- /eng/common/templates/steps/retain-build.yml: -------------------------------------------------------------------------------- 1 | steps: 2 | - powershell: > 3 | $(engCommonPath)/Retain-Build.ps1 4 | -BuildId $(Build.BuildId) 5 | -AzdoOrgUri '$(System.CollectionUri)' 6 | -AzdoProject '$(System.TeamProject)' 7 | -Token '$(System.AccessToken)' 8 | displayName: Enable permanent build retention 9 | condition: and(succeeded(), eq(variables.retainBuild, 'true')) 10 | -------------------------------------------------------------------------------- /eng/common/templates/steps/run-imagebuilder.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | - name: name 3 | type: string 4 | default: "" 5 | - name: displayName 6 | type: string 7 | default: "Run ImageBuilder" 8 | - name: serviceConnection 9 | type: string 10 | default: "" 11 | - name: internalProjectName 12 | type: string 13 | default: null 14 | - name: args 15 | type: string 16 | default: null 17 | - name: condition 18 | type: string 19 | default: succeeded() 20 | - name: continueOnError 21 | type: boolean 22 | default: false 23 | - name: dockerClientOS 24 | type: string 25 | default: "linux" 26 | 27 | steps: 28 | - ${{ if and(eq(variables['System.TeamProject'], parameters.internalProjectName), ne(variables['Build.Reason'], 'PullRequest'), ne(parameters.serviceConnection, '')) }}: 29 | - template: /eng/common/templates/steps/run-pwsh-with-auth.yml@self 30 | parameters: 31 | ${{ if ne(parameters.name, '') }}: 32 | name: ${{ parameters.name }} 33 | displayName: ${{ parameters.displayName }} 34 | serviceConnection: ${{ parameters.serviceConnection }} 35 | continueOnError: ${{ parameters.continueOnError }} 36 | dockerClientOS: ${{ parameters.dockerClientOS }} 37 | condition: ${{ parameters.condition }} 38 | command: > 39 | $env:idToken | Out-File -FilePath $(tokenHostFilePath); 40 | $(runAuthedImageBuilderCmd) ${{ parameters.args }}; 41 | Remove-Item -Path $(tokenHostFilePath) -Force 42 | - ${{ else }}: 43 | - task: PowerShell@2 44 | ${{ if ne(parameters.name, '') }}: 45 | name: ${{ parameters.name }} 46 | displayName: ${{ parameters.displayName }} 47 | continueOnError: ${{ parameters.continueOnError }} 48 | condition: ${{ parameters.condition }} 49 | inputs: 50 | targetType: 'inline' 51 | script: > 52 | $(runImageBuilderCmd) ${{ parameters.args }} 53 | -------------------------------------------------------------------------------- /eng/common/templates/steps/run-pwsh-with-auth.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | - name: name 3 | type: string 4 | default: "" 5 | - name: displayName 6 | type: string 7 | default: "Run PowerShell" 8 | - name: serviceConnection 9 | type: string 10 | default: "" 11 | - name: command 12 | type: string 13 | default: null 14 | - name: continueOnError 15 | type: boolean 16 | default: false 17 | - name: dockerClientOS 18 | type: string 19 | default: "linux" 20 | - name: condition 21 | type: string 22 | default: true 23 | 24 | steps: 25 | - task: AzureCLI@2 26 | ${{ if ne(parameters.name, '') }}: 27 | name: ${{ parameters.name }} 28 | displayName: ${{ parameters.displayName }} (Authenticated) 29 | continueOnError: ${{ parameters.continueOnError }} 30 | condition: and(succeeded(), ${{ parameters.condition }}) 31 | inputs: 32 | azureSubscription: ${{ parameters.serviceConnection }} 33 | addSpnToEnvironment: true 34 | ${{ if eq(parameters.dockerClientOS, 'windows') }}: 35 | scriptType: 'ps' 36 | ${{ else }}: 37 | scriptType: 'pscore' 38 | scriptLocation: 'inlineScript' 39 | inlineScript: ${{ parameters.command }}; 40 | -------------------------------------------------------------------------------- /eng/common/templates/steps/set-dry-run.yml: -------------------------------------------------------------------------------- 1 | steps: 2 | - powershell: | 3 | # Use dry-run option for certain publish operations if this is not a production build 4 | $dryRunArg="" 5 | if (-not "$(officialRepoPrefixes)".Split(',').Contains("$(publishRepoPrefix)") ` 6 | -or "$(System.TeamProject)" -eq "$(publicProjectName)") 7 | { 8 | $dryRunArg="--dry-run" 9 | } 10 | echo "##vso[task.setvariable variable=dryRunArg]$dryRunArg" 11 | displayName: Set dry-run arg for non-prod 12 | -------------------------------------------------------------------------------- /eng/common/templates/steps/set-image-info-path-var.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | publicSourceBranch: null 3 | 4 | steps: 5 | - powershell: | 6 | $basePath = "$(gitHubVersionsRepoInfo.path)" 7 | 8 | $publicSourceBranch = "${{ parameters.publicSourceBranch }}" 9 | 10 | if ($publicSourceBranch -eq "") { 11 | throw "publicSourceBranch variable is not set" 12 | } 13 | 14 | $buildRepoName = "$(Build.Repository.Name)".Replace("/", "-") 15 | $imageInfoName = "image-info.$buildRepoName-$publicSourceBranch$(imageInfoVariant).json" 16 | 17 | echo "##vso[task.setvariable variable=imageInfoVersionsPath]$basePath/$imageInfoName" 18 | echo "##vso[task.setvariable variable=gitHubImageInfoVersionsPath]$(gitHubVersionsRepoInfo.path)/$imageInfoName" 19 | displayName: Set Image Info Path Vars 20 | -------------------------------------------------------------------------------- /eng/common/templates/steps/validate-branch.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | internalProjectName: null 3 | 4 | steps: 5 | - ${{ if and(eq(variables['System.TeamProject'], parameters.internalProjectName), ne(variables['Build.Reason'], 'PullRequest')) }}: 6 | - powershell: | 7 | if ("$(officialBranches)".Split(',').Contains("$(sourceBranch)") ` 8 | -and "$(officialRepoPrefixes)".Split(',').Contains("$(publishRepoPrefix)")) 9 | { 10 | echo "Conditions met for official build, continuing..." 11 | exit 0 12 | } 13 | 14 | if (-not "$(officialRepoPrefixes)".Split(',').Contains("$(publishRepoPrefix)")) 15 | { 16 | echo "This build is a test build, continuing..." 17 | exit 0 18 | } 19 | 20 | if ("$(overrideOfficialBranchValidation)" -eq "true") 21 | { 22 | echo "Variable overrideOfficialBranchValidation is set to true, continuing..." 23 | exit 0 24 | } 25 | 26 | echo "##vso[task.logissue type=error]Official builds must be done from an official branch ($(officialBranches)) and repo prefix ($(officialRepoPrefixes))." 27 | exit 1 28 | displayName: Validate Branch 29 | -------------------------------------------------------------------------------- /eng/common/templates/steps/validate-image-sizes.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | dockerClientOS: null 3 | architecture: "*" 4 | validationMode: "all" 5 | 6 | steps: 7 | - template: ${{ format('../steps/init-docker-{0}.yml', parameters.dockerClientOS) }} 8 | parameters: 9 | # Get some disk space back, pipeline run time is not a concern here 10 | cleanupDocker: true 11 | - powershell: > 12 | ./tests/performance/Validate-ImageSize.ps1 13 | -ImageBuilderCustomArgs "--architecture '${{ parameters.architecture }}'" 14 | -ValidationMode:${{ parameters.validationMode }} 15 | -PullImages 16 | displayName: Run Image Size Tests 17 | -------------------------------------------------------------------------------- /eng/common/templates/steps/wait-for-mcr-doc-ingestion.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | commitDigest: null 3 | condition: true 4 | dryRunArg: "" 5 | 6 | steps: 7 | - template: /eng/common/templates/steps/run-imagebuilder.yml@self 8 | parameters: 9 | displayName: Wait for MCR Doc Ingestion 10 | condition: and(${{ parameters.condition }}, eq(variables['waitForIngestionEnabled'], 'true')) 11 | serviceConnection: $(marStatus.serviceConnectionName) 12 | internalProjectName: 'internal' 13 | args: > 14 | waitForMcrDocIngestion 15 | '${{ parameters.commitDigest }}' 16 | --timeout '$(mcrDocIngestionTimeout)' 17 | ${{ parameters.dryRunArg }} 18 | -------------------------------------------------------------------------------- /eng/common/templates/steps/wait-for-mcr-image-ingestion.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | imageInfoPath: null 3 | minQueueTime: null 4 | condition: true 5 | dryRunArg: "" 6 | 7 | steps: 8 | - template: /eng/common/templates/steps/run-imagebuilder.yml@self 9 | parameters: 10 | displayName: Wait for Image Ingestion 11 | condition: and(${{ parameters.condition }}, eq(variables['waitForIngestionEnabled'], 'true')) 12 | serviceConnection: $(marStatus.serviceConnectionName) 13 | internalProjectName: 'internal' 14 | args: > 15 | waitForMcrImageIngestion 16 | '${{ parameters.imageInfoPath }}' 17 | --manifest '$(manifest)' 18 | --repo-prefix '$(publishRepoPrefix)' 19 | --min-queue-time '${{ parameters.minQueueTime }}' 20 | --timeout '$(mcrImageIngestionTimeout)' 21 | $(manifestVariables) 22 | ${{ parameters.dryRunArg }} 23 | -------------------------------------------------------------------------------- /eng/common/templates/variables/common-paths.yml: -------------------------------------------------------------------------------- 1 | variables: 2 | engCommonRelativePath: eng/common 3 | engCommonPath: $(Build.Repository.LocalPath)/$(engCommonRelativePath) 4 | engPath: $(Build.Repository.LocalPath)/eng 5 | testScriptPath: "" 6 | -------------------------------------------------------------------------------- /eng/common/templates/variables/docker-images.yml: -------------------------------------------------------------------------------- 1 | variables: 2 | imageNames.imageBuilderName: mcr.microsoft.com/dotnet-buildtools/image-builder:2708614 3 | imageNames.imageBuilder: $(imageNames.imageBuilderName) 4 | imageNames.imageBuilder.withrepo: imagebuilder-withrepo:$(Build.BuildId)-$(System.JobId) 5 | imageNames.testRunner: mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux3.0-docker-testrunner 6 | imageNames.testRunner.withrepo: testrunner-withrepo:$(Build.BuildId)-$(System.JobId) 7 | -------------------------------------------------------------------------------- /eng/common/templates/variables/dotnet/build-test-publish.yml: -------------------------------------------------------------------------------- 1 | # Common variables for building/testing/publishing in the .NET team's pipelines 2 | 3 | variables: 4 | - template: /eng/common/templates/variables/dotnet/common.yml@self 5 | 6 | - name: commonVersionsImageInfoPath 7 | value: build-info/docker 8 | - name: publicGitRepoUri 9 | value: https://github.com/dotnet/dotnet-docker 10 | - name: testScriptPath 11 | value: ./tests/run-tests.ps1 12 | - name: testResultsDirectory 13 | value: tests/Microsoft.DotNet.Docker.Tests/TestResults/ 14 | - name: officialRepoPrefixes 15 | value: public/,internal/private/,unlisted/ 16 | 17 | - name: mcrDocsRepoInfo.authArgs 18 | value: >- 19 | --gh-private-key '$(GitHubApp-NET-Docker-MAR-Docs-Updater-PrivateKey)' 20 | --gh-app-client-id '$(gitHubApp.marDocsUpdater.clientId)' 21 | --gh-app-installation-id '$(gitHubApp.marDocsUpdater.microsoft.installationId)' 22 | - name: mcrDocsRepoInfo.userName 23 | value: $(gitHubApp.marDocsUpdater.userName) 24 | - name: mcrDocsRepoInfo.email 25 | value: $(gitHubApp.marDocsUpdater.email) 26 | 27 | - name: publishNotificationsEnabled 28 | value: true 29 | - name: gitHubNotificationsRepoInfo.org 30 | value: dotnet 31 | - name: gitHubNotificationsRepoInfo.repo 32 | value: dotnet-docker-internal 33 | - name: gitHubNotificationsRepoInfo.authArgs 34 | value: --gh-token '$(BotAccount-dotnet-docker-bot-PAT)' 35 | 36 | - name: gitHubVersionsRepoInfo.org 37 | value: dotnet 38 | - name: gitHubVersionsRepoInfo.repo 39 | value: versions 40 | - name: gitHubVersionsRepoInfo.branch 41 | value: main 42 | - name: gitHubVersionsRepoInfo.path 43 | value: ${{ variables.commonVersionsImageInfoPath }} 44 | - name: gitHubVersionsRepoInfo.authArgs 45 | value: --gh-token '$(BotAccount-dotnet-docker-bot-PAT)' 46 | - name: gitHubVersionsRepoInfo.userName 47 | value: $(dotnetDockerBot.userName) 48 | - name: gitHubVersionsRepoInfo.email 49 | value: $(dotnetDockerBot.email) 50 | -------------------------------------------------------------------------------- /eng/common/templates/variables/dotnet/common.yml: -------------------------------------------------------------------------------- 1 | variables: 2 | - template: /eng/common/templates/variables/common.yml@self 3 | - name: publicProjectName 4 | value: public 5 | - name: internalProjectName 6 | value: internal 7 | - name: dockerHubRegistryCreds 8 | value: --registry-creds 'docker.io=$(dotnetDockerHubBot.userName);$(BotAccount-dotnet-dockerhub-bot-PAT)' 9 | 10 | - name: linuxAmd64InternalPoolImage 11 | value: 1es-ubuntu-2204 12 | - name: linuxAmd64InternalPoolName 13 | value: NetCore1ESPool-Internal 14 | 15 | - name: linuxArm64PoolImage 16 | value: Mariner-2-Docker-ARM64 17 | - name: linuxArm64PublicPoolName 18 | value: Docker-Linux-Arm-Public 19 | - name: linuxArm64InternalPoolName 20 | value: Docker-Linux-Arm-Internal 21 | 22 | - name: linuxArm32PoolImage 23 | value: Mariner-2-Docker-ARM64 24 | - name: linuxArm32PublicPoolName 25 | value: Docker-Linux-Arm-Public 26 | - name: linuxArm32InternalPoolName 27 | value: Docker-Linux-Arm-Internal 28 | 29 | - name: windowsServer2016PublicPoolImage 30 | value: Server2016-NESDockerBuilds 31 | - name: windowsServer2016InternalPoolImage 32 | value: Server2016-NESDockerBuilds-1ESPT 33 | - name: windowsServer2016PoolName 34 | value: Docker-2016-${{ variables['System.TeamProject'] }} 35 | 36 | - name: windowsServer2019PublicPoolImage 37 | value: Server2019-1809-NESDockerBuilds 38 | - name: windowsServer2019InternalPoolImage 39 | value: Server2019-1809-NESDockerBuilds-1ESPT 40 | - name: windowsServer2019PoolName 41 | value: Docker-1809-${{ variables['System.TeamProject'] }} 42 | 43 | - name: windowsServer2022PublicPoolImage 44 | value: Server2022-NESDockerBuilds 45 | - name: windowsServer2022InternalPoolImage 46 | value: Server2022-NESDockerBuilds-1ESPT 47 | - name: windowsServer2022PoolName 48 | value: Docker-2022-${{ variables['System.TeamProject'] }} 49 | 50 | - name: windowsServer2025PublicPoolImage 51 | value: Server2025-NESDockerBuilds 52 | - name: windowsServer2025InternalPoolImage 53 | value: Server2025-NESDockerBuilds-1ESPT 54 | - name: windowsServer2025PoolName 55 | value: Docker-2025-${{ variables['System.TeamProject'] }} 56 | 57 | - group: DotNet-Docker-Common-2 58 | - ${{ if eq(variables['System.TeamProject'], 'internal') }}: 59 | - group: DotNet-Docker-Secrets 60 | -------------------------------------------------------------------------------- /eng/pipelines/dotnet-buildtools-prereqs-all-pr.yml: -------------------------------------------------------------------------------- 1 | trigger: none 2 | pr: 3 | branches: 4 | include: 5 | - main 6 | paths: 7 | include: 8 | - src/* 9 | 10 | resources: 11 | repositories: 12 | - repository: PublicVersionsRepo 13 | type: github 14 | endpoint: public 15 | name: dotnet/versions 16 | 17 | variables: 18 | - template: variables/common.yml 19 | 20 | stages: 21 | - template: stages/build-test-publish-repo.yml 22 | parameters: 23 | internalProjectName: ${{ variables.internalProjectName }} 24 | publicProjectName: ${{ variables.publicProjectName }} 25 | linuxAmdBuildJobTimeout: 480 26 | linuxArmBuildJobTimeout: 300 27 | linuxAmd64Pool: 28 | name: NetCore-Public-XL 29 | demands: ImageOverride -equals build.Ubuntu.2204.amd64.open 30 | customBuildInitSteps: 31 | - template: /eng/pipelines/steps/install-cross-build-prereqs.yml 32 | -------------------------------------------------------------------------------- /eng/pipelines/dotnet-buildtools-prereqs-eng.yml: -------------------------------------------------------------------------------- 1 | trigger: none 2 | pr: 3 | branches: 4 | include: 5 | - main 6 | paths: 7 | exclude: 8 | - src/* 9 | - "*.md" 10 | - .git* 11 | - CODEOWNERS 12 | - LICENSE 13 | 14 | resources: 15 | repositories: 16 | - repository: PublicVersionsRepo 17 | type: github 18 | endpoint: public 19 | name: dotnet/versions 20 | 21 | variables: 22 | - template: /eng/pipelines/variables/common.yml@self 23 | - name: imageBuilder.pathArgs 24 | value: --path '*' 25 | # Since this pipeline is intended to test the infra, we don't want to trim the cached images from the matrix. 26 | # This enables the entire pipeline to be exercised. 27 | - name: trimCachedImagesForMatrix 28 | value: false 29 | 30 | stages: 31 | - template: /eng/pipelines/stages/build-test-publish-repo.yml@self 32 | parameters: 33 | internalProjectName: ${{ variables.internalProjectName }} 34 | publicProjectName: ${{ variables.publicProjectName }} 35 | linuxAmdBuildJobTimeout: 360 36 | linuxArmBuildJobTimeout: 300 37 | customBuildInitSteps: 38 | - template: /eng/pipelines/steps/install-cross-build-prereqs.yml 39 | -------------------------------------------------------------------------------- /eng/pipelines/stages/build-test-publish-repo.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | noCache: false 3 | internalProjectName: null 4 | publicProjectName: null 5 | linuxAmdBuildJobTimeout: 60 6 | linuxArmBuildJobTimeout: 60 7 | customBuildInitSteps: [] 8 | customCopyBaseImagesInitSteps: [] 9 | linuxAmd64Pool: '' 10 | 11 | stages: 12 | - template: /eng/common/templates/stages/dotnet/build-test-publish-repo.yml@self 13 | parameters: 14 | noCache: ${{ parameters.noCache }} 15 | internalProjectName: ${{ parameters.internalProjectName }} 16 | publicProjectName: ${{ parameters.publicProjectName }} 17 | 18 | ${{ if and(eq(variables['System.TeamProject'], parameters.publicProjectName), eq(parameters.linuxAmd64Pool, ''))}}: 19 | linuxAmd64Pool: 20 | name: NetCore-Public 21 | demands: ImageOverride -equals build.ubuntu.2204.amd64.open 22 | ${{ else }}: 23 | linuxAmd64Pool: ${{ parameters.linuxAmd64Pool }} 24 | 25 | linuxAmdBuildJobTimeout: ${{ parameters.linuxAmdBuildJobTimeout }} 26 | linuxArmBuildJobTimeout: ${{ parameters.linuxArmBuildJobTimeout }} 27 | 28 | customBuildInitSteps: ${{ parameters.customBuildInitSteps }} 29 | customCopyBaseImagesInitSteps: ${{ parameters.customCopyBaseImagesInitSteps }} 30 | -------------------------------------------------------------------------------- /eng/pipelines/steps/install-cross-build-prereqs.yml: -------------------------------------------------------------------------------- 1 | steps: 2 | - script: ./$(buildRepoName)/src/ubuntu/build-scripts/install-cross-build-prereqs.sh 3 | displayName: Install Cross Build Pre-Reqs 4 | condition: and(succeeded(), contains(variables.imageBuilderPaths, '/cross'), not(contains(variables.imageBuilderPaths, '/raspbian'))) 5 | -------------------------------------------------------------------------------- /eng/pipelines/steps/set-base-image-override-options.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | # Name of the pipeline variable to append the options to 3 | variableName: null 4 | dockerfileOs: '' 5 | baseOverrideRegistry: '' 6 | 7 | steps: 8 | # Configures Image Builder options to override the base image tags for Ubuntu as defined in the Dockerfiles 9 | # and instead use the corresponding image from the Ubuntu ACR. 10 | - powershell: | 11 | # For official builds, we configure the regex and substitution 12 | # to use a different registry. (e.g. "ubuntu:20.04" becomes "parameters.baseOverrideRegistry/ubuntu:20.04")". 13 | $baseOverrideRegex = "^(${{ parameters.dockerfileOs }}:.+)" 14 | 15 | # Be sure to use the string literal syntax here (single quote) to avoid $1 being interpreted as a variable 16 | $baseOverrideSubstitution = '${{ parameters.baseOverrideRegistry }}/$1' 17 | 18 | # Assume the variable already exists and append to it. This allows us to dynamically append additional 19 | # options to a general purpose variable. 20 | $options = "$(${{ parameters.variableName }})" 21 | $options += " --base-override-regex '$baseOverrideRegex' --base-override-sub '$baseOverrideSubstitution'" 22 | echo "##vso[task.setvariable variable=${{ parameters.variableName }}]$options" 23 | displayName: Set Base Image Override Options -------------------------------------------------------------------------------- /eng/pipelines/variables/common.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | - name: disableMatrixTrimming 3 | type: boolean 4 | default: false 5 | 6 | variables: 7 | - template: /eng/common/templates/variables/dotnet/build-test-publish.yml@self 8 | - name: officialBranches 9 | # comma-delimited list of branch names 10 | value: main 11 | - name: manifest 12 | value: manifest.json 13 | - name: dotnetVersion 14 | value: '*' 15 | - name: osVariant 16 | value: '' 17 | - name: publishReadme 18 | value: false 19 | - name: imageBuilderBuildArgs 20 | value: '' 21 | - name: publicGitRepoUri 22 | value: https://github.com/dotnet/dotnet-buildtools-prereqs-docker 23 | - name: publicSourceBranch 24 | value: main 25 | - name: ingestKustoImageInfo 26 | value: false 27 | - name: testScriptPath 28 | value: "" 29 | - ${{ if not(parameters.disableMatrixTrimming) }}: 30 | - name: trimCachedImagesForMatrix 31 | value: true 32 | - ${{ if eq(variables['System.TeamProject'], 'internal') }}: 33 | - name: build.imageBuilderDockerRunExtraOptions 34 | value: -e DOCKER_REPO=$(acr.server)/$(stagingRepoPrefix)dotnet-buildtools/prereqs 35 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "registry": "mcr.microsoft.com", 3 | "includes": [ 4 | "src/almalinux/manifest.json", 5 | "src/alpine/manifest.json", 6 | "src/azurelinux/manifest.json", 7 | "src/cbl-mariner/manifest.json", 8 | "src/centos-stream/manifest.json", 9 | "src/debian/manifest.json", 10 | "src/fedora/manifest.json", 11 | "src/nanoserver/manifest.json", 12 | "src/opensuse/manifest.json", 13 | "src/ubuntu/manifest.json", 14 | "src/windowsservercore/manifest.json" 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /run-tests.ps1: -------------------------------------------------------------------------------- 1 | [cmdletbinding()] 2 | param( 3 | # Additional args to pass to dotnet run 4 | [string]$OptionalArgs 5 | ) 6 | 7 | Set-StrictMode -Version Latest 8 | $ErrorActionPreference = 'Stop' 9 | 10 | function Log { 11 | param ([string] $Message) 12 | 13 | Write-Output $Message 14 | } 15 | 16 | function Exec { 17 | param ([string] $Cmd) 18 | 19 | Log "Executing: '$Cmd'" 20 | Invoke-Expression $Cmd 21 | if ($LASTEXITCODE -ne 0) { 22 | throw "Failed: '$Cmd'" 23 | } 24 | } 25 | 26 | $EngCommonDir = "$PSScriptRoot/eng/common" 27 | 28 | $DotnetInstallDir = "$PSScriptRoot/.dotnet" 29 | & $EngCommonDir/Install-DotNetSdk.ps1 -InstallPath $DotnetInstallDir 30 | 31 | Push-Location "$PSScriptRoot\tests\Microsoft.DotNet.BuildTools.Prereqs.Docker.Tests" 32 | try { 33 | Exec "$DotnetInstallDir/dotnet run --project Microsoft.DotNet.BuildTools.Prereqs.Docker.Tests.csproj --report-xunit-trx --results-directory $PSScriptRoot/artifacts/TestResults $OptionalArgs" 34 | } 35 | finally { 36 | Pop-Location 37 | } 38 | -------------------------------------------------------------------------------- /src/almalinux/10/helix/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM library/almalinux:10 AS venv 2 | 3 | RUN dnf upgrade --refresh -y \ 4 | && dnf install --setopt tsflags=nodocs -y \ 5 | gcc \ 6 | gcc-c++ \ 7 | python3.12 \ 8 | python3.12-devel \ 9 | python3.12-pip 10 | 11 | RUN python3 -m venv /venv \ 12 | && . /venv/bin/activate \ 13 | && pip download --no-deps helix-scripts --index-url https://dnceng.pkgs.visualstudio.com/public/_packaging/helix-client-prod/pypi/simple \ 14 | && pip install ./helix_scripts-*-py3-none-any.whl \ 15 | && rm ./helix_scripts-*-py3-none-any.whl 16 | 17 | 18 | FROM library/almalinux:10 19 | 20 | # Install dependencies 21 | RUN dnf upgrade --refresh -y \ 22 | && dnf install --setopt tsflags=nodocs -y \ 23 | dnf-plugins-core \ 24 | && dnf config-manager --add-repo=https://packages.microsoft.com/rhel/9/prod/config.repo \ 25 | && dnf install --setopt tsflags=nodocs -y --allowerasing \ 26 | cpio \ 27 | file \ 28 | libicu \ 29 | libmsquic \ 30 | python3.12 \ 31 | sudo \ 32 | && dnf clean all 33 | 34 | # create helixbot user and give rights to sudo without password 35 | RUN adduser --uid 1000 --shell /bin/bash --gid adm helixbot \ 36 | && chmod 755 /root \ 37 | && echo "helixbot ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/helixbot 38 | 39 | USER helixbot 40 | ENV VIRTUAL_ENV=/home/helixbot/.vsts-env 41 | 42 | # Install Helix Dependencies 43 | RUN python3 -m venv $VIRTUAL_ENV 44 | ENV PATH="${VIRTUAL_ENV}/bin:${PATH}" 45 | COPY --from=venv --chown=helixbot /venv $VIRTUAL_ENV 46 | -------------------------------------------------------------------------------- /src/almalinux/10/source-build/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM library/almalinux:10 2 | 3 | # Install dependencies 4 | RUN dnf upgrade --refresh -y \ 5 | && dnf install --setopt tsflags=nodocs -y \ 6 | 'dnf-command(config-manager)' \ 7 | epel-release \ 8 | && dnf config-manager --set-enabled crb \ 9 | && dnf config-manager --set-enabled epel \ 10 | && dnf install --setopt tsflags=nodocs -y \ 11 | "perl(Time::HiRes)" \ 12 | autoconf \ 13 | automake \ 14 | brotli-devel \ 15 | cmake \ 16 | cpio \ 17 | elfutils \ 18 | file \ 19 | gdb \ 20 | git \ 21 | glibc-langpack-en \ 22 | iproute \ 23 | jq \ 24 | krb5-devel \ 25 | libcurl-devel \ 26 | libicu-devel \ 27 | libtool \ 28 | # Requires epel 29 | libunwind-devel \ 30 | libuuid-devel \ 31 | libxml2-devel \ 32 | llvm-toolset \ 33 | lld \ 34 | # Requires powertools 35 | lttng-ust-devel \ 36 | make \ 37 | ncurses-devel \ 38 | nodejs \ 39 | numactl-devel \ 40 | openssl-devel \ 41 | readline-devel \ 42 | python3.12 \ 43 | sudo \ 44 | swig \ 45 | wget \ 46 | which \ 47 | xz \ 48 | zlib-devel \ 49 | && dnf clean all 50 | -------------------------------------------------------------------------------- /src/almalinux/8/helix/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM library/almalinux:8 2 | 3 | RUN dnf upgrade --refresh -y \ 4 | && dnf install --setopt tsflags=nodocs -y \ 5 | 'dnf-command(config-manager)' \ 6 | # Add microsoft centos/8 repo for libmsquic. 7 | # (Use centos/8 rather than rhel/8 because the latter doesn't have 8 | # libmsquic except in the 8.1-specific packages feed.) 9 | && dnf config-manager --add-repo=https://packages.microsoft.com/centos/8/prod/config.repo \ 10 | && dnf install --setopt tsflags=nodocs -y \ 11 | # Get recent python3 This is needed to get a pip recent enough 12 | # not to fail the build when installing cryptography library as 13 | # a dependency of the helix scripts. 14 | python39 \ 15 | # Required for asp.net core test runs 16 | sudo \ 17 | libicu \ 18 | libmsquic \ 19 | # Required for arcade test runs 20 | cpio \ 21 | file \ 22 | && dnf clean all 23 | 24 | # Test runs expect python to be available without version suffix 25 | RUN alternatives --set python /usr/bin/python3 \ 26 | && ln -sf /usr/bin/pip3 /usr/bin/pip 27 | 28 | ENV LANG=en-US.UTF-8 29 | 30 | # create helixbot user and give rights to sudo without password 31 | RUN adduser --uid 1000 --shell /bin/bash --gid adm helixbot \ 32 | && chmod 755 /root \ 33 | && echo "helixbot ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/helixbot 34 | 35 | USER helixbot 36 | WORKDIR /home/helixbot 37 | ENV VIRTUAL_ENV=/home/helixbot/.vsts-env 38 | 39 | RUN python -m venv $VIRTUAL_ENV && \ 40 | ${VIRTUAL_ENV}/bin/pip download --no-deps helix-scripts --index-url https://dnceng.pkgs.visualstudio.com/public/_packaging/helix-client-prod/pypi/simple && \ 41 | ${VIRTUAL_ENV}/bin/pip install ./helix_scripts-*-py3-none-any.whl && \ 42 | rm ./helix_scripts-*-py3-none-any.whl 43 | ENV PATH="${VIRTUAL_ENV}/bin:${PATH}" 44 | -------------------------------------------------------------------------------- /src/almalinux/8/source-build/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM library/almalinux:8 2 | 3 | # Install dependencies 4 | RUN dnf upgrade --refresh -y \ 5 | && dnf install --setopt tsflags=nodocs -y \ 6 | 'dnf-command(config-manager)' \ 7 | epel-release \ 8 | && dnf config-manager --set-enabled powertools \ 9 | && dnf config-manager --set-enabled epel \ 10 | && dnf install --setopt tsflags=nodocs -y \ 11 | "perl(Time::HiRes)" \ 12 | autoconf \ 13 | automake \ 14 | brotli-devel \ 15 | cmake \ 16 | cpio \ 17 | elfutils \ 18 | file \ 19 | gdb \ 20 | git \ 21 | glibc-langpack-en \ 22 | iproute \ 23 | jq \ 24 | krb5-devel \ 25 | libcurl-devel \ 26 | libicu-devel \ 27 | libtool \ 28 | # Requires epel 29 | libunwind-devel \ 30 | libuuid-devel \ 31 | libxml2-devel \ 32 | llvm-toolset \ 33 | lld \ 34 | # Requires powertools 35 | lttng-ust-devel \ 36 | make \ 37 | ncurses-devel \ 38 | numactl-devel \ 39 | openssl-devel \ 40 | readline-devel \ 41 | python3 \ 42 | sudo \ 43 | swig \ 44 | wget \ 45 | which \ 46 | xz \ 47 | zlib-devel \ 48 | && dnf module install -y \ 49 | nodejs:20 \ 50 | && dnf clean all 51 | -------------------------------------------------------------------------------- /src/almalinux/9/helix/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM library/almalinux:9 AS venv 2 | 3 | RUN dnf upgrade --refresh -y \ 4 | && dnf install --setopt tsflags=nodocs -y \ 5 | gcc \ 6 | gcc-c++ \ 7 | python3.12 \ 8 | python3.12-devel \ 9 | python3.12-pip 10 | 11 | RUN python3 -m venv /venv \ 12 | && . /venv/bin/activate \ 13 | && pip download --no-deps helix-scripts --index-url https://dnceng.pkgs.visualstudio.com/public/_packaging/helix-client-prod/pypi/simple \ 14 | && pip install ./helix_scripts-*-py3-none-any.whl \ 15 | && rm ./helix_scripts-*-py3-none-any.whl 16 | 17 | 18 | FROM library/almalinux:9 19 | 20 | # Install dependencies 21 | RUN dnf upgrade --refresh -y \ 22 | && dnf install --setopt tsflags=nodocs -y \ 23 | dnf-plugins-core \ 24 | && dnf config-manager --add-repo=https://packages.microsoft.com/rhel/9/prod/config.repo \ 25 | && dnf install --setopt tsflags=nodocs -y --allowerasing \ 26 | cpio \ 27 | file \ 28 | libicu \ 29 | libmsquic \ 30 | python3.12 \ 31 | sudo \ 32 | && dnf clean all 33 | 34 | ENV LANG=en_US.utf8 35 | 36 | # create helixbot user and give rights to sudo without password 37 | RUN adduser --uid 1000 --shell /bin/bash --gid adm helixbot \ 38 | && chmod 755 /root \ 39 | && echo "helixbot ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/helixbot 40 | 41 | USER helixbot 42 | ENV VIRTUAL_ENV=/home/helixbot/.vsts-env 43 | 44 | # Install Helix Dependencies 45 | RUN python3 -m venv $VIRTUAL_ENV 46 | ENV PATH="${VIRTUAL_ENV}/bin:${PATH}" 47 | COPY --from=venv --chown=helixbot /venv $VIRTUAL_ENV 48 | -------------------------------------------------------------------------------- /src/almalinux/9/source-build/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM library/almalinux:9 2 | 3 | # Install dependencies 4 | RUN dnf upgrade --refresh -y \ 5 | && dnf install --setopt tsflags=nodocs -y \ 6 | 'dnf-command(config-manager)' \ 7 | epel-release \ 8 | && dnf config-manager --set-enabled crb \ 9 | && dnf config-manager --set-enabled epel \ 10 | && dnf install --setopt tsflags=nodocs -y \ 11 | "perl(Time::HiRes)" \ 12 | autoconf \ 13 | automake \ 14 | brotli-devel \ 15 | cmake \ 16 | cpio \ 17 | elfutils \ 18 | file \ 19 | gdb \ 20 | git \ 21 | glibc-langpack-en \ 22 | iproute \ 23 | jq \ 24 | krb5-devel \ 25 | libcurl-devel \ 26 | libicu-devel \ 27 | libtool \ 28 | # Requires epel 29 | libunwind-devel \ 30 | libuuid-devel \ 31 | libxml2-devel \ 32 | llvm-toolset \ 33 | lld \ 34 | # Requires powertools 35 | lttng-ust-devel \ 36 | make \ 37 | ncurses-devel \ 38 | numactl-devel \ 39 | openssl-devel \ 40 | readline-devel \ 41 | python3.12 \ 42 | sudo \ 43 | swig \ 44 | wget \ 45 | which \ 46 | xz \ 47 | zlib-devel \ 48 | && dnf module install -y \ 49 | nodejs:22 \ 50 | && dnf clean all 51 | -------------------------------------------------------------------------------- /src/almalinux/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "repos": [ 3 | { 4 | "name": "dotnet-buildtools/prereqs", 5 | "images": [ 6 | { 7 | "platforms": [ 8 | { 9 | "dockerfile": "src/almalinux/8/source-build/amd64", 10 | "os": "linux", 11 | "osVersion": "almalinux8", 12 | "tags": { 13 | "almalinux-8-source-build": {}, 14 | "almalinux-8-source-build-amd64": {} 15 | } 16 | }, 17 | { 18 | "dockerfile": "src/almalinux/8/helix/amd64", 19 | "os": "linux", 20 | "osVersion": "almalinux8", 21 | "tags": { 22 | "almalinux-8-helix-amd64": {} 23 | } 24 | } 25 | ] 26 | }, 27 | { 28 | "platforms": [ 29 | { 30 | "dockerfile": "src/almalinux/9/source-build/amd64", 31 | "os": "linux", 32 | "osVersion": "almalinux9", 33 | "tags": { 34 | "almalinux-9-source-build-amd64": {} 35 | } 36 | }, 37 | { 38 | "dockerfile": "src/almalinux/9/helix/amd64", 39 | "os": "linux", 40 | "osVersion": "almalinux9", 41 | "tags": { 42 | "almalinux-9-helix-amd64": {} 43 | } 44 | } 45 | ] 46 | }, 47 | { 48 | "platforms": [ 49 | { 50 | "dockerfile": "src/almalinux/10/source-build/amd64", 51 | "os": "linux", 52 | "osVersion": "almalinux10", 53 | "tags": { 54 | "almalinux-10-source-build-amd64": {} 55 | } 56 | }, 57 | { 58 | "dockerfile": "src/almalinux/10/helix/amd64", 59 | "os": "linux", 60 | "osVersion": "almalinux10", 61 | "tags": { 62 | "almalinux-10-helix-amd64": {} 63 | } 64 | } 65 | ] 66 | } 67 | ] 68 | } 69 | ] 70 | } 71 | -------------------------------------------------------------------------------- /src/alpine/3.19/WithNode/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.19 2 | 3 | RUN apk add --upgrade --no-cache \ 4 | nodejs \ 5 | npm 6 | 7 | # Add label for bring your own node in azure devops 8 | LABEL "com.azure.dev.pipelines.agent.handler.node.path"="/usr/bin/node" 9 | 10 | ENV NO_UPDATE_NOTIFIER=true 11 | 12 | # Set node as a default command 13 | CMD [ "node" ] 14 | -------------------------------------------------------------------------------- /src/alpine/3.19/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM amd64/alpine:3.19 2 | 3 | # Install .NET and test dependencies 4 | RUN apk add --upgrade --no-cache \ 5 | autoconf \ 6 | automake \ 7 | bash \ 8 | build-base \ 9 | brotli-dev \ 10 | ca-certificates \ 11 | clang \ 12 | clang-dev \ 13 | cmake \ 14 | coreutils \ 15 | cpio \ 16 | curl \ 17 | elfutils \ 18 | file \ 19 | gcc \ 20 | gettext-dev \ 21 | git \ 22 | icu-data-full \ 23 | icu-dev \ 24 | icu-libs \ 25 | iproute2 \ 26 | jq \ 27 | krb5-dev \ 28 | krb5-libs \ 29 | libtool \ 30 | less \ 31 | libgcc \ 32 | libintl \ 33 | libssl3 \ 34 | libstdc++ \ 35 | libunwind-dev \ 36 | linux-headers \ 37 | lld \ 38 | lldb-dev \ 39 | llvm \ 40 | lttng-ust-dev \ 41 | make \ 42 | ncurses-terminfo-base \ 43 | numactl-dev \ 44 | openssl \ 45 | openssl-dev \ 46 | paxctl \ 47 | pigz \ 48 | py3-lldb \ 49 | py3-pip \ 50 | python3-dev \ 51 | shadow \ 52 | sudo \ 53 | tzdata \ 54 | userspace-rcu \ 55 | util-linux-dev \ 56 | which \ 57 | zlib-dev 58 | 59 | # Install the latest non-preview powershell release. 60 | RUN apk -X https://dl-cdn.alpinelinux.org/alpine/edge/main add --no-cache lttng-ust \ 61 | && LATEST_TAG=$(curl -L https://api.github.com/repos/powershell/powershell/releases/latest | jq -r '.tag_name') \ 62 | && curl -L https://github.com/PowerShell/PowerShell/releases/download/$LATEST_TAG/powershell-${LATEST_TAG#*v}-linux-musl-x64.tar.gz -o /tmp/powershell.tar.gz \ 63 | && mkdir -p /opt/microsoft/powershell \ 64 | && tar zxf /tmp/powershell.tar.gz -C /opt/microsoft/powershell \ 65 | && chmod +x /opt/microsoft/powershell/pwsh \ 66 | && ln -s /opt/microsoft/powershell/pwsh /usr/bin/pwsh \ 67 | && rm -f /tmp/powershell.tar.gz 68 | 69 | # Install azurecli from PIP 70 | RUN azureEnv="/usr/local/share/azure-cli-env" && \ 71 | python3 -m venv "$azureEnv" && \ 72 | "$azureEnv/bin/python" -m pip install --upgrade setuptools && \ 73 | "$azureEnv/bin/python" -m pip install azure-cli && \ 74 | ln -s "$azureEnv/bin/az" /usr/local/bin/az 75 | -------------------------------------------------------------------------------- /src/alpine/3.20/helix/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM library/alpine:3.20 AS venv 2 | 3 | RUN apk add --upgrade --no-cache \ 4 | cargo \ 5 | python3-dev \ 6 | build-base \ 7 | libffi-dev \ 8 | openssl-dev \ 9 | gcc \ 10 | linux-headers 11 | 12 | RUN python3 -m venv /venv && \ 13 | source /venv/bin/activate && \ 14 | pip download --no-deps helix-scripts --index-url https://dnceng.pkgs.visualstudio.com/public/_packaging/helix-client-prod/pypi/simple && \ 15 | pip install ./helix_scripts-*-py3-none-any.whl && \ 16 | rm ./helix_scripts-*-py3-none-any.whl 17 | 18 | FROM library/alpine:3.20 19 | 20 | # Install .NET and test dependencies 21 | RUN apk add --upgrade --no-cache \ 22 | bash \ 23 | coreutils \ 24 | curl \ 25 | icu-data-full \ 26 | icu-libs \ 27 | iputils \ 28 | krb5-libs \ 29 | lldb \ 30 | llvm \ 31 | lttng-ust \ 32 | musl-locales \ 33 | numactl \ 34 | openssl \ 35 | python3 \ 36 | python3-dev \ 37 | py3-pip \ 38 | sudo \ 39 | tzdata 40 | 41 | # Install libmsquic from testing repository 42 | RUN apk add --repository=http://dl-cdn.alpinelinux.org/alpine/edge/community/ libmsquic 43 | 44 | # Needed for runtime tests to pass 45 | ENV LANG=en-US.UTF-8 46 | RUN echo export LANG=${LANG} >> /etc/profile.d/locale.sh 47 | 48 | # create helixbot user and give rights to sudo without password 49 | # Alpine does not support long options 50 | RUN /usr/sbin/adduser -D -g '' -G adm -s /bin/bash -u 1000 helixbot && \ 51 | chmod 755 /root && \ 52 | echo "helixbot ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/helixbot 53 | 54 | USER helixbot 55 | 56 | # Install Helix Dependencies 57 | ENV VIRTUAL_ENV=/home/helixbot/.vsts-env 58 | RUN python3 -m venv $VIRTUAL_ENV 59 | ENV PATH="${VIRTUAL_ENV}/bin:${PATH}" 60 | COPY --from=venv --chown=helixbot /venv $VIRTUAL_ENV 61 | -------------------------------------------------------------------------------- /src/alpine/3.21/helix/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM library/alpine:3.21 AS venv 2 | 3 | RUN apk add --upgrade --no-cache \ 4 | cargo \ 5 | python3-dev \ 6 | build-base \ 7 | libffi-dev \ 8 | openssl-dev \ 9 | gcc \ 10 | linux-headers 11 | 12 | RUN python3 -m venv /venv && \ 13 | source /venv/bin/activate && \ 14 | pip download --no-deps helix-scripts --index-url https://dnceng.pkgs.visualstudio.com/public/_packaging/helix-client-prod/pypi/simple && \ 15 | pip install ./helix_scripts-*-py3-none-any.whl && \ 16 | rm ./helix_scripts-*-py3-none-any.whl 17 | 18 | FROM library/alpine:3.21 19 | 20 | # Install .NET and test dependencies 21 | RUN apk add --upgrade --no-cache \ 22 | bash \ 23 | coreutils \ 24 | curl \ 25 | icu-data-full \ 26 | icu-libs \ 27 | iputils \ 28 | krb5-libs \ 29 | libmsquic \ 30 | lldb \ 31 | llvm \ 32 | lttng-ust \ 33 | musl-locales \ 34 | numactl \ 35 | openssl \ 36 | python3 \ 37 | python3-dev \ 38 | py3-pip \ 39 | sudo \ 40 | tzdata 41 | 42 | # Needed for runtime tests to pass 43 | ENV LANG=en-US.UTF-8 44 | RUN echo export LANG=${LANG} >> /etc/profile.d/locale.sh 45 | 46 | # create helixbot user and give rights to sudo without password 47 | # Alpine does not support long options 48 | RUN /usr/sbin/adduser -D -g '' -G adm -s /bin/bash -u 1000 helixbot && \ 49 | chmod 755 /root && \ 50 | echo "helixbot ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/helixbot 51 | 52 | USER helixbot 53 | 54 | # Install Helix Dependencies 55 | ENV VIRTUAL_ENV=/home/helixbot/.vsts-env 56 | RUN python3 -m venv $VIRTUAL_ENV 57 | ENV PATH="${VIRTUAL_ENV}/bin:${PATH}" 58 | COPY --from=venv --chown=helixbot /venv $VIRTUAL_ENV 59 | -------------------------------------------------------------------------------- /src/alpine/3.22/helix/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM library/alpine:3.22 AS venv 2 | 3 | RUN apk add --upgrade --no-cache \ 4 | cargo \ 5 | python3-dev \ 6 | build-base \ 7 | libffi-dev \ 8 | openssl-dev \ 9 | gcc \ 10 | linux-headers 11 | 12 | RUN python3 -m venv /venv && \ 13 | source /venv/bin/activate && \ 14 | pip download --no-deps helix-scripts --index-url https://dnceng.pkgs.visualstudio.com/public/_packaging/helix-client-prod/pypi/simple && \ 15 | pip install ./helix_scripts-*-py3-none-any.whl && \ 16 | rm ./helix_scripts-*-py3-none-any.whl 17 | 18 | FROM library/alpine:3.22 19 | 20 | # Install .NET and test dependencies 21 | RUN apk add --upgrade --no-cache \ 22 | bash \ 23 | coreutils \ 24 | curl \ 25 | icu-data-full \ 26 | icu-libs \ 27 | iputils \ 28 | krb5-libs \ 29 | libmsquic \ 30 | lldb \ 31 | llvm \ 32 | lttng-ust \ 33 | musl-locales \ 34 | numactl \ 35 | openssl \ 36 | python3 \ 37 | python3-dev \ 38 | py3-pip \ 39 | sudo \ 40 | tzdata 41 | 42 | # create helixbot user and give rights to sudo without password 43 | # Alpine does not support long options 44 | RUN /usr/sbin/adduser -D -g '' -G adm -s /bin/bash -u 1000 helixbot && \ 45 | chmod 755 /root && \ 46 | echo "helixbot ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/helixbot 47 | 48 | USER helixbot 49 | 50 | # Install Helix Dependencies 51 | ENV VIRTUAL_ENV=/home/helixbot/.vsts-env 52 | RUN python3 -m venv $VIRTUAL_ENV 53 | ENV PATH="${VIRTUAL_ENV}/bin:${PATH}" 54 | COPY --from=venv --chown=helixbot /venv $VIRTUAL_ENV 55 | -------------------------------------------------------------------------------- /src/alpine/edge/helix/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM library/alpine:edge AS venv 2 | 3 | RUN apk add --upgrade --no-cache \ 4 | cargo \ 5 | python3-dev \ 6 | build-base \ 7 | libffi-dev \ 8 | openssl-dev \ 9 | gcc \ 10 | linux-headers 11 | 12 | RUN python3 -m venv /venv && \ 13 | source /venv/bin/activate && \ 14 | pip download --no-deps helix-scripts --index-url https://dnceng.pkgs.visualstudio.com/public/_packaging/helix-client-prod/pypi/simple && \ 15 | pip install ./helix_scripts-*-py3-none-any.whl && \ 16 | rm ./helix_scripts-*-py3-none-any.whl 17 | 18 | FROM library/alpine:edge 19 | 20 | # Install .NET and test dependencies 21 | RUN apk add --upgrade --no-cache \ 22 | bash \ 23 | coreutils \ 24 | curl \ 25 | icu-data-full \ 26 | icu-libs \ 27 | iputils \ 28 | krb5-libs \ 29 | libmsquic \ 30 | lldb \ 31 | llvm \ 32 | lttng-ust \ 33 | musl-locales \ 34 | numactl \ 35 | openssl \ 36 | python3 \ 37 | python3-dev \ 38 | py3-pip \ 39 | sudo \ 40 | tzdata 41 | 42 | # create helixbot user and give rights to sudo without password 43 | # Alpine does not support long options 44 | RUN /usr/sbin/adduser -D -g '' -G adm -s /bin/bash -u 1000 helixbot && \ 45 | chmod 755 /root && \ 46 | echo "helixbot ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/helixbot 47 | 48 | USER helixbot 49 | 50 | # Install Helix Dependencies 51 | ENV VIRTUAL_ENV=/home/helixbot/.vsts-env 52 | RUN python3 -m venv $VIRTUAL_ENV 53 | ENV PATH="${VIRTUAL_ENV}/bin:${PATH}" 54 | COPY --from=venv --chown=helixbot /venv $VIRTUAL_ENV 55 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/docker-testrunner/Dockerfile: -------------------------------------------------------------------------------- 1 | # Dockerfile used to create a testrunner image that can perform Docker operations. 2 | # Usage: docker run --rm -v /var/run/docker.sock:/var/run/docker.sock testrunner pwsh -File xyz.ps1 3 | 4 | FROM mcr.microsoft.com/azurelinux/base/core:3.0 5 | 6 | RUN tdnf install -y \ 7 | ca-certificates \ 8 | # Install Docker 9 | moby-engine \ 10 | docker-buildx \ 11 | docker-cli \ 12 | # Test dependencies 13 | azure-cli \ 14 | git \ 15 | powershell \ 16 | shadow-utils \ 17 | && tdnf clean all 18 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/helix/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/azurelinux/base/core:3.0 as venv 2 | 3 | RUN tdnf install --refresh -y \ 4 | build-essential \ 5 | ca-certificates-microsoft \ 6 | gcc \ 7 | iputils \ 8 | python3 \ 9 | python3-devel \ 10 | python3-pip 11 | 12 | RUN python3 -m venv /venv && \ 13 | source /venv/bin/activate && \ 14 | pip download --no-deps helix-scripts --index-url https://dnceng.pkgs.visualstudio.com/public/_packaging/helix-client-prod/pypi/simple && \ 15 | pip install ./helix_scripts-*-py3-none-any.whl && \ 16 | rm ./helix_scripts-*-py3-none-any.whl 17 | 18 | FROM mcr.microsoft.com/azurelinux/base/core:3.0 19 | 20 | # Install .NET and test dependencies 21 | RUN tdnf install --setopt tsflags=nodocs --refresh -y \ 22 | ca-certificates-microsoft \ 23 | icu \ 24 | iputils \ 25 | libgcc-atomic \ 26 | libmsquic \ 27 | libnuma \ 28 | llvm \ 29 | python3 \ 30 | python3-pip \ 31 | shadow-utils \ 32 | sudo \ 33 | tar \ 34 | tzdata \ 35 | which \ 36 | && tdnf clean all 37 | 38 | # create helixbot user and give rights to sudo without password 39 | RUN /usr/sbin/useradd -c '' --uid 1000 --shell /bin/bash --groups adm helixbot && \ 40 | chmod 755 /root && \ 41 | echo "helixbot ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/helixbot && \ 42 | mkdir /home/helixbot/ && chown -R helixbot /home/helixbot/ 43 | 44 | USER helixbot 45 | 46 | # Install Helix Dependencies 47 | ENV VIRTUAL_ENV=/home/helixbot/.vsts-env 48 | RUN python3 -m venv $VIRTUAL_ENV 49 | ENV PATH="${VIRTUAL_ENV}/bin:${PATH}" 50 | COPY --from=venv --chown=helixbot /venv $VIRTUAL_ENV 51 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net10.0/android/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ANDROID_SDK_ROOT=/usr/local/android-sdk 2 | ARG ANDROID_NDK_VERSION=27.2.12479018 3 | ARG ANDROID_NDK_ROOT=$ANDROID_SDK_ROOT/ndk/$ANDROID_NDK_VERSION 4 | FROM mcr.microsoft.com/openjdk/jdk:17-mariner AS android-sdk-download 5 | ARG ANDROID_SDK_ROOT 6 | ARG ANDROID_NDK_VERSION 7 | ARG ANDROID_NDK_ROOT 8 | 9 | # Dependencies for Android SDK install 10 | RUN tdnf update -y \ 11 | && tdnf install -y \ 12 | # Android dependencies 13 | wget \ 14 | zip \ 15 | unzip 16 | 17 | # Grab the necessary Android SDK packages / tools 18 | RUN wget https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip \ 19 | && echo "2d2d50857e4eb553af5a6dc3ad507a17adf43d115264b1afc116f95c92e5e258 commandlinetools-linux-11076708_latest.zip" | sha256sum -c \ 20 | && mkdir -p /usr/local/cmdline-tools \ 21 | && unzip commandlinetools-linux-11076708_latest.zip -d /usr/local/cmdline-tools \ 22 | && rm -f commandlinetools-linux-11076708_latest.zip \ 23 | && yes | /usr/local/cmdline-tools/cmdline-tools/bin/sdkmanager --sdk_root="${ANDROID_SDK_ROOT}" --licenses 24 | 25 | RUN yes | /usr/local/cmdline-tools/cmdline-tools/bin/sdkmanager --licenses 26 | RUN /usr/local/cmdline-tools/cmdline-tools/bin/sdkmanager --sdk_root="${ANDROID_SDK_ROOT}" --install "build-tools;33.0.0" "platforms;android-33" "ndk;${ANDROID_NDK_VERSION}" 27 | 28 | # Remove all components of NDK that are flagged by security scanners 29 | RUN rm -r ${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/python3/lib/python3.11/site-packages/ 30 | 31 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-crossdeps-llvm-amd64 32 | 33 | # Install Microsoft OpenJDK from the Microsoft OpenJDK 17 Mariner image. 34 | ENV LANG=en_US.UTF-8 35 | ENV JAVA_HOME=/usr/lib/jvm/msopenjdk-17 36 | ENV PATH=$JAVA_HOME/bin:$PATH 37 | COPY --from=mcr.microsoft.com/openjdk/jdk:17-mariner $JAVA_HOME $JAVA_HOME 38 | ARG ANDROID_SDK_ROOT 39 | ARG ANDROID_NDK_VERSION 40 | ARG ANDROID_NDK_ROOT 41 | 42 | 43 | # Dependencies for Android build 44 | RUN tdnf update -y \ 45 | && tdnf install -y \ 46 | # Common dependencies 47 | binutils \ 48 | # Android dependencies 49 | zip \ 50 | unzip \ 51 | # linux-bionic build dependencies 52 | openssl-devel 53 | 54 | ENV ANDROID_SDK_ROOT=${ANDROID_SDK_ROOT} 55 | ENV ANDROID_NDK_ROOT=${ANDROID_NDK_ROOT} 56 | 57 | COPY --from=android-sdk-download $ANDROID_SDK_ROOT $ANDROID_SDK_ROOT 58 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net10.0/android/docker/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-android-amd64 2 | 3 | RUN tdnf update -y \ 4 | && tdnf install -y \ 5 | moby-engine \ 6 | moby-cli 7 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net10.0/build/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | # This should be switched to 10.0 stable and then non-preview 2 | FROM mcr.microsoft.com/dotnet/runtime-deps:10.0-preview-azurelinux3.0 3 | 4 | RUN tdnf install -y \ 5 | awk \ 6 | azure-cli \ 7 | # added to ensure latest patches over the base image 8 | curl \ 9 | git \ 10 | nodejs \ 11 | powershell \ 12 | # provides 'useradd', required by Azure DevOps 13 | shadow-utils \ 14 | tar \ 15 | # Provides 'su', required by Azure DevOps 16 | util-linux \ 17 | && tdnf clean all 18 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net10.0/cross/amd64-musl/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/x64 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-crossdeps-builder-amd64 AS builder 4 | ARG ROOTFS_DIR 5 | 6 | RUN /scripts/eng/common/cross/build-rootfs.sh x64 alpine3.17 --skipunmount 7 | 8 | RUN TARGET_TRIPLE="x86_64-alpine-linux-musl" && \ 9 | GCC_VER=$(basename "$(find "$ROOTFS_DIR/usr/include/c++/" -mindepth 1 -maxdepth 1 -type d | sort -V | head -n1)") && \ 10 | CPP_INCLUDES="$ROOTFS_DIR/usr/include/c++/$GCC_VER" && \ 11 | TRIPLET_INCLUDES=$([ -e "$CPP_INCLUDES/$TARGET_TRIPLE" ] && echo "$CPP_INCLUDES/$TARGET_TRIPLE" || echo "$(realpath "$CPP_INCLUDES/../../$TARGET_TRIPLE");$(realpath "$CPP_INCLUDES/../../$TARGET_TRIPLE/c++/$GCC_VER")") && \ 12 | echo "Using C++ includes $CPP_INCLUDES and $TRIPLET_INCLUDES to build for $TARGET_TRIPLE" && \ 13 | cmake -S llvm-project.src/runtimes -B runtimes \ 14 | -DCMAKE_BUILD_TYPE=Release \ 15 | -DCMAKE_ASM_COMPILER=clang \ 16 | -DCMAKE_C_COMPILER=clang \ 17 | -DCMAKE_CXX_COMPILER=clang++ \ 18 | -DCMAKE_ASM_COMPILER_TARGET="$TARGET_TRIPLE" \ 19 | -DCMAKE_C_COMPILER_TARGET="$TARGET_TRIPLE" \ 20 | -DCMAKE_CXX_COMPILER_TARGET="$TARGET_TRIPLE" \ 21 | # We're going to link the static libraries we build here into PIC images, so build the static libraries as PIC. 22 | -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ 23 | -DCMAKE_SYSROOT="$ROOTFS_DIR" \ 24 | # Specify linker to use for exes directly for CMake toolchain detection 25 | -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld" \ 26 | # Don't search for tools in the sysroot as we're cross-compiling 27 | -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM="NEVER" \ 28 | -DLLVM_USE_LINKER=lld \ 29 | -DLLVM_ENABLE_RUNTIMES="libcxx" \ 30 | -DLIBCXX_ENABLE_SHARED=OFF \ 31 | -DLIBCXX_HAS_MUSL_LIBC=ON \ 32 | -DLIBCXX_CXX_ABI=libstdc++ \ 33 | -DLIBCXX_CXX_ABI_INCLUDE_PATHS="$CPP_INCLUDES;$TRIPLET_INCLUDES" && \ 34 | cmake --build runtimes -j $(getconf _NPROCESSORS_ONLN) && \ 35 | cmake --install runtimes --prefix "$ROOTFS_DIR/usr" 36 | 37 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-crossdeps-llvm-amd64 38 | ARG ROOTFS_DIR 39 | 40 | COPY --from=builder $ROOTFS_DIR $ROOTFS_DIR 41 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net10.0/cross/android/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-cross-amd64 AS crossrootx64 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-android-amd64 4 | 5 | # Copy crossrootfs from AMD64 build image, so we can build Android-targeting code for that arch 6 | COPY --from=crossrootx64 /crossrootfs/x64 /crossrootfs/x64 7 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net10.0/cross/android/openssl/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-cross-android-amd64 2 | 3 | # Copy the OpenSSL headers and libs from the x64 rootfs into the Anroid NDK so dotnet/runtime's 4 | # OpenSSL headers hack can find them for the linux-bionic build. 5 | RUN mkdir -p ${ANDROID_NDK_ROOT}/usr/local/include && \ 6 | mkdir ${ANDROID_NDK_ROOT}/usr/local/lib && \ 7 | cp -r /crossrootfs/x64/usr/include/openssl ${ANDROID_NDK_ROOT}/usr/local/include/openssl && \ 8 | cp -r /crossrootfs/x64/usr/include/x86_64-linux-gnu/openssl ${ANDROID_NDK_ROOT}/usr/local/include && \ 9 | cp -r $(readlink -f /crossrootfs/x64/usr/lib/x86_64-linux-gnu/libssl.so) ${ANDROID_NDK_ROOT}/usr/local/lib/libssl.so && \ 10 | cp -r $(readlink -f /crossrootfs/x64/usr/lib/x86_64-linux-gnu/libcrypto.so) ${ANDROID_NDK_ROOT}/usr/local/lib/libcrypto.so 11 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net10.0/cross/arm-musl/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/arm 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-crossdeps-builder-amd64 AS builder 4 | ARG ROOTFS_DIR 5 | 6 | RUN /scripts/eng/common/cross/build-rootfs.sh arm alpine3.17 --skipunmount 7 | 8 | RUN TARGET_TRIPLE="armv7-alpine-linux-musleabihf" && \ 9 | GCC_VER=$(basename "$(find "$ROOTFS_DIR/usr/include/c++/" -mindepth 1 -maxdepth 1 -type d | sort -V | head -n1)") && \ 10 | CPP_INCLUDES="$ROOTFS_DIR/usr/include/c++/$GCC_VER" && \ 11 | TRIPLET_INCLUDES=$([ -e "$CPP_INCLUDES/$TARGET_TRIPLE" ] && echo "$CPP_INCLUDES/$TARGET_TRIPLE" || echo "$(realpath "$CPP_INCLUDES/../../$TARGET_TRIPLE");$(realpath "$CPP_INCLUDES/../../$TARGET_TRIPLE/c++/$GCC_VER")") && \ 12 | echo "Using C++ includes $CPP_INCLUDES and $TRIPLET_INCLUDES to build for $TARGET_TRIPLE" && \ 13 | cmake -S llvm-project.src/runtimes -B runtimes \ 14 | -DCMAKE_BUILD_TYPE=Release \ 15 | -DCMAKE_ASM_COMPILER=clang \ 16 | -DCMAKE_C_COMPILER=clang \ 17 | -DCMAKE_CXX_COMPILER=clang++ \ 18 | -DCMAKE_ASM_COMPILER_TARGET="$TARGET_TRIPLE" \ 19 | -DCMAKE_C_COMPILER_TARGET="$TARGET_TRIPLE" \ 20 | -DCMAKE_CXX_COMPILER_TARGET="$TARGET_TRIPLE" \ 21 | # We're going to link the static libraries we build here into PIC images, so build the static libraries as PIC. 22 | -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ 23 | -DCMAKE_SYSROOT="$ROOTFS_DIR" \ 24 | # Specify linker to use for exes directly for CMake toolchain detection 25 | -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld" \ 26 | # Don't search for tools in the sysroot as we're cross-compiling 27 | -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM="NEVER" \ 28 | -DLLVM_USE_LINKER=lld \ 29 | -DLLVM_ENABLE_RUNTIMES="libcxx" \ 30 | -DLIBCXX_ENABLE_SHARED=OFF \ 31 | -DLIBCXX_HAS_MUSL_LIBC=ON \ 32 | -DLIBCXX_CXX_ABI=libstdc++ \ 33 | -DLIBCXX_CXX_ABI_INCLUDE_PATHS="$CPP_INCLUDES;$TRIPLET_INCLUDES" && \ 34 | cmake --build runtimes -j $(getconf _NPROCESSORS_ONLN) && \ 35 | cmake --install runtimes --prefix "$ROOTFS_DIR/usr" 36 | 37 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-crossdeps-llvm-amd64 38 | ARG ROOTFS_DIR 39 | 40 | COPY --from=builder $ROOTFS_DIR $ROOTFS_DIR 41 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net10.0/cross/arm64-musl/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/arm64 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-crossdeps-builder-amd64 AS builder 4 | ARG ROOTFS_DIR 5 | 6 | RUN /scripts/eng/common/cross/build-rootfs.sh arm64 alpine3.17 --skipunmount 7 | 8 | RUN TARGET_TRIPLE="aarch64-alpine-linux-musl" && \ 9 | GCC_VER=$(basename "$(find "$ROOTFS_DIR/usr/include/c++/" -mindepth 1 -maxdepth 1 -type d | sort -V | head -n1)") && \ 10 | CPP_INCLUDES="$ROOTFS_DIR/usr/include/c++/$GCC_VER" && \ 11 | TRIPLET_INCLUDES=$([ -e "$CPP_INCLUDES/$TARGET_TRIPLE" ] && echo "$CPP_INCLUDES/$TARGET_TRIPLE" || echo "$(realpath "$CPP_INCLUDES/../../$TARGET_TRIPLE");$(realpath "$CPP_INCLUDES/../../$TARGET_TRIPLE/c++/$GCC_VER")") && \ 12 | echo "Using C++ includes $CPP_INCLUDES and $TRIPLET_INCLUDES to build for $TARGET_TRIPLE" && \ 13 | cmake -S llvm-project.src/runtimes -B runtimes \ 14 | -DCMAKE_BUILD_TYPE=Release \ 15 | -DCMAKE_ASM_COMPILER=clang \ 16 | -DCMAKE_C_COMPILER=clang \ 17 | -DCMAKE_CXX_COMPILER=clang++ \ 18 | -DCMAKE_ASM_COMPILER_TARGET="$TARGET_TRIPLE" \ 19 | -DCMAKE_C_COMPILER_TARGET="$TARGET_TRIPLE" \ 20 | -DCMAKE_CXX_COMPILER_TARGET="$TARGET_TRIPLE" \ 21 | # We're going to link the static libraries we build here into PIC images, so build the static libraries as PIC. 22 | -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ 23 | -DCMAKE_SYSROOT="$ROOTFS_DIR" \ 24 | # Specify linker to use for exes directly for CMake toolchain detection 25 | -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld" \ 26 | # Don't search for tools in the sysroot as we're cross-compiling 27 | -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM="NEVER" \ 28 | -DLLVM_USE_LINKER=lld \ 29 | -DLLVM_ENABLE_RUNTIMES="libcxx" \ 30 | -DLIBCXX_ENABLE_SHARED=OFF \ 31 | -DLIBCXX_HAS_MUSL_LIBC=ON \ 32 | -DLIBCXX_CXX_ABI=libstdc++ \ 33 | -DLIBCXX_CXX_ABI_INCLUDE_PATHS="$CPP_INCLUDES;$TRIPLET_INCLUDES" && \ 34 | cmake --build runtimes -j $(getconf _NPROCESSORS_ONLN) && \ 35 | cmake --install runtimes --prefix "$ROOTFS_DIR/usr" 36 | 37 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-crossdeps-llvm-amd64 38 | ARG ROOTFS_DIR 39 | 40 | COPY --from=builder $ROOTFS_DIR $ROOTFS_DIR 41 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net10.0/cross/armv6/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/armv6 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-crossdeps-builder-amd64 AS builder 4 | ARG ROOTFS_DIR 5 | 6 | # Install raspbian package signing keys 7 | RUN wget http://raspbian.raspberrypi.org/raspbian/pool/main/r/raspbian-archive-keyring/raspbian-archive-keyring_20120528.2.tar.gz && \ 8 | echo "b3f22fa8d63d8d2f8b81f77784c3dc8f65fd6a10eadda63ac30a2da483ffc9d6ac72d0b5d3d0d5bdf2a61ca264a26fa071aed3acc780f062c8ab27a2e5ac6d49 raspbian-archive-keyring_20120528.2.tar.gz" | sha512sum -c && \ 9 | tar xf raspbian-archive-keyring_20120528.2.tar.gz && \ 10 | mv raspbian-archive-keyring-20120528.2/keyrings/raspbian-archive-keyring.gpg /usr/share/keyrings/ && \ 11 | rm -r raspbian-archive-keyring_20120528.2.tar.gz raspbian-archive-keyring-20120528.2 12 | 13 | RUN /scripts/eng/common/cross/build-rootfs.sh armv6 bookworm no-lldb 14 | 15 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-crossdeps-llvm-amd64 16 | ARG ROOTFS_DIR 17 | 18 | COPY --from=builder "$ROOTFS_DIR" "$ROOTFS_DIR" 19 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net10.0/cross/freebsd/14/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/x64 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-crossdeps-builder-amd64 AS builder 4 | ARG ROOTFS_DIR 5 | 6 | # Install packages needed by the FreeBSD bootstrap scripts 7 | RUN tdnf install -y \ 8 | awk \ 9 | m4 && \ 10 | # The xz package in Azure Linux 3.0 doesn't provide liblzma.so, so we need to create a symlink to liblzma.so.5 11 | # so the FreeBSD bootstrap can find it. See https://github.com/microsoft/azurelinux/issues/9217 12 | ln -s /usr/lib/liblzma.so.5 /usr/lib/liblzma.so 13 | 14 | RUN /scripts/eng/common/cross/build-rootfs.sh freebsd14 x64 15 | 16 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-crossdeps-llvm-amd64 17 | ARG ROOTFS_DIR 18 | 19 | COPY --from=builder "$ROOTFS_DIR" "$ROOTFS_DIR" 20 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net10.0/cross/freebsd/14/arm64/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/arm64 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-crossdeps-builder-amd64 AS builder 4 | ARG ROOTFS_DIR 5 | 6 | # Install packages needed by the FreeBSD bootstrap scripts 7 | RUN tdnf install -y \ 8 | awk \ 9 | m4 \ 10 | # The xz package in Azure Linux 3.0 doesn't provide liblzma.so, so we need to create a symlink to liblzma.so.5 11 | # so the FreeBSD bootstrap can find it. See https://github.com/microsoft/azurelinux/issues/9217 12 | && ln -s /usr/lib/liblzma.so.5 /usr/lib/liblzma.so 13 | 14 | RUN /scripts/eng/common/cross/build-rootfs.sh freebsd14 arm64 15 | 16 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-crossdeps-llvm-amd64 17 | ARG ROOTFS_DIR 18 | 19 | COPY --from=builder "$ROOTFS_DIR" "$ROOTFS_DIR" 20 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net10.0/cross/loongarch64-musl/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/loongarch64 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-crossdeps-builder-amd64 AS builder 4 | ARG ROOTFS_DIR 5 | 6 | RUN /scripts/eng/common/cross/build-rootfs.sh loongarch64 alpineedge --skipemulation 7 | 8 | RUN TARGET_TRIPLE="loongarch64-alpine-linux-musl" && \ 9 | GCC_VER=$(basename "$(find "$ROOTFS_DIR/usr/include/c++/" -mindepth 1 -maxdepth 1 -type d | sort -V | head -n1)") && \ 10 | CPP_INCLUDES="$ROOTFS_DIR/usr/include/c++/$GCC_VER" && \ 11 | TRIPLET_INCLUDES=$([ -e "$CPP_INCLUDES/$TARGET_TRIPLE" ] && echo "$CPP_INCLUDES/$TARGET_TRIPLE" || echo "$(realpath "$CPP_INCLUDES/../../$TARGET_TRIPLE");$(realpath "$CPP_INCLUDES/../../$TARGET_TRIPLE/c++/$GCC_VER")") && \ 12 | echo "Using C++ includes $CPP_INCLUDES and $TRIPLET_INCLUDES to build for $TARGET_TRIPLE" && \ 13 | cmake -S llvm-project.src/runtimes -B runtimes \ 14 | -DCMAKE_BUILD_TYPE=Release \ 15 | -DCMAKE_ASM_COMPILER=clang \ 16 | -DCMAKE_C_COMPILER=clang \ 17 | -DCMAKE_CXX_COMPILER=clang++ \ 18 | -DCMAKE_ASM_COMPILER_TARGET="$TARGET_TRIPLE" \ 19 | -DCMAKE_C_COMPILER_TARGET="$TARGET_TRIPLE" \ 20 | -DCMAKE_CXX_COMPILER_TARGET="$TARGET_TRIPLE" \ 21 | # We're going to link the static libraries we build here into PIC images, so build the static libraries as PIC. 22 | -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ 23 | -DCMAKE_SYSROOT="$ROOTFS_DIR" \ 24 | # Specify linker to use for exes directly for CMake toolchain detection 25 | -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld" \ 26 | # Don't search for tools in the sysroot as we're cross-compiling 27 | -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM="NEVER" \ 28 | -DLLVM_USE_LINKER=lld \ 29 | -DLLVM_ENABLE_RUNTIMES="libcxx" \ 30 | -DLIBCXX_ENABLE_SHARED=OFF \ 31 | -DLIBCXX_HAS_MUSL_LIBC=ON \ 32 | -DLIBCXX_CXX_ABI=libstdc++ \ 33 | -DLIBCXX_CXX_ABI_INCLUDE_PATHS="$CPP_INCLUDES;$TRIPLET_INCLUDES" && \ 34 | cmake --build runtimes -j $(getconf _NPROCESSORS_ONLN) && \ 35 | cmake --install runtimes --prefix "$ROOTFS_DIR/usr" 36 | 37 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-crossdeps-llvm-amd64 38 | ARG ROOTFS_DIR 39 | 40 | COPY --from=builder $ROOTFS_DIR $ROOTFS_DIR 41 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net10.0/cross/ppc64le/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/ppc64le 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-crossdeps-builder-amd64 AS builder 4 | ARG ROOTFS_DIR 5 | 6 | RUN /scripts/eng/common/cross/build-rootfs.sh bionic ppc64le 7 | 8 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-crossdeps-llvm-amd64 9 | ARG ROOTFS_DIR 10 | 11 | COPY --from=builder "$ROOTFS_DIR" "$ROOTFS_DIR" 12 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net10.0/cross/riscv64-musl/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/riscv64 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-crossdeps-builder-amd64 AS builder 4 | ARG ROOTFS_DIR 5 | 6 | RUN /scripts/eng/common/cross/build-rootfs.sh riscv64 alpine3.20 --skipunmount 7 | 8 | RUN TARGET_TRIPLE="riscv64-alpine-linux-musl" && \ 9 | GCC_VER=$(basename "$(find "$ROOTFS_DIR/usr/include/c++/" -mindepth 1 -maxdepth 1 -type d | sort -V | head -n1)") && \ 10 | CPP_INCLUDES="$ROOTFS_DIR/usr/include/c++/$GCC_VER" && \ 11 | TRIPLET_INCLUDES=$([ -e "$CPP_INCLUDES/$TARGET_TRIPLE" ] && echo "$CPP_INCLUDES/$TARGET_TRIPLE" || echo "$(realpath "$CPP_INCLUDES/../../$TARGET_TRIPLE");$(realpath "$CPP_INCLUDES/../../$TARGET_TRIPLE/c++/$GCC_VER")") && \ 12 | echo "Using C++ includes $CPP_INCLUDES and $TRIPLET_INCLUDES to build for $TARGET_TRIPLE" && \ 13 | cmake -S llvm-project.src/runtimes -B runtimes \ 14 | -DCMAKE_BUILD_TYPE=Release \ 15 | -DCMAKE_ASM_COMPILER=clang \ 16 | -DCMAKE_C_COMPILER=clang \ 17 | -DCMAKE_CXX_COMPILER=clang++ \ 18 | -DCMAKE_ASM_COMPILER_TARGET="$TARGET_TRIPLE" \ 19 | -DCMAKE_C_COMPILER_TARGET="$TARGET_TRIPLE" \ 20 | -DCMAKE_CXX_COMPILER_TARGET="$TARGET_TRIPLE" \ 21 | # We're going to link the static libraries we build here into PIC images, so build the static libraries as PIC. 22 | -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ 23 | -DCMAKE_SYSROOT="$ROOTFS_DIR" \ 24 | # Specify linker to use for exes directly for CMake toolchain detection 25 | -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld" \ 26 | # Don't search for tools in the sysroot as we're cross-compiling 27 | -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM="NEVER" \ 28 | -DLLVM_USE_LINKER=lld \ 29 | -DLLVM_ENABLE_RUNTIMES="libcxx" \ 30 | -DLIBCXX_ENABLE_SHARED=OFF \ 31 | -DLIBCXX_HAS_MUSL_LIBC=ON \ 32 | -DLIBCXX_CXX_ABI=libstdc++ \ 33 | -DLIBCXX_CXX_ABI_INCLUDE_PATHS="$CPP_INCLUDES;$TRIPLET_INCLUDES" && \ 34 | cmake --build runtimes -j $(getconf _NPROCESSORS_ONLN) && \ 35 | cmake --install runtimes --prefix "$ROOTFS_DIR/usr" 36 | 37 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-crossdeps-llvm-amd64 38 | ARG ROOTFS_DIR 39 | 40 | COPY --from=builder $ROOTFS_DIR $ROOTFS_DIR 41 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net10.0/cross/s390x/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/s390x 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-crossdeps-builder-amd64 AS builder 4 | ARG ROOTFS_DIR 5 | 6 | RUN /scripts/eng/common/cross/build-rootfs.sh bionic s390x 7 | 8 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-crossdeps-llvm-amd64 9 | ARG ROOTFS_DIR 10 | 11 | COPY --from=builder "$ROOTFS_DIR" "$ROOTFS_DIR" 12 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net10.0/cross/x86/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/x86 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-crossdeps-builder-amd64 AS builder 4 | ARG ROOTFS_DIR 5 | 6 | # We don't ship linux-x86 binaries, so we don't need to make a custom libc++ build for servicing concerns. 7 | # We don't sanitize or instrument the linux-x64 build (as we don't ship it), so we don't need to build those runtime support libraries either. 8 | RUN /scripts/eng/common/cross/build-rootfs.sh x86 bionic --skipunmount 9 | 10 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-crossdeps-llvm-amd64 11 | ARG ROOTFS_DIR 12 | 13 | COPY --from=builder $ROOTFS_DIR $ROOTFS_DIR 14 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net10.0/crossdeps-llvm/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-crossdeps-builder-amd64 AS builder 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-crossdeps-amd64 4 | 5 | # dummy change to trigger cross/ images build after llvm update 6 | 7 | # Install LLVM that we built from source 8 | COPY --from=builder /opt/llvm /usr/local 9 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net10.0/crossdeps/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/azurelinux/base/core:3.0 2 | 3 | RUN tdnf update -y && \ 4 | tdnf install -y \ 5 | # Provides 'su', required by Azure DevOps 6 | ca-certificates \ 7 | git \ 8 | pigz \ 9 | shadow-utils \ 10 | util-linux \ 11 | wget \ 12 | # Common runtime build dependencies 13 | awk \ 14 | cpio \ 15 | file \ 16 | gcc \ 17 | make \ 18 | cmake \ 19 | diffutils \ 20 | icu \ 21 | tar \ 22 | # Crosscomponents build dependencies 23 | glibc-devel \ 24 | kernel-headers \ 25 | lttng-ust-devel \ 26 | # Jit rolling build dependency 27 | python3-pip \ 28 | # aspnetcore build dependencies 29 | nodejs \ 30 | npm \ 31 | # Provides functionality for AzureCLI AzDO task 32 | azure-cli \ 33 | powershell 34 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net10.0/fpm/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/azurelinux/base/core:3.0 2 | RUN tdnf install -y \ 3 | awk \ 4 | build-essential \ 5 | ca-certificates \ 6 | git \ 7 | icu \ 8 | rpm-build \ 9 | ruby \ 10 | # Provides useradd 11 | shadow-utils \ 12 | tar \ 13 | # Provides su 14 | util-linux \ 15 | # Provides sudo 16 | sudo \ 17 | && tdnf clean all \ 18 | && gem install fpm 19 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net10.0/source-build-test/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet/sdk:10.0-preview-azurelinux3.0-amd64 AS installer 2 | 3 | # Install scancode 4 | # Install instructions: https://scancode-toolkit.readthedocs.io/en/latest/getting-started/install.html#installation-as-a-library-via-pip 5 | # See latest release at https://github.com/nexB/scancode-toolkit/releases 6 | RUN SCANCODE_VERSION="32.3.3" \ 7 | && python3 -m venv /venv \ 8 | && source /venv/bin/activate \ 9 | && pip install scancode-toolkit==$SCANCODE_VERSION \ 10 | && pip install click==8.1.8 11 | 12 | FROM mcr.microsoft.com/dotnet/sdk:10.0-preview-azurelinux3.0-amd64 13 | 14 | COPY --from=installer /venv /venv 15 | 16 | # Install necessary dependencies 17 | RUN tdnf update -y \ 18 | && tdnf install -y \ 19 | libgomp \ 20 | shadow-utils \ 21 | util-linux \ 22 | && tdnf clean all 23 | 24 | # Setup a script which executes scancode in the virtual environment 25 | COPY ./run-scancode.sh /usr/local/bin/scancode 26 | RUN chmod +x /usr/local/bin/scancode -------------------------------------------------------------------------------- /src/azurelinux/3.0/net10.0/source-build-test/amd64/run-scancode.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -euo pipefail 3 | source /venv/bin/activate 4 | scancode "$@" 5 | deactivate -------------------------------------------------------------------------------- /src/azurelinux/3.0/net10.0/webassembly/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-cross-amd64 2 | 3 | # Dependencies for WebAssembly build 4 | RUN tdnf update -y \ 5 | && tdnf install -y \ 6 | # WebAssembly build dependencies 7 | which \ 8 | nodejs \ 9 | npm \ 10 | pigz \ 11 | python3 \ 12 | libxml2 \ 13 | unzip 14 | 15 | # WebAssembly build needs typescript 16 | RUN npm i -g typescript 17 | 18 | # Install V8 Engine 19 | SHELL ["/bin/bash", "-c"] 20 | 21 | ENV V8_VERSION=10.8.168 22 | RUN curl -sSL https://netcorenativeassets.blob.core.windows.net/resource-packages/external/linux/chromium-v8/v8-linux64-rel-${V8_VERSION}.zip -o ./v8.zip \ 23 | && unzip ./v8.zip -d /usr/local/v8 \ 24 | && echo $'#!/usr/bin/env bash\n\ 25 | "/usr/local/v8/d8" --snapshot_blob="/usr/local/v8/snapshot_blob.bin" "$@"\n' > /usr/local/bin/v8 \ 26 | && chmod +x /usr/local/bin/v8 27 | 28 | # Install Wasi toolchain 29 | ENV WASI_SDK_MAJOR_VERSION=25 30 | ENV WASI_SDK_VERSION=${WASI_SDK_MAJOR_VERSION}.0 31 | ENV WASI_SDK_PATH=/usr/local/wasi-sdk 32 | ENV WASI_SDK_URL=https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-${WASI_SDK_MAJOR_VERSION}/wasi-sdk-${WASI_SDK_VERSION}-x86_64-linux.tar.gz 33 | 34 | RUN mkdir -p ${WASI_SDK_PATH} \ 35 | && cd /tmp \ 36 | && curl -L -o /tmp/wasi-sdk.tar.gz ${WASI_SDK_URL} \ 37 | && tar --strip-components=1 -xvzf /tmp/wasi-sdk.tar.gz -C ${WASI_SDK_PATH} \ 38 | && echo ${WASI_SDK_VERSION} > ${WASI_SDK_PATH}/wasi-sdk-version.txt \ 39 | && echo ${WASI_SDK_VERSION} > ${WASI_SDK_PATH}/WASI-SDK-VERSION-${WASI_SDK_VERSION} \ 40 | && rm /tmp/wasi-sdk.tar.gz 41 | 42 | ENV WASMTIME_VERSION=27.0.0 43 | ENV WASMTIME_PATH=/usr/local/wasmtime 44 | ENV WASMTIME_URL=https://github.com/bytecodealliance/wasmtime/releases/download/v${WASMTIME_VERSION}/wasmtime-v${WASMTIME_VERSION}-x86_64-linux.tar.xz 45 | 46 | RUN mkdir -p ${WASMTIME_PATH} \ 47 | && cd /tmp \ 48 | && curl -L -o /tmp/wasmtime.tar.xz ${WASMTIME_URL} \ 49 | && tar --strip-components=1 -xvf /tmp/wasmtime.tar.xz -C ${WASMTIME_PATH} \ 50 | && echo ${WASMTIME_VERSION} > ${WASMTIME_PATH}/wasmtime-version.txt \ 51 | && rm /tmp/wasmtime.tar.xz \ 52 | && ln -s ${WASMTIME_PATH}/wasmtime /bin/wasmtime 53 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net8.0/android/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ANDROID_SDK_ROOT=/usr/local/android-sdk 2 | ARG ANDROID_NDK_VERSION=27.2.12479018 3 | ARG ANDROID_NDK_ROOT=$ANDROID_SDK_ROOT/ndk/$ANDROID_NDK_VERSION 4 | FROM mcr.microsoft.com/openjdk/jdk:17-mariner AS android-sdk-download 5 | ARG ANDROID_SDK_ROOT 6 | ARG ANDROID_NDK_VERSION 7 | ARG ANDROID_NDK_ROOT 8 | 9 | # Dependencies for Android SDK install 10 | RUN tdnf update -y \ 11 | && tdnf install -y \ 12 | # Android dependencies 13 | wget \ 14 | zip \ 15 | unzip 16 | 17 | # Grab the necessary Android SDK packages / tools 18 | RUN wget https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip \ 19 | && echo "2d2d50857e4eb553af5a6dc3ad507a17adf43d115264b1afc116f95c92e5e258 commandlinetools-linux-11076708_latest.zip" | sha256sum -c \ 20 | && mkdir -p /usr/local/cmdline-tools \ 21 | && unzip commandlinetools-linux-11076708_latest.zip -d /usr/local/cmdline-tools \ 22 | && rm -f commandlinetools-linux-11076708_latest.zip \ 23 | && yes | /usr/local/cmdline-tools/cmdline-tools/bin/sdkmanager --sdk_root="${ANDROID_SDK_ROOT}" --licenses 24 | 25 | RUN yes | /usr/local/cmdline-tools/cmdline-tools/bin/sdkmanager --licenses 26 | RUN /usr/local/cmdline-tools/cmdline-tools/bin/sdkmanager --sdk_root="${ANDROID_SDK_ROOT}" --install "build-tools;33.0.0" "platforms;android-33" "ndk;${ANDROID_NDK_VERSION}" 27 | 28 | # Remove all components of NDK 27 that are flagged by security scanners 29 | RUN rm -r ${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/python3/lib/python3.11/site-packages/ 30 | 31 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net8.0-crossdeps-llvm-amd64 32 | 33 | # Install Microsoft OpenJDK from the Microsoft OpenJDK 17 Mariner image. 34 | ENV LANG=en_US.UTF-8 35 | ENV JAVA_HOME=/usr/lib/jvm/msopenjdk-17 36 | ENV PATH=$JAVA_HOME/bin:$PATH 37 | COPY --from=mcr.microsoft.com/openjdk/jdk:17-mariner $JAVA_HOME $JAVA_HOME 38 | ARG ANDROID_SDK_ROOT 39 | ARG ANDROID_NDK_VERSION 40 | ARG ANDROID_NDK_ROOT 41 | 42 | 43 | # Dependencies for Android build 44 | RUN tdnf update -y \ 45 | && tdnf install -y \ 46 | # Common dependencies 47 | binutils \ 48 | # Android dependencies 49 | zip \ 50 | unzip \ 51 | # linux-bionic build dependencies 52 | openssl-devel 53 | 54 | ENV ANDROID_SDK_ROOT=${ANDROID_SDK_ROOT} 55 | ENV ANDROID_NDK_ROOT=${ANDROID_NDK_ROOT} 56 | 57 | COPY --from=android-sdk-download $ANDROID_SDK_ROOT $ANDROID_SDK_ROOT 58 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net8.0/android/docker/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net8.0-android-amd64 2 | 3 | RUN tdnf update -y \ 4 | && tdnf install -y \ 5 | moby-engine \ 6 | moby-cli 7 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net8.0/build/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet/runtime-deps:8.0-azurelinux3.0 2 | 3 | RUN tdnf install -y \ 4 | awk \ 5 | azure-cli \ 6 | # added to ensure latest patches over the base image 7 | curl \ 8 | git \ 9 | nodejs \ 10 | powershell \ 11 | # provides 'useradd', required by Azure DevOps 12 | shadow-utils \ 13 | tar \ 14 | # Provides 'su', required by Azure DevOps 15 | util-linux \ 16 | && tdnf clean all 17 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net8.0/cross/amd64-musl/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/x64 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net8.0-crossdeps-builder-amd64 AS builder 4 | ARG ROOTFS_DIR 5 | 6 | RUN /scripts/eng/common/cross/build-rootfs.sh x64 alpine3.13 --skipunmount 7 | 8 | 9 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net8.0-crossdeps-llvm-amd64 10 | ARG ROOTFS_DIR 11 | 12 | COPY --from=builder $ROOTFS_DIR $ROOTFS_DIR 13 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net8.0/cross/android/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net8.0-cross-amd64 AS crossrootx64 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net8.0-android-amd64 4 | 5 | # Copy crossrootfs from AMD64 build image, so we can build Android-targeting code for that arch 6 | COPY --from=crossrootx64 /crossrootfs/x64 /crossrootfs/x64 7 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net8.0/cross/android/openssl/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net8.0-cross-android-amd64 2 | 3 | # Copy the OpenSSL headers and libs from the x64 rootfs into the Anroid NDK so dotnet/runtime's 4 | # OpenSSL headers hack can find them for the linux-bionic build. 5 | RUN mkdir -p ${ANDROID_NDK_ROOT}/usr/local/include && \ 6 | mkdir ${ANDROID_NDK_ROOT}/usr/local/lib && \ 7 | cp -r /crossrootfs/x64/usr/include/openssl ${ANDROID_NDK_ROOT}/usr/local/include/openssl && \ 8 | cp -r /crossrootfs/x64/usr/include/x86_64-linux-gnu/openssl ${ANDROID_NDK_ROOT}/usr/local/include && \ 9 | cp -r $(readlink -f /crossrootfs/x64/usr/lib/x86_64-linux-gnu/libssl.so) ${ANDROID_NDK_ROOT}/usr/local/lib/libssl.so && \ 10 | cp -r $(readlink -f /crossrootfs/x64/usr/lib/x86_64-linux-gnu/libcrypto.so) ${ANDROID_NDK_ROOT}/usr/local/lib/libcrypto.so 11 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net8.0/cross/arm-musl/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/arm 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net8.0-crossdeps-builder-amd64 AS builder 4 | ARG ROOTFS_DIR 5 | 6 | RUN /scripts/eng/common/cross/build-rootfs.sh arm alpine3.13 --skipunmount 7 | 8 | 9 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net8.0-crossdeps-llvm-amd64 10 | ARG ROOTFS_DIR 11 | 12 | COPY --from=builder $ROOTFS_DIR $ROOTFS_DIR 13 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net8.0/cross/arm64-musl/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/arm64 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net8.0-crossdeps-builder-amd64 AS builder 4 | ARG ROOTFS_DIR 5 | 6 | RUN /scripts/eng/common/cross/build-rootfs.sh arm64 alpine3.13 --skipunmount 7 | 8 | 9 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net8.0-crossdeps-llvm-amd64 10 | ARG ROOTFS_DIR 11 | 12 | COPY --from=builder $ROOTFS_DIR $ROOTFS_DIR 13 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net8.0/cross/freebsd/14/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/x64 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net8.0-crossdeps-builder-amd64 AS builder 4 | ARG ROOTFS_DIR 5 | 6 | # Install packages needed by the FreeBSD bootstrap scripts 7 | RUN tdnf install -y \ 8 | awk \ 9 | m4 && \ 10 | # The xz package in Azure Linux 3.0 doesn't provide liblzma.so, so we need to create a symlink to liblzma.so.5 11 | # so the FreeBSD bootstrap can find it. See https://github.com/microsoft/azurelinux/issues/9217 12 | ln -s /usr/lib/liblzma.so.5 /usr/lib/liblzma.so 13 | 14 | RUN /scripts/eng/common/cross/build-rootfs.sh freebsd14 x64 15 | 16 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net8.0-crossdeps-llvm-amd64 17 | ARG ROOTFS_DIR 18 | 19 | COPY --from=builder "$ROOTFS_DIR" "$ROOTFS_DIR" 20 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net8.0/cross/ppc64le/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/ppc64le 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net8.0-crossdeps-builder-amd64 AS builder 4 | ARG ROOTFS_DIR 5 | 6 | RUN /scripts/eng/common/cross/build-rootfs.sh bionic ppc64le 7 | 8 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net8.0-crossdeps-llvm-amd64 9 | ARG ROOTFS_DIR 10 | 11 | COPY --from=builder "$ROOTFS_DIR" "$ROOTFS_DIR" 12 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net8.0/cross/s390x/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/s390x 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net8.0-crossdeps-builder-amd64 AS builder 4 | ARG ROOTFS_DIR 5 | 6 | RUN /scripts/eng/common/cross/build-rootfs.sh bionic s390x 7 | 8 | # build ld from binutils since llvm's lld only supports s390x since 18.0 but we're using 16.0 9 | # this can be removed once crossdeps-builder switches to llvm 18.0 10 | RUN tdnf install -y awk && \ 11 | wget https://sourceware.org/pub/binutils/snapshots/binutils-2.41.90.tar.xz -O binutils.tar.xz && \ 12 | echo "6e990c6e40000acedb9928fa6b6a32a164f3119740a95c40e7a85c6461dbdda5 binutils.tar.xz" | sha256sum -c && \ 13 | mkdir binutils.src && \ 14 | tar -xf binutils.tar.xz --directory=binutils.src --strip-components=1 && \ 15 | cd binutils.src && \ 16 | ./configure --target=s390x-linux-gnu --prefix=/binutils.install --disable-nls --disable-werror && \ 17 | make -j $(getconf _NPROCESSORS_ONLN) && \ 18 | make install -C ld 19 | 20 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net8.0-crossdeps-llvm-amd64 21 | ARG ROOTFS_DIR 22 | 23 | COPY --from=builder "$ROOTFS_DIR" "$ROOTFS_DIR" 24 | COPY --from=builder /binutils.install/s390x-linux-gnu/bin/ld /usr/local/bin/s390x-linux-gnu-ld 25 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net8.0/crossdeps-llvm/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net8.0-crossdeps-builder-amd64 AS builder 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net8.0-crossdeps-amd64 4 | 5 | # Install LLVM that we built from source 6 | COPY --from=builder /opt/llvm /usr/local 7 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net8.0/crossdeps/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/azurelinux/base/core:3.0 2 | 3 | RUN tdnf update -y && \ 4 | tdnf install -y \ 5 | ca-certificates \ 6 | git \ 7 | shadow-utils \ 8 | # Provides 'su', required by Azure DevOps 9 | util-linux \ 10 | wget \ 11 | # Common runtime build dependencies 12 | awk \ 13 | gcc \ 14 | make \ 15 | cmake \ 16 | diffutils \ 17 | icu \ 18 | tar \ 19 | zlib-devel \ 20 | # Crosscomponents build dependencies 21 | glibc-devel \ 22 | kernel-headers \ 23 | lttng-ust-devel \ 24 | # Jit rolling build dependency 25 | python3-pip \ 26 | # aspnetcore build dependencies 27 | nodejs \ 28 | npm \ 29 | # Provides functionality for AzureCLI AzDO task 30 | azure-cli \ 31 | powershell 32 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net8.0/fpm/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/azurelinux/base/core:3.0 2 | RUN tdnf install -y \ 3 | awk \ 4 | build-essential \ 5 | ca-certificates \ 6 | git \ 7 | icu \ 8 | rpm-build \ 9 | ruby \ 10 | # Provides useradd 11 | shadow-utils \ 12 | tar \ 13 | # Provides su 14 | util-linux \ 15 | # Provides sudo 16 | sudo \ 17 | && tdnf clean all \ 18 | && gem install fpm 19 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net9.0/android/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ANDROID_SDK_ROOT=/usr/local/android-sdk 2 | ARG ANDROID_NDK_VERSION=27.2.12479018 3 | ARG ANDROID_NDK_ROOT=$ANDROID_SDK_ROOT/ndk/$ANDROID_NDK_VERSION 4 | FROM mcr.microsoft.com/openjdk/jdk:17-mariner AS android-sdk-download 5 | ARG ANDROID_SDK_ROOT 6 | ARG ANDROID_NDK_VERSION 7 | ARG ANDROID_NDK_ROOT 8 | 9 | # Dependencies for Android SDK install 10 | RUN tdnf update -y \ 11 | && tdnf install -y \ 12 | # Android dependencies 13 | wget \ 14 | zip \ 15 | unzip 16 | 17 | # Grab the necessary Android SDK packages / tools 18 | RUN wget https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip \ 19 | && echo "2d2d50857e4eb553af5a6dc3ad507a17adf43d115264b1afc116f95c92e5e258 commandlinetools-linux-11076708_latest.zip" | sha256sum -c \ 20 | && mkdir -p /usr/local/cmdline-tools \ 21 | && unzip commandlinetools-linux-11076708_latest.zip -d /usr/local/cmdline-tools \ 22 | && rm -f commandlinetools-linux-11076708_latest.zip \ 23 | && yes | /usr/local/cmdline-tools/cmdline-tools/bin/sdkmanager --sdk_root="${ANDROID_SDK_ROOT}" --licenses 24 | 25 | RUN yes | /usr/local/cmdline-tools/cmdline-tools/bin/sdkmanager --licenses 26 | RUN /usr/local/cmdline-tools/cmdline-tools/bin/sdkmanager --sdk_root="${ANDROID_SDK_ROOT}" --install "build-tools;33.0.0" "platforms;android-33" "ndk;${ANDROID_NDK_VERSION}" 27 | 28 | # Remove all components of NDK that are flagged by security scanners 29 | RUN rm -r ${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/python3/lib/python3.11/site-packages/ 30 | 31 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-crossdeps-llvm-amd64 32 | 33 | # Install Microsoft OpenJDK from the Microsoft OpenJDK 17 Mariner image. 34 | ENV LANG=en_US.UTF-8 35 | ENV JAVA_HOME=/usr/lib/jvm/msopenjdk-17 36 | ENV PATH=$JAVA_HOME/bin:$PATH 37 | COPY --from=mcr.microsoft.com/openjdk/jdk:17-mariner $JAVA_HOME $JAVA_HOME 38 | ARG ANDROID_SDK_ROOT 39 | ARG ANDROID_NDK_VERSION 40 | ARG ANDROID_NDK_ROOT 41 | 42 | 43 | # Dependencies for Android build 44 | RUN tdnf update -y \ 45 | && tdnf install -y \ 46 | # Common dependencies 47 | binutils \ 48 | # Android dependencies 49 | zip \ 50 | unzip \ 51 | # linux-bionic build dependencies 52 | openssl-devel 53 | 54 | ENV ANDROID_SDK_ROOT=${ANDROID_SDK_ROOT} 55 | ENV ANDROID_NDK_ROOT=${ANDROID_NDK_ROOT} 56 | 57 | COPY --from=android-sdk-download $ANDROID_SDK_ROOT $ANDROID_SDK_ROOT 58 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net9.0/android/docker/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-android-amd64 2 | 3 | RUN tdnf update -y \ 4 | && tdnf install -y \ 5 | moby-engine \ 6 | moby-cli 7 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net9.0/build/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet/runtime-deps:9.0-azurelinux3.0 2 | 3 | RUN tdnf install -y \ 4 | awk \ 5 | azure-cli \ 6 | # added to ensure latest patches over the base image 7 | curl \ 8 | git \ 9 | nodejs \ 10 | powershell \ 11 | # provides 'useradd', required by Azure DevOps 12 | shadow-utils \ 13 | tar \ 14 | # Provides 'su', required by Azure DevOps 15 | util-linux \ 16 | && tdnf clean all 17 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net9.0/cross/amd64-musl/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/x64 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-crossdeps-builder-amd64 AS builder 4 | ARG ROOTFS_DIR 5 | 6 | RUN /scripts/eng/common/cross/build-rootfs.sh x64 alpine3.13 --skipunmount 7 | 8 | RUN TARGET_TRIPLE="x86_64-alpine-linux-musl" && \ 9 | GCC_VER=$(basename "$(find "$ROOTFS_DIR/usr/include/c++/" -mindepth 1 -maxdepth 1 -type d | sort -V | head -n1)") && \ 10 | CPP_INCLUDES="$ROOTFS_DIR/usr/include/c++/$GCC_VER" && \ 11 | TRIPLET_INCLUDES=$([ -e "$CPP_INCLUDES/$TARGET_TRIPLE" ] && echo "$CPP_INCLUDES/$TARGET_TRIPLE" || echo "$(realpath "$CPP_INCLUDES/../../$TARGET_TRIPLE");$(realpath "$CPP_INCLUDES/../../$TARGET_TRIPLE/c++/$GCC_VER")") && \ 12 | echo "Using C++ includes $CPP_INCLUDES and $TRIPLET_INCLUDES to build for $TARGET_TRIPLE" && \ 13 | cmake -S llvm-project.src/runtimes -B runtimes \ 14 | -DCMAKE_BUILD_TYPE=Release \ 15 | -DCMAKE_ASM_COMPILER=clang \ 16 | -DCMAKE_C_COMPILER=clang \ 17 | -DCMAKE_CXX_COMPILER=clang++ \ 18 | -DCMAKE_ASM_COMPILER_TARGET="$TARGET_TRIPLE" \ 19 | -DCMAKE_C_COMPILER_TARGET="$TARGET_TRIPLE" \ 20 | -DCMAKE_CXX_COMPILER_TARGET="$TARGET_TRIPLE" \ 21 | # We're going to link the static libraries we build here into PIC images, so build the static libraries as PIC. 22 | -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ 23 | -DCMAKE_SYSROOT="$ROOTFS_DIR" \ 24 | # Specify linker to use for exes directly for CMake toolchain detection 25 | -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld" \ 26 | # Don't search for tools in the sysroot as we're cross-compiling 27 | -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM="NEVER" \ 28 | -DLLVM_USE_LINKER=lld \ 29 | -DLLVM_ENABLE_RUNTIMES="libcxx" \ 30 | -DLIBCXX_ENABLE_SHARED=OFF \ 31 | -DLIBCXX_HAS_MUSL_LIBC=ON \ 32 | -DLIBCXX_CXX_ABI=libstdc++ \ 33 | -DLIBCXX_CXX_ABI_INCLUDE_PATHS="$CPP_INCLUDES;$TRIPLET_INCLUDES" && \ 34 | cmake --build runtimes -j $(getconf _NPROCESSORS_ONLN) && \ 35 | cmake --install runtimes --prefix "$ROOTFS_DIR/usr" 36 | 37 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-crossdeps-llvm-amd64 38 | ARG ROOTFS_DIR 39 | 40 | COPY --from=builder $ROOTFS_DIR $ROOTFS_DIR 41 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net9.0/cross/android/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-cross-amd64 AS crossrootx64 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-android-amd64 4 | 5 | # Copy crossrootfs from AMD64 build image, so we can build Android-targeting code for that arch 6 | COPY --from=crossrootx64 /crossrootfs/x64 /crossrootfs/x64 7 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net9.0/cross/android/openssl/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-cross-android-amd64 2 | 3 | # Copy the OpenSSL headers and libs from the x64 rootfs into the Anroid NDK so dotnet/runtime's 4 | # OpenSSL headers hack can find them for the linux-bionic build. 5 | RUN mkdir -p ${ANDROID_NDK_ROOT}/usr/local/include && \ 6 | mkdir ${ANDROID_NDK_ROOT}/usr/local/lib && \ 7 | cp -r /crossrootfs/x64/usr/include/openssl ${ANDROID_NDK_ROOT}/usr/local/include/openssl && \ 8 | cp -r /crossrootfs/x64/usr/include/x86_64-linux-gnu/openssl ${ANDROID_NDK_ROOT}/usr/local/include && \ 9 | cp -r $(readlink -f /crossrootfs/x64/usr/lib/x86_64-linux-gnu/libssl.so) ${ANDROID_NDK_ROOT}/usr/local/lib/libssl.so && \ 10 | cp -r $(readlink -f /crossrootfs/x64/usr/lib/x86_64-linux-gnu/libcrypto.so) ${ANDROID_NDK_ROOT}/usr/local/lib/libcrypto.so 11 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net9.0/cross/arm-musl/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/arm 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-crossdeps-builder-amd64 AS builder 4 | ARG ROOTFS_DIR 5 | 6 | RUN /scripts/eng/common/cross/build-rootfs.sh arm alpine3.13 --skipunmount 7 | 8 | RUN TARGET_TRIPLE="armv7-alpine-linux-musleabihf" && \ 9 | GCC_VER=$(basename "$(find "$ROOTFS_DIR/usr/include/c++/" -mindepth 1 -maxdepth 1 -type d | sort -V | head -n1)") && \ 10 | CPP_INCLUDES="$ROOTFS_DIR/usr/include/c++/$GCC_VER" && \ 11 | TRIPLET_INCLUDES=$([ -e "$CPP_INCLUDES/$TARGET_TRIPLE" ] && echo "$CPP_INCLUDES/$TARGET_TRIPLE" || echo "$(realpath "$CPP_INCLUDES/../../$TARGET_TRIPLE");$(realpath "$CPP_INCLUDES/../../$TARGET_TRIPLE/c++/$GCC_VER")") && \ 12 | echo "Using C++ includes $CPP_INCLUDES and $TRIPLET_INCLUDES to build for $TARGET_TRIPLE" && \ 13 | cmake -S llvm-project.src/runtimes -B runtimes \ 14 | -DCMAKE_BUILD_TYPE=Release \ 15 | -DCMAKE_ASM_COMPILER=clang \ 16 | -DCMAKE_C_COMPILER=clang \ 17 | -DCMAKE_CXX_COMPILER=clang++ \ 18 | -DCMAKE_ASM_COMPILER_TARGET="$TARGET_TRIPLE" \ 19 | -DCMAKE_C_COMPILER_TARGET="$TARGET_TRIPLE" \ 20 | -DCMAKE_CXX_COMPILER_TARGET="$TARGET_TRIPLE" \ 21 | # We're going to link the static libraries we build here into PIC images, so build the static libraries as PIC. 22 | -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ 23 | -DCMAKE_SYSROOT="$ROOTFS_DIR" \ 24 | # Specify linker to use for exes directly for CMake toolchain detection 25 | -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld" \ 26 | # Don't search for tools in the sysroot as we're cross-compiling 27 | -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM="NEVER" \ 28 | -DLLVM_USE_LINKER=lld \ 29 | -DLLVM_ENABLE_RUNTIMES="libcxx" \ 30 | -DLIBCXX_ENABLE_SHARED=OFF \ 31 | -DLIBCXX_HAS_MUSL_LIBC=ON \ 32 | -DLIBCXX_CXX_ABI=libstdc++ \ 33 | -DLIBCXX_CXX_ABI_INCLUDE_PATHS="$CPP_INCLUDES;$TRIPLET_INCLUDES" && \ 34 | cmake --build runtimes -j $(getconf _NPROCESSORS_ONLN) && \ 35 | cmake --install runtimes --prefix "$ROOTFS_DIR/usr" 36 | 37 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-crossdeps-llvm-amd64 38 | ARG ROOTFS_DIR 39 | 40 | COPY --from=builder $ROOTFS_DIR $ROOTFS_DIR 41 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net9.0/cross/arm64-musl/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/arm64 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-crossdeps-builder-amd64 AS builder 4 | ARG ROOTFS_DIR 5 | 6 | RUN /scripts/eng/common/cross/build-rootfs.sh arm64 alpine3.13 --skipunmount 7 | 8 | RUN TARGET_TRIPLE="aarch64-alpine-linux-musl" && \ 9 | GCC_VER=$(basename "$(find "$ROOTFS_DIR/usr/include/c++/" -mindepth 1 -maxdepth 1 -type d | sort -V | head -n1)") && \ 10 | CPP_INCLUDES="$ROOTFS_DIR/usr/include/c++/$GCC_VER" && \ 11 | TRIPLET_INCLUDES=$([ -e "$CPP_INCLUDES/$TARGET_TRIPLE" ] && echo "$CPP_INCLUDES/$TARGET_TRIPLE" || echo "$(realpath "$CPP_INCLUDES/../../$TARGET_TRIPLE");$(realpath "$CPP_INCLUDES/../../$TARGET_TRIPLE/c++/$GCC_VER")") && \ 12 | echo "Using C++ includes $CPP_INCLUDES and $TRIPLET_INCLUDES to build for $TARGET_TRIPLE" && \ 13 | cmake -S llvm-project.src/runtimes -B runtimes \ 14 | -DCMAKE_BUILD_TYPE=Release \ 15 | -DCMAKE_ASM_COMPILER=clang \ 16 | -DCMAKE_C_COMPILER=clang \ 17 | -DCMAKE_CXX_COMPILER=clang++ \ 18 | -DCMAKE_ASM_COMPILER_TARGET="$TARGET_TRIPLE" \ 19 | -DCMAKE_C_COMPILER_TARGET="$TARGET_TRIPLE" \ 20 | -DCMAKE_CXX_COMPILER_TARGET="$TARGET_TRIPLE" \ 21 | # We're going to link the static libraries we build here into PIC images, so build the static libraries as PIC. 22 | -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ 23 | -DCMAKE_SYSROOT="$ROOTFS_DIR" \ 24 | # Specify linker to use for exes directly for CMake toolchain detection 25 | -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld" \ 26 | # Don't search for tools in the sysroot as we're cross-compiling 27 | -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM="NEVER" \ 28 | -DLLVM_USE_LINKER=lld \ 29 | -DLLVM_ENABLE_RUNTIMES="libcxx" \ 30 | -DLIBCXX_ENABLE_SHARED=OFF \ 31 | -DLIBCXX_HAS_MUSL_LIBC=ON \ 32 | -DLIBCXX_CXX_ABI=libstdc++ \ 33 | -DLIBCXX_CXX_ABI_INCLUDE_PATHS="$CPP_INCLUDES;$TRIPLET_INCLUDES" && \ 34 | cmake --build runtimes -j $(getconf _NPROCESSORS_ONLN) && \ 35 | cmake --install runtimes --prefix "$ROOTFS_DIR/usr" 36 | 37 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-crossdeps-llvm-amd64 38 | ARG ROOTFS_DIR 39 | 40 | COPY --from=builder $ROOTFS_DIR $ROOTFS_DIR 41 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net9.0/cross/armv6/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/armv6 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-crossdeps-builder-amd64 AS builder 4 | ARG ROOTFS_DIR 5 | 6 | # Install raspbian package signing keys 7 | RUN wget http://raspbian.raspberrypi.org/raspbian/pool/main/r/raspbian-archive-keyring/raspbian-archive-keyring_20120528.2.tar.gz && \ 8 | echo "b3f22fa8d63d8d2f8b81f77784c3dc8f65fd6a10eadda63ac30a2da483ffc9d6ac72d0b5d3d0d5bdf2a61ca264a26fa071aed3acc780f062c8ab27a2e5ac6d49 raspbian-archive-keyring_20120528.2.tar.gz" | sha512sum -c && \ 9 | tar xf raspbian-archive-keyring_20120528.2.tar.gz && \ 10 | mv raspbian-archive-keyring-20120528.2/keyrings/raspbian-archive-keyring.gpg /usr/share/keyrings/ && \ 11 | rm -r raspbian-archive-keyring_20120528.2.tar.gz raspbian-archive-keyring-20120528.2 12 | 13 | RUN /scripts/eng/common/cross/build-rootfs.sh armv6 bookworm no-lldb 14 | 15 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-crossdeps-llvm-amd64 16 | ARG ROOTFS_DIR 17 | 18 | COPY --from=builder "$ROOTFS_DIR" "$ROOTFS_DIR" 19 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net9.0/cross/freebsd/14/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/x64 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-crossdeps-builder-amd64 AS builder 4 | ARG ROOTFS_DIR 5 | 6 | # Install packages needed by the FreeBSD bootstrap scripts 7 | RUN tdnf install -y \ 8 | awk \ 9 | m4 && \ 10 | # The xz package in Azure Linux 3.0 doesn't provide liblzma.so, so we need to create a symlink to liblzma.so.5 11 | # so the FreeBSD bootstrap can find it. See https://github.com/microsoft/azurelinux/issues/9217 12 | ln -s /usr/lib/liblzma.so.5 /usr/lib/liblzma.so 13 | 14 | RUN /scripts/eng/common/cross/build-rootfs.sh freebsd14 x64 15 | 16 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-crossdeps-llvm-amd64 17 | ARG ROOTFS_DIR 18 | 19 | COPY --from=builder "$ROOTFS_DIR" "$ROOTFS_DIR" 20 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net9.0/cross/freebsd/14/arm64/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/arm64 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-crossdeps-builder-amd64 AS builder 4 | ARG ROOTFS_DIR 5 | 6 | # Install packages needed by the FreeBSD bootstrap scripts 7 | RUN tdnf install -y \ 8 | awk \ 9 | m4 \ 10 | # The xz package in Azure Linux 3.0 doesn't provide liblzma.so, so we need to create a symlink to liblzma.so.5 11 | # so the FreeBSD bootstrap can find it. See https://github.com/microsoft/azurelinux/issues/9217 12 | && ln -s /usr/lib/liblzma.so.5 /usr/lib/liblzma.so 13 | 14 | RUN /scripts/eng/common/cross/build-rootfs.sh freebsd14 arm64 15 | 16 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-crossdeps-llvm-amd64 17 | ARG ROOTFS_DIR 18 | 19 | COPY --from=builder "$ROOTFS_DIR" "$ROOTFS_DIR" 20 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net9.0/cross/ppc64le/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/ppc64le 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-crossdeps-builder-amd64 AS builder 4 | ARG ROOTFS_DIR 5 | 6 | RUN /scripts/eng/common/cross/build-rootfs.sh bionic ppc64le 7 | 8 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-crossdeps-llvm-amd64 9 | ARG ROOTFS_DIR 10 | 11 | COPY --from=builder "$ROOTFS_DIR" "$ROOTFS_DIR" 12 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net9.0/cross/riscv64-musl/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/riscv64 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-crossdeps-builder-amd64 AS builder 4 | ARG ROOTFS_DIR 5 | 6 | RUN /scripts/eng/common/cross/build-rootfs.sh riscv64 alpine3.20 --skipunmount 7 | 8 | RUN TARGET_TRIPLE="riscv64-alpine-linux-musl" && \ 9 | GCC_VER=$(basename "$(find "$ROOTFS_DIR/usr/include/c++/" -mindepth 1 -maxdepth 1 -type d | sort -V | head -n1)") && \ 10 | CPP_INCLUDES="$ROOTFS_DIR/usr/include/c++/$GCC_VER" && \ 11 | TRIPLET_INCLUDES=$([ -e "$CPP_INCLUDES/$TARGET_TRIPLE" ] && echo "$CPP_INCLUDES/$TARGET_TRIPLE" || echo "$(realpath "$CPP_INCLUDES/../../$TARGET_TRIPLE");$(realpath "$CPP_INCLUDES/../../$TARGET_TRIPLE/c++/$GCC_VER")") && \ 12 | echo "Using C++ includes $CPP_INCLUDES and $TRIPLET_INCLUDES to build for $TARGET_TRIPLE" && \ 13 | cmake -S llvm-project.src/runtimes -B runtimes \ 14 | -DCMAKE_BUILD_TYPE=Release \ 15 | -DCMAKE_ASM_COMPILER=clang \ 16 | -DCMAKE_C_COMPILER=clang \ 17 | -DCMAKE_CXX_COMPILER=clang++ \ 18 | -DCMAKE_ASM_COMPILER_TARGET="$TARGET_TRIPLE" \ 19 | -DCMAKE_C_COMPILER_TARGET="$TARGET_TRIPLE" \ 20 | -DCMAKE_CXX_COMPILER_TARGET="$TARGET_TRIPLE" \ 21 | # We're going to link the static libraries we build here into PIC images, so build the static libraries as PIC. 22 | -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ 23 | -DCMAKE_SYSROOT="$ROOTFS_DIR" \ 24 | # Specify linker to use for exes directly for CMake toolchain detection 25 | -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld" \ 26 | # Don't search for tools in the sysroot as we're cross-compiling 27 | -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM="NEVER" \ 28 | -DLLVM_USE_LINKER=lld \ 29 | -DLLVM_ENABLE_RUNTIMES="libcxx" \ 30 | -DLIBCXX_ENABLE_SHARED=OFF \ 31 | -DLIBCXX_HAS_MUSL_LIBC=ON \ 32 | -DLIBCXX_CXX_ABI=libstdc++ \ 33 | -DLIBCXX_CXX_ABI_INCLUDE_PATHS="$CPP_INCLUDES;$TRIPLET_INCLUDES" && \ 34 | cmake --build runtimes -j $(getconf _NPROCESSORS_ONLN) && \ 35 | cmake --install runtimes --prefix "$ROOTFS_DIR/usr" 36 | 37 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-crossdeps-llvm-amd64 38 | ARG ROOTFS_DIR 39 | 40 | COPY --from=builder $ROOTFS_DIR $ROOTFS_DIR 41 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net9.0/cross/s390x/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/s390x 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-crossdeps-builder-amd64 AS builder 4 | ARG ROOTFS_DIR 5 | 6 | RUN /scripts/eng/common/cross/build-rootfs.sh bionic s390x 7 | 8 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-crossdeps-llvm-amd64 9 | ARG ROOTFS_DIR 10 | 11 | COPY --from=builder "$ROOTFS_DIR" "$ROOTFS_DIR" 12 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net9.0/cross/x86/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/x86 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-crossdeps-builder-amd64 AS builder 4 | ARG ROOTFS_DIR 5 | 6 | # We don't ship linux-x86 binaries, so we don't need to make a custom libc++ build for servicing concerns. 7 | # We don't sanitize or instrument the linux-x64 build (as we don't ship it), so we don't need to build those runtime support libraries either. 8 | RUN /scripts/eng/common/cross/build-rootfs.sh x86 xenial --skipunmount 9 | 10 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-crossdeps-llvm-amd64 11 | ARG ROOTFS_DIR 12 | 13 | COPY --from=builder $ROOTFS_DIR $ROOTFS_DIR 14 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net9.0/crossdeps-llvm/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-crossdeps-builder-amd64 AS builder 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-crossdeps-amd64 4 | 5 | # Install LLVM that we built from source 6 | COPY --from=builder /opt/llvm /usr/local 7 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net9.0/crossdeps/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/azurelinux/base/core:3.0 2 | 3 | RUN tdnf update -y && \ 4 | tdnf install -y \ 5 | ca-certificates \ 6 | git \ 7 | pigz \ 8 | shadow-utils \ 9 | # Provides 'su', required by Azure DevOps 10 | util-linux \ 11 | wget \ 12 | # Common runtime build dependencies 13 | awk \ 14 | cpio \ 15 | file \ 16 | gcc \ 17 | make \ 18 | cmake \ 19 | diffutils \ 20 | icu \ 21 | tar \ 22 | # Crosscomponents build dependencies 23 | glibc-devel \ 24 | kernel-headers \ 25 | lttng-ust-devel \ 26 | # Jit rolling build dependency 27 | python3-pip \ 28 | # aspnetcore build dependencies 29 | nodejs \ 30 | npm \ 31 | # Provides functionality for AzureCLI AzDO task 32 | azure-cli \ 33 | powershell 34 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net9.0/fpm/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/azurelinux/base/core:3.0 2 | RUN tdnf install -y \ 3 | awk \ 4 | build-essential \ 5 | ca-certificates \ 6 | git \ 7 | icu \ 8 | rpm-build \ 9 | ruby \ 10 | # Provides useradd 11 | shadow-utils \ 12 | tar \ 13 | # Provides su 14 | util-linux \ 15 | # Provides sudo 16 | sudo \ 17 | && tdnf clean all \ 18 | && gem install fpm 19 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net9.0/opt/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/azurelinux/base/core:3.0 2 | 3 | RUN tdnf update -y && \ 4 | tdnf install -y \ 5 | # Common dependencies 6 | ca-certificates \ 7 | git \ 8 | shadow-utils \ 9 | tar \ 10 | util-linux \ 11 | wget \ 12 | # Runtime dependencies 13 | icu \ 14 | # Optimization dependencies (provides llvm-profdata) 15 | llvm 16 | -------------------------------------------------------------------------------- /src/azurelinux/3.0/net9.0/webassembly/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-cross-amd64 2 | 3 | # Dependencies for WebAssembly build 4 | RUN tdnf update -y \ 5 | && tdnf install -y \ 6 | # WebAssembly build dependencies 7 | which \ 8 | nodejs \ 9 | npm \ 10 | pigz \ 11 | python3 \ 12 | libxml2 \ 13 | unzip 14 | 15 | # WebAssembly build needs typescript 16 | RUN npm i -g typescript 17 | 18 | # Install V8 Engine 19 | SHELL ["/bin/bash", "-c"] 20 | 21 | ENV V8_VERSION=10.8.168 22 | RUN curl -sSL https://netcorenativeassets.blob.core.windows.net/resource-packages/external/linux/chromium-v8/v8-linux64-rel-${V8_VERSION}.zip -o ./v8.zip \ 23 | && unzip ./v8.zip -d /usr/local/v8 \ 24 | && echo $'#!/usr/bin/env bash\n\ 25 | "/usr/local/v8/d8" --snapshot_blob="/usr/local/v8/snapshot_blob.bin" "$@"\n' > /usr/local/bin/v8 \ 26 | && chmod +x /usr/local/bin/v8 27 | 28 | # Install Wasi toolchain 29 | ENV WASI_SDK_VERSION=22 30 | ENV WASI_SDK_PATH=/usr/local/wasi-sdk 31 | ENV WASI_SDK_URL=https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-${WASI_SDK_VERSION}/wasi-sdk-${WASI_SDK_VERSION}.0-linux.tar.gz 32 | 33 | RUN mkdir -p ${WASI_SDK_PATH} \ 34 | && cd /tmp \ 35 | && curl -L -o /tmp/wasi-sdk.tar.gz ${WASI_SDK_URL} \ 36 | && tar --strip-components=1 -xvzf /tmp/wasi-sdk.tar.gz -C ${WASI_SDK_PATH} \ 37 | && echo ${WASI_SDK_VERSION} > ${WASI_SDK_PATH}/wasi-sdk-version.txt \ 38 | && rm /tmp/wasi-sdk.tar.gz 39 | 40 | ENV WASMTIME_VERSION=19.0.2 41 | ENV WASMTIME_PATH=/usr/local/wasmtime 42 | ENV WASMTIME_URL=https://github.com/bytecodealliance/wasmtime/releases/download/v${WASMTIME_VERSION}/wasmtime-v${WASMTIME_VERSION}-x86_64-linux.tar.xz 43 | 44 | RUN mkdir -p ${WASMTIME_PATH} \ 45 | && cd /tmp \ 46 | && curl -L -o /tmp/wasmtime.tar.xz ${WASMTIME_URL} \ 47 | && tar --strip-components=1 -xvf /tmp/wasmtime.tar.xz -C ${WASMTIME_PATH} \ 48 | && echo ${WASMTIME_VERSION} > ${WASMTIME_PATH}/wasmtime-version.txt \ 49 | && rm /tmp/wasmtime.tar.xz \ 50 | && ln -s ${WASMTIME_PATH}/wasmtime /bin/wasmtime 51 | -------------------------------------------------------------------------------- /src/cbl-mariner/2.0/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/cbl-mariner/base/core:2.0 2 | RUN tdnf install -y \ 3 | autoconf \ 4 | automake \ 5 | build-essential \ 6 | ca-certificates \ 7 | clang \ 8 | cmake \ 9 | doxygen \ 10 | gcc \ 11 | gdb \ 12 | git \ 13 | krb5-devel \ 14 | libcurl-devel \ 15 | libedit-devel \ 16 | libicu-devel \ 17 | libmetalink-devel \ 18 | libnghttp2-devel \ 19 | libssh2-devel \ 20 | libtool \ 21 | libunwind-devel \ 22 | libuuid-devel \ 23 | libxml2-devel \ 24 | lldb-devel \ 25 | lttng-ust-devel \ 26 | lzma \ 27 | make \ 28 | ncurses-devel \ 29 | numactl-devel \ 30 | openssl-devel \ 31 | pkgconf \ 32 | python3 \ 33 | python3-devel \ 34 | readline-devel \ 35 | sed \ 36 | sudo \ 37 | swig \ 38 | tar \ 39 | wget \ 40 | which \ 41 | xz \ 42 | zlib-devel \ 43 | && tdnf clean all 44 | -------------------------------------------------------------------------------- /src/cbl-mariner/2.0/cross/amd64-alpine/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/x64 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-crossdeps-builder AS builder 4 | ARG ROOTFS_DIR 5 | 6 | RUN /scripts/eng/common/cross/build-rootfs.sh x64 alpine3.13 --skipunmount 7 | 8 | 9 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-crossdeps-llvm 10 | ARG ROOTFS_DIR 11 | 12 | COPY --from=builder $ROOTFS_DIR $ROOTFS_DIR 13 | -------------------------------------------------------------------------------- /src/cbl-mariner/2.0/cross/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/x64 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-crossdeps-builder AS builder 4 | ARG ROOTFS_DIR 5 | 6 | RUN /scripts/eng/common/cross/build-rootfs.sh x64 xenial --skipunmount 7 | 8 | # Build compiler-rt profile library for PGO instrumentation 9 | RUN mkdir compiler-rt_build && cd compiler-rt_build && \ 10 | BUILD_FLAGS="-v --sysroot=$ROOTFS_DIR" \ 11 | TARGET_TRIPLE="x86_64-linux-gnu" && \ 12 | cmake ../llvm-project.src/compiler-rt \ 13 | -DCOMPILER_RT_BUILD_PROFILE=ON \ 14 | -DCOMPILER_RT_BUILD_SANITIZERS=ON \ 15 | -DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON \ 16 | \ 17 | -DCOMPILER_RT_BUILD_BUILTINS=OFF \ 18 | -DCOMPILER_RT_BUILD_CRT=OFF \ 19 | -DCOMPILER_RT_BUILD_GWP_ASAN=OFF \ 20 | -DCOMPILER_RT_BUILD_LIBFUZZER=OFF \ 21 | -DCOMPILER_RT_BUILD_MEMPROF=OFF \ 22 | -DCOMPILER_RT_BUILD_ORC=OFF \ 23 | -DCOMPILER_RT_BUILD_XRAY=OFF \ 24 | \ 25 | -DCMAKE_BUILD_TYPE=Release \ 26 | -DCMAKE_ASM_COMPILER=clang \ 27 | -DCMAKE_C_COMPILER=clang \ 28 | -DCMAKE_CXX_COMPILER=clang++ \ 29 | -DCMAKE_SHARED_LINKER_FLAGS="-fuse-ld=lld" \ 30 | -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld" \ 31 | -DCMAKE_ASM_COMPILER_TARGET="${TARGET_TRIPLE}" \ 32 | -DCMAKE_C_COMPILER_TARGET="${TARGET_TRIPLE}" \ 33 | -DCMAKE_CXX_COMPILER_TARGET="${TARGET_TRIPLE}" \ 34 | -DCMAKE_ASM_FLAGS="${BUILD_FLAGS}" \ 35 | -DCMAKE_C_FLAGS="${BUILD_FLAGS}" \ 36 | -DCMAKE_CXX_FLAGS="${BUILD_FLAGS}" && \ 37 | make -j $(getconf _NPROCESSORS_ONLN) 38 | 39 | RUN LLVM_VERSION=16.0.0 LLVM_VERSION_MAJOR="${LLVM_VERSION%%.*}" SANITIZER_RUNTIMES_DIR=/sanitizer-runtimes && \ 40 | mkdir -p $ROOTFS_DIR/usr/lib/llvm-${LLVM_VERSION_MAJOR}/lib/clang/${LLVM_VERSION}/lib/linux/ && \ 41 | cp compiler-rt_build/lib/linux/libclang_rt.profile-x86_64.a $ROOTFS_DIR/usr/lib/llvm-${LLVM_VERSION_MAJOR}/lib/clang/${LLVM_VERSION}/lib/linux/ && \ 42 | mkdir ${SANITIZER_RUNTIMES_DIR} && \ 43 | cp compiler-rt_build/lib/linux/libclang_rt.*-x86_64.a $SANITIZER_RUNTIMES_DIR 44 | 45 | 46 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-crossdeps-llvm 47 | ARG ROOTFS_DIR 48 | ARG LLVM_VERSION_MAJOR=16 49 | 50 | COPY --from=builder $ROOTFS_DIR $ROOTFS_DIR 51 | COPY --from=builder /sanitizer-runtimes /usr/local/lib/clang/$LLVM_VERSION_MAJOR/lib/linux/ 52 | COPY --from=builder compiler-rt_build/include/sanitizer /usr/local/lib/clang/$LLVM_VERSION_MAJOR/include/sanitizer/ 53 | -------------------------------------------------------------------------------- /src/cbl-mariner/2.0/cross/android/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-cross-amd64 AS crossrootx64 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-android 4 | 5 | # Copy crossrootfs from AMD64 build image, so we can build Android-targeting code for that arch 6 | COPY --from=crossrootx64 /crossrootfs/x64 /crossrootfs/x64 -------------------------------------------------------------------------------- /src/cbl-mariner/2.0/cross/arm-alpine/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/arm 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-crossdeps-builder AS builder 4 | ARG ROOTFS_DIR 5 | 6 | RUN /scripts/eng/common/cross/build-rootfs.sh arm alpine3.13 --skipunmount 7 | 8 | 9 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-crossdeps-llvm 10 | ARG ROOTFS_DIR 11 | 12 | COPY --from=builder $ROOTFS_DIR $ROOTFS_DIR 13 | -------------------------------------------------------------------------------- /src/cbl-mariner/2.0/cross/arm/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/arm 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-crossdeps-builder AS builder 4 | ARG ROOTFS_DIR 5 | 6 | RUN /scripts/eng/common/cross/build-rootfs.sh arm xenial --skipunmount 7 | 8 | # Build compiler-rt profile library for PGO instrumentation 9 | RUN mkdir compiler-rt_build && cd compiler-rt_build && \ 10 | BUILD_FLAGS="-v --sysroot=$ROOTFS_DIR" \ 11 | TARGET_TRIPLE="arm-linux-gnueabihf" && \ 12 | cmake ../llvm-project.src/compiler-rt \ 13 | -DCOMPILER_RT_BUILD_PROFILE=ON \ 14 | -DCOMPILER_RT_BUILD_SANITIZERS=ON \ 15 | -DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON \ 16 | \ 17 | -DCOMPILER_RT_BUILD_BUILTINS=OFF \ 18 | -DCOMPILER_RT_BUILD_CRT=OFF \ 19 | -DCOMPILER_RT_BUILD_GWP_ASAN=OFF \ 20 | -DCOMPILER_RT_BUILD_LIBFUZZER=OFF \ 21 | -DCOMPILER_RT_BUILD_MEMPROF=OFF \ 22 | -DCOMPILER_RT_BUILD_ORC=OFF \ 23 | -DCOMPILER_RT_BUILD_XRAY=OFF \ 24 | \ 25 | -DCMAKE_BUILD_TYPE=Release \ 26 | -DCMAKE_ASM_COMPILER=clang \ 27 | -DCMAKE_C_COMPILER=clang \ 28 | -DCMAKE_CXX_COMPILER=clang++ \ 29 | -DCMAKE_SHARED_LINKER_FLAGS="-fuse-ld=lld" \ 30 | -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld" \ 31 | -DCMAKE_ASM_COMPILER_TARGET="${TARGET_TRIPLE}" \ 32 | -DCMAKE_C_COMPILER_TARGET="${TARGET_TRIPLE}" \ 33 | -DCMAKE_CXX_COMPILER_TARGET="${TARGET_TRIPLE}" \ 34 | -DCMAKE_ASM_FLAGS="${BUILD_FLAGS}" \ 35 | -DCMAKE_C_FLAGS="${BUILD_FLAGS}" \ 36 | -DCMAKE_CXX_FLAGS="${BUILD_FLAGS}" && \ 37 | make -j $(getconf _NPROCESSORS_ONLN) 38 | 39 | RUN LLVM_VERSION=16.0.0 LLVM_VERSION_MAJOR="${LLVM_VERSION%%.*}" SANITIZER_RUNTIMES_DIR=/sanitizer-runtimes && \ 40 | mkdir -p $ROOTFS_DIR/usr/lib/llvm-${LLVM_VERSION_MAJOR}/lib/clang/${LLVM_VERSION}/lib/linux/ && \ 41 | cp compiler-rt_build/lib/linux/libclang_rt.profile-armhf.a $ROOTFS_DIR/usr/lib/llvm-${LLVM_VERSION_MAJOR}/lib/clang/${LLVM_VERSION}/lib/linux/ && \ 42 | mkdir ${SANITIZER_RUNTIMES_DIR} && \ 43 | cp compiler-rt_build/lib/linux/libclang_rt.*-armhf.a $SANITIZER_RUNTIMES_DIR 44 | 45 | 46 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-crossdeps-llvm 47 | ARG ROOTFS_DIR 48 | ARG LLVM_VERSION_MAJOR=16 49 | 50 | COPY --from=builder $ROOTFS_DIR $ROOTFS_DIR 51 | COPY --from=builder /sanitizer-runtimes /usr/local/lib/clang/$LLVM_VERSION_MAJOR/lib/linux/ 52 | COPY --from=builder compiler-rt_build/include/sanitizer /usr/local/lib/clang/$LLVM_VERSION_MAJOR/include/sanitizer/ 53 | -------------------------------------------------------------------------------- /src/cbl-mariner/2.0/cross/arm64-alpine/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/arm64 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-crossdeps-builder AS builder 4 | ARG ROOTFS_DIR 5 | 6 | RUN /scripts/eng/common/cross/build-rootfs.sh arm64 alpine3.13 --skipunmount 7 | 8 | 9 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-crossdeps-llvm 10 | ARG ROOTFS_DIR 11 | 12 | COPY --from=builder $ROOTFS_DIR $ROOTFS_DIR 13 | -------------------------------------------------------------------------------- /src/cbl-mariner/2.0/cross/arm64/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/arm64 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-crossdeps-builder AS builder 4 | ARG ROOTFS_DIR 5 | 6 | RUN /scripts/eng/common/cross/build-rootfs.sh arm64 xenial --skipunmount 7 | 8 | # Build compiler-rt profile library for PGO instrumentation 9 | RUN mkdir compiler-rt_build && cd compiler-rt_build && \ 10 | BUILD_FLAGS="-v --sysroot=$ROOTFS_DIR" \ 11 | TARGET_TRIPLE="aarch64-linux-gnu" && \ 12 | cmake ../llvm-project.src/compiler-rt \ 13 | -DCOMPILER_RT_BUILD_PROFILE=ON \ 14 | -DCOMPILER_RT_BUILD_SANITIZERS=ON \ 15 | -DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON \ 16 | \ 17 | -DCOMPILER_RT_BUILD_BUILTINS=OFF \ 18 | -DCOMPILER_RT_BUILD_CRT=OFF \ 19 | -DCOMPILER_RT_BUILD_GWP_ASAN=OFF \ 20 | -DCOMPILER_RT_BUILD_LIBFUZZER=OFF \ 21 | -DCOMPILER_RT_BUILD_MEMPROF=OFF \ 22 | -DCOMPILER_RT_BUILD_ORC=OFF \ 23 | -DCOMPILER_RT_BUILD_XRAY=OFF \ 24 | \ 25 | -DCMAKE_BUILD_TYPE=Release \ 26 | -DCMAKE_ASM_COMPILER=clang \ 27 | -DCMAKE_C_COMPILER=clang \ 28 | -DCMAKE_CXX_COMPILER=clang++ \ 29 | -DCMAKE_SHARED_LINKER_FLAGS="-fuse-ld=lld" \ 30 | -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld" \ 31 | -DCMAKE_ASM_COMPILER_TARGET="${TARGET_TRIPLE}" \ 32 | -DCMAKE_C_COMPILER_TARGET="${TARGET_TRIPLE}" \ 33 | -DCMAKE_CXX_COMPILER_TARGET="${TARGET_TRIPLE}" \ 34 | -DCMAKE_ASM_FLAGS="${BUILD_FLAGS}" \ 35 | -DCMAKE_C_FLAGS="${BUILD_FLAGS}" \ 36 | -DCMAKE_CXX_FLAGS="${BUILD_FLAGS}" && \ 37 | make -j $(getconf _NPROCESSORS_ONLN) 38 | 39 | RUN LLVM_VERSION=16.0.0 LLVM_VERSION_MAJOR="${LLVM_VERSION%%.*}" SANITIZER_RUNTIMES_DIR=/sanitizer-runtimes && \ 40 | mkdir -p $ROOTFS_DIR/usr/lib/llvm-${LLVM_VERSION_MAJOR}/lib/clang/${LLVM_VERSION}/lib/linux/ && \ 41 | cp compiler-rt_build/lib/linux/libclang_rt.profile-aarch64.a $ROOTFS_DIR/usr/lib/llvm-${LLVM_VERSION_MAJOR}/lib/clang/${LLVM_VERSION}/lib/linux/ && \ 42 | mkdir ${SANITIZER_RUNTIMES_DIR} && \ 43 | cp compiler-rt_build/lib/linux/libclang_rt.*-aarch64.a $SANITIZER_RUNTIMES_DIR 44 | 45 | 46 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-crossdeps-llvm 47 | ARG ROOTFS_DIR 48 | ARG LLVM_VERSION_MAJOR=16 49 | 50 | COPY --from=builder $ROOTFS_DIR $ROOTFS_DIR 51 | COPY --from=builder /sanitizer-runtimes /usr/local/lib/clang/$LLVM_VERSION_MAJOR/lib/linux/ 52 | COPY --from=builder compiler-rt_build/include/sanitizer /usr/local/lib/clang/$LLVM_VERSION_MAJOR/include/sanitizer/ 53 | -------------------------------------------------------------------------------- /src/cbl-mariner/2.0/crossdeps-llvm/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-crossdeps-builder AS builder 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-crossdeps 4 | 5 | # Install LLVM that we built from source 6 | COPY --from=builder /opt/llvm /usr/local 7 | -------------------------------------------------------------------------------- /src/cbl-mariner/2.0/crossdeps/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/cbl-mariner/base/core:2.0 2 | 3 | RUN tdnf update -y && \ 4 | tdnf install -y \ 5 | ca-certificates \ 6 | git \ 7 | # Provides 'su', required by Azure DevOps 8 | util-linux \ 9 | wget \ 10 | # Common runtime build dependencies 11 | awk \ 12 | cmake \ 13 | diffutils \ 14 | icu \ 15 | tar \ 16 | zlib-devel \ 17 | # Crosscomponents build dependencies 18 | glibc-devel \ 19 | kernel-headers \ 20 | lttng-ust-devel \ 21 | # Jit rolling build dependency 22 | python3-pip \ 23 | # diagnostics build dependency 24 | lldb-devel \ 25 | # Provides functionality for AzureCLI AzDO task 26 | azure-cli \ 27 | powershell 28 | 29 | # Validate checksums with keyring after https://github.com/microsoft/azurelinux/issues/3142 is resolved 30 | ENV NODE_VERSION=20.11.1 31 | RUN mkdir /usr/share/node && \ 32 | curl -O https://nodejs.org/dist/v${NODE_VERSION}/SHASUMS256.txt && \ 33 | curl -O -sSL https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.xz && \ 34 | grep node-v${NODE_VERSION}-linux-x64.tar.xz SHASUMS256.txt | sha256sum -c - && \ 35 | tar xf node-v${NODE_VERSION}-linux-x64.tar.xz -J -C /usr/share/node --strip-components=1 && \ 36 | ln -s /usr/share/node/bin/node /usr/local/bin/node && \ 37 | ln -s /usr/share/node/bin/npm /usr/local/bin/npm && \ 38 | ln -s /usr/share/node/bin/npx /usr/local/bin/npx && \ 39 | rm SHASUMS256.txt && \ 40 | rm node-v${NODE_VERSION}-linux-x64.tar.xz 41 | -------------------------------------------------------------------------------- /src/cbl-mariner/2.0/fpm/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/cbl-mariner/base/core:2.0 2 | RUN tdnf install -y \ 3 | awk \ 4 | build-essential \ 5 | ca-certificates \ 6 | git \ 7 | icu \ 8 | rpm-build \ 9 | ruby \ 10 | # Provides useradd 11 | shadow-utils \ 12 | tar \ 13 | # Provides su 14 | util-linux \ 15 | # Provides sudo 16 | sudo \ 17 | # Provides functionality for AzureCLI AzDO task 18 | azure-cli \ 19 | powershell \ 20 | && tdnf clean all \ 21 | && gem install fpm 22 | -------------------------------------------------------------------------------- /src/cbl-mariner/2.0/helix/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/cbl-mariner/base/core:2.0 2 | 3 | # Install Helix Dependencies 4 | 5 | ENV LANG=en_US.utf8 6 | 7 | RUN tdnf install --setopt tsflags=nodocs --refresh -y \ 8 | ca-certificates-microsoft \ 9 | gcc \ 10 | icu \ 11 | iputils \ 12 | libmsquic \ 13 | llvm \ 14 | python3-pip \ 15 | shadow-utils \ 16 | sudo \ 17 | tar \ 18 | tzdata \ 19 | which \ 20 | && tdnf clean all 21 | 22 | RUN ln -sf /usr/bin/python3 /usr/bin/python 23 | 24 | # create helixbot user and give rights to sudo without password 25 | RUN /usr/sbin/useradd -c '' --uid 1000 --shell /bin/bash --groups adm helixbot && \ 26 | chmod 755 /root && \ 27 | echo "helixbot ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/helixbot && \ 28 | mkdir /home/helixbot/ && chown -R helixbot /home/helixbot/ 29 | 30 | USER helixbot 31 | WORKDIR /home/helixbot 32 | ENV VIRTUAL_ENV=/home/helixbot/.vsts-env 33 | 34 | RUN python -m venv $VIRTUAL_ENV && \ 35 | ${VIRTUAL_ENV}/bin/pip download --no-deps helix-scripts --index-url https://dnceng.pkgs.visualstudio.com/public/_packaging/helix-client-prod/pypi/simple && \ 36 | ${VIRTUAL_ENV}/bin/pip install --upgrade pip && \ 37 | ${VIRTUAL_ENV}/bin/pip install ./helix_scripts-*-py3-none-any.whl && \ 38 | rm ./helix_scripts-*-py3-none-any.whl 39 | ENV PATH="${VIRTUAL_ENV}/bin:${PATH}" 40 | -------------------------------------------------------------------------------- /src/cbl-mariner/2.0/opt/arm64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/cbl-mariner/base/core:2.0 2 | 3 | RUN tdnf update -y && \ 4 | tdnf install -y \ 5 | # Common dependencies 6 | ca-certificates \ 7 | git \ 8 | tar \ 9 | util-linux \ 10 | wget \ 11 | # Runtime dependencies 12 | icu \ 13 | # Optimization dependencies (provides llvm-profdata) 14 | llvm16 15 | -------------------------------------------------------------------------------- /src/centos-stream/10/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM quay.io/centos/centos:stream10 2 | 3 | # Install dependencies 4 | RUN dnf upgrade --refresh -y \ 5 | && dnf install --setopt tsflags=nodocs -y \ 6 | dnf-plugins-core \ 7 | # rhel/10 packages don't exist yet, so we use the rhel/9 packages 8 | && dnf config-manager --add-repo=https://packages.microsoft.com/rhel/9/prod/config.repo \ 9 | && dnf config-manager --set-enabled crb \ 10 | && dnf install --setopt tsflags=nodocs -y \ 11 | "perl(Time::HiRes)" \ 12 | autoconf \ 13 | automake \ 14 | brotli-devel \ 15 | clang \ 16 | cmake \ 17 | cpio \ 18 | curl-devel \ 19 | doxygen \ 20 | elfutils \ 21 | file \ 22 | findutils \ 23 | gcc \ 24 | gdb \ 25 | git \ 26 | glibc-langpack-en \ 27 | hostname \ 28 | iproute \ 29 | jq \ 30 | krb5-devel \ 31 | libcurl-devel \ 32 | libedit-devel \ 33 | libicu-devel \ 34 | libidn2-devel \ 35 | libnghttp2-devel \ 36 | libtool \ 37 | libuuid-devel \ 38 | libxml2-devel \ 39 | lld \ 40 | lldb-devel \ 41 | llvm \ 42 | lttng-ust-devel \ 43 | lzma \ 44 | make \ 45 | ncurses-devel \ 46 | numactl-devel \ 47 | openssl-devel \ 48 | pigz \ 49 | powershell \ 50 | procps-ng \ 51 | python3 \ 52 | python3-devel \ 53 | readline-devel \ 54 | sudo \ 55 | swig \ 56 | tar \ 57 | wget \ 58 | which \ 59 | xz \ 60 | zlib-devel \ 61 | && dnf clean all 62 | -------------------------------------------------------------------------------- /src/centos-stream/10/helix/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM quay.io/centos/centos:stream10 AS venv 2 | 3 | RUN dnf upgrade --refresh -y \ 4 | && dnf install --setopt tsflags=nodocs -y \ 5 | gcc \ 6 | gcc-c++ \ 7 | python3 \ 8 | python3-devel \ 9 | python3-pip 10 | 11 | RUN python3 -m venv /venv \ 12 | && . /venv/bin/activate \ 13 | && pip download --no-deps helix-scripts --index-url https://dnceng.pkgs.visualstudio.com/public/_packaging/helix-client-prod/pypi/simple \ 14 | && pip install ./helix_scripts-*-py3-none-any.whl \ 15 | && rm ./helix_scripts-*-py3-none-any.whl 16 | 17 | FROM quay.io/centos/centos:stream10 18 | 19 | # Install dependencies 20 | RUN dnf upgrade --refresh -y \ 21 | && dnf install --setopt tsflags=nodocs -y \ 22 | dnf-plugins-core \ 23 | && dnf config-manager --add-repo=https://packages.microsoft.com/rhel/9/prod/config.repo \ 24 | && dnf install --setopt tsflags=nodocs -y --allowerasing \ 25 | autoconf \ 26 | automake \ 27 | curl \ 28 | file \ 29 | git-core \ 30 | iputils \ 31 | libicu \ 32 | libmsquic \ 33 | libtool \ 34 | lldb \ 35 | llvm \ 36 | make \ 37 | openssl \ 38 | openssl-devel \ 39 | perl \ 40 | python3 \ 41 | python3-devel \ 42 | python3-pip \ 43 | sudo \ 44 | tar \ 45 | wget \ 46 | which \ 47 | && dnf clean all 48 | 49 | ENV LANG=en_US.utf8 50 | 51 | # create helixbot user and give rights to sudo without password 52 | RUN /usr/sbin/adduser --uid 1000 --shell /bin/bash --gid adm helixbot \ 53 | && chmod 755 /root \ 54 | && echo "helixbot ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/helixbot 55 | 56 | USER helixbot 57 | ENV VIRTUAL_ENV=/home/helixbot/.vsts-env 58 | 59 | # Install Helix Dependencies 60 | RUN python3 -m venv $VIRTUAL_ENV 61 | ENV PATH="${VIRTUAL_ENV}/bin:${PATH}" 62 | COPY --from=venv --chown=helixbot /venv $VIRTUAL_ENV 63 | -------------------------------------------------------------------------------- /src/centos-stream/9/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM quay.io/centos/centos:stream9 2 | 3 | # Install dependencies 4 | RUN dnf upgrade --refresh -y \ 5 | && dnf install --setopt tsflags=nodocs -y \ 6 | dnf-plugins-core \ 7 | && dnf config-manager --add-repo=https://packages.microsoft.com/rhel/9/prod/config.repo \ 8 | && dnf config-manager --set-enabled crb \ 9 | && dnf module install --setopt tsflags=nodocs -y \ 10 | nodejs:20/common \ 11 | && dnf install --setopt tsflags=nodocs -y \ 12 | "perl(Time::HiRes)" \ 13 | autoconf \ 14 | automake \ 15 | azure-cli \ 16 | brotli-devel \ 17 | clang \ 18 | cmake \ 19 | cpio \ 20 | curl-devel \ 21 | doxygen \ 22 | elfutils \ 23 | file \ 24 | findutils \ 25 | gcc \ 26 | gdb \ 27 | git \ 28 | glibc-langpack-en \ 29 | hostname \ 30 | iproute \ 31 | jq \ 32 | krb5-devel \ 33 | libcurl-devel \ 34 | libedit-devel \ 35 | libicu-devel \ 36 | libidn2-devel \ 37 | libnghttp2-devel \ 38 | libtool \ 39 | libuuid-devel \ 40 | libxml2-devel \ 41 | lld \ 42 | lldb-devel \ 43 | llvm \ 44 | lttng-ust-devel \ 45 | lzma \ 46 | make \ 47 | ncurses-devel \ 48 | numactl-devel \ 49 | openssl-devel \ 50 | pigz \ 51 | powershell \ 52 | procps-ng \ 53 | python3 \ 54 | python3-devel \ 55 | readline-devel \ 56 | sudo \ 57 | swig \ 58 | tar \ 59 | wget \ 60 | which \ 61 | xz \ 62 | zlib-devel \ 63 | && dnf clean all 64 | 65 | ENV \ 66 | NO_UPDATE_NOTIFIER=true \ 67 | # Sha1 is disabled by default centos:stream9 but sevaral CI jobs still rely on it. 68 | OPENSSL_ENABLE_SHA1_SIGNATURES=1 69 | -------------------------------------------------------------------------------- /src/centos-stream/9/helix/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM quay.io/centos/centos:stream9 2 | 3 | # Install dependencies 4 | RUN dnf upgrade --refresh -y \ 5 | # Required to install libunwind from the EPEL repo 6 | && dnf install -y epel-release \ 7 | && dnf install --setopt tsflags=nodocs -y \ 8 | dnf-plugins-core \ 9 | && dnf config-manager --add-repo=https://packages.microsoft.com/rhel/9/prod/config.repo \ 10 | && dnf install --setopt tsflags=nodocs -y --allowerasing \ 11 | autoconf \ 12 | automake \ 13 | curl \ 14 | file \ 15 | gcc \ 16 | gcc-c++ \ 17 | gdb \ 18 | git-core \ 19 | iputils \ 20 | libicu \ 21 | libmsquic \ 22 | libtool \ 23 | llvm \ 24 | make \ 25 | openssl \ 26 | openssl-devel \ 27 | perl \ 28 | python3 \ 29 | python3-devel \ 30 | python3-pip \ 31 | sudo \ 32 | tar \ 33 | wget \ 34 | which \ 35 | # NativeAOT and runtime dependencies 36 | zlib-devel \ 37 | libunwind \ 38 | && dnf clean all 39 | 40 | RUN ln -sf /usr/bin/python3 /usr/bin/python 41 | 42 | ENV LANG=en_US.utf8 43 | 44 | # create helixbot user and give rights to sudo without password 45 | RUN /usr/sbin/adduser --uid 1000 --shell /bin/bash --gid adm helixbot \ 46 | && chmod 755 /root \ 47 | && echo "helixbot ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/helixbot 48 | 49 | USER helixbot 50 | WORKDIR /home/helixbot 51 | ENV VIRTUAL_ENV=/home/helixbot/.vsts-env 52 | 53 | RUN python -m venv $VIRTUAL_ENV && \ 54 | ${VIRTUAL_ENV}/bin/pip download --no-deps helix-scripts --index-url https://dnceng.pkgs.visualstudio.com/public/_packaging/helix-client-prod/pypi/simple && \ 55 | ${VIRTUAL_ENV}/bin/pip install ./helix_scripts-*-py3-none-any.whl && \ 56 | rm ./helix_scripts-*-py3-none-any.whl 57 | ENV PATH="${VIRTUAL_ENV}/bin:${PATH}" 58 | -------------------------------------------------------------------------------- /src/debian/11/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM library/debian:bullseye 2 | 3 | # Dependencies for generic .NET Core builds and the base toolchain we need to 4 | # build anything (clang, cmake, make and the like) 5 | RUN apt-get update \ 6 | && apt-get upgrade -y \ 7 | && apt-get install -y \ 8 | apt-transport-https \ 9 | curl \ 10 | software-properties-common \ 11 | && curl -sL https://packages.microsoft.com/config/debian/11/packages-microsoft-prod.deb -o packages-microsoft-prod.deb \ 12 | && dpkg -i packages-microsoft-prod.deb \ 13 | && rm packages-microsoft-prod.deb \ 14 | && apt-get update \ 15 | && apt-get install -y \ 16 | autoconf \ 17 | automake \ 18 | azure-cli \ 19 | build-essential \ 20 | clang \ 21 | cmake \ 22 | elfutils \ 23 | file \ 24 | g++ \ 25 | gettext \ 26 | gdb \ 27 | git \ 28 | gnupg \ 29 | jq \ 30 | libcurl4-openssl-dev \ 31 | libicu-dev \ 32 | libkrb5-dev \ 33 | liblldb-dev \ 34 | liblttng-ust-dev \ 35 | libnuma-dev \ 36 | libssl-dev \ 37 | libssl1.1 \ 38 | libtool \ 39 | libunwind8-dev \ 40 | lldb \ 41 | llvm \ 42 | locales \ 43 | make \ 44 | pigz \ 45 | powershell \ 46 | python-lldb \ 47 | sudo \ 48 | tar \ 49 | uuid-dev \ 50 | zip \ 51 | zlib1g-dev \ 52 | && rm -rf /var/lib/apt/lists/* 53 | 54 | # .NET SDK MSBuild requires US.UTF-8 locale to execute tasks 55 | # These commands are from https://askubuntu.com/a/1027038 56 | RUN echo "locales locales/default_environment_locale select en_US.UTF-8" | debconf-set-selections \ 57 | && echo "locales locales/locales_to_be_generated multiselect en_US.UTF-8 UTF-8" | debconf-set-selections \ 58 | && rm "/etc/locale.gen" \ 59 | && dpkg-reconfigure --frontend noninteractive locales 60 | -------------------------------------------------------------------------------- /src/debian/11/helix/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM library/debian:bullseye 2 | 3 | # Install Helix Dependencies 4 | 5 | RUN apt-get update \ 6 | && apt-get upgrade -y \ 7 | && apt-get install -y \ 8 | apt-transport-https \ 9 | curl \ 10 | software-properties-common \ 11 | && curl -sL https://packages.microsoft.com/config/debian/11/packages-microsoft-prod.deb -o packages-microsoft-prod.deb \ 12 | && dpkg -i packages-microsoft-prod.deb \ 13 | && rm packages-microsoft-prod.deb \ 14 | && apt-get update \ 15 | && apt-get install -y \ 16 | autoconf \ 17 | automake \ 18 | at \ 19 | build-essential \ 20 | gcc \ 21 | gdb \ 22 | git \ 23 | iputils-ping \ 24 | libcurl4 \ 25 | libffi-dev \ 26 | libicu-dev \ 27 | libmsquic \ 28 | libssl-dev \ 29 | libtool \ 30 | libunwind8 \ 31 | llvm \ 32 | locales \ 33 | locales-all \ 34 | python3-dev \ 35 | python3-pip \ 36 | python3-venv \ 37 | sudo \ 38 | tzdata \ 39 | unzip \ 40 | && rm -rf /var/lib/apt/lists/* \ 41 | && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8 42 | 43 | ENV LANG=en_US.utf8 44 | 45 | RUN ln -sf /usr/bin/python3 /usr/bin/python 46 | 47 | # Create helixbot user and give rights to sudo without password 48 | RUN /usr/sbin/adduser --disabled-password --gecos '' --uid 1000 --shell /bin/bash --ingroup adm helixbot \ 49 | && chmod 755 /root \ 50 | && echo "helixbot ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/helixbot 51 | 52 | USER helixbot 53 | WORKDIR /home/helixbot 54 | ENV VIRTUAL_ENV=/home/helixbot/.vsts-env 55 | 56 | RUN python -m venv $VIRTUAL_ENV && \ 57 | ${VIRTUAL_ENV}/bin/pip download --no-deps helix-scripts --index-url https://dnceng.pkgs.visualstudio.com/public/_packaging/helix-client-prod/pypi/simple && \ 58 | ${VIRTUAL_ENV}/bin/pip install --upgrade pip && \ 59 | ${VIRTUAL_ENV}/bin/pip install ./helix_scripts-*-py3-none-any.whl && \ 60 | rm ./helix_scripts-*-py3-none-any.whl 61 | ENV PATH="${VIRTUAL_ENV}/bin:${PATH}" 62 | -------------------------------------------------------------------------------- /src/debian/11/helix/arm64v8/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM library/debian:bullseye 2 | 3 | # Install Helix Dependencies 4 | 5 | RUN apt-get update \ 6 | && apt-get upgrade -y \ 7 | && apt-get install -y \ 8 | apt-transport-https \ 9 | curl \ 10 | software-properties-common \ 11 | && curl -sL https://packages.microsoft.com/config/debian/11/packages-microsoft-prod.deb -o packages-microsoft-prod.deb \ 12 | && dpkg -i packages-microsoft-prod.deb \ 13 | && rm packages-microsoft-prod.deb \ 14 | && apt-get update \ 15 | && apt-get install -y \ 16 | autoconf \ 17 | automake \ 18 | at \ 19 | build-essential \ 20 | cmake \ 21 | gcc \ 22 | gdb \ 23 | git \ 24 | iputils-ping \ 25 | libcurl4 \ 26 | libffi-dev \ 27 | libicu-dev \ 28 | libmsquic \ 29 | libssl-dev \ 30 | libtool \ 31 | libunwind8 \ 32 | llvm \ 33 | locales \ 34 | locales-all \ 35 | python3-dev \ 36 | python3-pip \ 37 | python3-venv \ 38 | sudo \ 39 | tzdata \ 40 | unzip \ 41 | && rm -rf /var/lib/apt/lists/* \ 42 | && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8 43 | 44 | ENV LANG=en_US.utf8 45 | 46 | RUN ln -sf /usr/bin/python3 /usr/bin/python 47 | 48 | # Create helixbot user and give rights to sudo without password 49 | RUN /usr/sbin/adduser --disabled-password --gecos '' --uid 1000 --shell /bin/bash --ingroup adm helixbot \ 50 | && chmod 755 /root \ 51 | && echo "helixbot ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/helixbot 52 | 53 | USER helixbot 54 | WORKDIR /home/helixbot 55 | ENV VIRTUAL_ENV=/home/helixbot/.vsts-env 56 | 57 | RUN python -m venv $VIRTUAL_ENV && \ 58 | ${VIRTUAL_ENV}/bin/pip download --no-deps helix-scripts --index-url https://dnceng.pkgs.visualstudio.com/public/_packaging/helix-client-prod/pypi/simple && \ 59 | ${VIRTUAL_ENV}/bin/pip install --upgrade pip && \ 60 | ${VIRTUAL_ENV}/bin/pip install ./helix_scripts-*-py3-none-any.whl && \ 61 | rm ./helix_scripts-*-py3-none-any.whl 62 | ENV PATH="${VIRTUAL_ENV}/bin:${PATH}" 63 | -------------------------------------------------------------------------------- /src/debian/12/gcc15/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM library/gcc:15-bookworm 2 | 3 | # Dependencies for dotnet/runtime native components. 4 | RUN apt-get update \ 5 | && apt-get upgrade -y \ 6 | && apt-get install -y \ 7 | apt-transport-https \ 8 | curl \ 9 | software-properties-common \ 10 | && curl -sL https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb -o packages-microsoft-prod.deb \ 11 | && dpkg -i packages-microsoft-prod.deb \ 12 | && rm packages-microsoft-prod.deb \ 13 | && apt-get update \ 14 | && apt-get install -y \ 15 | azure-cli \ 16 | cmake \ 17 | gdb \ 18 | git \ 19 | iputils-ping \ 20 | libicu-dev \ 21 | libkrb5-dev \ 22 | liblttng-ust-dev \ 23 | libssl-dev \ 24 | liblldb-dev \ 25 | lttng-tools \ 26 | locales \ 27 | locales-all \ 28 | pigz \ 29 | powershell \ 30 | python3-dev \ 31 | python3-pip \ 32 | sudo \ 33 | tzdata \ 34 | && rm -rf /var/lib/apt/lists/* \ 35 | && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8 36 | 37 | ENV LANG=en_US.utf8 38 | 39 | # These symlinks are required because this docker has gcc-12 suffixed with version and gcc-15 unsuffixed in PATH. 40 | # In the runtime repo, we (by design) give precedence to suffixed compilers before selecting unsuffixed one in PATH. 41 | RUN ln -s $(command -v gcc) /usr/bin/gcc-15 \ 42 | && ln -s $(command -v g++) /usr/bin/g++-15 43 | -------------------------------------------------------------------------------- /src/debian/12/helix/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM library/debian:bookworm AS venv 2 | 3 | RUN apt-get update \ 4 | && apt-get upgrade -y \ 5 | && apt-get install -y \ 6 | coreutils \ 7 | python3-dev \ 8 | python3-pip \ 9 | python3-venv \ 10 | && rm -rf /var/lib/apt/lists/* 11 | 12 | RUN python3 -m venv /venv \ 13 | && . /venv/bin/activate \ 14 | && pip download --no-deps helix-scripts --index-url https://dnceng.pkgs.visualstudio.com/public/_packaging/helix-client-prod/pypi/simple \ 15 | && pip install ./helix_scripts-*-py3-none-any.whl \ 16 | && rm ./helix_scripts-*-py3-none-any.whl 17 | 18 | FROM library/debian:bookworm 19 | 20 | # Install Helix Dependencies 21 | RUN apt-get update \ 22 | && apt-get upgrade -y \ 23 | && apt-get install -y \ 24 | apt-transport-https \ 25 | curl \ 26 | software-properties-common \ 27 | && curl -sL https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb -o packages-microsoft-prod.deb \ 28 | && dpkg -i packages-microsoft-prod.deb \ 29 | && rm packages-microsoft-prod.deb \ 30 | && apt-get update \ 31 | && apt-get install -y \ 32 | autoconf \ 33 | automake \ 34 | at \ 35 | build-essential \ 36 | cpio \ 37 | gcc \ 38 | gdb \ 39 | git \ 40 | iputils-ping \ 41 | libcurl4 \ 42 | libffi-dev \ 43 | libicu-dev \ 44 | libmsquic \ 45 | libssl-dev \ 46 | libtool \ 47 | libunwind8 \ 48 | llvm \ 49 | locales \ 50 | locales-all \ 51 | python3-dev \ 52 | python3-pip \ 53 | python3-venv \ 54 | sudo \ 55 | tzdata \ 56 | unzip \ 57 | && rm -rf /var/lib/apt/lists/* \ 58 | && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8 59 | 60 | ENV LANG=en_US.utf8 61 | 62 | # Create helixbot user and give rights to sudo without password 63 | RUN /usr/sbin/adduser --disabled-password --gecos '' --uid 1000 --shell /bin/bash --ingroup adm helixbot \ 64 | && chmod 755 /root \ 65 | && echo "helixbot ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/helixbot 66 | 67 | USER helixbot 68 | 69 | # Install Helix Dependencies 70 | ENV VIRTUAL_ENV=/home/helixbot/.vsts-env 71 | RUN python3 -m venv $VIRTUAL_ENV 72 | ENV PATH="${VIRTUAL_ENV}/bin:${PATH}" 73 | COPY --from=venv --chown=helixbot /venv $VIRTUAL_ENV 74 | -------------------------------------------------------------------------------- /src/debian/12/helix/arm64v8/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM library/debian:bookworm AS venv 2 | 3 | RUN apt-get update \ 4 | && apt-get upgrade -y \ 5 | && apt-get install -y \ 6 | coreutils \ 7 | python3-dev \ 8 | python3-pip \ 9 | python3-venv \ 10 | && rm -rf /var/lib/apt/lists/* 11 | 12 | RUN python3 -m venv /venv \ 13 | && . /venv/bin/activate \ 14 | && pip download --no-deps helix-scripts --index-url https://dnceng.pkgs.visualstudio.com/public/_packaging/helix-client-prod/pypi/simple \ 15 | && pip install ./helix_scripts-*-py3-none-any.whl \ 16 | && rm ./helix_scripts-*-py3-none-any.whl 17 | 18 | FROM library/debian:bookworm 19 | 20 | # Install Helix Dependencies 21 | RUN apt-get update \ 22 | && apt-get upgrade -y \ 23 | && apt-get install -y \ 24 | apt-transport-https \ 25 | curl \ 26 | software-properties-common \ 27 | && curl -sL https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb -o packages-microsoft-prod.deb \ 28 | && dpkg -i packages-microsoft-prod.deb \ 29 | && rm packages-microsoft-prod.deb \ 30 | && apt-get update \ 31 | && apt-get install -y \ 32 | autoconf \ 33 | automake \ 34 | at \ 35 | build-essential \ 36 | gcc \ 37 | gdb \ 38 | git \ 39 | iputils-ping \ 40 | libcurl4 \ 41 | libffi-dev \ 42 | libicu-dev \ 43 | libmsquic \ 44 | libssl-dev \ 45 | libtool \ 46 | libunwind8 \ 47 | llvm \ 48 | locales \ 49 | locales-all \ 50 | python3-dev \ 51 | python3-pip \ 52 | python3-venv \ 53 | sudo \ 54 | tzdata \ 55 | unzip \ 56 | && rm -rf /var/lib/apt/lists/* \ 57 | && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8 58 | 59 | ENV LANG=en_US.utf8 60 | 61 | # Create helixbot user and give rights to sudo without password 62 | RUN /usr/sbin/adduser --disabled-password --gecos '' --uid 1000 --shell /bin/bash --ingroup adm helixbot \ 63 | && chmod 755 /root \ 64 | && echo "helixbot ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/helixbot 65 | 66 | USER helixbot 67 | 68 | # Install Helix Dependencies 69 | ENV VIRTUAL_ENV=/home/helixbot/.vsts-env 70 | RUN python3 -m venv $VIRTUAL_ENV 71 | ENV PATH="${VIRTUAL_ENV}/bin:${PATH}" 72 | COPY --from=venv --chown=helixbot /venv $VIRTUAL_ENV 73 | -------------------------------------------------------------------------------- /src/fedora/40/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM library/fedora:40 2 | 3 | RUN dnf upgrade --refresh -y \ 4 | && dnf install --setopt tsflags=nodocs -y \ 5 | dnf-plugins-core \ 6 | && dnf config-manager --add-repo=https://packages.microsoft.com/fedora/40/prod/config.repo \ 7 | && dnf install --setopt=install_weak_deps=False --setopt tsflags=nodocs -y \ 8 | # Base toolchain we need to build anything (clang, cmake, make and the like) 9 | clang \ 10 | cmake \ 11 | findutils \ 12 | gdb \ 13 | glibc-langpack-en \ 14 | lldb-devel \ 15 | llvm-devel \ 16 | make \ 17 | pigz \ 18 | python \ 19 | which \ 20 | # Tools used by build automation 21 | azure-cli \ 22 | git \ 23 | jq \ 24 | tar \ 25 | procps \ 26 | zip \ 27 | # Dependencies of CoreCLR, Mono and CoreFX 28 | autoconf \ 29 | automake \ 30 | brotli-devel \ 31 | glibc-locale-source \ 32 | iputils \ 33 | jq \ 34 | krb5-devel \ 35 | libcurl-devel \ 36 | libicu-devel \ 37 | libomp-devel \ 38 | libtool \ 39 | libunwind-devel \ 40 | libuuid-devel \ 41 | lttng-ust-devel \ 42 | openssl-devel \ 43 | uuid-devel \ 44 | zlib-devel \ 45 | # Dependencies for VMR/source-build tests 46 | elfutils \ 47 | file \ 48 | # Dependencies to support globalization 49 | icu \ 50 | && dnf clean all 51 | 52 | # Install the latest non-preview powershell release. 53 | RUN LATEST_TAG=$(curl -L https://api.github.com/repos/powershell/powershell/releases/latest | jq -r '.tag_name') \ 54 | && curl -L https://github.com/PowerShell/PowerShell/releases/download/$LATEST_TAG/powershell-${LATEST_TAG#*v}-linux-x64.tar.gz -o /tmp/powershell.tar.gz \ 55 | && mkdir -p /opt/microsoft/powershell \ 56 | && tar zxf /tmp/powershell.tar.gz -C /opt/microsoft/powershell \ 57 | && chmod +x /opt/microsoft/powershell/pwsh \ 58 | && ln -s /opt/microsoft/powershell/pwsh /usr/bin/pwsh \ 59 | && rm -f /tmp/powershell.tar.gz 60 | -------------------------------------------------------------------------------- /src/fedora/41/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM library/fedora:41 2 | 3 | RUN dnf upgrade --refresh -y \ 4 | && dnf config-manager addrepo --from-repofile=https://packages.microsoft.com/fedora/41/prod/config.repo \ 5 | && dnf install --setopt=install_weak_deps=False --setopt tsflags=nodocs -y \ 6 | # Base toolchain we need to build anything (clang, cmake, make and the like) 7 | clang \ 8 | cmake \ 9 | dnf-plugins-core \ 10 | findutils \ 11 | gdb \ 12 | glibc-langpack-en \ 13 | lldb-devel \ 14 | llvm-devel \ 15 | make \ 16 | pigz \ 17 | python \ 18 | which \ 19 | # Tools used by build automation 20 | azure-cli \ 21 | git \ 22 | jq \ 23 | tar \ 24 | procps \ 25 | zip \ 26 | # Dependencies of CoreCLR, Mono and CoreFX 27 | autoconf \ 28 | automake \ 29 | brotli-devel \ 30 | cpio \ 31 | glibc-locale-source \ 32 | iputils \ 33 | jq \ 34 | krb5-devel \ 35 | libcurl-devel \ 36 | libicu-devel \ 37 | libomp-devel \ 38 | libtool \ 39 | libunwind-devel \ 40 | libuuid-devel \ 41 | lttng-ust-devel \ 42 | openssl-devel \ 43 | uuid-devel \ 44 | zlib-devel \ 45 | # Dependencies for VMR/source-build tests 46 | iproute \ 47 | elfutils \ 48 | file \ 49 | # Dependencies to support globalization 50 | icu \ 51 | && dnf clean all 52 | 53 | # Install the latest non-preview powershell release. 54 | RUN LATEST_TAG=$(curl -L https://api.github.com/repos/powershell/powershell/releases/latest | jq -r '.tag_name') \ 55 | && curl -L https://github.com/PowerShell/PowerShell/releases/download/$LATEST_TAG/powershell-${LATEST_TAG#*v}-linux-x64.tar.gz -o /tmp/powershell.tar.gz \ 56 | && mkdir -p /opt/microsoft/powershell \ 57 | && tar zxf /tmp/powershell.tar.gz -C /opt/microsoft/powershell \ 58 | && chmod +x /opt/microsoft/powershell/pwsh \ 59 | && ln -s /opt/microsoft/powershell/pwsh /usr/bin/pwsh \ 60 | && rm -f /tmp/powershell.tar.gz 61 | -------------------------------------------------------------------------------- /src/fedora/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "repos": [ 3 | { 4 | "name": "dotnet-buildtools/prereqs", 5 | "images": [ 6 | { 7 | "platforms": [ 8 | { 9 | "dockerfile": "src/fedora/40/amd64", 10 | "os": "linux", 11 | "osVersion": "fedora40", 12 | "tags": { 13 | "fedora-40": {}, 14 | "fedora-40-amd64": {} 15 | } 16 | } 17 | ] 18 | }, 19 | { 20 | "platforms": [ 21 | { 22 | "dockerfile": "src/fedora/41/amd64", 23 | "os": "linux", 24 | "osVersion": "fedora41", 25 | "tags": { 26 | "fedora-41": {}, 27 | "fedora-41-amd64": {} 28 | } 29 | } 30 | ] 31 | }, 32 | { 33 | "platforms": [ 34 | { 35 | "dockerfile": "src/fedora/41/helix/amd64", 36 | "os": "linux", 37 | "osVersion": "fedora41", 38 | "tags": { 39 | "fedora-41-helix": {}, 40 | "fedora-41-helix-amd64": {} 41 | } 42 | } 43 | ] 44 | }, 45 | { 46 | "platforms": [ 47 | { 48 | "dockerfile": "src/fedora/42/helix/amd64", 49 | "os": "linux", 50 | "osVersion": "fedora42", 51 | "tags": { 52 | "fedora-42-helix-amd64": {} 53 | } 54 | } 55 | ] 56 | } 57 | ] 58 | } 59 | ] 60 | } 61 | -------------------------------------------------------------------------------- /src/nanoserver/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "repos": [ 3 | { 4 | "name": "dotnet-buildtools/prereqs", 5 | "images": [ 6 | { 7 | "platforms": [ 8 | { 9 | "dockerfile": "src/nanoserver/1809/helix/amd64", 10 | "os": "windows", 11 | "osVersion": "nanoserver-1809", 12 | "tags": { 13 | "nanoserver-1809-helix-amd64": {} 14 | } 15 | } 16 | ] 17 | } 18 | ] 19 | } 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /src/opensuse/15.6/helix/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM opensuse/leap:15.6 2 | 3 | # Install Helix Dependencies 4 | RUN zypper ref \ 5 | && zypper update -y \ 6 | && zypper install -y -t pattern \ 7 | devel_C_C++ \ 8 | && zypper install -y \ 9 | autoconf \ 10 | automake \ 11 | clang \ 12 | cmake \ 13 | gcc-locale \ 14 | gdb \ 15 | git \ 16 | glibc-i18ndata \ 17 | gssntlmssp \ 18 | iputils \ 19 | krb5-devel \ 20 | lato-fonts \ 21 | libffi-devel \ 22 | libicu-devel \ 23 | libopenssl-devel \ 24 | libtool \ 25 | libunwind \ 26 | lldb-devel \ 27 | llvm \ 28 | lttng-ust-devel \ 29 | python312-devel \ 30 | python312-pip \ 31 | sudo \ 32 | unzip \ 33 | wget \ 34 | && zypper clean -a 35 | 36 | ENV LANG=en_US.utf8 37 | 38 | # Install MsQuic from official GitHub releases 39 | RUN wget https://packages.microsoft.com/keys/microsoft.asc \ 40 | && echo 2cfd20a306b2fa5e25522d78f2ef50a1f429d35fd30bd983e2ebffc2b80944fa microsoft.asc | sha256sum --check - \ 41 | && rpm --import microsoft.asc \ 42 | && rm microsoft.asc \ 43 | && zypper addrepo https://packages.microsoft.com/opensuse/15/prod/ "MS Packages" \ 44 | && zypper install -y \ 45 | libmsquic \ 46 | && zypper clean -a 47 | 48 | RUN ln -sf /usr/bin/python3.12 /usr/bin/python 49 | 50 | # create helixbot user and give rights to sudo without password 51 | RUN /usr/sbin/useradd --uid 1000 --shell /bin/bash --system --create-home --groups trusted helixbot \ 52 | && chmod 755 /root \ 53 | && echo "helixbot ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/helixbot 54 | 55 | USER helixbot 56 | WORKDIR /home/helixbot 57 | ENV VIRTUAL_ENV=/home/helixbot/.vsts-env 58 | 59 | RUN python -m venv $VIRTUAL_ENV && \ 60 | ${VIRTUAL_ENV}/bin/pip download --no-deps helix-scripts --index-url https://dnceng.pkgs.visualstudio.com/public/_packaging/helix-client-prod/pypi/simple && \ 61 | ${VIRTUAL_ENV}/bin/pip install ./helix_scripts-*-py3-none-any.whl && \ 62 | rm ./helix_scripts-*-py3-none-any.whl 63 | ENV PATH="${VIRTUAL_ENV}/bin:${PATH}" 64 | -------------------------------------------------------------------------------- /src/opensuse/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "repos": [ 3 | { 4 | "name": "dotnet-buildtools/prereqs", 5 | "images": [ 6 | { 7 | "platforms": [ 8 | { 9 | "architecture": "amd64", 10 | "dockerfile": "src/opensuse/15.6/helix/amd64", 11 | "os": "linux", 12 | "osVersion": "leap15.6", 13 | "tags": { 14 | "opensuse-15.6-helix-amd64": {} 15 | } 16 | } 17 | ] 18 | } 19 | ] 20 | } 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /src/ubuntu/22.04/coredeps/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/powershell:ubuntu-22.04 2 | 3 | # Install tools used by the AzDO build automation. 4 | RUN apt-get update \ 5 | && apt-get upgrade -y \ 6 | && apt-get install -y \ 7 | git \ 8 | nodejs \ 9 | npm \ 10 | tar \ 11 | zip \ 12 | && curl -sL https://aka.ms/InstallAzureCLIDeb | bash \ 13 | && rm -rf /var/lib/apt/lists/* 14 | 15 | # Runtime dependencies 16 | RUN apt-get update \ 17 | && apt-get upgrade -y \ 18 | && apt-get install -y \ 19 | autoconf \ 20 | automake \ 21 | build-essential \ 22 | gettext \ 23 | jq \ 24 | libcurl4-openssl-dev \ 25 | libicu-dev \ 26 | libkrb5-dev \ 27 | liblttng-ust-dev \ 28 | libnuma-dev \ 29 | libssl-dev \ 30 | libtool \ 31 | libunwind8 \ 32 | libunwind8-dev \ 33 | python3 \ 34 | python3-pip \ 35 | uuid-dev \ 36 | && rm -rf /var/lib/apt/lists/* 37 | -------------------------------------------------------------------------------- /src/ubuntu/22.04/cross/armel-tizen/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ROOTFS_DIR=/crossrootfs/armel 2 | 3 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-22.04-crossdeps AS builder 4 | ARG ROOTFS_DIR 5 | 6 | # Obtain arcade scripts used to build rootfs 7 | RUN git config --global user.email builder@dotnet-buildtools-prereqs-docker && \ 8 | git clone --depth 1 --single-branch https://github.com/dotnet/arcade /scripts 9 | 10 | RUN /scripts/eng/common/cross/tizen-build-rootfs.sh armel 11 | 12 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-22.04-crossdeps 13 | ARG ROOTFS_DIR 14 | 15 | # Install binutils-arm-linux-gnueabi 16 | RUN apt-get update \ 17 | && apt-get upgrade -y \ 18 | && apt-get install -y \ 19 | binutils-arm-linux-gnueabi \ 20 | && rm -rf /var/lib/apt/lists/* 21 | 22 | COPY --from=builder $ROOTFS_DIR $ROOTFS_DIR 23 | -------------------------------------------------------------------------------- /src/ubuntu/22.04/crossdeps/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-22.04-coredeps 2 | 3 | # Install the base toolchain we need to build anything (clang, cmake, make and the like). 4 | RUN apt-get update \ 5 | && apt-get upgrade -y \ 6 | && apt-get install -y \ 7 | apt-transport-https \ 8 | ca-certificates \ 9 | gnupg \ 10 | software-properties-common \ 11 | wget \ 12 | && wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc | apt-key add - \ 13 | && apt-add-repository 'deb https://apt.kitware.com/ubuntu/ jammy main' \ 14 | && apt-get update \ 15 | && apt-get install -y \ 16 | binfmt-support \ 17 | binutils-arm-linux-gnueabihf \ 18 | bison \ 19 | bisonc++ \ 20 | build-essential \ 21 | cmake \ 22 | cpio \ 23 | debian-archive-keyring \ 24 | debootstrap \ 25 | flex \ 26 | gdb \ 27 | make \ 28 | nasm \ 29 | pigz \ 30 | qemu \ 31 | qemu-user-static \ 32 | rpm2cpio \ 33 | texinfo \ 34 | libbz2-dev \ 35 | libz-dev \ 36 | liblzma-dev \ 37 | libarchive-dev \ 38 | libbsd-dev \ 39 | libmpc-dev \ 40 | libxml2-utils \ 41 | libzstd-dev \ 42 | && rm -rf /var/lib/apt/lists/* 43 | 44 | # install llvm-toolchain using official script 45 | RUN wget -O- https://apt.llvm.org/llvm.sh | bash -s -- 18 \ 46 | && apt-get install -y \ 47 | clang-tools-18 \ 48 | liblldb-18-dev \ 49 | llvm-18 \ 50 | && rm -rf /var/lib/apt/lists/* 51 | -------------------------------------------------------------------------------- /src/ubuntu/22.04/debpkg/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-22.04 2 | 3 | # Install the deb packaging toolchain we need to build debs 4 | RUN apt-get update \ 5 | && apt-get -y install \ 6 | build-essential \ 7 | debhelper \ 8 | devscripts \ 9 | liblldb-14 \ 10 | && rm -rf /var/lib/apt/lists/* 11 | 12 | # Install powershell. This is in the debpkg/amd64 docker file as it may not be required in the arm64 13 | # images, and is not actually supported over there. 14 | RUN apt-get update && \ 15 | apt-get install -y \ 16 | apt-transport-https \ 17 | software-properties-common \ 18 | curl && \ 19 | curl -sL https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb -o packages-microsoft-prod.deb && \ 20 | dpkg -i packages-microsoft-prod.deb && \ 21 | rm packages-microsoft-prod.deb && \ 22 | apt-get update && \ 23 | apt-get install -y powershell && \ 24 | rm -rf /var/lib/apt/lists/* 25 | -------------------------------------------------------------------------------- /src/ubuntu/22.04/helix/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu.azurecr.io/ubuntu:22.04 2 | 3 | # Install Helix Dependencies 4 | ENV DEBIAN_FRONTEND=noninteractive 5 | 6 | RUN apt-get update && \ 7 | apt-get install -qq -y \ 8 | autoconf \ 9 | automake \ 10 | build-essential \ 11 | cmake \ 12 | clang \ 13 | curl \ 14 | gcc \ 15 | gdb \ 16 | git \ 17 | gss-ntlmssp \ 18 | iputils-ping \ 19 | libcurl4 \ 20 | libffi-dev \ 21 | libicu-dev \ 22 | libssl-dev \ 23 | libtool \ 24 | libunwind8 \ 25 | libunwind-dev \ 26 | lldb-12 \ 27 | llvm \ 28 | locales \ 29 | locales-all \ 30 | python3-dev \ 31 | python3-pip \ 32 | python3-venv \ 33 | software-properties-common \ 34 | sudo \ 35 | tzdata \ 36 | unzip \ 37 | && rm -rf /var/lib/apt/lists/* \ 38 | \ 39 | && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8 40 | 41 | ENV LANG=en_US.utf8 42 | 43 | RUN ln -sf /usr/bin/python3 /usr/bin/python 44 | 45 | # Add MsQuic 46 | RUN curl -LO https://packages.microsoft.com/keys/microsoft.asc && \ 47 | echo 2cfd20a306b2fa5e25522d78f2ef50a1f429d35fd30bd983e2ebffc2b80944fa microsoft.asc| sha256sum --check - && \ 48 | apt-key add microsoft.asc && \ 49 | rm microsoft.asc && \ 50 | apt-add-repository https://packages.microsoft.com/ubuntu/22.04/prod && \ 51 | apt-get update && \ 52 | apt-get install -y libmsquic && \ 53 | rm -rf /var/lib/apt/lists/* 54 | 55 | # create helixbot user and give rights to sudo without password 56 | RUN /usr/sbin/adduser --disabled-password --gecos '' --uid 1000 --shell /bin/bash --ingroup adm helixbot && \ 57 | chmod 755 /root && \ 58 | echo "helixbot ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/helixbot 59 | 60 | USER helixbot 61 | WORKDIR /home/helixbot 62 | ENV VIRTUAL_ENV=/home/helixbot/.vsts-env 63 | 64 | RUN python -m venv /home/helixbot/.vsts-env && \ 65 | ${VIRTUAL_ENV}/bin/pip download --no-deps helix-scripts --index-url https://dnceng.pkgs.visualstudio.com/public/_packaging/helix-client-prod/pypi/simple && \ 66 | ${VIRTUAL_ENV}/bin/pip install ./helix_scripts-*-py3-none-any.whl && \ 67 | rm ./helix_scripts-*-py3-none-any.whl 68 | ENV PATH="${VIRTUAL_ENV}/bin:${PATH}" 69 | -------------------------------------------------------------------------------- /src/ubuntu/22.04/helix/webassembly/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-22.04-helix-amd64 2 | 3 | USER root 4 | 5 | # Dependencies for WebAssembly build 6 | RUN apt-get update \ 7 | && apt-get install -y \ 8 | libasound2 \ 9 | libatk-bridge2.0-0 \ 10 | libatk1.0-0 \ 11 | libcairo2 \ 12 | libcups2 \ 13 | libdbus-glib-1-2 \ 14 | libdrm2 \ 15 | libgbm-dev \ 16 | libgtk-3-0 \ 17 | libnss3 \ 18 | libpango-1.0-0 \ 19 | libssl-dev \ 20 | libtinfo-dev \ 21 | libxcomposite-dev \ 22 | libxdamage1 \ 23 | libxkbcommon-x11-0 \ 24 | libxrandr2 \ 25 | libx11-xcb-dev \ 26 | locales \ 27 | unzip \ 28 | wget \ 29 | && rm -rf /var/lib/apt/lists/* 30 | 31 | ENV CMAKE_VERSION=3.17 32 | RUN wget https://cmake.org/files/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}.0-Linux-x86_64.tar.gz \ 33 | && tar -xf cmake-${CMAKE_VERSION}.0-Linux-x86_64.tar.gz --strip 1 -C /usr/local \ 34 | && rm cmake-${CMAKE_VERSION}.0-Linux-x86_64.tar.gz 35 | 36 | # WebAssembly build needs working UTF-8 locale 37 | RUN locale-gen en_US.UTF-8 38 | 39 | # install node, which is required for newer npm, jsvu and v8 40 | COPY ./setup-node-23.x.sh /tmp 41 | RUN /tmp/setup-node-23.x.sh && apt-get -y install nodejs 42 | 43 | RUN npm install -g npm 44 | 45 | # Install latest V8 engine 46 | ENV PATH="/home/helixbot/.jsvu/bin:${PATH}" 47 | RUN npm install jsvu -g \ 48 | && su helixbot -c "jsvu --os=linux64 --engines=v8" \ 49 | && v8 -e "console.log(version());quit();" \ 50 | && npm uninstall jsvu -g 51 | 52 | USER helixbot 53 | -------------------------------------------------------------------------------- /src/ubuntu/22.04/mlnet/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-22.04 2 | 3 | # Install openmp support 4 | RUN apt-get update \ 5 | && apt-get install -y \ 6 | libomp5 \ 7 | libomp-dev \ 8 | && rm -rf /var/lib/apt/lists/* 9 | -------------------------------------------------------------------------------- /src/ubuntu/22.04/mlnet/helix/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-22.04-mlnet 2 | 3 | # Install Helix Dependencies 4 | RUN apt-get update \ 5 | && apt-get install -y \ 6 | python3-pip \ 7 | python3-venv \ 8 | && rm -rf /var/lib/apt/lists/* 9 | 10 | RUN ln -sf /usr/bin/python3 /usr/bin/python 11 | 12 | # create helixbot user and give rights to sudo without password 13 | RUN /usr/sbin/adduser --disabled-password --gecos '' --uid 1000 --shell /bin/bash --ingroup adm helixbot && \ 14 | chmod 755 /root && \ 15 | echo "helixbot ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/helixbot 16 | 17 | USER helixbot 18 | WORKDIR /home/helixbot 19 | ENV VIRTUAL_ENV=/home/helixbot/.vsts-env 20 | 21 | RUN python -m venv $VIRTUAL_ENV && \ 22 | ${VIRTUAL_ENV}/bin/pip download --no-deps helix-scripts --index-url https://dnceng.pkgs.visualstudio.com/public/_packaging/helix-client-prod/pypi/simple && \ 23 | ${VIRTUAL_ENV}/bin/pip install ./helix_scripts-*-py3-none-any.whl && \ 24 | rm ./helix_scripts-*-py3-none-any.whl 25 | ENV PATH="${VIRTUAL_ENV}/bin:${PATH}" 26 | -------------------------------------------------------------------------------- /src/ubuntu/22.04/opt/arm64v8/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu.azurecr.io/ubuntu:22.04 2 | 3 | RUN apt-get update \ 4 | && apt-get install -y sudo \ 5 | && rm -rf /var/lib/apt/lists/* 6 | -------------------------------------------------------------------------------- /src/ubuntu/24.04/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu.azurecr.io/ubuntu:24.04 2 | 3 | # Install the base toolchain we need to build anything (clang, cmake, make and the like) 4 | # this does not include libraries that we need to compile different projects, we'd like 5 | # them in a different layer. 6 | RUN apt-get update \ 7 | && apt-get install -y \ 8 | clang-18 \ 9 | cmake \ 10 | gdb \ 11 | liblldb-18-dev \ 12 | lldb-18 \ 13 | llvm-18 \ 14 | locales \ 15 | make \ 16 | pigz \ 17 | sudo \ 18 | && rm -rf /var/lib/apt/lists/* 19 | 20 | # Install tools used by the VSO build automation. 21 | RUN apt-get update \ 22 | && apt-get install -y \ 23 | curl \ 24 | git \ 25 | iproute2 \ 26 | npm \ 27 | zip \ 28 | && rm -rf /var/lib/apt/lists/* 29 | 30 | # .NET SDK MSBuild requires US.UTF-8 locale to execute tasks 31 | RUN locale-gen en_US.UTF-8 32 | 33 | # Runtime dependencies 34 | RUN apt-get update \ 35 | && apt-get install -y \ 36 | autoconf \ 37 | automake \ 38 | build-essential \ 39 | cpio \ 40 | curl \ 41 | gettext \ 42 | jq \ 43 | libbrotli-dev \ 44 | libicu-dev \ 45 | libkrb5-dev \ 46 | liblttng-ust-dev \ 47 | libnuma-dev \ 48 | libssl-dev \ 49 | libtool \ 50 | libunwind8 \ 51 | libunwind8-dev \ 52 | uuid-dev \ 53 | zlib1g-dev \ 54 | && rm -rf /var/lib/apt/lists/* 55 | 56 | # Dependencies for VMR/source-build tests 57 | RUN apt-get update \ 58 | && apt-get install -y \ 59 | elfutils \ 60 | file \ 61 | && rm -rf /var/lib/apt/lists/* 62 | 63 | # Remove older version of node & install node 20 64 | RUN rm -f /etc/apt/sources.list.d/nodesource.list && \ 65 | apt-get --fix-broken install && \ 66 | apt-get update && \ 67 | apt-get remove nodejs -y && \ 68 | apt-get remove nodejs-doc -y && \ 69 | apt-get remove libnode-dev -y 70 | 71 | RUN cd ~ && \ 72 | curl -sL https://deb.nodesource.com/setup_20.x -o nodesource_setup.sh && \ 73 | bash nodesource_setup.sh && \ 74 | apt-get install nodejs -y && \ 75 | rm -rf /var/lib/apt/lists/* && \ 76 | rm -f nodesource_setup.sh 77 | 78 | ENV NO_UPDATE_NOTIFIER=true 79 | -------------------------------------------------------------------------------- /src/ubuntu/24.04/helix/webassembly/amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-24.04-helix-amd64 2 | 3 | USER root 4 | 5 | # Dependencies for WebAssembly build 6 | RUN apt-get update \ 7 | && apt-get install -y \ 8 | libasound2t64 \ 9 | libatk-bridge2.0-0 \ 10 | libatk1.0-0 \ 11 | libcairo2 \ 12 | libcups2 \ 13 | libdbus-glib-1-2 \ 14 | libdrm2 \ 15 | libgbm-dev \ 16 | libgtk-3-0 \ 17 | libnss3 \ 18 | libpango-1.0-0 \ 19 | libssl-dev \ 20 | libtinfo-dev \ 21 | libxcomposite-dev \ 22 | libxdamage1 \ 23 | libxkbcommon-x11-0 \ 24 | libxrandr2 \ 25 | libx11-xcb-dev \ 26 | locales \ 27 | unzip \ 28 | && rm -rf /var/lib/apt/lists/* 29 | 30 | ENV CMAKE_SHORTVERSION=3.31 31 | ENV CMAKE_VERSION=3.31.7 32 | RUN curl -O https://cmake.org/files/v${CMAKE_SHORTVERSION}/cmake-${CMAKE_VERSION}-linux-x86_64.tar.gz \ 33 | && tar -xf cmake-${CMAKE_VERSION}-linux-x86_64.tar.gz --strip 1 -C /usr/local \ 34 | && rm cmake-${CMAKE_VERSION}-linux-x86_64.tar.gz 35 | 36 | # WebAssembly build needs working UTF-8 locale 37 | RUN locale-gen en_US.UTF-8 38 | 39 | # install node, which is required for newer npm, jsvu and v8 40 | COPY ./setup-node-23.x.sh /tmp 41 | RUN chmod +x /tmp/setup-node-23.x.sh \ 42 | && /tmp/setup-node-23.x.sh \ 43 | && rm /tmp/setup-node-23.x.sh \ 44 | && apt-get update \ 45 | && apt-get install -y nodejs \ 46 | && rm -rf /var/lib/apt/lists/* 47 | 48 | RUN npm install -g npm 49 | 50 | # Install latest V8 engine 51 | ENV PATH="/home/helixbot/.jsvu/bin:${PATH}" 52 | RUN npm install jsvu -g \ 53 | && su helixbot -c "jsvu --os=linux64 --engines=v8" \ 54 | && v8 -e "console.log(version());quit();" \ 55 | && npm uninstall jsvu -g 56 | 57 | USER helixbot 58 | -------------------------------------------------------------------------------- /src/ubuntu/build-scripts/install-cross-build-prereqs.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Stop script on NZEC 4 | set -e 5 | # Stop script if unbound variable found (use ${var:-} if intentional) 6 | set -u 7 | 8 | # we need to make sure that we install binfmt >= 2.2.0 and qemu-user-static >= 1.4.2, 9 | # which are available in Ubuntu 20.04+ repositories 10 | . /etc/os-release 11 | if [ "$(echo "$VERSION_ID" | tr -d .)" -lt 2004 ]; then 12 | sed "s/$UBUNTU_CODENAME/focal/g" /etc/apt/sources.list | sudo dd of=/etc/apt/sources.list.d/focal.list 13 | fi 14 | 15 | function installPkgs { 16 | sudo apt-get update 17 | # see (see https://github.com/dotnet/dotnet-buildtools-prereqs-docker/issues/120) 18 | sudo apt-get install -y \ 19 | binfmt-support \ 20 | qemu \ 21 | qemu-user-static 22 | } 23 | 24 | # Retry apt-get update due to https://github.com/dotnet/dotnet-buildtools-prereqs-docker/issues/758 25 | retryCount=0 26 | waitSecs=60 27 | until installPkgs; do 28 | retryCount=$((retryCount+1)) 29 | if [ $retryCount -lt 10 ]; then 30 | echo "Failed to update apt-get, retrying in $waitSecs seconds..." 31 | sleep $waitSecs 32 | else 33 | echo "Failed to update apt-get, aborting." 34 | exit 1 35 | fi 36 | done 37 | -------------------------------------------------------------------------------- /src/windowsservercore/ltsc2022/helix/webassembly-net8/amd64/arial.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dotnet/dotnet-buildtools-prereqs-docker/20908075f9b907dfdedfe8612b3c9cf5b106b320/src/windowsservercore/ltsc2022/helix/webassembly-net8/amd64/arial.ttf -------------------------------------------------------------------------------- /src/windowsservercore/ltsc2022/helix/webassembly/amd64/arial.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dotnet/dotnet-buildtools-prereqs-docker/20908075f9b907dfdedfe8612b3c9cf5b106b320/src/windowsservercore/ltsc2022/helix/webassembly/amd64/arial.ttf -------------------------------------------------------------------------------- /src/windowsservercore/ltsc2025/helix/webassembly-net8/amd64/arial.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dotnet/dotnet-buildtools-prereqs-docker/20908075f9b907dfdedfe8612b3c9cf5b106b320/src/windowsservercore/ltsc2025/helix/webassembly-net8/amd64/arial.ttf -------------------------------------------------------------------------------- /src/windowsservercore/ltsc2025/helix/webassembly/amd64/arial.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dotnet/dotnet-buildtools-prereqs-docker/20908075f9b907dfdedfe8612b3c9cf5b106b320/src/windowsservercore/ltsc2025/helix/webassembly/amd64/arial.ttf -------------------------------------------------------------------------------- /tests/Microsoft.DotNet.BuildTools.Prereqs.Docker.Tests/Config.cs: -------------------------------------------------------------------------------- 1 | // Licensed to the .NET Foundation under one or more agreements. 2 | // The .NET Foundation licenses this file to you under the MIT license. 3 | // See the LICENSE file in the project root for more information. 4 | 5 | using System; 6 | 7 | namespace Microsoft.DotNet.BuildToolsPrereqs.Docker.Tests; 8 | 9 | internal static class Config 10 | { 11 | const string ConfigSwitchPrefix = "Microsoft.DotNet.BuildTools.Prereqs.Docker.Tests."; 12 | 13 | public static string RepoDirectory => (string)AppContext.GetData(ConfigSwitchPrefix + nameof(RepoDirectory))! ?? 14 | throw new InvalidOperationException("RepoDirectory must be specified"); 15 | 16 | public static string SrcDirectory => (string)AppContext.GetData(ConfigSwitchPrefix + nameof(SrcDirectory))! ?? 17 | throw new InvalidOperationException("SrcDirectory must be specified"); 18 | } 19 | -------------------------------------------------------------------------------- /tests/Microsoft.DotNet.BuildTools.Prereqs.Docker.Tests/Microsoft.DotNet.BuildTools.Prereqs.Docker.Tests.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | enable 5 | false 6 | Exe 7 | net9.0 8 | true 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | $(RepoDirectory) 29 | 30 | 31 | $(SrcDirectory) 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /tests/Microsoft.DotNet.BuildTools.Prereqs.Docker.Tests/xunit.runner.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://xunit.net/schema/current/xunit.runner.schema.json", 3 | "diagnosticMessages": true, 4 | "showLiveOutput": true 5 | } 6 | --------------------------------------------------------------------------------