diff --git a/.circleci/config.yml b/.circleci/config.yml index 9e9ccce11f31..5cf46e635006 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -45,7 +45,7 @@ executors: type: enum enum: ["medium", "xlarge", "2xlarge+"] docker: - - image: electron.azurecr.io/build:d818f06a9b1540c7fd38f75ad5a2c493dd6843b6 + - image: ghcr.io/electron/build:27db4a3e3512bfd2e47f58cea69922da0835f1d9 resource_class: << parameters.size >> macos: diff --git a/.devcontainer/README.md b/.devcontainer/README.md new file mode 100644 index 000000000000..c12625a1481e --- /dev/null +++ b/.devcontainer/README.md @@ -0,0 +1,59 @@ +# Electron Dev on Codespaces + +Welcome to the Codespaces Electron Developer Environment. + +## Quick Start + +Upon creation of your codespace you should have [build tools](https://github.com/electron/build-tools) installed and an initialized gclient checkout of Electron. In order to build electron you'll need to run the following commands. + +```bash +e sync -vv +e build +``` + +The initial sync will take approximately ~30 minutes and the build will take ~8 minutes. Incremental syncs and incremental builds are substantially quicker. + +## Directory Structure + +Codespaces doesn't lean very well into gclient based checkouts, the directory structure is slightly strange. There are two locations for the `electron` checkout that both map to the same files under the hood. + +```graphql +# Primary gclient checkout container +/workspaces/gclient/* + └─ src/* - # Chromium checkout + └─ electron - # Electron checkout +# Symlinked Electron checkout (identical to the above) +/workspaces/electron +``` + +## Goma + +If you are a maintainer [with Goma access](../docs/development/goma.md) it should be automatically configured and authenticated when you spin up a new codespaces instance. You can validate this by checking `e d goma_auth info` or by checking that your build-tools configuration has a goma mode of `cluster`. + +## Running Electron + +You can run Electron in a few ways. If you just want to see if it launches: + +```bash +# Enter an interactive JS prompt headlessly +xvfb-run e start -i +``` + +But if you want to actually see Electron you will need to use the built-in VNC capability. If you click "Ports" in codespaces and then open the `VNC web client` forwarded port you should see a web based VNC portal in your browser. When you are asked for a password use `builduser`. + +Once in the VNC UI you can open `Applications -> System -> XTerm` which will open a VNC based terminal app and then you can run `e start` like normal and Electron will open in your VNC session. + +## Running Tests + +You run tests via build-tools and `xvfb`. + +```bash +# Run all tests +xvfb-run e test + +# Run the main process tests +xvfb-run e test --runners=main + +# Run the old remote tests +xvfb-run e test --runners=remote +``` diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 000000000000..5c800028282d --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,43 @@ +{ + "dockerComposeFile": "docker-compose.yml", + "service": "buildtools", + "onCreateCommand": ".devcontainer/on-create-command.sh", + "workspaceFolder": "/workspaces/gclient/src/electron", + "extensions": [ + "joeleinbinder.mojom-language", + "rafaelmaiolla.diff", + "surajbarkale.ninja", + "ms-vscode.cpptools", + "mutantdino.resourcemonitor", + "dbaeumer.vscode-eslint", + "shakram02.bash-beautify", + "marshallofsound.gnls-electron" + ], + "settings": { + "[gn]": { + "editor.formatOnSave": true + }, + "editor.tabSize": 2, + "bashBeautify.tabSize": 2 + }, + "forwardPorts": [8088, 6080, 5901], + "portsAttributes": { + "8088": { + "label": "Goma Control Panel", + "onAutoForward": "silent" + }, + "6080": { + "label": "VNC web client (noVNC)", + "onAutoForward": "silent" + }, + "5901": { + "label": "VNC TCP port", + "onAutoForward": "silent" + } + }, + "hostRequirements": { + "storage": "32gb", + "cpus": 8 + }, + "remoteUser": "builduser" +} \ No newline at end of file diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml new file mode 100644 index 000000000000..794577745512 --- /dev/null +++ b/.devcontainer/docker-compose.yml @@ -0,0 +1,19 @@ +version: '3' + +services: + buildtools: + image: ghcr.io/electron/devcontainer:27db4a3e3512bfd2e47f58cea69922da0835f1d9 + + volumes: + - ..:/workspaces/gclient/src/electron:cached + + - /var/run/docker.sock:/var/run/docker.sock + + command: /bin/sh -c "while sleep 1000; do :; done" + + user: builduser + + cap_add: + - SYS_PTRACE + security_opt: + - seccomp:unconfined diff --git a/.devcontainer/on-create-command.sh b/.devcontainer/on-create-command.sh new file mode 100755 index 000000000000..eea1c7b857c6 --- /dev/null +++ b/.devcontainer/on-create-command.sh @@ -0,0 +1,75 @@ +#!/bin/bash + +set -eo pipefail + +buildtools=$HOME/.electron_build_tools +gclient_root=/workspaces/gclient +buildtools_configs=/workspaces/buildtools-configs + +export PATH="$PATH:$buildtools/src" + +# Create the persisted buildtools config folder +mkdir -p $buildtools_configs +rm -f $buildtools/configs +ln -s $buildtools_configs $buildtools/configs + +# Write the gclient config if it does not already exist +if [ ! -f $gclient_root/.gclient ]; then + echo " + solutions = [ + { \"name\" : \"src/electron\", + \"url\" : \"https://github.com/electron/electron\", + \"deps_file\" : \"DEPS\", + \"managed\" : False, + \"custom_deps\" : { + }, + \"custom_vars\": {}, + }, + ] + " >$gclient_root/.gclient +fi + +# Write the default buildtools config file if it does +# not already exist +if [ ! -f $buildtools/configs/evm.testing.json ]; then + write_config() { + echo " + { + \"root\": \"/workspaces/gclient\", + \"goma\": \"$1\", + \"gen\": { + \"args\": [ + \"import(\\\"//electron/build/args/testing.gn\\\")\", + \"import(\\\"/home/builduser/.electron_build_tools/third_party/goma.gn\\\")\" + ], + \"out\": \"Testing\" + }, + \"env\": { + \"CHROMIUM_BUILDTOOLS_PATH\": \"/workspaces/gclient/src/buildtools\", + \"GIT_CACHE_PATH\": \"/workspaces/gclient/.git-cache\" + }, + \"remotes\": { + \"electron\": { + \"origin\": \"https://github.com/electron/electron.git\" + } + } + } + " >$buildtools/configs/evm.testing.json + } + + # Start out as cache only + write_config cache-only + + e use testing + + # Attempt to auth to the goma service via codespaces tokens + # if it works we can use the goma cluster + export NOTGOMA_CODESPACES_TOKEN=$GITHUB_TOKEN + if e d goma_auth login; then + write_config cluster + fi +else + # Even if the config file existed we still need to re-auth with the goma + # cluster + NOTGOMA_CODESPACES_TOKEN=$GITHUB_TOKEN e d goma_auth login || true +fi diff --git a/vsts-arm32v7.yml b/vsts-arm32v7.yml index 7ce8a8e86ac7..feeb920ba8f3 100644 --- a/vsts-arm32v7.yml +++ b/vsts-arm32v7.yml @@ -1,7 +1,7 @@ resources: containers: - container: arm32v7-test-container - image: electron.azurecr.io/build:arm32v7-ca93c6a7bc49e7d2a7b8c62ed04e0b870f3dfd1e + image: ghcr.io/electron/build:arm32v7-27db4a3e3512bfd2e47f58cea69922da0835f1d9 options: --shm-size 128m jobs: diff --git a/vsts-arm64v8.yml b/vsts-arm64v8.yml index 93ea8d6e0c9b..e64708663b39 100644 --- a/vsts-arm64v8.yml +++ b/vsts-arm64v8.yml @@ -1,7 +1,7 @@ resources: containers: - container: arm64v8-test-container - image: electron.azurecr.io/arm64v8-ca93c6a7bc49e7d2a7b8c62ed04e0b870f3dfd1e + image: ghcr.io/electron/build:arm64v8-27db4a3e3512bfd2e47f58cea69922da0835f1d9 options: --shm-size 128m jobs: