From 8df8298ca5880e2ddcb8a25cf52c8fd4abb94101 Mon Sep 17 00:00:00 2001 From: Viet Nguyen Duc Date: Wed, 3 Sep 2025 01:39:32 +0700 Subject: [PATCH] Docker: Add support all browsers in one Node/Standalone container Signed-off-by: Viet Nguyen Duc --- Makefile | 78 ++++++++++- NodeBase/generate_config | 173 ++++++++++++++++++------ NodeChrome/Dockerfile | 7 +- NodeChromium/Dockerfile | 13 +- NodeEdge/Dockerfile | 7 +- NodeFirefox/Dockerfile | 7 +- README.md | 71 ++++++++-- Standalone/Dockerfile | 3 - Standalone/generate_config | 68 ---------- Standalone/start-selenium-standalone.sh | 7 +- docker-compose-v3-node-all-browsers.yml | 41 ++++++ generate_release_notes.sh | 1 - tests/test.py | 12 ++ 13 files changed, 345 insertions(+), 143 deletions(-) delete mode 100755 Standalone/generate_config create mode 100644 docker-compose-v3-node-all-browsers.yml diff --git a/Makefile b/Makefile index c9f8910834..da3c5cf56f 100644 --- a/Makefile +++ b/Makefile @@ -48,11 +48,13 @@ all: hub \ edge \ firefox \ docker \ + all_browsers \ standalone_chrome \ standalone_chromium \ standalone_edge \ standalone_firefox \ standalone_docker \ + standalone_all_browsers \ video check_dev_env: @@ -283,6 +285,25 @@ video: base ffmpeg: cd ./.ffmpeg && docker buildx build --platform $(PLATFORMS) $(BUILD_ARGS) --build-arg FFMPEG_VERSION=$(FFMPEG_VERSION) $(FROM_IMAGE_ARGS) -t $(NAME)/ffmpeg:$(FFMPEG_VERSION)-$(BUILD_DATE) . +all_browsers: node_base + case "$(PLATFORMS)" in \ + *linux/amd64*) \ + cd ./NodeFirefox && docker buildx build --platform linux/amd64 $(BUILD_ARGS) $(FROM_IMAGE_ARGS) --build-arg BASE=node-base --build-arg FIREFOX_DOWNLOAD_URL=$(FIREFOX_DOWNLOAD_URL) -t $(NAME)/node-all-browsers:$(TAG_VERSION) . ; \ + cd .. ; \ + cd ./NodeChrome && docker buildx build --platform linux/amd64 $(BUILD_ARGS) $(FROM_IMAGE_ARGS) --build-arg BASE=node-all-browsers -t $(NAME)/node-all-browsers:$(TAG_VERSION) . ; \ + cd .. ; \ + cd ./NodeEdge && docker buildx build --platform linux/amd64 $(BUILD_ARGS) $(FROM_IMAGE_ARGS) --build-arg BASE=node-all-browsers -t $(NAME)/node-all-browsers:$(TAG_VERSION) . ; \ + ;; \ + *) \ + cd ./NodeFirefox && docker buildx build --platform $(PLATFORMS) $(BUILD_ARGS) $(FROM_IMAGE_ARGS) --build-arg BASE=node-base --build-arg FIREFOX_DOWNLOAD_URL=$(FIREFOX_DOWNLOAD_URL) -t $(NAME)/node-all-browsers:$(TAG_VERSION) . ; \ + cd .. ; \ + cd ./NodeChromium && docker buildx build --platform $(PLATFORMS) $(BUILD_ARGS) $(FROM_IMAGE_ARGS) --build-arg BASE=node-all-browsers --build-arg CHROMIUM_VERSION=$(CHROMIUM_VERSION) -t $(NAME)/node-all-browsers:$(TAG_VERSION) . ; \ + ;; \ + esac + +standalone_all_browsers: all_browsers + cd ./Standalone && docker buildx build --platform $(PLATFORMS) $(BUILD_ARGS) $(FROM_IMAGE_ARGS) --build-arg BASE=node-all-browsers -t $(NAME)/standalone-all-browsers:$(TAG_VERSION) . + fetch_grid_scaler_resources: mkdir -p ./.keda/scalers \ && cd ./.keda/scalers \ @@ -324,11 +345,13 @@ count_image_layers: docker history $(NAME)/node-edge:$(TAG_VERSION) -q | wc -l docker history $(NAME)/node-firefox:$(TAG_VERSION) -q | wc -l docker history $(NAME)/node-docker:$(TAG_VERSION) -q | wc -l + docker history $(NAME)/node-all-browsers:$(TAG_VERSION) -q | wc -l docker history $(NAME)/standalone-chrome:$(TAG_VERSION) -q | wc -l docker history $(NAME)/standalone-chromium:$(TAG_VERSION) -q | wc -l docker history $(NAME)/standalone-edge:$(TAG_VERSION) -q | wc -l docker history $(NAME)/standalone-firefox:$(TAG_VERSION) -q | wc -l docker history $(NAME)/standalone-docker:$(TAG_VERSION) -q | wc -l + docker history $(NAME)/standalone-all-browsers:$(TAG_VERSION) -q | wc -l docker history $(NAME)/video:$(FFMPEG_TAG_VERSION)-$(BUILD_DATE) -q | wc -l chrome_upgrade_version: @@ -384,9 +407,11 @@ tag_latest: docker tag $(NAME)/node-chromium:$(TAG_VERSION) $(NAME)/node-chromium:latest docker tag $(NAME)/node-firefox:$(TAG_VERSION) $(NAME)/node-firefox:latest docker tag $(NAME)/node-docker:$(TAG_VERSION) $(NAME)/node-docker:latest + docker tag $(NAME)/node-all-browsers:$(TAG_VERSION) $(NAME)/node-all-browsers:latest docker tag $(NAME)/standalone-chromium:$(TAG_VERSION) $(NAME)/standalone-chromium:latest docker tag $(NAME)/standalone-firefox:$(TAG_VERSION) $(NAME)/standalone-firefox:latest docker tag $(NAME)/standalone-docker:$(TAG_VERSION) $(NAME)/standalone-docker:latest + docker tag $(NAME)/standalone-all-browsers:$(TAG_VERSION) $(NAME)/standalone-all-browsers:latest docker tag $(NAME)/video:$(FFMPEG_TAG_VERSION)-$(BUILD_DATE) $(NAME)/video:latest case "$(PLATFORMS)" in *linux/amd64*) \ docker tag $(NAME)/node-chrome:$(TAG_VERSION) $(NAME)/node-chrome:latest && \ @@ -418,11 +443,13 @@ release_latest: release_grid_scaler_latest docker push $(NAME)/node-edge:latest docker push $(NAME)/node-firefox:latest docker push $(NAME)/node-docker:latest + docker push $(NAME)/node-all-browsers:latest docker push $(NAME)/standalone-chrome:latest docker push $(NAME)/standalone-chromium:latest docker push $(NAME)/standalone-edge:latest docker push $(NAME)/standalone-firefox:latest docker push $(NAME)/standalone-docker:latest + docker push $(NAME)/standalone-all-browsers:latest docker push $(NAME)/video:latest generate_latest_sbom: @@ -440,9 +467,11 @@ tag_nightly: docker tag $(NAME)/node-chromium:$(TAG_VERSION) $(NAME)/node-chromium:nightly docker tag $(NAME)/node-firefox:$(TAG_VERSION) $(NAME)/node-firefox:nightly docker tag $(NAME)/node-docker:$(TAG_VERSION) $(NAME)/node-docker:nightly + docker tag $(NAME)/node-all-browsers:$(TAG_VERSION) $(NAME)/node-all-browsers:nightly docker tag $(NAME)/standalone-chromium:$(TAG_VERSION) $(NAME)/standalone-chromium:nightly docker tag $(NAME)/standalone-firefox:$(TAG_VERSION) $(NAME)/standalone-firefox:nightly docker tag $(NAME)/standalone-docker:$(TAG_VERSION) $(NAME)/standalone-docker:nightly + docker tag $(NAME)/standalone-all-browsers:$(TAG_VERSION) $(NAME)/standalone-all-browsers:nightly docker tag $(NAME)/video:$(FFMPEG_TAG_VERSION)-$(BUILD_DATE) $(NAME)/video:nightly case "$(PLATFORMS)" in *linux/amd64*) \ docker tag $(NAME)/node-chrome:$(TAG_VERSION) $(NAME)/node-chrome:nightly && \ @@ -469,11 +498,13 @@ release_nightly: release_grid_scaler_nightly docker push $(NAME)/node-edge:nightly docker push $(NAME)/node-firefox:nightly docker push $(NAME)/node-docker:nightly + docker push $(NAME)/node-all-browsers:nightly docker push $(NAME)/standalone-chrome:nightly docker push $(NAME)/standalone-chromium:nightly docker push $(NAME)/standalone-edge:nightly docker push $(NAME)/standalone-firefox:nightly docker push $(NAME)/standalone-docker:nightly + docker push $(NAME)/standalone-all-browsers:nightly docker push $(NAME)/video:nightly generate_nightly_sbom: @@ -493,11 +524,13 @@ tag_major_minor: docker tag $(NAME)/node-edge:$(TAG_VERSION) $(NAME)/node-edge:$(MAJOR) docker tag $(NAME)/node-firefox:$(TAG_VERSION) $(NAME)/node-firefox:$(MAJOR) docker tag $(NAME)/node-docker:$(TAG_VERSION) $(NAME)/node-docker:$(MAJOR) + docker tag $(NAME)/node-all-browsers:$(TAG_VERSION) $(NAME)/node-all-browsers:$(MAJOR) docker tag $(NAME)/standalone-chrome:$(TAG_VERSION) $(NAME)/standalone-chrome:$(MAJOR) docker tag $(NAME)/standalone-chromium:$(TAG_VERSION) $(NAME)/standalone-chromium:$(MAJOR) docker tag $(NAME)/standalone-edge:$(TAG_VERSION) $(NAME)/standalone-edge:$(MAJOR) docker tag $(NAME)/standalone-firefox:$(TAG_VERSION) $(NAME)/standalone-firefox:$(MAJOR) docker tag $(NAME)/standalone-docker:$(TAG_VERSION) $(NAME)/standalone-docker:$(MAJOR) + docker tag $(NAME)/standalone-all-browsers:$(TAG_VERSION) $(NAME)/standalone-all-browsers:$(MAJOR) docker tag $(NAME)/base:$(TAG_VERSION) $(NAME)/base:$(MAJOR).$(MINOR) docker tag $(NAME)/hub:$(TAG_VERSION) $(NAME)/hub:$(MAJOR).$(MINOR) docker tag $(NAME)/distributor:$(TAG_VERSION) $(NAME)/distributor:$(MAJOR).$(MINOR) @@ -511,11 +544,13 @@ tag_major_minor: docker tag $(NAME)/node-edge:$(TAG_VERSION) $(NAME)/node-edge:$(MAJOR).$(MINOR) docker tag $(NAME)/node-firefox:$(TAG_VERSION) $(NAME)/node-firefox:$(MAJOR).$(MINOR) docker tag $(NAME)/node-docker:$(TAG_VERSION) $(NAME)/node-docker:$(MAJOR).$(MINOR) + docker tag $(NAME)/node-all-browsers:$(TAG_VERSION) $(NAME)/node-all-browsers:$(MAJOR).$(MINOR) docker tag $(NAME)/standalone-chrome:$(TAG_VERSION) $(NAME)/standalone-chrome:$(MAJOR).$(MINOR) docker tag $(NAME)/standalone-chromium:$(TAG_VERSION) $(NAME)/standalone-chromium:$(MAJOR).$(MINOR) docker tag $(NAME)/standalone-edge:$(TAG_VERSION) $(NAME)/standalone-edge:$(MAJOR).$(MINOR) docker tag $(NAME)/standalone-firefox:$(TAG_VERSION) $(NAME)/standalone-firefox:$(MAJOR).$(MINOR) docker tag $(NAME)/standalone-docker:$(TAG_VERSION) $(NAME)/standalone-docker:$(MAJOR).$(MINOR) + docker tag $(NAME)/standalone-all-browsers:$(TAG_VERSION) $(NAME)/standalone-all-browsers:$(MAJOR).$(MINOR) docker tag $(NAME)/base:$(TAG_VERSION) $(NAME)/base:$(MAJOR_MINOR_PATCH) docker tag $(NAME)/hub:$(TAG_VERSION) $(NAME)/hub:$(MAJOR_MINOR_PATCH) docker tag $(NAME)/distributor:$(TAG_VERSION) $(NAME)/distributor:$(MAJOR_MINOR_PATCH) @@ -529,11 +564,13 @@ tag_major_minor: docker tag $(NAME)/node-edge:$(TAG_VERSION) $(NAME)/node-edge:$(MAJOR_MINOR_PATCH) docker tag $(NAME)/node-firefox:$(TAG_VERSION) $(NAME)/node-firefox:$(MAJOR_MINOR_PATCH) docker tag $(NAME)/node-docker:$(TAG_VERSION) $(NAME)/node-docker:$(MAJOR_MINOR_PATCH) + docker tag $(NAME)/node-all-browsers:$(TAG_VERSION) $(NAME)/node-all-browsers:$(MAJOR_MINOR_PATCH) docker tag $(NAME)/standalone-chrome:$(TAG_VERSION) $(NAME)/standalone-chrome:$(MAJOR_MINOR_PATCH) docker tag $(NAME)/standalone-chromium:$(TAG_VERSION) $(NAME)/standalone-chromium:$(MAJOR_MINOR_PATCH) docker tag $(NAME)/standalone-edge:$(TAG_VERSION) $(NAME)/standalone-edge:$(MAJOR_MINOR_PATCH) docker tag $(NAME)/standalone-firefox:$(TAG_VERSION) $(NAME)/standalone-firefox:$(MAJOR_MINOR_PATCH) docker tag $(NAME)/standalone-docker:$(TAG_VERSION) $(NAME)/standalone-docker:$(MAJOR_MINOR_PATCH) + docker tag $(NAME)/standalone-all-browsers:$(TAG_VERSION) $(NAME)/standalone-all-browsers:$(MAJOR_MINOR_PATCH) release: tag_major_minor release_grid_scaler @if ! docker images $(NAME)/base | awk '{ print $$2 }' | grep -q -F $(TAG_VERSION); then echo "$(NAME)/base version $(TAG_VERSION) is not yet built. Please run 'make build'"; false; fi @@ -549,11 +586,13 @@ release: tag_major_minor release_grid_scaler @if ! docker images $(NAME)/node-edge | awk '{ print $$2 }' | grep -q -F $(TAG_VERSION); then echo "$(NAME)/node-edge version $(TAG_VERSION) is not yet built. Please run 'make build'"; false; fi @if ! docker images $(NAME)/node-firefox | awk '{ print $$2 }' | grep -q -F $(TAG_VERSION); then echo "$(NAME)/node-firefox version $(TAG_VERSION) is not yet built. Please run 'make build'"; false; fi @if ! docker images $(NAME)/node-docker | awk '{ print $$2 }' | grep -q -F $(TAG_VERSION); then echo "$(NAME)/node-docker version $(TAG_VERSION) is not yet built. Please run 'make build'"; false; fi + @if ! docker images $(NAME)/node-all-browsers | awk '{ print $$2 }' | grep -q -F $(TAG_VERSION); then echo "$(NAME)/node-all-browsers version $(TAG_VERSION) is not yet built. Please run 'make build'"; false; fi @if ! docker images $(NAME)/standalone-chrome | awk '{ print $$2 }' | grep -q -F $(TAG_VERSION); then echo "$(NAME)/standalone-chrome version $(TAG_VERSION) is not yet built. Please run 'make build'"; false; fi @if ! docker images $(NAME)/standalone-chromium | awk '{ print $$2 }' | grep -q -F $(TAG_VERSION); then echo "$(NAME)/standalone-chromium version $(TAG_VERSION) is not yet built. Please run 'make build'"; false; fi @if ! docker images $(NAME)/standalone-edge | awk '{ print $$2 }' | grep -q -F $(TAG_VERSION); then echo "$(NAME)/standalone-edge version $(TAG_VERSION) is not yet built. Please run 'make build'"; false; fi @if ! docker images $(NAME)/standalone-firefox | awk '{ print $$2 }' | grep -q -F $(TAG_VERSION); then echo "$(NAME)/standalone-firefox version $(TAG_VERSION) is not yet built. Please run 'make build'"; false; fi @if ! docker images $(NAME)/standalone-docker | awk '{ print $$2 }' | grep -q -F $(TAG_VERSION); then echo "$(NAME)/standalone-docker version $(TAG_VERSION) is not yet built. Please run 'make build'"; false; fi + @if ! docker images $(NAME)/standalone-all-browsers | awk '{ print $$2 }' | grep -q -F $(TAG_VERSION); then echo "$(NAME)/standalone-all-browsers version $(TAG_VERSION) is not yet built. Please run 'make build'"; false; fi docker push $(NAME)/base:$(TAG_VERSION) docker push $(NAME)/hub:$(TAG_VERSION) docker push $(NAME)/distributor:$(TAG_VERSION) @@ -567,11 +606,13 @@ release: tag_major_minor release_grid_scaler docker push $(NAME)/node-edge:$(TAG_VERSION) docker push $(NAME)/node-firefox:$(TAG_VERSION) docker push $(NAME)/node-docker:$(TAG_VERSION) + docker push $(NAME)/node-all-browsers:$(TAG_VERSION) docker push $(NAME)/standalone-chrome:$(TAG_VERSION) docker push $(NAME)/standalone-chromium:$(TAG_VERSION) docker push $(NAME)/standalone-edge:$(TAG_VERSION) docker push $(NAME)/standalone-firefox:$(TAG_VERSION) docker push $(NAME)/standalone-docker:$(TAG_VERSION) + docker push $(NAME)/standalone-all-browsers:$(TAG_VERSION) docker push $(NAME)/base:$(MAJOR) docker push $(NAME)/hub:$(MAJOR) docker push $(NAME)/distributor:$(MAJOR) @@ -585,11 +626,13 @@ release: tag_major_minor release_grid_scaler docker push $(NAME)/node-edge:$(MAJOR) docker push $(NAME)/node-firefox:$(MAJOR) docker push $(NAME)/node-docker:$(MAJOR) + docker push $(NAME)/node-all-browsers:$(MAJOR) docker push $(NAME)/standalone-chrome:$(MAJOR) docker push $(NAME)/standalone-chromium:$(MAJOR) docker push $(NAME)/standalone-edge:$(MAJOR) docker push $(NAME)/standalone-firefox:$(MAJOR) docker push $(NAME)/standalone-docker:$(MAJOR) + docker push $(NAME)/standalone-all-browsers:$(MAJOR) docker push $(NAME)/base:$(MAJOR).$(MINOR) docker push $(NAME)/hub:$(MAJOR).$(MINOR) docker push $(NAME)/distributor:$(MAJOR).$(MINOR) @@ -603,11 +646,13 @@ release: tag_major_minor release_grid_scaler docker push $(NAME)/node-edge:$(MAJOR).$(MINOR) docker push $(NAME)/node-firefox:$(MAJOR).$(MINOR) docker push $(NAME)/node-docker:$(MAJOR).$(MINOR) + docker push $(NAME)/node-all-browsers:$(MAJOR).$(MINOR) docker push $(NAME)/standalone-chrome:$(MAJOR).$(MINOR) docker push $(NAME)/standalone-chromium:$(MAJOR).$(MINOR) docker push $(NAME)/standalone-edge:$(MAJOR).$(MINOR) docker push $(NAME)/standalone-firefox:$(MAJOR).$(MINOR) docker push $(NAME)/standalone-docker:$(MAJOR).$(MINOR) + docker push $(NAME)/standalone-all-browsers:$(MAJOR).$(MINOR) docker push $(NAME)/base:$(MAJOR_MINOR_PATCH) docker push $(NAME)/hub:$(MAJOR_MINOR_PATCH) docker push $(NAME)/distributor:$(MAJOR_MINOR_PATCH) @@ -621,11 +666,13 @@ release: tag_major_minor release_grid_scaler docker push $(NAME)/node-edge:$(MAJOR_MINOR_PATCH) docker push $(NAME)/node-firefox:$(MAJOR_MINOR_PATCH) docker push $(NAME)/node-docker:$(MAJOR_MINOR_PATCH) + docker push $(NAME)/node-all-browsers:$(MAJOR_MINOR_PATCH) docker push $(NAME)/standalone-chrome:$(MAJOR_MINOR_PATCH) docker push $(NAME)/standalone-chromium:$(MAJOR_MINOR_PATCH) docker push $(NAME)/standalone-edge:$(MAJOR_MINOR_PATCH) docker push $(NAME)/standalone-firefox:$(MAJOR_MINOR_PATCH) docker push $(NAME)/standalone-docker:$(MAJOR_MINOR_PATCH) + docker push $(NAME)/standalone-all-browsers:$(MAJOR_MINOR_PATCH) docker push $(NAME)/video:$(FFMPEG_TAG_VERSION)-$(BUILD_DATE) test: test_chrome \ @@ -639,7 +686,9 @@ test: test_chrome \ test_firefox_standalone_java \ test_edge \ test_edge_standalone \ - test_edge_standalone_java + test_edge_standalone_java \ + test_node_all_browsers \ + test_standalone_all_browsers test_chrome: case "$(PLATFORMS)" in \ @@ -730,6 +779,33 @@ test_chromium_standalone: test_chromium_standalone_java: PLATFORMS=$(PLATFORMS) VERSION=$(TAG_VERSION) NAMESPACE=$(NAMESPACE) BASE_RELEASE=$(BASE_RELEASE) BASE_VERSION=$(BASE_VERSION) BINDING_VERSION=$(BINDING_VERSION) SKIP_BUILD=true ./tests/SeleniumJavaTests/bootstrap_java.sh chrome standalone-chromium +test_node_all_browsers: + case "$(PLATFORMS)" in \ + *linux/amd64*) \ + echo "Microsoft Edge is only supported on linux/amd64" \ + && PLATFORMS=linux/amd64 VERSION=$(TAG_VERSION) NAMESPACE=$(NAMESPACE) BASE_RELEASE=$(BASE_RELEASE) BASE_VERSION=$(BASE_VERSION) BINDING_VERSION=$(BINDING_VERSION) SKIP_BUILD=true ./tests/bootstrap.sh NodeAllEdge \ + ;; \ + *) \ + echo "Microsoft Edge doesn't support platform $(PLATFORMS)" ; \ + ;; \ + esac + PLATFORMS=$(PLATFORMS) VERSION=$(TAG_VERSION) NAMESPACE=$(NAMESPACE) BASE_RELEASE=$(BASE_RELEASE) BASE_VERSION=$(BASE_VERSION) BINDING_VERSION=$(BINDING_VERSION) SKIP_BUILD=true ./tests/bootstrap.sh NodeAllChrome + PLATFORMS=$(PLATFORMS) VERSION=$(TAG_VERSION) NAMESPACE=$(NAMESPACE) BASE_RELEASE=$(BASE_RELEASE) BASE_VERSION=$(BASE_VERSION) BINDING_VERSION=$(BINDING_VERSION) SKIP_BUILD=true \ + ./tests/bootstrap.sh NodeAllFirefox + +test_standalone_all_browsers: + case "$(PLATFORMS)" in \ + *linux/amd64*) \ + echo "Microsoft Edge is only supported on linux/amd64" \ + && PLATFORMS=linux/amd64 VERSION=$(TAG_VERSION) NAMESPACE=$(NAMESPACE) BASE_RELEASE=$(BASE_RELEASE) BASE_VERSION=$(BASE_VERSION) BINDING_VERSION=$(BINDING_VERSION) SKIP_BUILD=true ./tests/bootstrap.sh StandaloneAllEdge \ + ;; \ + *) \ + echo "Microsoft Edge doesn't support platform $(PLATFORMS)" ; \ + ;; \ + esac + PLATFORMS=$(PLATFORMS) VERSION=$(TAG_VERSION) NAMESPACE=$(NAMESPACE) BASE_RELEASE=$(BASE_RELEASE) BASE_VERSION=$(BASE_VERSION) BINDING_VERSION=$(BINDING_VERSION) SKIP_BUILD=true ./tests/bootstrap.sh StandaloneAllFirefox + PLATFORMS=$(PLATFORMS) VERSION=$(TAG_VERSION) NAMESPACE=$(NAMESPACE) BASE_RELEASE=$(BASE_RELEASE) BASE_VERSION=$(BASE_VERSION) BINDING_VERSION=$(BINDING_VERSION) SKIP_BUILD=true ./tests/bootstrap.sh StandaloneAllChrome + test_parallel: hub chrome firefox edge chromium video sudo rm -rf ./tests/tests sudo rm -rf ./tests/videos; mkdir -p ./tests/videos diff --git a/NodeBase/generate_config b/NodeBase/generate_config index 4f7c38f4c4..c141f9187a 100755 --- a/NodeBase/generate_config +++ b/NodeBase/generate_config @@ -8,17 +8,86 @@ function short_version() { echo "${__major}.${__minor:0:1}" } +# A global array of environment variable prefixes supports different browser suffixes +ENV_PREFIXES=( + "SE_NODE_STEREOTYPE" + "SE_NODE_BROWSER_NAME" + "SE_NODE_BROWSER_VERSION" + "SE_NODE_PLATFORM_NAME" + "SE_BROWSER_BINARY_LOCATION" + "SE_NODE_STEREOTYPE_EXTRA" + "SE_NODE_MAX_SESSIONS" +) + +function backup_original_env_vars() { + echo "Backing up original environment variables..." + + for prefix in "${ENV_PREFIXES[@]}"; do + local backup_var="${prefix}_ORIGINAL" + local common_var="${prefix}" + + # Backup original value if not already backed up + if [[ -z "${!backup_var}" ]] && [[ -n "${!common_var}" ]]; then + eval "${backup_var}=\"${!common_var}\"" + echo "Backed up original ${common_var}=${!common_var} to ${backup_var}" + fi + done +} + +function restore_original_env_vars() { + echo "Restoring original environment variables..." + + for prefix in "${ENV_PREFIXES[@]}"; do + local backup_var="${prefix}_ORIGINAL" + local common_var="${prefix}" + + # Restore original value if backup exists + if [[ -n "${!backup_var}" ]]; then + eval "${common_var}=\"${!backup_var}\"" + echo "Restored original ${backup_var}=${!backup_var} to ${common_var}" + else + # Clear the variable if no backup exists + eval "${common_var}=\"\"" + echo "Cleared ${common_var} (no original backup)" + fi + done +} + +function assign_browser_specific_env_vars() { + local browser_name=$1 + + # Set browser-specific values or inherit original values + for prefix in "${ENV_PREFIXES[@]}"; do + local browser_specific_var="${prefix}_${browser_name}" + local common_var="${prefix}" + local backup_var="${prefix}_ORIGINAL" + + # Check if the browser-specific environment variable exists + if [[ -n "${!browser_specific_var}" ]]; then + # Assign the browser-specific value to the common variable + eval "${common_var}=\"${!browser_specific_var}\"" + echo "Assigned ${browser_specific_var}=${!browser_specific_var} to ${common_var}" + elif [[ -n "${!backup_var}" ]]; then + # Inherit original value if browser-specific value is not set + eval "${common_var}=\"${!backup_var}\"" + echo "Inherited original ${backup_var}=${!backup_var} to ${common_var}" + fi + done +} + if [[ -z "$CONFIG_FILE" ]]; then FILENAME="/opt/selenium/config.toml" else FILENAME="$CONFIG_FILE" fi +echo -n "" >"$FILENAME" + if [[ -n "${SE_EVENT_BUS_HOST}" ]]; then echo "[events] publish = \"tcp://${SE_EVENT_BUS_HOST}:${SE_EVENT_BUS_PUBLISH_PORT}\" subscribe = \"tcp://${SE_EVENT_BUS_HOST}:${SE_EVENT_BUS_SUBSCRIBE_PORT}\" - " >"$FILENAME" + " >>"$FILENAME" fi if [[ -z "${SE_NODE_HOST}" ]] && [[ -z "${SE_NODE_PORT}" ]]; then @@ -39,6 +108,11 @@ else echo "port = \"${SE_NODE_PORT}\"" >>"$FILENAME" fi +if [[ -n "${SE_RELAX_CHECKS}" ]]; then + echo "[network]" >>"$FILENAME" + echo "relax-checks = ${SE_RELAX_CHECKS}" >>"$FILENAME" +fi + echo "[node]" >>"$FILENAME" # String, Url where the Grid can be reached if [[ -z "${SE_NODE_GRID_URL}" ]]; then @@ -50,44 +124,65 @@ echo "session-timeout = ${SE_NODE_SESSION_TIMEOUT}" >>"$FILENAME" echo "override-max-sessions = ${SE_NODE_OVERRIDE_MAX_SESSIONS}" >>"$FILENAME" echo "detect-drivers = false" >>"$FILENAME" echo "drain-after-session-count = ${DRAIN_AFTER_SESSION_COUNT:-$SE_DRAIN_AFTER_SESSION_COUNT}" >>"$FILENAME" -echo "max-sessions = ${SE_NODE_MAX_SESSIONS} -" >>"$FILENAME" +echo "" >>"$FILENAME" -if [ -f /opt/selenium/browser_name ]; then - SE_NODE_BROWSER_NAME=$(cat /opt/selenium/browser_name) -fi -if [ -f /opt/selenium/browser_version ] && [ "${SE_NODE_BROWSER_VERSION,,}" = "stable" ]; then - SE_NODE_BROWSER_VERSION=$(short_version $(cat /opt/selenium/browser_version)) -fi -if [ -f /opt/selenium/browser_binary_location ] && [ -z "${SE_BROWSER_BINARY_LOCATION}" ]; then - SE_BROWSER_BINARY_LOCATION=$(cat /opt/selenium/browser_binary_location) -fi -SE_NODE_CONTAINER_NAME="${SE_NODE_CONTAINER_NAME:-$(hostname)}" - -# 'browserName' is mandatory for default stereotype -if [[ -z "${SE_NODE_STEREOTYPE}" ]] && [[ -n "${SE_NODE_BROWSER_NAME}" ]] && ([[ -z "${SE_NODE_RELAY_URL}" ]] || [[ "${SE_NODE_RELAY_ONLY}" = "false" ]]); then - 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)\"}" - if [[ -n "${SE_BROWSER_BINARY_LOCATION}" ]]; then - SE_NODE_STEREOTYPE="$(python3 /opt/bin/json_merge.py "${SE_NODE_STEREOTYPE}" "{${SE_BROWSER_BINARY_LOCATION}}")" - fi -else - SE_NODE_STEREOTYPE="${SE_NODE_STEREOTYPE}" -fi -if [[ -n "${SE_NODE_STEREOTYPE_EXTRA}" ]]; then - echo "Merging SE_NODE_STEREOTYPE_EXTRA=${SE_NODE_STEREOTYPE_EXTRA} to main stereotype" - SE_NODE_STEREOTYPE="$(python3 /opt/bin/json_merge.py "${SE_NODE_STEREOTYPE}" "${SE_NODE_STEREOTYPE_EXTRA}")" - if [[ $? -ne 0 ]]; then - echo "Failed to merge SE_NODE_STEREOTYPE_EXTRA. Please check the format of the JSON string. Keep using main stereotype." - else - echo "Merged stereotype: ${SE_NODE_STEREOTYPE}" - fi -fi +# Check if /opt/selenium/browsers directory exists and iterate through browser folders +if [ -d "/opt/selenium/browsers" ]; then + # Backup original environment variables before processing browsers + backup_original_env_vars -# 'stereotype' setting is mandatory -if [[ -n "${SE_NODE_STEREOTYPE}" ]]; then - echo "[[node.driver-configuration]]" >>"$FILENAME" - echo "display-name = \"${SE_NODE_BROWSER_NAME}\"" >>"$FILENAME" - echo "stereotype = '${SE_NODE_STEREOTYPE}'" >>"$FILENAME" - echo "max-sessions = ${SE_NODE_MAX_SESSIONS} - " >>"$FILENAME" + for browser_dir in /opt/selenium/browsers/*/; do + if [ -d "$browser_dir" ]; then + browser_name=$(basename "$browser_dir" | tr '[:lower:]' '[:upper:]') + echo "===Start generating stereotype for browser: ${browser_name}===" + # Assign environment variables with browser suffix to common variables + assign_browser_specific_env_vars "$browser_name" + + if [ -f "${browser_dir}name" ]; then + SE_NODE_BROWSER_NAME=$(cat "${browser_dir}name") + fi + if [ -f "${browser_dir}version" ] && [ "${SE_NODE_BROWSER_VERSION,,}" = "stable" ]; then + SE_NODE_BROWSER_VERSION=$(short_version "$(cat "${browser_dir}version")") + fi + if [ -f "${browser_dir}binary_location" ] && [ -z "${SE_BROWSER_BINARY_LOCATION}" ]; then + SE_BROWSER_BINARY_LOCATION=$(cat "${browser_dir}binary_location") + fi + SE_NODE_CONTAINER_NAME="${SE_NODE_CONTAINER_NAME:-$(hostname)}" + + # 'browserName' is mandatory for default stereotype + if [[ -z "${SE_NODE_STEREOTYPE}" ]] && [[ -n "${SE_NODE_BROWSER_NAME}" ]] && ([[ -z "${SE_NODE_RELAY_URL}" ]] || [[ "${SE_NODE_RELAY_ONLY}" = "false" ]]); then + 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)\"}" + if [[ -n "${SE_BROWSER_BINARY_LOCATION}" ]]; then + SE_NODE_STEREOTYPE="$(python3 /opt/bin/json_merge.py "${SE_NODE_STEREOTYPE}" "${SE_BROWSER_BINARY_LOCATION}")" + fi + else + SE_NODE_STEREOTYPE="${SE_NODE_STEREOTYPE}" + fi + if [[ -n "${SE_NODE_STEREOTYPE_EXTRA}" ]]; then + echo "Merging SE_NODE_STEREOTYPE_EXTRA=${SE_NODE_STEREOTYPE_EXTRA} to main stereotype for $browser_name" + SE_NODE_STEREOTYPE="$(python3 /opt/bin/json_merge.py "${SE_NODE_STEREOTYPE}" "${SE_NODE_STEREOTYPE_EXTRA}")" + if [[ $? -ne 0 ]]; then + echo "Failed to merge SE_NODE_STEREOTYPE_EXTRA for $browser_name. Please check the format of the JSON string. Keep using main stereotype." + else + echo "Merged stereotype for $browser_name: ${SE_NODE_STEREOTYPE}" + fi + fi + + # 'stereotype' setting is mandatory + if [[ -n "${SE_NODE_STEREOTYPE}" ]]; then + echo "[[node.driver-configuration]]" >>"$FILENAME" + echo "display-name = \"${SE_NODE_BROWSER_NAME}\"" >>"$FILENAME" + echo "stereotype = '${SE_NODE_STEREOTYPE}'" >>"$FILENAME" + # Validate SE_NODE_MAX_SESSIONS is a positive integer + if [[ "${SE_NODE_MAX_SESSIONS}" =~ ^[0-9]+$ ]] && [[ "${SE_NODE_MAX_SESSIONS}" -gt 0 ]]; then + echo "max-sessions = ${SE_NODE_MAX_SESSIONS}" >>"$FILENAME" + fi + echo "" >>"$FILENAME" + fi + + # Restore original environment variables for next browser iteration + restore_original_env_vars + echo "===Stop generating stereotype for browser: ${browser_name}===" + fi + done fi diff --git a/NodeChrome/Dockerfile b/NodeChrome/Dockerfile index fa4f3b320a..e0557ca59b 100644 --- a/NodeChrome/Dockerfile +++ b/NodeChrome/Dockerfile @@ -49,9 +49,10 @@ USER ${SEL_UID} #============================================ # Dumping Browser information for config #============================================ -RUN echo "chrome" > /opt/selenium/browser_name -RUN google-chrome --version | awk '{print $3}' > /opt/selenium/browser_version -RUN echo "\"goog:chromeOptions\": {\"binary\": \"/usr/bin/google-chrome\"}" > /opt/selenium/browser_binary_location +RUN mkdir -p /opt/selenium/browsers/chrome \ + && echo "chrome" > /opt/selenium/browsers/chrome/name \ + && google-chrome --version | awk '{print $3}' > /opt/selenium/browsers/chrome/version \ + && echo '{"goog:chromeOptions": {"binary": "/usr/bin/google-chrome"}}' > /opt/selenium/browsers/chrome/binary_location ENV SE_OTEL_SERVICE_NAME="selenium-node-chrome" \ SE_NODE_ENABLE_MANAGED_DOWNLOADS="true" diff --git a/NodeChromium/Dockerfile b/NodeChromium/Dockerfile index e3484647fb..67371b0b04 100644 --- a/NodeChromium/Dockerfile +++ b/NodeChromium/Dockerfile @@ -10,7 +10,7 @@ USER root # Install Chromium ARG CHROMIUM_VERSION="latest" ARG CHROMIUM_DEB_SITE="http://deb.debian.org/debian" -RUN echo "deb ${CHROMIUM_DEB_SITE}/ sid main" >> /etc/apt/sources.list \ +RUN echo "deb ${CHROMIUM_DEB_SITE}/ sid main" >/etc/apt/sources.list.d/debian.list \ && wget -qO- https://ftp-master.debian.org/keys/archive-key-12.asc | gpg --dearmor > /etc/apt/trusted.gpg.d/debian-archive-keyring.gpg \ && 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 \ && apt-get update -qqy \ @@ -24,7 +24,7 @@ RUN echo "deb ${CHROMIUM_DEB_SITE}/ sid main" >> /etc/apt/sources.list \ && apt-get -qqyf install /tmp/chromium/chromium-common.deb /tmp/chromium/chromium.deb /tmp/chromium/chromium-l10n.deb /tmp/chromium/chromium-driver.deb \ && rm -rf /tmp/chromium; \ fi \ - && rm -rf /var/lib/apt/lists/* /var/cache/apt/* + && rm -rf /var/lib/apt/lists/* /var/cache/apt/* /etc/apt/sources.list.d/debian.list #================================= # Chromium Launch Script Wrapper @@ -43,9 +43,10 @@ USER ${SEL_UID} #============================================ # Dumping Browser information for config #============================================ -RUN echo "chrome" > /opt/selenium/browser_name -RUN chromium --version | awk '{print $2}' > /opt/selenium/browser_version -RUN echo "\"goog:chromeOptions\": {\"binary\": \"/usr/bin/chromium\"}" > /opt/selenium/browser_binary_location +RUN mkdir -p /opt/selenium/browsers/chrome \ + && echo "chrome" > /opt/selenium/browsers/chrome/name \ + && chromium --version | awk '{print $2}' > /opt/selenium/browsers/chrome/version \ + && echo '{"goog:chromeOptions": {"binary": "/usr/bin/chromium"}}' > /opt/selenium/browsers/chrome/binary_location -ENV SE_OTEL_SERVICE_NAME="selenium-node-chromium" \ +ENV SE_OTEL_SERVICE_NAME="selenium-node-chrome" \ SE_NODE_ENABLE_MANAGED_DOWNLOADS="true" diff --git a/NodeEdge/Dockerfile b/NodeEdge/Dockerfile index 977432e9e0..d64cb7d249 100644 --- a/NodeEdge/Dockerfile +++ b/NodeEdge/Dockerfile @@ -66,9 +66,10 @@ USER ${SEL_UID} #============================================ # Dumping Browser information for config #============================================ -RUN echo "MicrosoftEdge" > /opt/selenium/browser_name -RUN microsoft-edge --version | awk '{print $3}' > /opt/selenium/browser_version -RUN echo "\"ms:edgeOptions\": {\"binary\": \"/usr/bin/microsoft-edge\"}" > /opt/selenium/browser_binary_location +RUN mkdir -p /opt/selenium/browsers/edge \ + && echo "MicrosoftEdge" > /opt/selenium/browsers/edge/name \ + && microsoft-edge --version | awk '{print $3}' > /opt/selenium/browsers/edge/version \ + && echo '{"ms:edgeOptions": {"binary": "/usr/bin/microsoft-edge"}}' > /opt/selenium/browsers/edge/binary_location ENV SE_OTEL_SERVICE_NAME="selenium-node-edge" \ SE_NODE_ENABLE_MANAGED_DOWNLOADS="true" diff --git a/NodeFirefox/Dockerfile b/NodeFirefox/Dockerfile index 3f25fca02d..02ec3fa61b 100644 --- a/NodeFirefox/Dockerfile +++ b/NodeFirefox/Dockerfile @@ -85,9 +85,10 @@ USER ${SEL_UID} #============================================ # Dumping Browser information for config #============================================ -RUN echo "firefox" > /opt/selenium/browser_name \ - && firefox --version | awk '{print $3}' > /opt/selenium/browser_version \ - && echo "\"moz:firefoxOptions\": {\"binary\": \"/usr/bin/firefox\"}" > /opt/selenium/browser_binary_location +RUN mkdir -p /opt/selenium/browsers/firefox \ + && echo "firefox" > /opt/selenium/browsers/firefox/name \ + && firefox --version | awk '{print $3}' > /opt/selenium/browsers/firefox/version \ + && echo '{"moz:firefoxOptions": {"binary": "/usr/bin/firefox"}}' > /opt/selenium/browsers/firefox/binary_location ENV SE_OTEL_SERVICE_NAME="selenium-node-firefox" \ SE_NODE_ENABLE_MANAGED_DOWNLOADS="true" diff --git a/README.md b/README.md index 5728f94a19..49dbd5a728 100644 --- a/README.md +++ b/README.md @@ -154,19 +154,29 @@ From image tag based `4.21.0` onwards, the architectures supported by this proje The following browsers are available in multi-arch images: -| Architecture | Chrome | Chromium | Firefox | Edge | -| :-----------------------: | :----: | :------: | :-----: | :---: | -| x86_64 (aka amd64) | ✅ | ✅ | ✅ | ✅ | -| aarch64 (aka arm64/armv8) | ❌ | ✅ | ✅ | ❌ | -| armhf (aka arm32/armv7l) | ❌ | ❌ | ❌ | ❌ | +| Architecture | Chrome | Chromium | Firefox | Edge | +|:-------------------------:|:------:|:--------:|:-------:|:----:| +| x86_64 (aka amd64) | ✅ | ✅ | ✅ | ✅ | +| aarch64 (aka arm64/armv8) | ❌ | ✅ | ✅ | ❌ | +| armhf (aka arm32/armv7l) | ❌ | ❌ | ❌ | ❌ | + + +Accordingly, browsers are available in images `selenium/node-all-browsers` and `selenium/standalone-all-browsers` would be different per architecture. + +| Browser / Arch | x86_64 (aka amd64) | aarch64 (aka arm64/armv8) | +|----------------|--------------------|---------------------------| +| Chrome | ✅ | ❌ | +| Edge | ✅ | ❌ | +| Firefox | ✅ | ✅ | +| Chromium | ❌ | ✅ | Note: +- **Running an AMD64 image under emulation on an ARM64 platform is not recommended due to performance and [stability issues](https://github.com/SeleniumHQ/docker-selenium/issues/2298), or browsers could not launch.** + - Google does not build Chrome (`google-chrome`) for Linux/ARM platforms. Hence, the Chrome (node and standalone) images are only available for AMD64. Similarly, Microsoft does not build Edge (`microsoft-edge`) for Linux/ARM platforms. -- Running an AMD64 image under emulation on an ARM64 platform is not recommended due to performance and [stability issues](https://github.com/SeleniumHQ/docker-selenium/issues/2298). - - For Linux/ARM use the open source Chromium browser. The Chromium (node and standalone) images are available in multi-arch. ```bash @@ -175,7 +185,7 @@ $ docker run --rm -it -p 4444:4444 -p 5900:5900 -p 7900:7900 --shm-size 2g selen - Mozilla Firefox now is available for Linux/ARM64 via APT stable channel from v136+. The Firefox (node and standalone) images are available in multi-arch. -Multi-arch images are tested on CircleCI with resource class Linux/ARM64. See the status below. +~~Multi-arch images are tested on CircleCI with resource class Linux/ARM64. See the status below.~~ (Moved to GitHub Actions) [![CircleCI](https://dl.circleci.com/status-badge/img/gh/SeleniumHQ/docker-selenium/tree/trunk.svg?style=svg)](https://dl.circleci.com/status-badge/redirect/gh/SeleniumHQ/docker-selenium/tree/trunk) @@ -202,16 +212,20 @@ A single command to enable that feature in Docker Engine: make set_containerd_image_store ``` +Noted: That command is only compatible with Ubuntu. For users use Docker Desktop on macOS, it can be enabled easily via + +> `Settings > General > Use containerd for pulling and storing images` + To build all the images for multiplatform at once, run the following command: ```bash -PLATFORMS=linux/amd64,linux/arm64 make build +PLATFORMS=linux/amd64,linux/arm64 make all ``` To build the images for a specific platform, run the following command: ```bash -PLATFORMS=linux/arm64 make build +PLATFORMS=linux/arm64 make all ``` By default, without specifying the `PLATFORMS` variable, the images are built with current host architecture. @@ -219,7 +233,7 @@ By default, without specifying the `PLATFORMS` variable, the images are built wi Similarly, if you are using host ARM64 architecture, you can build the images for AMD64 architecture by running the following command: ```bash -PLATFORMS=linux/amd64 make build +PLATFORMS=linux/amd64 make all ``` ___ @@ -382,21 +396,26 @@ How to update or contribute to list of environment variables? Follow below steps ### Standalone -![Firefox](https://raw.githubusercontent.com/alrra/browser-logos/main/src/firefox/firefox_24x24.png) Firefox +#### ![Firefox](https://raw.githubusercontent.com/alrra/browser-logos/main/src/firefox/firefox_24x24.png) Firefox ```bash docker run -d -p 4444:4444 --shm-size="2g" selenium/standalone-firefox:4.35.0-20250808 ``` -![Chrome](https://raw.githubusercontent.com/alrra/browser-logos/main/src/chrome/chrome_24x24.png) Chrome +#### ![Chrome](https://raw.githubusercontent.com/alrra/browser-logos/main/src/chrome/chrome_24x24.png) Chrome ```bash docker run -d -p 4444:4444 --shm-size="2g" selenium/standalone-chrome:4.35.0-20250808 ``` -![Edge](https://raw.githubusercontent.com/alrra/browser-logos/main/src/edge/edge_24x24.png) Edge +#### ![Edge](https://raw.githubusercontent.com/alrra/browser-logos/main/src/edge/edge_24x24.png) Edge ```bash docker run -d -p 4444:4444 --shm-size="2g" selenium/standalone-edge:4.35.0-20250808 ``` +#### All browsers in single container +```bash +docker run -d -p 4444:4444 --shm-size="3g" selenium/standalone-all-browsers:4.35.0-20250808 +``` + _Note: Only one Standalone container can run on port_ `4444` _at the same time._ ___ @@ -411,6 +430,8 @@ A Docker [network](https://docs.docker.com/engine/reference/commandline/network_ ##### macOS/Linux +**Hub and multiple browser Node containers** + ```bash $ docker network create grid $ docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub selenium/hub:4.35.0-20250808 @@ -425,8 +446,20 @@ $ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub \ selenium/node-firefox:4.35.0-20250808 ``` +**Hub and single Node container with all browsers** + +```bash +$ docker network create grid +$ docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub selenium/hub:4.35.0-20250808 +$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub \ + --shm-size="3g" \ + selenium/node-all-browsers:4.35.0-20250808 +``` + ##### Windows PowerShell +**Hub and multiple browser Node containers** + ```powershell $ docker network create grid $ docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub selenium/hub:4.35.0-20250808 @@ -441,6 +474,16 @@ $ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub ` selenium/node-firefox:4.35.0-20250808 ``` +**Hub and single Node container with all browsers** + +```powershell +$ docker network create grid +$ docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub selenium/hub:4.35.0-20250808 +$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub ` + --shm-size="3g" ` + selenium/node-all-browsers:4.35.0-20250808 +``` + When you are done using the Grid, and the containers have exited, the network can be removed with the following command: ``` bash diff --git a/Standalone/Dockerfile b/Standalone/Dockerfile index cac3967e54..9a7ce90a5f 100644 --- a/Standalone/Dockerfile +++ b/Standalone/Dockerfile @@ -17,9 +17,6 @@ COPY --chown="${SEL_UID}:${SEL_GID}" start-selenium-standalone.sh /opt/bin/start #============================== COPY selenium.conf /etc/supervisor/conf.d/ -# Copying configuration script generator -COPY --chown="${SEL_UID}:${SEL_GID}" generate_config /opt/bin/generate_config - # In seconds, maps to "--session-request-timeout" ENV SE_SESSION_REQUEST_TIMEOUT="300" \ # In seconds, maps to "--session-retry-interval" diff --git a/Standalone/generate_config b/Standalone/generate_config deleted file mode 100755 index 67f98c6061..0000000000 --- a/Standalone/generate_config +++ /dev/null @@ -1,68 +0,0 @@ -#!/bin/bash - -function short_version() { - local __long_version=$1 - local __version_split=(${__long_version//./ }) - local __major=${__version_split[0]} - local __minor=${__version_split[1]} - echo "${__major}.${__minor:0:1}" -} - -if [[ -z "$CONFIG_FILE" ]]; then - FILENAME="/opt/selenium/config.toml" -else - FILENAME="$CONFIG_FILE" -fi - -echo "[network] -relax-checks = ${SE_RELAX_CHECKS} -" >"$FILENAME" - -echo "[node]" >>"$FILENAME" -# String, Url where the Grid can be reached -if [[ -z "${SE_NODE_GRID_URL}" ]]; then - echo "Setting up SE_NODE_GRID_URL..." -else - echo "grid-url = \"${SE_NODE_GRID_URL}\"" >>"$FILENAME" -fi -echo "session-timeout = ${SE_NODE_SESSION_TIMEOUT}" >>"$FILENAME" -echo "override-max-sessions = ${SE_NODE_OVERRIDE_MAX_SESSIONS}" >>"$FILENAME" -echo "detect-drivers = false" >>"$FILENAME" -echo "drain-after-session-count = ${DRAIN_AFTER_SESSION_COUNT:-$SE_DRAIN_AFTER_SESSION_COUNT}" >>"$FILENAME" -echo "max-sessions = ${SE_NODE_MAX_SESSIONS} -" >>"$FILENAME" - -if [ -f /opt/selenium/browser_name ]; then - SE_NODE_BROWSER_NAME=$(cat /opt/selenium/browser_name) -fi -if [ -f /opt/selenium/browser_version ] && [ "${SE_NODE_BROWSER_VERSION}" = "stable" ]; then - SE_NODE_BROWSER_VERSION=$(short_version $(cat /opt/selenium/browser_version)) -fi -if [ -f /opt/selenium/browser_binary_location ] && [ -z "${SE_BROWSER_BINARY_LOCATION}" ]; then - SE_BROWSER_BINARY_LOCATION=$(cat /opt/selenium/browser_binary_location) -fi -SE_NODE_CONTAINER_NAME="${SE_NODE_CONTAINER_NAME:-$(hostname)}" - -if [[ -z "$SE_NODE_STEREOTYPE" ]]; then - 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)\"}" - if [[ -n "${SE_BROWSER_BINARY_LOCATION}" ]]; then - SE_NODE_STEREOTYPE="$(python3 /opt/bin/json_merge.py "${SE_NODE_STEREOTYPE}" "{${SE_BROWSER_BINARY_LOCATION}}")" - fi -else - SE_NODE_STEREOTYPE="$SE_NODE_STEREOTYPE" -fi -if [[ -n "${SE_NODE_STEREOTYPE_EXTRA}" ]]; then - echo "Merging SE_NODE_STEREOTYPE_EXTRA=${SE_NODE_STEREOTYPE_EXTRA} to main stereotype" - SE_NODE_STEREOTYPE="$(python3 /opt/bin/json_merge.py "${SE_NODE_STEREOTYPE}" "${SE_NODE_STEREOTYPE_EXTRA}")" - if [[ $? -ne 0 ]]; then - echo "Failed to merge SE_NODE_STEREOTYPE_EXTRA. Please check the format of the JSON string. Keep using main stereotype." - else - echo "Merged stereotype: ${SE_NODE_STEREOTYPE}" - fi -fi - -echo "[[node.driver-configuration]]" >>"$FILENAME" -echo "display-name = \"${SE_NODE_BROWSER_NAME}\"" >>"$FILENAME" -echo "stereotype = '${SE_NODE_STEREOTYPE}'" >>"$FILENAME" -echo "max-sessions = ${SE_NODE_MAX_SESSIONS} -" >>"$FILENAME" diff --git a/Standalone/start-selenium-standalone.sh b/Standalone/start-selenium-standalone.sh index 578e6eb344..d55e412323 100755 --- a/Standalone/start-selenium-standalone.sh +++ b/Standalone/start-selenium-standalone.sh @@ -136,8 +136,11 @@ if [ ! -z "$SE_NEW_SESSION_THREAD_POOL_SIZE" ]; then append_se_opts "--newsession-threadpool-size" "${SE_NEW_SESSION_THREAD_POOL_SIZE}" fi -/opt/bin/generate_config -/opt/bin/generate_relay_config +if [ "$GENERATE_CONFIG" = true ]; then + echo "Generating Selenium Config" + /opt/bin/generate_config + /opt/bin/generate_relay_config +fi echo "Selenium Grid Standalone configuration: " cat "${CONFIG_FILE}" diff --git a/docker-compose-v3-node-all-browsers.yml b/docker-compose-v3-node-all-browsers.yml new file mode 100644 index 0000000000..02a813363f --- /dev/null +++ b/docker-compose-v3-node-all-browsers.yml @@ -0,0 +1,41 @@ +# To execute this docker compose yml file use `docker compose -f docker-compose-v3-node-all-browsers.yml up` +# Add the `-d` flag at the end for detached execution +# To stop the execution, hit Ctrl+C, and then `docker compose -f docker-compose-v3-node-all-browsers.yml down` +services: + selenium-hub: + image: selenium/hub:4.35.0-20250808 + container_name: selenium-hub + ports: + - "4442:4442" + - "4443:4443" + - "4444:4444" + + all-browsers: + image: selenium/node-all-browsers:4.35.0-20250808 + shm_size: 3gb + depends_on: + - selenium-hub + environment: + - SE_EVENT_BUS_HOST=selenium-hub + # Uncomment the following lines to set a value to environment variable of particular browser when GENERATE_CONFIG=true +# - SE_NODE_STEREOTYPE_CHROME= +# - SE_NODE_BROWSER_NAME_CHROME= +# - SE_NODE_BROWSER_VERSION_CHROME= +# - SE_NODE_PLATFORM_NAME_CHROME= +# - SE_BROWSER_BINARY_LOCATION_CHROME= +# - SE_NODE_STEREOTYPE_EXTRA_CHROME= +# - SE_NODE_MAX_SESSIONS_CHROME= +# - SE_NODE_STEREOTYPE_EDGE= +# - SE_NODE_BROWSER_NAME_EDGE= +# - SE_NODE_BROWSER_VERSION_EDGE= +# - SE_NODE_PLATFORM_NAME_EDGE= +# - SE_BROWSER_BINARY_LOCATION_EDGE= +# - SE_NODE_STEREOTYPE_EXTRA_EDGE= +# - SE_NODE_MAX_SESSIONS_EDGE= +# - SE_NODE_STEREOTYPE_FIREFOX= +# - SE_NODE_BROWSER_NAME_FIREFOX= +# - SE_NODE_BROWSER_VERSION_FIREFOX= +# - SE_NODE_PLATFORM_NAME_FIREFOX= +# - SE_BROWSER_BINARY_LOCATION_FIREFOX= +# - SE_NODE_STEREOTYPE_EXTRA_FIREFOX= +# - SE_NODE_MAX_SESSIONS_FIREFOX= diff --git a/generate_release_notes.sh b/generate_release_notes.sh index a06980bc9e..a89f6fde1d 100755 --- a/generate_release_notes.sh +++ b/generate_release_notes.sh @@ -6,7 +6,6 @@ GRID_VERSION=$3 BUILD_DATE=$4 NAMESPACE=${NAME:-selenium} FFMPEG_TAG_VERSION=$(grep FFMPEG_TAG_VERSION Makefile | sed 's/.*,\([^)]*\))/\1/p' | head -n 1) -RCLONE_TAG_VERSION=$(grep RCLONE_TAG_VERSION Makefile | sed 's/.*,\([^)]*\))/\1/p' | head -n 1) AUTHORS=${AUTHORS:-"SeleniumHQ"} TAG_VERSION=${GRID_VERSION}-${BUILD_DATE} diff --git a/tests/test.py b/tests/test.py index f03c14a06e..70de0a0acb 100644 --- a/tests/test.py +++ b/tests/test.py @@ -63,13 +63,19 @@ def signal_handler(signum, frame): 'Hub': 'hub', # Chrome Images 'NodeChrome': 'node-chrome', + 'NodeAllChrome': 'node-all-browsers', 'StandaloneChrome': 'standalone-chrome', + 'StandaloneAllChrome': 'standalone-all-browsers', # Edge Images 'NodeEdge': 'node-edge', + 'NodeAllEdge': 'node-all-browsers', 'StandaloneEdge': 'standalone-edge', + 'StandaloneAllEdge': 'standalone-all-browsers', # Firefox Images 'NodeFirefox': 'node-firefox', + 'NodeAllFirefox': 'node-all-browsers', 'StandaloneFirefox': 'standalone-firefox', + 'StandaloneAllFirefox': 'standalone-all-browsers', # Chromium Images 'NodeChromium': 'node-chromium', 'StandaloneChromium': 'standalone-chromium', @@ -79,13 +85,19 @@ def signal_handler(signum, frame): "Android": "ChromeTests", # Chrome Images 'NodeChrome': 'ChromeTests', + 'NodeAllChrome': 'ChromeTests', 'StandaloneChrome': 'ChromeTests', + 'StandaloneAllChrome': 'ChromeTests', # Edge Images 'NodeEdge': 'EdgeTests', + 'NodeAllEdge': 'EdgeTests', 'StandaloneEdge': 'EdgeTests', + 'StandaloneAllEdge': 'EdgeTests', # Firefox Images 'NodeFirefox': 'FirefoxTests', + 'NodeAllFirefox': 'FirefoxTests', 'StandaloneFirefox': 'FirefoxTests', + 'StandaloneAllFirefox': 'FirefoxTests', # Chromium Images 'NodeChromium': 'ChromeTests', 'StandaloneChromium': 'ChromeTests',