-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathaction.yml
More file actions
173 lines (162 loc) · 5.94 KB
/
action.yml
File metadata and controls
173 lines (162 loc) · 5.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
name: "Setup Playwright PHP"
description: "Install the Playwright JS library and download the browsers you need (default: chrome). Made for PlaywrightPHP."
author: "playwright-php"
branding:
icon: "download"
color: "blue"
inputs:
playwright-version:
description: "Version of the Playwright package to install (e.g., 1.47.2 or latest)."
required: false
default: "latest"
browsers:
description: 'Browsers as a JSON array (["chrome","firefox"]), "all", or a single string like "chrome". Allowed: chrome, chromium, firefox, webkit, msedge.'
required: false
default: "chrome"
browsers-path:
description: "Optional custom directory to store browser binaries (sets PLAYWRIGHT_BROWSERS_PATH)."
required: false
default: ""
with-deps:
description: "Install OS dependencies on Linux using --with-deps. true | false | auto. auto enables only on Linux."
required: false
default: "auto"
outputs:
playwright-version:
description: "The installed Playwright version (x.y.z)."
value: ${{ steps.detect-version.outputs.version }}
installed-browsers:
description: "JSON array string of the browsers that were installed."
value: ${{ steps.args.outputs.json }}
runs:
using: "composite"
steps:
- name: Resolve browsers and basic validation
id: args
shell: bash
env:
INPUT_BROWSERS: ${{ inputs.browsers }}
RUNNER_OS: ${{ runner.os }}
run: |
set -euo pipefail
node - <<'NODE'
const fs = require('fs');
const out = process.env.GITHUB_OUTPUT;
const raw = (process.env.INPUT_BROWSERS ?? 'chrome').trim();
const os = process.env.RUNNER_OS || '';
const allowed = new Set(['chrome','chromium','firefox','webkit','msedge']);
// "all" shortcut
if (raw.toLowerCase() === 'all') {
fs.appendFileSync(out, 'cli=all\njson=["chromium","firefox","webkit"]\n');
process.exit(0);
}
// Try JSON first
let arr;
try {
const parsed = JSON.parse(raw);
if (Array.isArray(parsed)) {
arr = parsed;
} else if (typeof parsed === 'string') {
// Allow a single string JSON, e.g. "chrome"
arr = [parsed];
} else {
throw new Error();
}
} catch {
// Fall back to treating raw as a single browser token
arr = [raw];
}
const norm = [];
for (const v of arr.map(x => String(x).trim().toLowerCase()).filter(Boolean)) {
if (!allowed.has(v)) {
console.error(`Invalid browser "${v}". Allowed: ${Array.from(allowed).join(', ')}, or "all".`);
process.exit(1);
}
if (v === 'msedge' && os !== 'Windows') {
console.error(`"msedge" can only be installed on Windows runners (current: ${os}).`);
process.exit(1);
}
if (!norm.includes(v)) norm.push(v);
}
if (norm.length === 0) {
console.error('At least one browser must be specified.');
process.exit(1);
}
const cli = norm.join(' ');
const json = JSON.stringify(norm);
fs.appendFileSync(out, `cli=${cli}\njson=${json}\n`);
NODE
- name: Compute --with-deps (tiny)
id: flags
shell: bash
env:
RAW_WITH_DEPS: ${{ inputs.with-deps }}
RUNNER_OS: ${{ runner.os }}
run: |
set -euo pipefail
v=$(printf '%s' "$RAW_WITH_DEPS" | tr '[:upper:]' '[:lower:]' | xargs)
[ "$v" = "true" ] || [ "$v" = "false" ] || [ "$v" = "auto" ] || { echo "::error::with-deps must be true, false, or auto"; exit 1; }
if [ "$v" = "true" ] || { [ "$v" = "auto" ] && [ "$RUNNER_OS" = "Linux" ]; }; then
echo "with_deps=--with-deps" >> "$GITHUB_OUTPUT"
else
echo "with_deps=" >> "$GITHUB_OUTPUT"
fi
- name: Configure browsers path (optional)
if: ${{ inputs.browsers-path != '' }}
shell: bash
run: echo "PLAYWRIGHT_BROWSERS_PATH=${{ inputs.browsers-path }}" >> "$GITHUB_ENV"
- name: Install Playwright npm package
shell: bash
env:
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: "1"
run: |
set -euo pipefail
if [ "${{ inputs.playwright-version }}" = "latest" ]; then
PKG="playwright@latest"
else
PKG="playwright@${{ inputs.playwright-version }}"
fi
echo "Installing $PKG globally (skip browser download)..."
npm i -g --no-audit --no-fund "$PKG"
command -v playwright || true
GLOBAL_NODE_ROOT=$(npm root -g | tr -d '\r')
OS="${RUNNER_OS:-}"
if [ "$OS" = "Windows" ] && command -v cygpath >/dev/null 2>&1; then
GLOBAL_NODE_ROOT=$(cygpath -m "$GLOBAL_NODE_ROOT")
fi
SEP=':'
if [ "$OS" = "Windows" ]; then
SEP=';'
fi
if [ -n "${NODE_PATH:-}" ]; then
echo "NODE_PATH=${GLOBAL_NODE_ROOT}${SEP}${NODE_PATH}" >> "$GITHUB_ENV"
else
echo "NODE_PATH=${GLOBAL_NODE_ROOT}" >> "$GITHUB_ENV"
fi
- name: Install browsers
shell: bash
env:
CLI: ${{ steps.args.outputs.cli }}
WITH_DEPS: ${{ steps.flags.outputs.with_deps }}
run: |
set -euo pipefail
if [ "$CLI" = "all" ]; then
echo "Installing all default Playwright browsers (chromium, firefox, webkit)..."
set -x
playwright install $WITH_DEPS
set +x
else
echo "Installing: $CLI"
set -x
# shellcheck disable=SC2086
playwright install $WITH_DEPS $CLI
set +x
fi
- name: Detect Playwright version
id: detect-version
shell: bash
run: |
set -euo pipefail
V=$(playwright --version 2>/dev/null | awk '{print $2}')
[ -n "$V" ] || V=$(node -e 'try{console.log(require("playwright/package.json").version)}catch{}' || true)
echo "version=${V:-unknown}" >> "$GITHUB_OUTPUT"