Skip to content

Commit 53ae08a

Browse files
committed
Docker: Add support all browsers in one Node/Standalone container
Signed-off-by: Viet Nguyen Duc <[email protected]>
1 parent e517467 commit 53ae08a

File tree

13 files changed

+345
-143
lines changed

13 files changed

+345
-143
lines changed

Makefile

Lines changed: 77 additions & 1 deletion
Large diffs are not rendered by default.

NodeBase/generate_config

Lines changed: 134 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,86 @@ function short_version() {
88
echo "${__major}.${__minor:0:1}"
99
}
1010

11+
# A global array of environment variable prefixes supports different browser suffixes
12+
ENV_PREFIXES=(
13+
"SE_NODE_STEREOTYPE"
14+
"SE_NODE_BROWSER_NAME"
15+
"SE_NODE_BROWSER_VERSION"
16+
"SE_NODE_PLATFORM_NAME"
17+
"SE_BROWSER_BINARY_LOCATION"
18+
"SE_NODE_STEREOTYPE_EXTRA"
19+
"SE_NODE_MAX_SESSIONS"
20+
)
21+
22+
function backup_original_env_vars() {
23+
echo "Backing up original environment variables..."
24+
25+
for prefix in "${ENV_PREFIXES[@]}"; do
26+
local backup_var="${prefix}_ORIGINAL"
27+
local common_var="${prefix}"
28+
29+
# Backup original value if not already backed up
30+
if [[ -z "${!backup_var}" ]] && [[ -n "${!common_var}" ]]; then
31+
eval "${backup_var}=\"${!common_var}\""
32+
echo "Backed up original ${common_var}=${!common_var} to ${backup_var}"
33+
fi
34+
done
35+
}
36+
37+
function restore_original_env_vars() {
38+
echo "Restoring original environment variables..."
39+
40+
for prefix in "${ENV_PREFIXES[@]}"; do
41+
local backup_var="${prefix}_ORIGINAL"
42+
local common_var="${prefix}"
43+
44+
# Restore original value if backup exists
45+
if [[ -n "${!backup_var}" ]]; then
46+
eval "${common_var}=\"${!backup_var}\""
47+
echo "Restored original ${backup_var}=${!backup_var} to ${common_var}"
48+
else
49+
# Clear the variable if no backup exists
50+
eval "${common_var}=\"\""
51+
echo "Cleared ${common_var} (no original backup)"
52+
fi
53+
done
54+
}
55+
56+
function assign_browser_specific_env_vars() {
57+
local browser_name=$1
58+
59+
# Set browser-specific values or inherit original values
60+
for prefix in "${ENV_PREFIXES[@]}"; do
61+
local browser_specific_var="${prefix}_${browser_name}"
62+
local common_var="${prefix}"
63+
local backup_var="${prefix}_ORIGINAL"
64+
65+
# Check if the browser-specific environment variable exists
66+
if [[ -n "${!browser_specific_var}" ]]; then
67+
# Assign the browser-specific value to the common variable
68+
eval "${common_var}=\"${!browser_specific_var}\""
69+
echo "Assigned ${browser_specific_var}=${!browser_specific_var} to ${common_var}"
70+
elif [[ -n "${!backup_var}" ]]; then
71+
# Inherit original value if browser-specific value is not set
72+
eval "${common_var}=\"${!backup_var}\""
73+
echo "Inherited original ${backup_var}=${!backup_var} to ${common_var}"
74+
fi
75+
done
76+
}
77+
1178
if [[ -z "$CONFIG_FILE" ]]; then
1279
FILENAME="/opt/selenium/config.toml"
1380
else
1481
FILENAME="$CONFIG_FILE"
1582
fi
1683

84+
echo -n "" >"$FILENAME"
85+
1786
if [[ -n "${SE_EVENT_BUS_HOST}" ]]; then
1887
echo "[events]
1988
publish = \"tcp://${SE_EVENT_BUS_HOST}:${SE_EVENT_BUS_PUBLISH_PORT}\"
2089
subscribe = \"tcp://${SE_EVENT_BUS_HOST}:${SE_EVENT_BUS_SUBSCRIBE_PORT}\"
21-
" >"$FILENAME"
90+
" >>"$FILENAME"
2291
fi
2392

2493
if [[ -z "${SE_NODE_HOST}" ]] && [[ -z "${SE_NODE_PORT}" ]]; then
@@ -39,6 +108,11 @@ else
39108
echo "port = \"${SE_NODE_PORT}\"" >>"$FILENAME"
40109
fi
41110

111+
if [[ -n "${SE_RELAX_CHECKS}" ]]; then
112+
echo "[network]" >>"$FILENAME"
113+
echo "relax-checks = ${SE_RELAX_CHECKS}" >>"$FILENAME"
114+
fi
115+
42116
echo "[node]" >>"$FILENAME"
43117
# String, Url where the Grid can be reached
44118
if [[ -z "${SE_NODE_GRID_URL}" ]]; then
@@ -50,44 +124,65 @@ echo "session-timeout = ${SE_NODE_SESSION_TIMEOUT}" >>"$FILENAME"
50124
echo "override-max-sessions = ${SE_NODE_OVERRIDE_MAX_SESSIONS}" >>"$FILENAME"
51125
echo "detect-drivers = false" >>"$FILENAME"
52126
echo "drain-after-session-count = ${DRAIN_AFTER_SESSION_COUNT:-$SE_DRAIN_AFTER_SESSION_COUNT}" >>"$FILENAME"
53-
echo "max-sessions = ${SE_NODE_MAX_SESSIONS}
54-
" >>"$FILENAME"
127+
echo "" >>"$FILENAME"
55128

56-
if [ -f /opt/selenium/browser_name ]; then
57-
SE_NODE_BROWSER_NAME=$(cat /opt/selenium/browser_name)
58-
fi
59-
if [ -f /opt/selenium/browser_version ] && [ "${SE_NODE_BROWSER_VERSION,,}" = "stable" ]; then
60-
SE_NODE_BROWSER_VERSION=$(short_version $(cat /opt/selenium/browser_version))
61-
fi
62-
if [ -f /opt/selenium/browser_binary_location ] && [ -z "${SE_BROWSER_BINARY_LOCATION}" ]; then
63-
SE_BROWSER_BINARY_LOCATION=$(cat /opt/selenium/browser_binary_location)
64-
fi
65-
SE_NODE_CONTAINER_NAME="${SE_NODE_CONTAINER_NAME:-$(hostname)}"
66-
67-
# 'browserName' is mandatory for default stereotype
68-
if [[ -z "${SE_NODE_STEREOTYPE}" ]] && [[ -n "${SE_NODE_BROWSER_NAME}" ]] && ([[ -z "${SE_NODE_RELAY_URL}" ]] || [[ "${SE_NODE_RELAY_ONLY}" = "false" ]]); then
69-
SE_NODE_STEREOTYPE="{\"browserName\": \"${SE_NODE_BROWSER_NAME}\", \"browserVersion\": \"${SE_NODE_BROWSER_VERSION}\", \"platformName\": \"${SE_NODE_PLATFORM_NAME}\", \"se:containerName\": \"${SE_NODE_CONTAINER_NAME}\", \"container:hostname\": \"$(hostname)\"}"
70-
if [[ -n "${SE_BROWSER_BINARY_LOCATION}" ]]; then
71-
SE_NODE_STEREOTYPE="$(python3 /opt/bin/json_merge.py "${SE_NODE_STEREOTYPE}" "{${SE_BROWSER_BINARY_LOCATION}}")"
72-
fi
73-
else
74-
SE_NODE_STEREOTYPE="${SE_NODE_STEREOTYPE}"
75-
fi
76-
if [[ -n "${SE_NODE_STEREOTYPE_EXTRA}" ]]; then
77-
echo "Merging SE_NODE_STEREOTYPE_EXTRA=${SE_NODE_STEREOTYPE_EXTRA} to main stereotype"
78-
SE_NODE_STEREOTYPE="$(python3 /opt/bin/json_merge.py "${SE_NODE_STEREOTYPE}" "${SE_NODE_STEREOTYPE_EXTRA}")"
79-
if [[ $? -ne 0 ]]; then
80-
echo "Failed to merge SE_NODE_STEREOTYPE_EXTRA. Please check the format of the JSON string. Keep using main stereotype."
81-
else
82-
echo "Merged stereotype: ${SE_NODE_STEREOTYPE}"
83-
fi
84-
fi
129+
# Check if /opt/selenium/browsers directory exists and iterate through browser folders
130+
if [ -d "/opt/selenium/browsers" ]; then
131+
# Backup original environment variables before processing browsers
132+
backup_original_env_vars
85133

86-
# 'stereotype' setting is mandatory
87-
if [[ -n "${SE_NODE_STEREOTYPE}" ]]; then
88-
echo "[[node.driver-configuration]]" >>"$FILENAME"
89-
echo "display-name = \"${SE_NODE_BROWSER_NAME}\"" >>"$FILENAME"
90-
echo "stereotype = '${SE_NODE_STEREOTYPE}'" >>"$FILENAME"
91-
echo "max-sessions = ${SE_NODE_MAX_SESSIONS}
92-
" >>"$FILENAME"
134+
for browser_dir in /opt/selenium/browsers/*/; do
135+
if [ -d "$browser_dir" ]; then
136+
browser_name=$(basename "$browser_dir" | tr '[:lower:]' '[:upper:]')
137+
echo "===Start generating stereotype for browser: ${browser_name}==="
138+
# Assign environment variables with browser suffix to common variables
139+
assign_browser_specific_env_vars "$browser_name"
140+
141+
if [ -f "${browser_dir}name" ]; then
142+
SE_NODE_BROWSER_NAME=$(cat "${browser_dir}name")
143+
fi
144+
if [ -f "${browser_dir}version" ] && [ "${SE_NODE_BROWSER_VERSION,,}" = "stable" ]; then
145+
SE_NODE_BROWSER_VERSION=$(short_version "$(cat "${browser_dir}version")")
146+
fi
147+
if [ -f "${browser_dir}binary_location" ] && [ -z "${SE_BROWSER_BINARY_LOCATION}" ]; then
148+
SE_BROWSER_BINARY_LOCATION=$(cat "${browser_dir}binary_location")
149+
fi
150+
SE_NODE_CONTAINER_NAME="${SE_NODE_CONTAINER_NAME:-$(hostname)}"
151+
152+
# 'browserName' is mandatory for default stereotype
153+
if [[ -z "${SE_NODE_STEREOTYPE}" ]] && [[ -n "${SE_NODE_BROWSER_NAME}" ]] && ([[ -z "${SE_NODE_RELAY_URL}" ]] || [[ "${SE_NODE_RELAY_ONLY}" = "false" ]]); then
154+
SE_NODE_STEREOTYPE="{\"browserName\": \"${SE_NODE_BROWSER_NAME}\", \"browserVersion\": \"${SE_NODE_BROWSER_VERSION}\", \"platformName\": \"${SE_NODE_PLATFORM_NAME}\", \"se:containerName\": \"${SE_NODE_CONTAINER_NAME}\", \"container:hostname\": \"$(hostname)\"}"
155+
if [[ -n "${SE_BROWSER_BINARY_LOCATION}" ]]; then
156+
SE_NODE_STEREOTYPE="$(python3 /opt/bin/json_merge.py "${SE_NODE_STEREOTYPE}" "{${SE_BROWSER_BINARY_LOCATION}}")"
157+
fi
158+
else
159+
SE_NODE_STEREOTYPE="${SE_NODE_STEREOTYPE}"
160+
fi
161+
if [[ -n "${SE_NODE_STEREOTYPE_EXTRA}" ]]; then
162+
echo "Merging SE_NODE_STEREOTYPE_EXTRA=${SE_NODE_STEREOTYPE_EXTRA} to main stereotype for $browser_name"
163+
SE_NODE_STEREOTYPE="$(python3 /opt/bin/json_merge.py "${SE_NODE_STEREOTYPE}" "${SE_NODE_STEREOTYPE_EXTRA}")"
164+
if [[ $? -ne 0 ]]; then
165+
echo "Failed to merge SE_NODE_STEREOTYPE_EXTRA for $browser_name. Please check the format of the JSON string. Keep using main stereotype."
166+
else
167+
echo "Merged stereotype for $browser_name: ${SE_NODE_STEREOTYPE}"
168+
fi
169+
fi
170+
171+
# 'stereotype' setting is mandatory
172+
if [[ -n "${SE_NODE_STEREOTYPE}" ]]; then
173+
echo "[[node.driver-configuration]]" >>"$FILENAME"
174+
echo "display-name = \"${SE_NODE_BROWSER_NAME}\"" >>"$FILENAME"
175+
echo "stereotype = '${SE_NODE_STEREOTYPE}'" >>"$FILENAME"
176+
# Validate SE_NODE_MAX_SESSIONS is a positive integer
177+
if [[ "${SE_NODE_MAX_SESSIONS}" =~ ^[0-9]+$ ]] && [[ "${SE_NODE_MAX_SESSIONS}" -gt 0 ]]; then
178+
echo "max-sessions = ${SE_NODE_MAX_SESSIONS}" >>"$FILENAME"
179+
fi
180+
echo "" >>"$FILENAME"
181+
fi
182+
183+
# Restore original environment variables for next browser iteration
184+
restore_original_env_vars
185+
echo "===Stop generating stereotype for browser: ${browser_name}==="
186+
fi
187+
done
93188
fi

NodeChrome/Dockerfile

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,10 @@ USER ${SEL_UID}
4949
#============================================
5050
# Dumping Browser information for config
5151
#============================================
52-
RUN echo "chrome" > /opt/selenium/browser_name
53-
RUN google-chrome --version | awk '{print $3}' > /opt/selenium/browser_version
54-
RUN echo "\"goog:chromeOptions\": {\"binary\": \"/usr/bin/google-chrome\"}" > /opt/selenium/browser_binary_location
52+
RUN mkdir -p /opt/selenium/browsers/chrome \
53+
&& echo "chrome" > /opt/selenium/browsers/chrome/name \
54+
&& google-chrome --version | awk '{print $3}' > /opt/selenium/browsers/chrome/version \
55+
&& echo "\"goog:chromeOptions\": {\"binary\": \"/usr/bin/google-chrome\"}" > /opt/selenium/browsers/chrome/binary_location
5556

5657
ENV SE_OTEL_SERVICE_NAME="selenium-node-chrome" \
5758
SE_NODE_ENABLE_MANAGED_DOWNLOADS="true"

NodeChromium/Dockerfile

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ USER root
1010
# Install Chromium
1111
ARG CHROMIUM_VERSION="latest"
1212
ARG CHROMIUM_DEB_SITE="http://deb.debian.org/debian"
13-
RUN echo "deb ${CHROMIUM_DEB_SITE}/ sid main" >> /etc/apt/sources.list \
13+
RUN echo "deb ${CHROMIUM_DEB_SITE}/ sid main" >/etc/apt/sources.list.d/debian.list \
1414
&& wget -qO- https://ftp-master.debian.org/keys/archive-key-12.asc | gpg --dearmor > /etc/apt/trusted.gpg.d/debian-archive-keyring.gpg \
1515
&& wget -qO- https://ftp-master.debian.org/keys/archive-key-12-security.asc | gpg --dearmor > /etc/apt/trusted.gpg.d/debian-archive-security-keyring.gpg \
1616
&& apt-get update -qqy \
@@ -24,7 +24,7 @@ RUN echo "deb ${CHROMIUM_DEB_SITE}/ sid main" >> /etc/apt/sources.list \
2424
&& apt-get -qqyf install /tmp/chromium/chromium-common.deb /tmp/chromium/chromium.deb /tmp/chromium/chromium-l10n.deb /tmp/chromium/chromium-driver.deb \
2525
&& rm -rf /tmp/chromium; \
2626
fi \
27-
&& rm -rf /var/lib/apt/lists/* /var/cache/apt/*
27+
&& rm -rf /var/lib/apt/lists/* /var/cache/apt/* /etc/apt/sources.list.d/debian.list
2828

2929
#=================================
3030
# Chromium Launch Script Wrapper
@@ -43,9 +43,10 @@ USER ${SEL_UID}
4343
#============================================
4444
# Dumping Browser information for config
4545
#============================================
46-
RUN echo "chrome" > /opt/selenium/browser_name
47-
RUN chromium --version | awk '{print $2}' > /opt/selenium/browser_version
48-
RUN echo "\"goog:chromeOptions\": {\"binary\": \"/usr/bin/chromium\"}" > /opt/selenium/browser_binary_location
46+
RUN mkdir -p /opt/selenium/browsers/chrome \
47+
&& echo "chrome" > /opt/selenium/browsers/chrome/name \
48+
&& chromium --version | awk '{print $2}' > /opt/selenium/browsers/chrome/version \
49+
&& echo "\"goog:chromeOptions\": {\"binary\": \"/usr/bin/chromium\"}" > /opt/selenium/browsers/chrome/binary_location
4950

50-
ENV SE_OTEL_SERVICE_NAME="selenium-node-chromium" \
51+
ENV SE_OTEL_SERVICE_NAME="selenium-node-chrome" \
5152
SE_NODE_ENABLE_MANAGED_DOWNLOADS="true"

NodeEdge/Dockerfile

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,10 @@ USER ${SEL_UID}
6666
#============================================
6767
# Dumping Browser information for config
6868
#============================================
69-
RUN echo "MicrosoftEdge" > /opt/selenium/browser_name
70-
RUN microsoft-edge --version | awk '{print $3}' > /opt/selenium/browser_version
71-
RUN echo "\"ms:edgeOptions\": {\"binary\": \"/usr/bin/microsoft-edge\"}" > /opt/selenium/browser_binary_location
69+
RUN mkdir -p /opt/selenium/browsers/edge \
70+
&& echo "MicrosoftEdge" > /opt/selenium/browsers/edge/name \
71+
&& microsoft-edge --version | awk '{print $3}' > /opt/selenium/browsers/edge/version \
72+
&& echo "\"ms:edgeOptions\": {\"binary\": \"/usr/bin/microsoft-edge\"}" > /opt/selenium/browsers/edge/binary_location
7273

7374
ENV SE_OTEL_SERVICE_NAME="selenium-node-edge" \
7475
SE_NODE_ENABLE_MANAGED_DOWNLOADS="true"

NodeFirefox/Dockerfile

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,10 @@ USER ${SEL_UID}
8585
#============================================
8686
# Dumping Browser information for config
8787
#============================================
88-
RUN echo "firefox" > /opt/selenium/browser_name \
89-
&& firefox --version | awk '{print $3}' > /opt/selenium/browser_version \
90-
&& echo "\"moz:firefoxOptions\": {\"binary\": \"/usr/bin/firefox\"}" > /opt/selenium/browser_binary_location
88+
RUN mkdir -p /opt/selenium/browsers/firefox \
89+
&& echo "firefox" > /opt/selenium/browsers/firefox/name \
90+
&& firefox --version | awk '{print $3}' > /opt/selenium/browsers/firefox/version \
91+
&& echo "\"moz:firefoxOptions\": {\"binary\": \"/usr/bin/firefox\"}" > /opt/selenium/browsers/firefox/binary_location
9192

9293
ENV SE_OTEL_SERVICE_NAME="selenium-node-firefox" \
9394
SE_NODE_ENABLE_MANAGED_DOWNLOADS="true"

0 commit comments

Comments
 (0)