diff --git a/roles/debian/selenium/README.md b/roles/debian/selenium/README.md new file mode 100644 index 000000000..19ff88933 --- /dev/null +++ b/roles/debian/selenium/README.md @@ -0,0 +1,33 @@ +# Selenium role + +Install selenium using the standalone version, and chromium as browser. +This role DOES not install any graphic env like Xvfb, tools like 'Google Lighthouse' or 'axe DevTools' do not need it. +These tools can be executed in headless mode, because normally some reports are generated as part of the execution. + + +## Default variables +```yaml +--- +selenium: + version: 4.31.0 + port: 4444 + path: "/wd/hub" + url_server: localhost +``` + + +You can see how selenium is executed in this file templates/start-selenium.sh.j2. +If you stopped, and you need to make selenium available, you can execute: + +``` +nohup /opt/selenium/start-selenium.sh & +``` + +And you can stop selenium using: + +``` +/opt/selenium/stop-selenium.sh +``` + +More browser will be available in future updates + diff --git a/roles/debian/selenium/defaults/main.yml b/roles/debian/selenium/defaults/main.yml index 8eaab488a..d97836728 100644 --- a/roles/debian/selenium/defaults/main.yml +++ b/roles/debian/selenium/defaults/main.yml @@ -1,6 +1,6 @@ --- selenium: - version: 3.141.59 - gecko_version: 0.23.0 - chrome_version: 2.45 - display_manager: XVFB + version: 4.31.0 + port: 4444 + path: "/wd/hub" + url_server: localhost diff --git a/roles/debian/selenium/tasks/main.yml b/roles/debian/selenium/tasks/main.yml index b0cea2ead..9a7f66496 100644 --- a/roles/debian/selenium/tasks/main.yml +++ b/roles/debian/selenium/tasks/main.yml @@ -1,114 +1,49 @@ --- -- name: Install Selenium dependencies. +- name: Install Java ansible.builtin.apt: - pkg: - - firefox-esr - - chromium - - xvfb - - xterm + name: openjdk-17-jre state: present update_cache: true - cache_valid_time: 240 -- name: Install VNC. +- name: Install chromium and chromium-driver ansible.builtin.apt: - pkg: tightvncserver - state: present - when: selenium.display_manager == 'VNC' - -- name: Set Selenium major version. - ansible.builtin.set_fact: - _selenium_major_version: "{{ selenium.version | regex_replace('\\.[0-9]+$', '') }}" + name: + - chromium + - chromium-driver -- name: Create Selenium folder. +- name: Create directory for Selenium Standalone ansible.builtin.file: path: /opt/selenium state: directory -- name: Download Selenium. +- name: Download selenium-server-standalone.jar ansible.builtin.get_url: - url: "http://selenium-release.storage.googleapis.com/{{ _selenium_major_version }}/selenium-server-standalone-{{ selenium.version }}.jar" - dest: "/opt/selenium/selenium-server-standalone.jar" - -- name: Download GeckoDriver. - ansible.builtin.unarchive: - src: "https://github.com/mozilla/geckodriver/releases/download/v{{ selenium.gecko_version }}/geckodriver-v{{ selenium.gecko_version }}-linux64.tar.gz" - dest: /opt/selenium - remote_src: true + url: "https://github.com/SeleniumHQ/selenium/releases/download/selenium-{ selenium.version }/selenium-server-{ selenium.version }.jar" + dest: /opt/selenium/selenium-server-standalone.jar + mode: '0644' -- name: Download ChromeDriver. - ansible.builtin.unarchive: - src: "https://chromedriver.storage.googleapis.com/{{ selenium.chrome_version }}/chromedriver_linux64.zip" - dest: /opt/selenium - remote_src: true - -- name: Install init.d service. - ansible.builtin.template: - src: "selenium.init.j2" - dest: /etc/init.d/selenium - owner: root - group: root - mode: 0755 - -- name: Create Selenium start script. +- name: Create a script to run Selenium Standalone Server ansible.builtin.template: - src: "selenium-daemon-start-{{ selenium.display_manager }}.j2" - dest: /opt/selenium/selenium-daemon-start - owner: root - group: root - mode: 0555 - force: true + src: start-selenium.sh.j2 + dest: /opt/selenium/start-selenium.sh + mode: '0755' -- name: Create selenium stop script. +- name: Create a script to stop Selenium Standalone Server ansible.builtin.template: - src: "selenium-daemon-stop.j2" - dest: /opt/selenium/selenium-daemon-stop - owner: root - group: root - mode: 0555 - -- name: Create home X dir if needed. - ansible.builtin.file: - path: "/home/{{ user_deploy.username }}/.vnc" - owner: "{{ user_deploy.username }}" - group: "{{ user_deploy.username }}" - state: directory - when: selenium.display_manager == "VNC" - -- name: Create X startup script. - ansible.builtin.template: - src: "xstartup.j2" - dest: "/home/{{ user_deploy.username }}/.vnc/xstartup" - owner: "{{ user_deploy.username }}" - group: "{{ user_deploy.username }}" - mode: 0755 - when: selenium.display_manager == "VNC" - -- name: Generate VNC password. - ansible.builtin.shell: "set -o pipefail && echo '{{ user_deploy.username }}' | vncpasswd -f > /home/{{ user_deploy.username }}/.vnc/passwd" - args: - executable: /bin/bash - become: true - become_user: "{{ user_deploy.username }}" - when: selenium.display_manager == "VNC" - -- name: Fix VNC folder permissions. - ansible.builtin.file: - dest: "/home/{{ user_deploy.username }}/.vnc" - owner: "{{ user_deploy.username }}" - group: "{{ user_deploy.username }}" - mode: 0700 - when: selenium.display_manager == "VNC" - -- name: Fix VNC password file permissions. - ansible.builtin.file: - dest: "/home/{{ user_deploy.username }}/.vnc/passwd" - owner: "{{ user_deploy.username }}" - group: "{{ user_deploy.username }}" - mode: 0700 - when: selenium.display_manager == "VNC" - -- name: Ensure Selenium is restarted. - ansible.builtin.service: - name: selenium - state: restarted + src: stop-selenium.sh.j2 + dest: /opt/selenium/stop-selenium.sh + mode: '0755' + +- name: Run Selenium Standalone Server in background + ansible.builtin.shell: nohup /opt/selenium/start-selenium.sh & + async: 30 + poll: 0 + +- name: Check if Selenium is running + ansible.builtin.uri: + url: "https://{ selenium.url_server }:{ selenium.port }{selenium.path}/status" + return_content: true + register: result + retries: 5 + delay: 10 + until: result.status == 200 \ No newline at end of file diff --git a/roles/debian/selenium/templates/selenium-daemon-start-VNC.j2 b/roles/debian/selenium/templates/selenium-daemon-start-VNC.j2 deleted file mode 100644 index 7d2f98916..000000000 --- a/roles/debian/selenium/templates/selenium-daemon-start-VNC.j2 +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -exec 2>&1 -/usr/bin/tightvncserver :99 diff --git a/roles/debian/selenium/templates/selenium-daemon-start-XVFB.j2 b/roles/debian/selenium/templates/selenium-daemon-start-XVFB.j2 deleted file mode 100644 index e8f807ee4..000000000 --- a/roles/debian/selenium/templates/selenium-daemon-start-XVFB.j2 +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh - -sudo /usr/bin/Xvfb -ac :99 & -export DISPLAY=:99 -/usr/bin/java -Dwebdriver.gecko.driver=/opt/selenium/geckodriver -Dwebdriver.chrome.driver=/opt/selenium/chromedriver -jar /opt/selenium/selenium-server-standalone.jar & \ No newline at end of file diff --git a/roles/debian/selenium/templates/selenium-daemon-stop.j2 b/roles/debian/selenium/templates/selenium-daemon-stop.j2 deleted file mode 100644 index 69ca4769a..000000000 --- a/roles/debian/selenium/templates/selenium-daemon-stop.j2 +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh - -PID=$(pgrep --full "selenium-server-standalone.jar") -if [ ! -z "$PID" ]; then - kill $PID -fi - -PID=$(pgrep "Xtightvnc") -if [ ! -z "$PID" ]; then - kill $PID -fi - -PID=$(pgrep --full "Xvfb") -if [ ! -z "$PID" ]; then - kill $PID -fi - -if [ -e "/tmp/.X99-lock" ]; then - rm "/tmp/.X99-lock" -fi - -if [ -e "/tmp/.X11-unix" ]; then - rm -rf "/tmp/.X11-unix" -fi diff --git a/roles/debian/selenium/templates/selenium.init.j2 b/roles/debian/selenium/templates/selenium.init.j2 deleted file mode 100755 index 0049073bb..000000000 --- a/roles/debian/selenium/templates/selenium.init.j2 +++ /dev/null @@ -1,44 +0,0 @@ -#! /bin/sh -### BEGIN INIT INFO -# Provides: selenium -# Required-Start: $remote_fs $syslog -# Required-Stop: $remote_fs $syslog -# Should-Start: $named autofs -# Default-Start: 3 4 5 -# Default-Stop: -# Short-Description: Selenium server -### END INIT INFO - -usage(){ - echo "/etc/init.d/selenium start|stop|restart|status" -} - - -case "$1" in - start) - runuser -l {{ user_deploy.username }} -c "/bin/sh /opt/selenium/selenium-daemon-start" - ;; - stop) - /bin/sh /opt/selenium/selenium-daemon-stop - ;; - - restart) - /bin/sh /opt/selenium/selenium-daemon-stop - sleep 1 - runuser -l {{ user_deploy.username }} -c "/bin/sh /opt/selenium/selenium-daemon-start" - ;; - - status) - PID=$(pgrep --full "selenium-server-standalone.jar") - if [ ! -z "$PID" ]; then - echo "Selenium server appears to be running" - else - echo "Selenium server appears to be stopped" - fi - ;; - *) - echo "Usage: /etc/init.d/selenium {start|stop|restart|status}" - exit 1 -esac - -exit 0 diff --git a/roles/debian/selenium/templates/start-selenium.sh.j2 b/roles/debian/selenium/templates/start-selenium.sh.j2 new file mode 100644 index 000000000..f22d48d9a --- /dev/null +++ b/roles/debian/selenium/templates/start-selenium.sh.j2 @@ -0,0 +1,5 @@ +#!/bin/bash + +java -jar /opt/selenium/selenium-server-standalone.jar standalone \ + --port { selenium.port } \ + --selenium-manager true \ No newline at end of file diff --git a/roles/debian/selenium/templates/startup.sh.j2 b/roles/debian/selenium/templates/startup.sh.j2 deleted file mode 100644 index c985b2a1f..000000000 --- a/roles/debian/selenium/templates/startup.sh.j2 +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -/usr/sbin/service selenium restart diff --git a/roles/debian/selenium/templates/stop-selenium.sh.j2 b/roles/debian/selenium/templates/stop-selenium.sh.j2 new file mode 100644 index 000000000..f220e993e --- /dev/null +++ b/roles/debian/selenium/templates/stop-selenium.sh.j2 @@ -0,0 +1,6 @@ +#!/bin/sh + +PID=$(pgrep --full "selenium-server-standalone.jar") +if [ ! -z "$PID" ]; then + kill $PID +fi \ No newline at end of file diff --git a/roles/debian/selenium/templates/xstartup.j2 b/roles/debian/selenium/templates/xstartup.j2 deleted file mode 100644 index ad63b4c65..000000000 --- a/roles/debian/selenium/templates/xstartup.j2 +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh - -[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup -[ -r /home/{{ user_deploy.username }}/.Xresources ] && xrdb $HOME/.Xresources -xsetroot -solid grey -export DISPLAY=:99 -java -Dwebdriver.gecko.driver=/opt/selenium/geckodriver -Dwebdriver.chrome.driver=/opt/selenium/chromedriver -jar /opt/selenium/selenium-server-standalone.jar & -x-terminal-emulator -ls -title "$VNCDESKTOP Desktop" &