Skip to content

Commit ec3ed70

Browse files
authored
[rust] Build selenium-manager for win32 (compatible when executed in win64) (#11788)
* [CI] Build selenium-manager for win32 in GH Actions * [CI] Remove build for selenium-manager win64 in GH Actions * [rust] Enable browser version and architecture detection both in Windows x32 and x64
1 parent 982af75 commit ec3ed70

File tree

7 files changed

+93
-48
lines changed

7 files changed

+93
-48
lines changed

.github/workflows/build-selenium-manager.yml

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ name: build-selenium-manager
33
on: workflow_dispatch
44

55
jobs:
6-
windows:
7-
name: "[Windows] Build selenium-manager"
6+
win32:
7+
name: "[Windows x32] Build selenium-manager"
88
runs-on: windows-latest
99
env:
1010
RUSTFLAGS: '-Ctarget-feature=+crt-static'
@@ -14,20 +14,22 @@ jobs:
1414
- name: "Update Rust"
1515
run: |
1616
rustup update
17+
rustup toolchain install stable-i686-pc-windows-msvc
18+
rustup default stable-i686-pc-windows-msvc
1719
rustc -vV
1820
- name: "Build release"
1921
run: |
2022
cd rust
21-
cargo build --release --target x86_64-pc-windows-msvc
23+
cargo build --release
2224
- name: "Upload binary"
2325
uses: actions/upload-artifact@v3
2426
with:
25-
name: selenium-manager_windows-x64
26-
path: rust/target/x86_64-pc-windows-msvc/release/selenium-manager.exe
27+
name: selenium-manager_windows-x32
28+
path: rust/target/release/selenium-manager.exe
2729
retention-days: 6
2830

29-
linux:
30-
name: "[Linux] Build selenium-manager"
31+
linux64:
32+
name: "[Linux x64] Build selenium-manager"
3133
runs-on: ubuntu-latest
3234
env:
3335
RUSTFLAGS: '-Ctarget-feature=-crt-static'
@@ -58,8 +60,8 @@ jobs:
5860
path: selenium-manager.tar
5961
retention-days: 6
6062

61-
macos:
62-
name: "[macOS] Build selenium-manager"
63+
macos64:
64+
name: "[macOS x64] Build selenium-manager"
6365
runs-on: macos-latest
6466
env:
6567
RUSTFLAGS: '-Ctarget-feature=+crt-static'
@@ -83,4 +85,4 @@ jobs:
8385
with:
8486
name: selenium-manager_macos-x64
8587
path: selenium-manager.tar
86-
retention-days: 6
88+
retention-days: 6

rust/src/chrome.rs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ use crate::metadata::{
3030
create_driver_metadata, get_driver_version_from_metadata, get_metadata, write_metadata,
3131
};
3232
use crate::{
33-
create_http_client, format_one_arg, format_two_args, SeleniumManager, BETA, DASH_DASH_VERSION,
34-
DEV, ENV_LOCALAPPDATA, ENV_PROGRAM_FILES, ENV_PROGRAM_FILES_X86, FALLBACK_RETRIES, NIGHTLY,
35-
REG_QUERY, STABLE, WMIC_COMMAND, WMIC_COMMAND_ENV,
33+
create_http_client, format_one_arg, format_three_args, SeleniumManager, BETA,
34+
DASH_DASH_VERSION, DEV, ENV_LOCALAPPDATA, ENV_PROGRAM_FILES, ENV_PROGRAM_FILES_X86,
35+
FALLBACK_RETRIES, NIGHTLY, REG_QUERY, REMOVE_X86, STABLE, WMIC_COMMAND, WMIC_COMMAND_ENV,
3636
};
3737

3838
pub const CHROME_NAME: &str = "chrome";
@@ -126,9 +126,19 @@ impl SeleniumManager for ChromeManager {
126126
Some(path) => {
127127
browser_path = path;
128128
commands = vec![
129-
format_two_args(WMIC_COMMAND_ENV, ENV_PROGRAM_FILES, browser_path),
130-
format_two_args(WMIC_COMMAND_ENV, ENV_PROGRAM_FILES_X86, browser_path),
131-
format_two_args(WMIC_COMMAND_ENV, ENV_LOCALAPPDATA, browser_path),
129+
format_three_args(
130+
WMIC_COMMAND_ENV,
131+
ENV_PROGRAM_FILES,
132+
REMOVE_X86,
133+
browser_path,
134+
),
135+
format_three_args(
136+
WMIC_COMMAND_ENV,
137+
ENV_PROGRAM_FILES_X86,
138+
"",
139+
browser_path,
140+
),
141+
format_three_args(WMIC_COMMAND_ENV, ENV_LOCALAPPDATA, "", browser_path),
132142
];
133143
if !self.is_browser_version_unstable() {
134144
commands.push(format_one_arg(

rust/src/config.rs

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,9 @@
1616
// under the License.
1717

1818
use crate::config::OS::{LINUX, MACOS, WINDOWS};
19-
use crate::TTL_BROWSERS_SEC;
20-
use crate::TTL_DRIVERS_SEC;
21-
2219
use crate::files::get_cache_folder;
23-
use crate::{
24-
format_one_arg, run_shell_command, ENV_PROCESSOR_ARCHITECTURE, REQUEST_TIMEOUT_SEC,
25-
UNAME_COMMAND,
26-
};
20+
use crate::{format_one_arg, run_shell_command, REQUEST_TIMEOUT_SEC, UNAME_COMMAND};
21+
use crate::{ARCH_AMD64, ARCH_ARM64, ARCH_X86, TTL_BROWSERS_SEC, TTL_DRIVERS_SEC, WMIC_COMMAND_OS};
2722
use std::env;
2823
use std::env::consts::OS;
2924
use std::error::Error;
@@ -52,15 +47,22 @@ impl ManagerConfig {
5247
pub fn default(browser_name: &str, driver_name: &str) -> ManagerConfig {
5348
let self_os = OS;
5449
let self_arch = if WINDOWS.is(self_os) {
55-
env::var(ENV_PROCESSOR_ARCHITECTURE).unwrap_or_default()
50+
if run_shell_command(self_os, WMIC_COMMAND_OS.to_string())
51+
.unwrap_or_default()
52+
.contains("32")
53+
{
54+
ARCH_X86.to_string()
55+
} else {
56+
ARCH_AMD64.to_string()
57+
}
5658
} else {
5759
let uname_a = format_one_arg(UNAME_COMMAND, "a");
5860
if run_shell_command(self_os, uname_a)
5961
.unwrap_or_default()
6062
.to_ascii_lowercase()
61-
.contains(ARM64_ARCH)
63+
.contains(ARCH_ARM64)
6264
{
63-
ARM64_ARCH.to_string()
65+
ARCH_ARM64.to_string()
6466
} else {
6567
let uname_m = format_one_arg(UNAME_COMMAND, "m");
6668
run_shell_command(self_os, uname_m).unwrap_or_default()
@@ -147,9 +149,9 @@ pub enum ARCH {
147149
impl ARCH {
148150
pub fn to_str_vector(&self) -> Vec<&str> {
149151
match self {
150-
ARCH::X32 => vec!["x86", "i386"],
151-
ARCH::X64 => vec!["x86_64", "x64", "i686", "amd64", "ia64"],
152-
ARCH::ARM64 => vec![ARM64_ARCH, "aarch64", "arm"],
152+
ARCH::X32 => vec![ARCH_X86, "i386"],
153+
ARCH::X64 => vec![ARCH_AMD64, "x86_64", "x64", "i686", "ia64"],
154+
ARCH::ARM64 => vec![ARCH_ARM64, "aarch64", "arm"],
153155
}
154156
}
155157

rust/src/edge.rs

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ use crate::metadata::{
2929
create_driver_metadata, get_driver_version_from_metadata, get_metadata, write_metadata,
3030
};
3131
use crate::{
32-
create_http_client, format_one_arg, format_two_args, Logger, SeleniumManager, BETA,
32+
create_http_client, format_one_arg, format_three_args, Logger, SeleniumManager, BETA,
3333
DASH_DASH_VERSION, DEV, ENV_LOCALAPPDATA, ENV_PROGRAM_FILES, ENV_PROGRAM_FILES_X86, NIGHTLY,
34-
REG_QUERY, STABLE, WMIC_COMMAND, WMIC_COMMAND_ENV,
34+
REG_QUERY, REMOVE_X86, STABLE, WMIC_COMMAND, WMIC_COMMAND_ENV,
3535
};
3636

3737
pub const EDGE_NAMES: &[&str] = &["edge", "msedge", "microsoftedge"];
@@ -126,9 +126,19 @@ impl SeleniumManager for EdgeManager {
126126
Some(path) => {
127127
browser_path = path;
128128
commands = vec![
129-
format_two_args(WMIC_COMMAND_ENV, ENV_PROGRAM_FILES_X86, browser_path),
130-
format_two_args(WMIC_COMMAND_ENV, ENV_PROGRAM_FILES, browser_path),
131-
format_two_args(WMIC_COMMAND, ENV_LOCALAPPDATA, browser_path),
129+
format_three_args(
130+
WMIC_COMMAND_ENV,
131+
ENV_PROGRAM_FILES_X86,
132+
"",
133+
browser_path,
134+
),
135+
format_three_args(
136+
WMIC_COMMAND_ENV,
137+
ENV_PROGRAM_FILES,
138+
REMOVE_X86,
139+
browser_path,
140+
),
141+
format_three_args(WMIC_COMMAND, ENV_LOCALAPPDATA, "", browser_path),
132142
];
133143
if !self.is_browser_version_unstable() {
134144
commands.push(format_one_arg(

rust/src/firefox.rs

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ use crate::metadata::{
2929
create_driver_metadata, get_driver_version_from_metadata, get_metadata, write_metadata,
3030
};
3131
use crate::{
32-
create_http_client, format_one_arg, format_two_args, Logger, SeleniumManager, BETA,
33-
DASH_VERSION, DEV, ENV_PROGRAM_FILES, ENV_PROGRAM_FILES_X86, NIGHTLY, STABLE, WMIC_COMMAND,
34-
WMIC_COMMAND_ENV,
32+
create_http_client, format_one_arg, format_three_args, Logger, SeleniumManager, BETA,
33+
DASH_VERSION, DEV, ENV_PROGRAM_FILES, ENV_PROGRAM_FILES_X86, NIGHTLY, REMOVE_X86, STABLE,
34+
WMIC_COMMAND, WMIC_COMMAND_ENV,
3535
};
3636

3737
pub const FIREFOX_NAME: &str = "firefox";
@@ -126,8 +126,18 @@ impl SeleniumManager for FirefoxManager {
126126
Some(path) => {
127127
browser_path = path;
128128
commands = vec![
129-
format_two_args(WMIC_COMMAND_ENV, ENV_PROGRAM_FILES, browser_path),
130-
format_two_args(WMIC_COMMAND_ENV, ENV_PROGRAM_FILES_X86, browser_path),
129+
format_three_args(
130+
WMIC_COMMAND_ENV,
131+
ENV_PROGRAM_FILES,
132+
REMOVE_X86,
133+
browser_path,
134+
),
135+
format_three_args(
136+
WMIC_COMMAND_ENV,
137+
ENV_PROGRAM_FILES_X86,
138+
"",
139+
browser_path,
140+
),
131141
];
132142
}
133143
_ => return None,

rust/src/lib.rs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,9 @@ pub const DEV: &str = "dev";
6161
pub const CANARY: &str = "canary";
6262
pub const NIGHTLY: &str = "nightly";
6363
pub const WMIC_COMMAND: &str = r#"wmic datafile where name='{}' get Version /value"#;
64-
pub const WMIC_COMMAND_ENV: &str = r#"wmic datafile where name='%{}:\=\\%{}' get Version /value"#;
64+
pub const WMIC_COMMAND_ENV: &str =
65+
r#"set PFILES=%{}{}%&& wmic datafile where name='!PFILES:\=\\!{}' get Version /value"#;
66+
pub const WMIC_COMMAND_OS: &str = r#"wmic os get osarchitecture"#;
6567
pub const REG_QUERY: &str = r#"REG QUERY {} /v version"#;
6668
pub const PLIST_COMMAND: &str =
6769
r#"/usr/libexec/PlistBuddy -c "print :CFBundleShortVersionString" {}/Contents/Info.plist"#;
@@ -70,6 +72,10 @@ pub const DASH_DASH_VERSION: &str = "{} --version";
7072
pub const ENV_PROGRAM_FILES: &str = "PROGRAMFILES";
7173
pub const ENV_PROGRAM_FILES_X86: &str = "PROGRAMFILES(X86)";
7274
pub const ENV_LOCALAPPDATA: &str = "LOCALAPPDATA";
75+
pub const REMOVE_X86: &str = ": (x86)=";
76+
pub const ARCH_X86: &str = "x86";
77+
pub const ARCH_AMD64: &str = "amd64";
78+
pub const ARCH_ARM64: &str = "arm64";
7379
pub const ENV_PROCESSOR_ARCHITECTURE: &str = "PROCESSOR_ARCHITECTURE";
7480
pub const FALLBACK_RETRIES: u32 = 5;
7581
pub const WHERE_COMMAND: &str = "where {}";
@@ -528,7 +534,7 @@ pub fn create_http_client(timeout: u64, proxy: String) -> Result<Client, String>
528534

529535
pub fn run_shell_command(os: &str, command: String) -> Result<String, Box<dyn Error>> {
530536
let (shell, flag) = if WINDOWS.is(os) {
531-
("cmd", "/C")
537+
("cmd", "/v/c")
532538
} else {
533539
("sh", "-c")
534540
};
@@ -545,8 +551,11 @@ pub fn format_one_arg(string: &str, arg1: &str) -> String {
545551
string.replacen("{}", arg1, 1)
546552
}
547553

548-
pub fn format_two_args(string: &str, arg1: &str, arg2: &str) -> String {
549-
string.replacen("{}", arg1, 1).replacen("{}", arg2, 2)
554+
pub fn format_three_args(string: &str, arg1: &str, arg2: &str, arg3: &str) -> String {
555+
string
556+
.replacen("{}", arg1, 1)
557+
.replacen("{}", arg2, 1)
558+
.replacen("{}", arg3, 1)
550559
}
551560

552561
// ----------------------------------------------------------

rust/src/metadata.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -155,12 +155,14 @@ pub fn write_metadata(metadata: &Metadata, log: &Logger) {
155155
.unwrap();
156156
}
157157

158-
pub fn clear_metadata(log: &Logger){
158+
pub fn clear_metadata(log: &Logger) {
159159
let metadata_path = get_metadata_path();
160-
log.trace(format!("Deleting metadata file {}", metadata_path.display()));
161-
match fs::remove_file(metadata_path){
160+
log.trace(format!(
161+
"Deleting metadata file {}",
162+
metadata_path.display()
163+
));
164+
match fs::remove_file(metadata_path) {
162165
Ok(()) => log.trace("Metadata file was deleted".to_string()),
163-
Err(err) => log.warn(
164-
format!("Metadata file deleting invoked an error: {}",err)),
166+
Err(err) => log.warn(format!("Metadata file deleting invoked an error: {}", err)),
165167
}
166168
}

0 commit comments

Comments
 (0)