From d8e2f6305e69a2313322836efcc40d912c49e4c2 Mon Sep 17 00:00:00 2001 From: Eric Erhardt Date: Fri, 26 Aug 2022 14:16:05 -0500 Subject: [PATCH 1/9] Split libraries and wasm devcontainers Codespaces allows for monorepo support now. So we can have different pre-builds for different dev environments. Creating a "libraries" pre-build and a "wasm" pre-build devcontainer. --- .devcontainer/devcontainer-libraries.json | 47 +++++++++++++++++++ ...vcontainer.json => devcontainer-wasm.json} | 39 ++++++++------- .devcontainer/scripts/onCreateCommand.sh | 28 +++++++---- 3 files changed, 87 insertions(+), 27 deletions(-) create mode 100644 .devcontainer/devcontainer-libraries.json rename .devcontainer/{devcontainer.json => devcontainer-wasm.json} (59%) diff --git a/.devcontainer/devcontainer-libraries.json b/.devcontainer/devcontainer-libraries.json new file mode 100644 index 00000000000000..7a428fe8dfda19 --- /dev/null +++ b/.devcontainer/devcontainer-libraries.json @@ -0,0 +1,47 @@ +// For format details, see https://aka.ms/devcontainer.json. +{ + "name": "C# (.NET)", + "build": { + "dockerfile": "Dockerfile", + "args": { + // Update 'VARIANT' to pick a .NET Core version: 3.1, 6.0 + // Append -bullseye or -focal to pin to an OS version. + "VARIANT": "6.0-focal" + } + }, + + // Configure tool-specific properties. + "customizations": { + // Configure properties specific to VS Code. + "vscode": { + // Add the IDs of extensions you want installed when the container is created. + "extensions": [ + "ms-dotnettools.csharp" + ], + "settings": { + // Loading projects on demand is better for larger codebases + "omnisharp.enableMsBuildLoadProjectsOnDemand": true, + "omnisharp.enableRoslynAnalyzers": true, + "omnisharp.enableEditorConfigSupport": true, + "omnisharp.enableAsyncCompletion": true, + "omnisharp.testRunSettings": "${containerWorkspaceFolder}/artifacts/obj/vscode/.runsettings" + } + } + }, + + // Use 'onCreateCommand' to run pre-build commands inside the codespace + "onCreateCommand": "${containerWorkspaceFolder}/.devcontainer/scripts/onCreateCommand.sh libraries", + + // Use 'postCreateCommand' to run commands after the container is created. + "postCreateCommand": "${containerWorkspaceFolder}/.devcontainer/scripts/postCreateCommand.sh", + + // Add the locally installed dotnet to the path to ensure that it is activated + // This allows developers to just use 'dotnet build' on the command-line, and the local dotnet version will be used. + "remoteEnv": { + "PATH": "${containerWorkspaceFolder}/.dotnet:${containerEnv:PATH}", + "DOTNET_MULTILEVEL_LOOKUP": "0" + }, + + // Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. + "remoteUser": "vscode" +} diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer-wasm.json similarity index 59% rename from .devcontainer/devcontainer.json rename to .devcontainer/devcontainer-wasm.json index d7b5a8b0efb57a..c5e938ef8f6427 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer-wasm.json @@ -1,31 +1,36 @@ -// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at: -// https://github.com/microsoft/vscode-dev-containers/tree/v0.192.0/containers/dotnet +// For format details, see https://aka.ms/devcontainer.json. { "name": "C# (.NET)", "build": { "dockerfile": "Dockerfile", "args": { - // Update 'VARIANT' to pick a .NET Core version: 2.1, 3.1, 5.0 - "VARIANT": "5.0", + // Update 'VARIANT' to pick a .NET Core version: 3.1, 6.0 + // Append -bullseye or -focal to pin to an OS version. + "VARIANT": "6.0-focal" } }, - "settings": { - // Loading projects on demand is better for larger codebases - "omnisharp.enableMsBuildLoadProjectsOnDemand": true, - "omnisharp.enableRoslynAnalyzers": true, - "omnisharp.enableEditorConfigSupport": true, - "omnisharp.enableAsyncCompletion": true, - "omnisharp.testRunSettings": "${containerWorkspaceFolder}/artifacts/obj/vscode/.runsettings" + // Configure tool-specific properties. + "customizations": { + // Configure properties specific to VS Code. + "vscode": { + // Add the IDs of extensions you want installed when the container is created. + "extensions": [ + "ms-dotnettools.csharp" + ], + "settings": { + // Loading projects on demand is better for larger codebases + "omnisharp.enableMsBuildLoadProjectsOnDemand": true, + "omnisharp.enableRoslynAnalyzers": true, + "omnisharp.enableEditorConfigSupport": true, + "omnisharp.enableAsyncCompletion": true, + "omnisharp.testRunSettings": "${containerWorkspaceFolder}/artifacts/obj/vscode/.runsettings" + } + } }, - // Add the IDs of extensions you want installed when the container is created. - "extensions": [ - "ms-dotnettools.csharp" - ], - // Use 'onCreateCommand' to run pre-build commands inside the codespace - "onCreateCommand": "${containerWorkspaceFolder}/.devcontainer/scripts/onCreateCommand.sh", + "onCreateCommand": "${containerWorkspaceFolder}/.devcontainer/scripts/onCreateCommand.sh wasm", // Use 'postCreateCommand' to run commands after the container is created. "postCreateCommand": "${containerWorkspaceFolder}/.devcontainer/scripts/postCreateCommand.sh", diff --git a/.devcontainer/scripts/onCreateCommand.sh b/.devcontainer/scripts/onCreateCommand.sh index 48850f5f00b719..f84c90b1878bb2 100755 --- a/.devcontainer/scripts/onCreateCommand.sh +++ b/.devcontainer/scripts/onCreateCommand.sh @@ -2,18 +2,26 @@ set -e -# prebuild the repo, so it is ready for development -./build.sh libs+clr -rc Release -# restore libs tests so that the project is ready to be loaded by OmniSharp -./build.sh libs.tests -restore +opt=$1 +case "$opt" in -# prebuild for WASM, so it is ready for wasm development -make -C src/mono/wasm provision-wasm -export EMSDK_PATH=$PWD/src/mono/wasm/emsdk -./build.sh mono+libs -os Browser -c release + libraries) + # prebuild the repo, so it is ready for development + ./build.sh libs+clr -rc Release + # restore libs tests so that the project is ready to be loaded by OmniSharp + ./build.sh libs.tests -restore + ;; -# install dotnet-serve for running wasm samples -./dotnet.sh tool install dotnet-serve --tool-path ./.dotnet-tools-global + wasm) + # prebuild for WASM, so it is ready for wasm development + make -C src/mono/wasm provision-wasm + export EMSDK_PATH=$PWD/src/mono/wasm/emsdk + ./build.sh mono+libs -os Browser -c Release + + # install dotnet-serve for running wasm samples + ./dotnet.sh tool install dotnet-serve --tool-path ./.dotnet-tools-global + ;; +esac # save the commit hash of the currently built assemblies, so developers know which version was built git rev-parse HEAD > ./artifacts/prebuild.sha From 5e225bff5af1e8610fd1b1e01bb7891864f10c87 Mon Sep 17 00:00:00 2001 From: Eric Erhardt Date: Fri, 26 Aug 2022 14:20:09 -0500 Subject: [PATCH 2/9] Move devcontainer files into separate folders --- .../{devcontainer-libraries.json => libraries/devcontainer.json} | 0 .devcontainer/{devcontainer-wasm.json => wasm/devcontainer.json} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename .devcontainer/{devcontainer-libraries.json => libraries/devcontainer.json} (100%) rename .devcontainer/{devcontainer-wasm.json => wasm/devcontainer.json} (100%) diff --git a/.devcontainer/devcontainer-libraries.json b/.devcontainer/libraries/devcontainer.json similarity index 100% rename from .devcontainer/devcontainer-libraries.json rename to .devcontainer/libraries/devcontainer.json diff --git a/.devcontainer/devcontainer-wasm.json b/.devcontainer/wasm/devcontainer.json similarity index 100% rename from .devcontainer/devcontainer-wasm.json rename to .devcontainer/wasm/devcontainer.json From 8fa37f42235f0b29a593bfb1e3982b90e43d3561 Mon Sep 17 00:00:00 2001 From: Eric Erhardt Date: Fri, 26 Aug 2022 14:25:03 -0500 Subject: [PATCH 3/9] Path up a directory to the Dockerfile --- .devcontainer/libraries/devcontainer.json | 2 +- .devcontainer/wasm/devcontainer.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.devcontainer/libraries/devcontainer.json b/.devcontainer/libraries/devcontainer.json index 7a428fe8dfda19..c43f6163b51cc9 100644 --- a/.devcontainer/libraries/devcontainer.json +++ b/.devcontainer/libraries/devcontainer.json @@ -2,7 +2,7 @@ { "name": "C# (.NET)", "build": { - "dockerfile": "Dockerfile", + "dockerfile": "../Dockerfile", "args": { // Update 'VARIANT' to pick a .NET Core version: 3.1, 6.0 // Append -bullseye or -focal to pin to an OS version. diff --git a/.devcontainer/wasm/devcontainer.json b/.devcontainer/wasm/devcontainer.json index c5e938ef8f6427..1278d22682add4 100644 --- a/.devcontainer/wasm/devcontainer.json +++ b/.devcontainer/wasm/devcontainer.json @@ -2,7 +2,7 @@ { "name": "C# (.NET)", "build": { - "dockerfile": "Dockerfile", + "dockerfile": "../Dockerfile", "args": { // Update 'VARIANT' to pick a .NET Core version: 3.1, 6.0 // Append -bullseye or -focal to pin to an OS version. From 64cae766c1f679932950180a138f9c5893e534e3 Mon Sep 17 00:00:00 2001 From: Eric Erhardt Date: Fri, 26 Aug 2022 21:27:12 +0000 Subject: [PATCH 4/9] Split the Dockerfile so it can be customized per devcontainer --- .devcontainer/libraries/Dockerfile | 19 +++++++++++++++++++ .devcontainer/libraries/devcontainer.json | 2 +- .devcontainer/{ => wasm}/Dockerfile | 0 .devcontainer/wasm/devcontainer.json | 2 +- 4 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 .devcontainer/libraries/Dockerfile rename .devcontainer/{ => wasm}/Dockerfile (100%) diff --git a/.devcontainer/libraries/Dockerfile b/.devcontainer/libraries/Dockerfile new file mode 100644 index 00000000000000..b9752f1fb9cb44 --- /dev/null +++ b/.devcontainer/libraries/Dockerfile @@ -0,0 +1,19 @@ +# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.192.0/containers/dotnet/.devcontainer/base.Dockerfile +# For details on dotnet specific container, see: https://github.com/microsoft/vscode-dev-containers/tree/main/containers/dotnet + +# [Choice] .NET version: 6.0, 5.0, 3.1, 2.1 +ARG VARIANT="6.0-focal" +FROM mcr.microsoft.com/vscode/devcontainers/dotnet:0-${VARIANT} + +# Setup the gh (GitHub) CLI signing key. +RUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg && \ + chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg && \ + echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | tee /etc/apt/sources.list.d/github-cli.list > /dev/null + +# Set up machine requirements to build the repo and the gh CLI +RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ + && apt-get -y install --no-install-recommends cmake llvm-10 clang-10 \ + build-essential python curl git lldb-6.0 liblldb-6.0-dev \ + libunwind8 libunwind8-dev gettext libicu-dev liblttng-ust-dev \ + libssl-dev libnuma-dev libkrb5-dev zlib1g-dev ninja-build \ + gh diff --git a/.devcontainer/libraries/devcontainer.json b/.devcontainer/libraries/devcontainer.json index c43f6163b51cc9..7a428fe8dfda19 100644 --- a/.devcontainer/libraries/devcontainer.json +++ b/.devcontainer/libraries/devcontainer.json @@ -2,7 +2,7 @@ { "name": "C# (.NET)", "build": { - "dockerfile": "../Dockerfile", + "dockerfile": "Dockerfile", "args": { // Update 'VARIANT' to pick a .NET Core version: 3.1, 6.0 // Append -bullseye or -focal to pin to an OS version. diff --git a/.devcontainer/Dockerfile b/.devcontainer/wasm/Dockerfile similarity index 100% rename from .devcontainer/Dockerfile rename to .devcontainer/wasm/Dockerfile diff --git a/.devcontainer/wasm/devcontainer.json b/.devcontainer/wasm/devcontainer.json index 1278d22682add4..c5e938ef8f6427 100644 --- a/.devcontainer/wasm/devcontainer.json +++ b/.devcontainer/wasm/devcontainer.json @@ -2,7 +2,7 @@ { "name": "C# (.NET)", "build": { - "dockerfile": "../Dockerfile", + "dockerfile": "Dockerfile", "args": { // Update 'VARIANT' to pick a .NET Core version: 3.1, 6.0 // Append -bullseye or -focal to pin to an OS version. From 2783fdc791fd82046d992ce159aca06e0ad3f344 Mon Sep 17 00:00:00 2001 From: Eric Erhardt Date: Fri, 26 Aug 2022 17:07:07 -0500 Subject: [PATCH 5/9] Update Codespaces docs --- docs/workflow/Codespaces.md | 37 ++++++++++-------- .../codespace-dev-container-configuration.png | Bin 0 -> 55154 bytes 2 files changed, 21 insertions(+), 16 deletions(-) create mode 100644 docs/workflow/codespace-dev-container-configuration.png diff --git a/docs/workflow/Codespaces.md b/docs/workflow/Codespaces.md index 8473f17beb4ffe..7de1d2be71027f 100644 --- a/docs/workflow/Codespaces.md +++ b/docs/workflow/Codespaces.md @@ -7,9 +7,20 @@ dotnet/runtime runs a nightly GitHub Action to build the latest code in the repo 1. From https://github.com/dotnet/runtime, drop-down the `Code` button and select the `Codespaces` tab. -![New codespace button](https://docs.github.com/assets/images/help/codespaces/new-codespace-button.png) +![New codespace button](https://docs.github.com/assets/cb-138303/images/help/codespaces/new-codespace-button.png) -2. Select the Machine type. For dotnet/runtime, it is recommended to select at least a `4-core` machine. You can also verify that a "Prebuild" is ready. +2. Click the drop-down at the size of the "Create codespace on main" button and select "Configure and create codespace" + +![Configure and create codespace](https://docs.github.com/assets/cb-49317/images/help/codespaces/default-machine-type.png) + +3. Select which Dev container configuration you want to use. + +![Dev container configuration](./codespace-dev-container-configuration.png) + + - For "libraries" work, pick ".devcontainer/libraries/devcontainer.json". + - For "WASM" work, pick ".devcontainer/wasm/devcontainer.json". + +4. Select the Machine type. For dotnet/runtime, it is recommended to select at least a `4-core` machine. You can also verify that a "Prebuild" is ready. ![Codespace machine size](./codespace-machine-size.png) @@ -20,21 +31,15 @@ dotnet/runtime runs a nightly GitHub Action to build the latest code in the repo The Codespaces configuration is spread across the following places: -1. The [.devcontainer](../../.devcontainer) folder contains: - - `devcontainer.json` file configures the codespace and mostly has VS Code settings - - The Dockerfile used to create the image +1. The [.devcontainer](../../.devcontainer) folder contains folders for each "development scenario": + - `libraries` - Used by developers working in src/libraries + - `wasm` - Used by developers working on the browser-wasm workload - The `scripts` folder contains any scripts that are executed during the creation of the codespace. This has the build command that builds the entire repo for prebuilds. -2. The GitHub Action can be configured by following the instructions at https://docs.github.com/codespaces/prebuilding-your-codespaces/configuring-prebuilds. +2. Each development scenario folder contains: + - `devcontainer.json` file configures the codespace and has VS Code / Environment settings + - The Dockerfile used to create the Docker image +3. The GitHub Action can be configured by following the instructions at https://docs.github.com/codespaces/prebuilding-your-codespaces/configuring-prebuilds. To test out changes to the `.devcontainer` files, you can follow the process in [Applying changes to your configuration](https://docs.github.com/codespaces/customizing-your-codespace/configuring-codespaces-for-your-project#applying-changes-to-your-configuration) docs. This allows you to rebuild the Codespace privately before creating a PR. -To test out your `.yml` changes, here is the process: - -**Note**: *Executing these steps will overwrite the current prebuilt container for the entire repo. Afterwards, anyone creating a new codespace will get a prebuilt machine with your test changes until the Action in `main` is executed again.* - -1. Edit and commit the files to a branch. -2. Push that to a branch on dotnet/runtime. Be careful that you aren't pushing to `main` or some other important branch. Prefix your branch name with your GitHub account name, so others know it is a dev branch. ex. `username/FixCodespaces`. -3. In the "Actions" tab at the top of dotnet/runtime: - - Select "Create Codespaces Prebuild" action on the left - - On the right click "Run workflow" and pick your branch - - After it runs, try to create a codespace +To test out your changes you can run the [Codespaces Prebuilds Action](https://github.com/dotnet/runtime/actions/workflows/codespaces/create_codespaces_prebuilds) in your fork against a branch with your changes. \ No newline at end of file diff --git a/docs/workflow/codespace-dev-container-configuration.png b/docs/workflow/codespace-dev-container-configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..0e03dab4b089c57ba768f5f71383e7c72f860aaa GIT binary patch literal 55154 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 Ix>v$~0Z@Cud;kCd literal 0 HcmV?d00001 From 5a343dac99755c8a4e822e9fbc8255c54c04649d Mon Sep 17 00:00:00 2001 From: Eric Erhardt Date: Wed, 14 Sep 2022 11:06:48 -0500 Subject: [PATCH 6/9] Respond to PR feedback --- .devcontainer/libraries/Dockerfile | 26 +++++++++++++++++++++----- .devcontainer/wasm/Dockerfile | 26 +++++++++++++++++++++----- docs/workflow/Codespaces.md | 10 +++++----- 3 files changed, 47 insertions(+), 15 deletions(-) diff --git a/.devcontainer/libraries/Dockerfile b/.devcontainer/libraries/Dockerfile index b9752f1fb9cb44..fb55b8ad51b69d 100644 --- a/.devcontainer/libraries/Dockerfile +++ b/.devcontainer/libraries/Dockerfile @@ -1,7 +1,7 @@ # See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.192.0/containers/dotnet/.devcontainer/base.Dockerfile # For details on dotnet specific container, see: https://github.com/microsoft/vscode-dev-containers/tree/main/containers/dotnet -# [Choice] .NET version: 6.0, 5.0, 3.1, 2.1 +# [Choice] .NET version: 6.0, 3.1 ARG VARIANT="6.0-focal" FROM mcr.microsoft.com/vscode/devcontainers/dotnet:0-${VARIANT} @@ -12,8 +12,24 @@ RUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | d # Set up machine requirements to build the repo and the gh CLI RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ - && apt-get -y install --no-install-recommends cmake llvm-10 clang-10 \ - build-essential python curl git lldb-6.0 liblldb-6.0-dev \ - libunwind8 libunwind8-dev gettext libicu-dev liblttng-ust-dev \ - libssl-dev libnuma-dev libkrb5-dev zlib1g-dev ninja-build \ + && apt-get -y install --no-install-recommends \ + cmake \ + llvm-10 \ + clang-10 \ + build-essential \ + python \ + curl \ + git \ + lldb-6.0 \ + liblldb-6.0-dev \ + libunwind8 \ + libunwind8-dev \ + gettext \ + libicu-dev \ + liblttng-ust-dev \ + libssl-dev \ + libnuma-dev \ + libkrb5-dev \ + zlib1g-dev \ + ninja-build \ gh diff --git a/.devcontainer/wasm/Dockerfile b/.devcontainer/wasm/Dockerfile index 54f5f2ff58bb80..0376b65042cc2e 100644 --- a/.devcontainer/wasm/Dockerfile +++ b/.devcontainer/wasm/Dockerfile @@ -1,7 +1,7 @@ # See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.192.0/containers/dotnet/.devcontainer/base.Dockerfile # For details on dotnet specific container, see: https://github.com/microsoft/vscode-dev-containers/tree/main/containers/dotnet -# [Choice] .NET version: 6.0, 5.0, 3.1, 2.1 +# [Choice] .NET version: 6.0, 3.1 ARG VARIANT="6.0-focal" FROM mcr.microsoft.com/vscode/devcontainers/dotnet:0-${VARIANT} @@ -12,10 +12,26 @@ RUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | d # Set up machine requirements to build the repo and the gh CLI RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ - && apt-get -y install --no-install-recommends cmake llvm-10 clang-10 \ - build-essential python curl git lldb-6.0 liblldb-6.0-dev \ - libunwind8 libunwind8-dev gettext libicu-dev liblttng-ust-dev \ - libssl-dev libnuma-dev libkrb5-dev zlib1g-dev ninja-build \ + && apt-get -y install --no-install-recommends \ + cmake \ + llvm-10 \ + clang-10 \ + build-essential \ + python \ + curl \ + git \ + lldb-6.0 \ + liblldb-6.0-dev \ + libunwind8 \ + libunwind8-dev \ + gettext \ + libicu-dev \ + liblttng-ust-dev \ + libssl-dev \ + libnuma-dev \ + libkrb5-dev \ + zlib1g-dev \ + ninja-build \ gh # Install V8 Engine diff --git a/docs/workflow/Codespaces.md b/docs/workflow/Codespaces.md index 7de1d2be71027f..edc0959f1cc58c 100644 --- a/docs/workflow/Codespaces.md +++ b/docs/workflow/Codespaces.md @@ -9,7 +9,7 @@ dotnet/runtime runs a nightly GitHub Action to build the latest code in the repo ![New codespace button](https://docs.github.com/assets/cb-138303/images/help/codespaces/new-codespace-button.png) -2. Click the drop-down at the size of the "Create codespace on main" button and select "Configure and create codespace" +2. Click the drop-down at the side of the `Create codespace on main` button and select `Configure and create codespace` ![Configure and create codespace](https://docs.github.com/assets/cb-49317/images/help/codespaces/default-machine-type.png) @@ -17,10 +17,10 @@ dotnet/runtime runs a nightly GitHub Action to build the latest code in the repo ![Dev container configuration](./codespace-dev-container-configuration.png) - - For "libraries" work, pick ".devcontainer/libraries/devcontainer.json". - - For "WASM" work, pick ".devcontainer/wasm/devcontainer.json". + - For `libraries` work, pick `.devcontainer/libraries/devcontainer.json`. + - For `WASM` work, pick `.devcontainer/wasm/devcontainer.json`. -4. Select the Machine type. For dotnet/runtime, it is recommended to select at least a `4-core` machine. You can also verify that a "Prebuild" is ready. +4. Select the Machine type. For `dotnet/runtime`, it is recommended to select at least a `4-core` machine. You can also verify that a `Prebuild` is ready. ![Codespace machine size](./codespace-machine-size.png) @@ -32,7 +32,7 @@ dotnet/runtime runs a nightly GitHub Action to build the latest code in the repo The Codespaces configuration is spread across the following places: 1. The [.devcontainer](../../.devcontainer) folder contains folders for each "development scenario": - - `libraries` - Used by developers working in src/libraries + - `libraries` - Used by developers working in `src/libraries` - `wasm` - Used by developers working on the browser-wasm workload - The `scripts` folder contains any scripts that are executed during the creation of the codespace. This has the build command that builds the entire repo for prebuilds. 2. Each development scenario folder contains: From 3ef0651f6cac5ff10e77dc3e1918750ea402b6d7 Mon Sep 17 00:00:00 2001 From: Eric Erhardt Date: Wed, 14 Sep 2022 15:57:10 -0500 Subject: [PATCH 7/9] Use the new open devcontainers path. --- .devcontainer/libraries/Dockerfile | 2 +- .devcontainer/wasm/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.devcontainer/libraries/Dockerfile b/.devcontainer/libraries/Dockerfile index fb55b8ad51b69d..e9cb0008d8b01f 100644 --- a/.devcontainer/libraries/Dockerfile +++ b/.devcontainer/libraries/Dockerfile @@ -3,7 +3,7 @@ # [Choice] .NET version: 6.0, 3.1 ARG VARIANT="6.0-focal" -FROM mcr.microsoft.com/vscode/devcontainers/dotnet:0-${VARIANT} +FROM mcr.microsoft.com/devcontainers/dotnet:0-${VARIANT} # Setup the gh (GitHub) CLI signing key. RUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg && \ diff --git a/.devcontainer/wasm/Dockerfile b/.devcontainer/wasm/Dockerfile index 0376b65042cc2e..09ec45df54f895 100644 --- a/.devcontainer/wasm/Dockerfile +++ b/.devcontainer/wasm/Dockerfile @@ -3,7 +3,7 @@ # [Choice] .NET version: 6.0, 3.1 ARG VARIANT="6.0-focal" -FROM mcr.microsoft.com/vscode/devcontainers/dotnet:0-${VARIANT} +FROM mcr.microsoft.com/devcontainers/dotnet:0-${VARIANT} # Setup the gh (GitHub) CLI signing key. RUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg && \ From 9bddecfa09169d7a0bcbfbdfb257379a0bccc219 Mon Sep 17 00:00:00 2001 From: Eric Erhardt Date: Wed, 14 Sep 2022 16:29:31 -0500 Subject: [PATCH 8/9] Use the GH CLI feature instead of installing it ourselves --- .devcontainer/libraries/Dockerfile | 8 +------- .devcontainer/libraries/devcontainer.json | 4 ++++ .devcontainer/wasm/Dockerfile | 8 +------- .devcontainer/wasm/devcontainer.json | 4 ++++ 4 files changed, 10 insertions(+), 14 deletions(-) diff --git a/.devcontainer/libraries/Dockerfile b/.devcontainer/libraries/Dockerfile index e9cb0008d8b01f..ff924ca7466f9b 100644 --- a/.devcontainer/libraries/Dockerfile +++ b/.devcontainer/libraries/Dockerfile @@ -5,11 +5,6 @@ ARG VARIANT="6.0-focal" FROM mcr.microsoft.com/devcontainers/dotnet:0-${VARIANT} -# Setup the gh (GitHub) CLI signing key. -RUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg && \ - chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg && \ - echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | tee /etc/apt/sources.list.d/github-cli.list > /dev/null - # Set up machine requirements to build the repo and the gh CLI RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ && apt-get -y install --no-install-recommends \ @@ -31,5 +26,4 @@ RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ libnuma-dev \ libkrb5-dev \ zlib1g-dev \ - ninja-build \ - gh + ninja-build diff --git a/.devcontainer/libraries/devcontainer.json b/.devcontainer/libraries/devcontainer.json index 7a428fe8dfda19..55482d390fa682 100644 --- a/.devcontainer/libraries/devcontainer.json +++ b/.devcontainer/libraries/devcontainer.json @@ -10,6 +10,10 @@ } }, + "features": { + "ghcr.io/devcontainers/features/github-cli:1": {} + }, + // Configure tool-specific properties. "customizations": { // Configure properties specific to VS Code. diff --git a/.devcontainer/wasm/Dockerfile b/.devcontainer/wasm/Dockerfile index 09ec45df54f895..cd29264dbff299 100644 --- a/.devcontainer/wasm/Dockerfile +++ b/.devcontainer/wasm/Dockerfile @@ -5,11 +5,6 @@ ARG VARIANT="6.0-focal" FROM mcr.microsoft.com/devcontainers/dotnet:0-${VARIANT} -# Setup the gh (GitHub) CLI signing key. -RUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg && \ - chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg && \ - echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | tee /etc/apt/sources.list.d/github-cli.list > /dev/null - # Set up machine requirements to build the repo and the gh CLI RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ && apt-get -y install --no-install-recommends \ @@ -31,8 +26,7 @@ RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ libnuma-dev \ libkrb5-dev \ zlib1g-dev \ - ninja-build \ - gh + ninja-build # Install V8 Engine SHELL ["/bin/bash", "-c"] diff --git a/.devcontainer/wasm/devcontainer.json b/.devcontainer/wasm/devcontainer.json index c5e938ef8f6427..b2075f606774bd 100644 --- a/.devcontainer/wasm/devcontainer.json +++ b/.devcontainer/wasm/devcontainer.json @@ -10,6 +10,10 @@ } }, + "features": { + "ghcr.io/devcontainers/features/github-cli:1": {} + }, + // Configure tool-specific properties. "customizations": { // Configure properties specific to VS Code. From 6222d87cc08455cc0c6447a241d01e81f9cd19fd Mon Sep 17 00:00:00 2001 From: Eric Erhardt Date: Thu, 15 Sep 2022 18:43:32 -0500 Subject: [PATCH 9/9] Set hostRequirements for Codespaces Developing in dotnet/runtime with a 2-core / 4GB ram machine doesn't work very well. Add a minimum of 4-core machine to the devcontainer spec. Fix #75680 --- .devcontainer/libraries/devcontainer.json | 4 ++++ .devcontainer/wasm/devcontainer.json | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/.devcontainer/libraries/devcontainer.json b/.devcontainer/libraries/devcontainer.json index 55482d390fa682..09daf0ecf6c6f8 100644 --- a/.devcontainer/libraries/devcontainer.json +++ b/.devcontainer/libraries/devcontainer.json @@ -9,6 +9,10 @@ "VARIANT": "6.0-focal" } }, + "hostRequirements": { + "cpus": 4, + "memory": "8gb" + }, "features": { "ghcr.io/devcontainers/features/github-cli:1": {} diff --git a/.devcontainer/wasm/devcontainer.json b/.devcontainer/wasm/devcontainer.json index b2075f606774bd..44fca5078392db 100644 --- a/.devcontainer/wasm/devcontainer.json +++ b/.devcontainer/wasm/devcontainer.json @@ -9,6 +9,10 @@ "VARIANT": "6.0-focal" } }, + "hostRequirements": { + "cpus": 4, + "memory": "8gb" + }, "features": { "ghcr.io/devcontainers/features/github-cli:1": {}