Skip to content

Commit 133a56d

Browse files
authored
Playwright docker improvements (#33213)
* Clean up playwright-common Dockerfile * Speed up element-web docker build * Wire up element-desktop playwright tests via nx * Better debug logs for Element Desktop playwright in CI * Iterate * Iterate * Fix element-desktop screenshot docker * @electron/fuses * Partial revert
1 parent b06422d commit 133a56d

File tree

10 files changed

+112
-26
lines changed

10 files changed

+112
-26
lines changed

.github/workflows/build_desktop_test.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ jobs:
9797
PW_TAG: ${{ inputs.project }}
9898
ELEMENT_DESKTOP_EXECUTABLE: ${{ steps.executable.outputs.path }}
9999
ARGS: ${{ inputs.args }}
100+
DEBUG: pw:browser
100101

101102
- name: Upload blob report
102103
if: always() && inputs.blob_report

apps/desktop/package.json

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
"mkdirs": "mkdirp packages deploys",
2929
"fetch": "pnpm run mkdirs && node scripts/fetch-package.ts",
3030
"asar-webapp": "asar p webapp webapp.asar",
31-
"start": "pnpm run build:ts && pnpm run build:res && electron .",
31+
"start": "nx start",
3232
"lint": "pnpm lint:types && pnpm lint:js",
3333
"lint:js": "eslint --max-warnings 0 src hak playwright scripts",
3434
"lint:js-fix": "eslint --fix --max-warnings 0 src hak playwright scripts && prettier --log-level=warn --write .",
@@ -39,22 +39,19 @@
3939
"lint:types:hak": "tsc --noEmit -p hak/tsconfig.json",
4040
"build:native": "pnpm run hak",
4141
"build:native:universal": "pnpm run hak --target x86_64-apple-darwin fetchandbuild && pnpm run hak --target aarch64-apple-darwin fetchandbuild && pnpm run hak --target x86_64-apple-darwin --target aarch64-apple-darwin copyandlink",
42-
"build:32": "pnpm run build:ts && pnpm run build:res && electron-builder --ia32",
43-
"build:64": "pnpm run build:ts && pnpm run build:res && electron-builder --x64",
44-
"build:universal": "pnpm run build:ts && pnpm run build:res && electron-builder --universal",
45-
"build": "pnpm run build:ts && pnpm run build:res && electron-builder",
46-
"build:ts": "tsc",
47-
"build:res": "node scripts/copy-res.ts",
42+
"build:32": "nx build --ia32",
43+
"build:64": "nx build --x64",
44+
"build:universal": "nx build --universal",
45+
"build": "nx build --",
4846
"docker:setup": "docker build --platform linux/amd64 -t element-desktop-dockerbuild -f dockerbuild/Dockerfile .",
4947
"docker:build:native": "scripts/in-docker.sh pnpm run hak",
5048
"docker:build": "scripts/in-docker.sh pnpm run build",
5149
"docker:install": "scripts/in-docker.sh pnpm install",
5250
"clean": "rimraf webapp.asar dist packages deploys lib",
5351
"hak": "node scripts/hak/index.ts",
54-
"test": "playwright test",
55-
"test:open": "pnpm test --ui",
56-
"test:screenshots:build": "docker build playwright -t element-desktop-playwright --platform linux/amd64",
57-
"test:screenshots:run": "docker run --rm --network host -v $(pwd):/work/element-desktop -v element-desktop-playwright:/work/element-desktop/node_modules -v /var/run/docker.sock:/var/run/docker.sock --platform linux/amd64 -it element-desktop-playwright",
52+
"test:playwright": "nx test:playwright --",
53+
"test:playwright:open": "nx test:playwright -- --ui",
54+
"test:playwright:screenshots": "nx test:playwright:screenshots --",
5855
"sane-postinstall": "electron-builder install-app-deps"
5956
},
6057
"dependencies": {
@@ -72,6 +69,7 @@
7269
"@babel/preset-env": "^7.18.10",
7370
"@babel/preset-typescript": "^7.18.6",
7471
"@electron/asar": "4.1.2",
72+
"@electron/fuses": "^2.1.1",
7573
"@playwright/test": "catalog:",
7674
"@stylistic/eslint-plugin": "^5.0.0",
7775
"@types/auto-launch": "^5.0.1",
@@ -107,5 +105,8 @@
107105
"hakDependencies": {
108106
"matrix-seshat": "4.2.0"
109107
},
110-
"packageManager": "pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319"
108+
"packageManager": "pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319",
109+
"nx": {
110+
"includedScripts": []
111+
}
111112
}

apps/desktop/playwright/Dockerfile

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
FROM mcr.microsoft.com/playwright:v1.59.1-jammy@sha256:8a0360d39d1973be506dd59002904a774f6d697d4946c94063b3fd006461c8ff
22

3-
WORKDIR /work/element-desktop
3+
WORKDIR /work
44

5-
RUN apt-get update && apt-get -y install xvfb dbus-x11 && apt-get purge -y --auto-remove && rm -rf /var/lib/apt/lists/*
5+
RUN apt-get update && \
6+
apt-get -y install xvfb dbus-x11 && \
7+
apt-get purge -y --auto-remove && \
8+
rm -rf /var/lib/apt/lists/* && \
9+
corepack enable
610

7-
# Create node_modules & dist dirs so that the volumes have the correct permissions
8-
RUN mkdir node_modules dist && chown 1000:1000 node_modules dist
11+
ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0
12+
ENV GITHUB_ACTIONS=1
13+
ENV DEBUG=pw:browser
914

15+
# switch to node user
1016
USER 1000:1000
1117

12-
COPY docker-entrypoint.sh /opt/docker-entrypoint.sh
18+
COPY apps/desktop/playwright/docker-entrypoint.sh /opt/docker-entrypoint.sh
1319
ENTRYPOINT ["bash", "/opt/docker-entrypoint.sh"]

apps/desktop/playwright/docker-entrypoint.sh

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,5 @@ sleep 2
88

99
export DISPLAY=:99
1010

11-
pnpm install --frozen-lockfile
12-
pnpm build -l --dir
13-
1411
PLAYWRIGHT_HTML_OPEN=never ELEMENT_DESKTOP_EXECUTABLE="./dist/linux-unpacked/element-desktop" \
15-
npx playwright test --update-snapshots --reporter line,html "$1"
16-
17-
# Clean up
18-
rm -R core qemu_* || exit 0
12+
exec pnpm -C apps/desktop exec playwright test --update-snapshots --reporter line,html "$1"

apps/desktop/playwright/element-desktop-test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,13 @@ export const test = base.extend<Fixtures>({
6969
const args = ["--profile-dir", tmpDir, ...extraArgs];
7070

7171
if (process.env.GITHUB_ACTIONS) {
72+
args.push("--disable-gpu");
73+
7274
if (process.platform === "linux") {
75+
if (process.getuid() === 0) {
76+
args.push("--no-sandbox");
77+
}
78+
7379
// GitHub Actions hosted runner lacks dbus and a compatible keyring, so we need to force plaintext storage
7480
args.push("--storage-mode", "force-plaintext");
7581
} else if (process.platform === "darwin") {

apps/desktop/project.json

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,65 @@
1919
"tags": ["type=ref,event=branch"]
2020
}
2121
}
22+
},
23+
"build:ts": {
24+
"cache": true,
25+
"command": "tsc",
26+
"inputs": ["src", "{projectRoot}/tsconfig.json"],
27+
"outputs": ["{projectRoot}/lib/*.js", "{projectRoot}/lib/*.d.ts"],
28+
"options": { "cwd": "apps/desktop" }
29+
},
30+
"build:res": {
31+
"cache": true,
32+
"command": "node scripts/copy-res.ts",
33+
"inputs": ["{projectRoot}/i18n"],
34+
"outputs": ["{projectRoot}/lib/i18n"],
35+
"options": { "cwd": "apps/desktop" }
36+
},
37+
"build": {
38+
"cache": true,
39+
"command": "pnpm exec electron-builder",
40+
"inputs": [
41+
"src",
42+
"{projectRoot}/.hak/hakModules",
43+
"{projectRoot}/electron-builder.json",
44+
"{projectRoot}/webapp.asar"
45+
],
46+
"outputs": ["{projectRoot}/dist"],
47+
"options": { "cwd": "apps/desktop" },
48+
"dependsOn": ["build:*"]
49+
},
50+
"start": {
51+
"command": "electron .",
52+
"options": { "cwd": "apps/desktop" },
53+
"dependsOn": ["build:*"]
54+
},
55+
"test:playwright": {
56+
"command": "playwright test",
57+
"options": { "cwd": "apps/desktop" }
58+
},
59+
"test:playwright:screenshots:build-app": {
60+
"executor": "nx:run-commands",
61+
"options": {
62+
"commands": [
63+
"pnpm run build -l --x64 --dir --publish=never",
64+
"pnpm exec electron-fuses write --app ./dist/linux-unpacked/element-desktop EnableNodeCliInspectArguments=on"
65+
],
66+
"parallel": false,
67+
"cwd": "apps/desktop"
68+
},
69+
"dependsOn": ["build:*"]
70+
},
71+
"test:playwright:screenshots:build-docker": {
72+
"cache": true,
73+
"command": "docker build -f playwright/Dockerfile -t element-desktop-playwright --platform linux/amd64 ../..",
74+
"inputs": ["{projectRoot}/playwright/Dockerfile", "{projectRoot}/playwright/docker-entrypoint.sh"],
75+
"options": { "cwd": "apps/desktop" }
76+
},
77+
"test:playwright:screenshots": {
78+
"command": "docker run --rm --network host -v $(pwd)/../../:/work/ --platform linux/amd64 -it element-desktop-playwright",
79+
"options": { "cwd": "apps/desktop" },
80+
"dependsOn": ["test:playwright:screenshots:*"]
2281
}
2382
}
2483
}

apps/web/Dockerfile.dockerignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ apps/web/webpack-stats.json
2323
apps/web/playwright/
2424
apps/web/webapp/
2525
apps/web/debian/
26+
apps/desktop
27+
!apps/desktop/package.json
2628

2729
packages/shared-components/__vis__/
2830
packages/shared-components/storybook-static/

apps/web/project.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
"dependsOn": ["^build:playwright"]
6161
},
6262
"test:playwright:screenshots": {
63-
"command": "playwright-screenshots nx test:playwright --update-snapshots --project=Chrome --grep @screenshot",
63+
"command": "playwright-screenshots nx test:playwright -- --update-snapshots --project=Chrome --grep @screenshot",
6464
"options": { "cwd": "apps/web" },
6565
"dependsOn": ["^build:playwright"]
6666
}

packages/playwright-common/Dockerfile

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,17 @@ ARG PLAYWRIGHT_VERSION
66
WORKDIR /work
77

88
# fonts-dejavu is needed for the same RTL rendering as on CI
9-
RUN apt-get update && apt-get -y install docker.io fonts-dejavu
9+
RUN apt-get update && \
10+
apt-get -y install docker.io fonts-dejavu && \
11+
apt-get purge -y --auto-remove && \
12+
rm -rf /var/lib/apt/lists/*
13+
1014
# Install the matching playwright runtime, the docker image only includes browsers
1115
RUN npm i -g playwright@${PLAYWRIGHT_VERSION}
1216

17+
# switch to pwuser
18+
USER 1001:1001
19+
1320
COPY docker-entrypoint.sh /docker-entrypoint.sh
1421

1522
# We use `docker-init` as PID 1, which means that the container shuts down correctly on SIGTERM.

pnpm-lock.yaml

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)