diff --git a/selenium/Containerfile b/selenium/Containerfile index f05f9064..e153c6ea 100644 --- a/selenium/Containerfile +++ b/selenium/Containerfile @@ -5,46 +5,39 @@ COPY init.go . COPY settings.json /home/selenium/.local/share/code-server/User/settings.json -# Firefox releases -# https://download-installer.cdn.mozilla.net/pub/firefox/releases/ -ARG FIREFOX_URL="https://download-installer.cdn.mozilla.net/pub/firefox/releases/140.7.0esr/linux-x86_64/en-US/firefox-140.7.0esr.tar.xz" # Gecko driver releases # https://github.com/mozilla/geckodriver/releases -ARG GECKODRIVER_VERSION="v0.36.0" # Chrome versions # https://www.ubuntuupdates.org/package/google_chrome/stable/main/base/google-chrome-stable -ARG CHROME_VERSION="144.0.7559.59-1" - -ARG SELENIUM_MAJOR_VERSION=4 - -ARG SELENIUM_MINOR_VERSION=39 - -ARG SELENIUM_PATCH_VERSION=0 +ARG \ +GECKODRIVER_VERSION="v0.36.0" \ +CHROME_VERSION="144.0.7559.59-1" \ +SELENIUM_MAJOR_VERSION=4 \ +SELENIUM_MINOR_VERSION=39 \ +SELENIUM_PATCH_VERSION=0 \ +SELENIUM_HTTP_JDK_CLIENT_VERSION="4.13.0" ENV SELENIUM_HOME=/home/selenium -ENV SELENIUM_PORT=4444 \ - SELENIUM_SESSION_TIMEOUT=1800 \ - VNC_PORT=5999 \ - API_PORT=8000 \ - DISPLAY=:99 \ - DBUS_SESSION_BUS_ADDRESS=/dev/null \ - HOME=${SELENIUM_HOME} \ - VNC_GEOMETRY="1600x900" \ - SELENIUM_VERSION=${SELENIUM_MAJOR_VERSION}.${SELENIUM_MINOR_VERSION}.${SELENIUM_PATCH_VERSION} \ - SELENIUM_PATH=${SELENIUM_HOME}/selenium-server/selenium-server-standalone.jar \ - SELENIUM_HTTP_JDK_CLIENT_PATH=${SELENIUM_HOME}/selenium-server/selenium-http-jdk-client.jar \ - PATH=${SELENIUM_HOME}/firefox:/opt/google/chrome:${PATH} - -EXPOSE ${SELENIUM_PORT} - -EXPOSE ${VNC_PORT} - -EXPOSE ${API_PORT} +ENV \ +SELENIUM_PORT=4444 \ +SELENIUM_SESSION_TIMEOUT=1800 \ +VNC_PORT=5999 \ +API_PORT=8000 \ +DISPLAY=:99 \ +DBUS_SESSION_BUS_ADDRESS=/dev/null \ +HOME=${SELENIUM_HOME} \ +VNC_GEOMETRY="1600x900" \ +SELENIUM_VERSION=${SELENIUM_MAJOR_VERSION}.${SELENIUM_MINOR_VERSION}.${SELENIUM_PATCH_VERSION} \ +SELENIUM_PATH=${SELENIUM_HOME}/selenium-server/selenium-server-standalone.jar \ +SELENIUM_HTTP_JDK_CLIENT_PATH=${SELENIUM_HOME}/selenium-server/selenium-http-jdk-client.jar \ +PATH=${SELENIUM_HOME}/firefox:/opt/google/chrome:${PATH} + +EXPOSE ${SELENIUM_PORT} ${VNC_PORT} ${API_PORT} WORKDIR ${SELENIUM_HOME} -RUN PACKAGES="\ +RUN --mount=type=cache,dst=/var/cache/dnf PACKAGES="\ alsa-lib \ at-spi2-atk \ at-spi2-core \ @@ -136,26 +129,38 @@ xkeyboard-config" && \ microdnf -q -y install ${PACKAGES} >/dev/null # ^ https://github.com/rpm-software-management/dnf5/issues/570 -RUN mkdir -p .cache/dconf .mozilla/plugins .vnc/ .fluxbox/ && \ -echo "session.screen0.toolbar.autoHide: true" > .fluxbox/init && \ -touch .Xauthority .vnc/config && \ +RUN --mount=type=cache,target=/.cache --mount=type=cache,target=/home/selenium/.cache/code-server \ +GECKODRIVER_ARCH=$([ "$(arch)" = "aarch64" ] && echo linux-aarch64 || echo linux64) && \ mkdir -p ${SELENIUM_HOME}/selenium-server && \ -curl -L https://github.com/SeleniumHQ/selenium/releases/download/selenium-${SELENIUM_MAJOR_VERSION}.${SELENIUM_MINOR_VERSION}.0/selenium-server-${SELENIUM_VERSION}.jar \ +cd /.cache && \ +curl -sSfL -C - https://github.com/SeleniumHQ/selenium/releases/download/selenium-${SELENIUM_MAJOR_VERSION}.${SELENIUM_MINOR_VERSION}.0/selenium-server-${SELENIUM_VERSION}.jar \ -o ${SELENIUM_PATH} && \ -curl -L https://repo1.maven.org/maven2/org/seleniumhq/selenium/selenium-http-jdk-client/${SELENIUM_VERSION}/selenium-http-jdk-client-${SELENIUM_VERSION}.jar \ +curl -sSfL -C - https://repo1.maven.org/maven2/org/seleniumhq/selenium/selenium-http-jdk-client/${SELENIUM_HTTP_JDK_CLIENT_VERSION}/selenium-http-jdk-client-${SELENIUM_HTTP_JDK_CLIENT_VERSION}.jar \ -o ${SELENIUM_HTTP_JDK_CLIENT_PATH} && \ -curl -L https://download-installer.cdn.mozilla.net/pub/firefox/releases/140.7.0esr/linux-x86_64/en-US/firefox-140.7.0esr.tar.xz|tar --xz -x && \ -curl -LO https://github.com/mozilla/geckodriver/releases/download/${GECKODRIVER_VERSION}/geckodriver-${GECKODRIVER_VERSION}-linux64.tar.gz && \ -tar -C /usr/bin/ -xvf geckodriver-${GECKODRIVER_VERSION}-linux64.tar.gz && \ -rm -f geckodriver-${GECKODRIVER_VERSION}-linux64.tar.gz && \ -curl -fsSL https://code-server.dev/install.sh | sh && \ +curl -sSfL https://download-installer.cdn.mozilla.net/pub/firefox/releases/140.7.0esr/linux-$(arch)/en-US/firefox-140.7.0esr.tar.xz -o firefox.tar.xz && tar --xz -x -f firefox.tar.xz && rm firefox.tar.xz && \ +curl -sSfL -C - -O https://github.com/mozilla/geckodriver/releases/download/${GECKODRIVER_VERSION}/geckodriver-${GECKODRIVER_VERSION}-${GECKODRIVER_ARCH}.tar.gz && \ +tar -C /usr/bin/ -xvf geckodriver-${GECKODRIVER_VERSION}-${GECKODRIVER_ARCH}.tar.gz && \ +cd ${SELENIUM_HOME} && \ +mkdir -p .cache/dconf .mozilla/plugins .vnc/ .fluxbox/ && \ +echo "session.screen0.toolbar.autoHide: true" > .fluxbox/init && \ +touch .Xauthority .vnc/config && \ +curl -fsSL https://code-server.dev/install.sh | sh + +RUN \ code-server --install-extension ms-python.vscode-python-envs --install-extension redhat.vscode-yaml --install-extension redhat.vscode-redhat-account && \ mkdir -p workspace && touch workspace/playbook.yaml && \ modutil -fips true -dbdir /etc/pki/nssdb -force && \ chown -R 0:0 /etc/pki/nssdb && \ chmod 644 /etc/pki/nssdb/* && \ chown -R 1001:0 ${SELENIUM_HOME} && \ -chmod -R g=u ${SELENIUM_HOME} +chmod -R g=u ${SELENIUM_HOME} && \ +geckodriver --version && \ +code-server --version && \ +Xvnc -version && \ +fluxbox --version && \ +java -version && \ +if [ "$(arch)" = "aarch64" ]; then export JAVA_TOOL_OPTIONS=-XX:UseSVE=0; fi && \ +java -Dwebdriver.http.factory=jdk-http-client -jar ${SELENIUM_PATH} -ext ${SELENIUM_HTTP_JDK_CLIENT_PATH} info USER 1001 diff --git a/selenium/init.go b/selenium/init.go index 1ec18d38..fda613b4 100644 --- a/selenium/init.go +++ b/selenium/init.go @@ -88,6 +88,21 @@ func startSelenium() *exec.Cmd { return selenium } +func installVsixExtension() { + vsixPath := "/data/ansible-latest.vsix" + if _, err := os.Stat(vsixPath); os.IsNotExist(err) { + fmt.Println("No VSIX found at", vsixPath, "- skipping extension install") + return + } + fmt.Println("Installing ansible extension from", vsixPath) + cmd := exec.Command("code-server", "--install-extension", vsixPath) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + fmt.Println("Warning: failed to install extension:", err) + } +} + func startCodeServer() *exec.Cmd { vscode := exec.Command( "code-server", @@ -104,6 +119,7 @@ func startProcesses() (*exec.Cmd, *exec.Cmd, *exec.Cmd, *exec.Cmd) { xvnc := startXvnc() waitForPort() fluxbox := startFluxbox() + installVsixExtension() selenium := startSelenium() vscode := startCodeServer() return xvnc, fluxbox, selenium, vscode