cherry-pick(#1938): feat(docker): pre-extract the driver in images to avoid /tmp unpacking
This commit is contained in:
@@ -17,9 +17,12 @@
|
||||
package com.microsoft.playwright;
|
||||
|
||||
import com.microsoft.playwright.impl.driver.Driver;
|
||||
import com.microsoft.playwright.impl.driver.jar.DriverJar;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URISyntaxException;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Collections;
|
||||
|
||||
import static java.util.Arrays.asList;
|
||||
@@ -28,7 +31,13 @@ import static java.util.Arrays.asList;
|
||||
* Use this class to launch playwright cli.
|
||||
*/
|
||||
public class CLI {
|
||||
public static void main(String[] args) throws IOException, InterruptedException {
|
||||
public static void main(String[] args) throws IOException, InterruptedException, URISyntaxException {
|
||||
// Extract the driver into a fixed directory instead of running the playwright CLI. This is
|
||||
// handled in Java because it must not require an already-extracted driver. See issue #1268.
|
||||
if (args.length > 0 && "install-driver".equals(args[0])) {
|
||||
installDriver(args);
|
||||
return;
|
||||
}
|
||||
Driver driver = Driver.ensureDriverInstalled(Collections.emptyMap(), false);
|
||||
ProcessBuilder pb = driver.createProcessBuilder();
|
||||
pb.command().addAll(asList(args));
|
||||
@@ -40,4 +49,17 @@ public class CLI {
|
||||
Process process = pb.start();
|
||||
System.exit(process.waitFor());
|
||||
}
|
||||
|
||||
private static void installDriver(String[] args) throws IOException, URISyntaxException {
|
||||
String dir = args.length > 1 ? args[1] : System.getenv(Driver.PLAYWRIGHT_DRIVER_DIR);
|
||||
if (dir == null) {
|
||||
System.err.println("Usage: install-driver <dir> (or set the " + Driver.PLAYWRIGHT_DRIVER_DIR
|
||||
+ " environment variable)");
|
||||
System.exit(1);
|
||||
return;
|
||||
}
|
||||
Path driverDir = Paths.get(dir);
|
||||
DriverJar.installDriverTo(driverDir);
|
||||
System.out.println("Installed Playwright driver into " + driverDir.toAbsolutePath());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -132,6 +132,30 @@ public class TestInstall {
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
void canInstallDriverToDirectoryAndReuseIt(@TempDir Path tmpDir) throws Exception {
|
||||
Path driverDir = tmpDir.resolve("driver");
|
||||
DriverJar.installDriverTo(driverDir);
|
||||
// The directory is self-contained: the playwright-core package and the Node.js binary.
|
||||
assertTrue(Files.exists(driverDir.resolve("package").resolve("cli.js")));
|
||||
assertTrue(Files.exists(driverDir.resolve(isWindows() ? "node.exe" : "node")));
|
||||
|
||||
// Pointing playwright.cli.dir at it must reuse it as-is, without extracting to a temp directory.
|
||||
System.setProperty("playwright.cli.dir", driverDir.toString());
|
||||
Driver driver = Driver.createAndInstall(Collections.emptyMap(), false);
|
||||
assertEquals(driverDir, driver.driverDir());
|
||||
|
||||
ProcessBuilder pb = driver.createProcessBuilder();
|
||||
pb.command().add("--version");
|
||||
pb.redirectError(ProcessBuilder.Redirect.INHERIT);
|
||||
Path out = tmpDir.resolve("out.txt");
|
||||
pb.redirectOutput(out.toFile());
|
||||
Process p = pb.start();
|
||||
assertTrue(p.waitFor(1, TimeUnit.MINUTES), "Timed out waiting for version to be printed");
|
||||
String stdout = new String(Files.readAllBytes(out), StandardCharsets.UTF_8);
|
||||
assertTrue(stdout.contains("Version "), stdout);
|
||||
}
|
||||
|
||||
private static String extractNodeJsToTemp() throws URISyntaxException, IOException {
|
||||
DriverJar auxDriver = new DriverJar();
|
||||
auxDriver.extractDriverToTempDir();
|
||||
|
||||
Reference in New Issue
Block a user