diff --git a/README.md b/README.md
index 8854388..a68fdff 100644
--- a/README.md
+++ b/README.md
@@ -17,7 +17,7 @@ Available Tags:
| `latest-base` | libffi-dev, libicu-dev, build-essential, libssl-dev, ca-certificates, jq, sed, grep, git, curl, wget, zip | Base runner with nothing fancy installed
[Dockerfile](images/base/Dockerfile) |
| `latest-kaniko-sidecar` | kaniko | Sidecar used by other runner images to build containers without root privileges |
| `latest-ansible-k8s` | base-image + ansible, helm, kubectl, skopeo | Runner specialized for automated k8s deployments via ansible
For more Details see [Dockerfile](images/ansible-k8s/Dockerfile) |
-| `latest-fullstacked` | base-image + ansible, helm, maven, openjdk-11, nodejs, go, yarn, angular/cli | Runner with a bunch of tools to build your hole application
For more Details see [Dockerfile](images/fullstacked/Dockerfile) |
+| `latest-fullstacked` | base-image + ansible, helm, maven, temurin-11, nodejs, go, yarn, angular/cli, chromium | Runner with a bunch of tools to build your hole application
For more Details see [Dockerfile](images/fullstacked/Dockerfile) |
> Hint: `latest` can be replaced with an specific release version for more stability in your environment.
diff --git a/images/fullstacked/Dockerfile b/images/fullstacked/Dockerfile
index 46e2db3..2fdc31e 100644
--- a/images/fullstacked/Dockerfile
+++ b/images/fullstacked/Dockerfile
@@ -1,16 +1,26 @@
-FROM ghcr.io/fullstack-devops/github-actions-runner:base-latest
+FROM ghcr.io/fullstack-devops/github-actions-runner:latest-base
USER root
# install packages along with jq so we can parse JSON
# add additional packages as necessary
-ARG PACKAGES="temurin-11-jdk maven nodejs ansible"
+ARG PACKAGES="temurin-11-jdk maven nodejs ansible chromium python3-selenium xvfb"
ARG PACKAGES_PYTHON="kubernetes"
+## ansible keys
RUN wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | apt-key add -
RUN echo "deb https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" | tee /etc/apt/sources.list.d/adoptium.list
+## helper for karma and chromium
+ENV CHROME_BIN="/usr/bin/chromium"
+ADD xvfb-chromium /usr/bin/xvfb-chromium
+ADD xvfb-chromium-webgl /usr/bin/xvfb-chromium-webgl
+ADD display-chromium /usr/bin/display-chromium
+
+RUN chmod +x /usr/bin/display-chromium /usr/bin/xvfb-chromium-webgl /usr/bin/xvfb-chromium
+
RUN apt-get update \
&& add-apt-repository -y --update ppa:ansible/ansible \
+ && add-apt-repository -y --update ppa:xtradeb/apps \
&& curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - \
&& apt-get install -y --no-install-recommends ${PACKAGES} \
&& rm -rf /var/lib/apt/lists/* \
@@ -37,20 +47,24 @@ RUN export ARCH=$(/helper-scripts/translate-aarch.sh a-short) \
ENV TMP_DIR=/home/${USERNAME}/tmp
+RUN mkdir /run/user/$USERID
RUN mkdir /home/${USERNAME}/.ansible
RUN mkdir ${TMP_DIR}
COPY requirements.yml ${TMP_DIR}/requirements.yml
RUN mkdir -p /home/${USERNAME}/.m2/ \
- && chown -R ${USERNAME} /home/${USERNAME}
+ && chown -R $USERNAME /home/$USERNAME \
+ && chown -R $USERNAME /run/user/$USERID
# install npm tools: yarn
-RUN npm install --global yarn @angular/cli@13
+ENV NPM_CONFIG_LOGLEVEL=warn NG_CLI_ANALYTICS=false
+RUN npm install --location=global yarn pnpm @angular/cli@14 \
+ && npm cache clean --force
-USER ${USERNAME}
+USER $USERNAME
-RUN pip3 install ${PACKAGES_PYTHON} --user
+RUN pip3 install $PACKAGES_PYTHON --user
# RUN ansible-galaxy install -c -r ${TMP_DIR}/requirements.yml
RUN ansible-galaxy collection install -c -r ${TMP_DIR}/requirements.yml
diff --git a/images/fullstacked/display-chromium b/images/fullstacked/display-chromium
new file mode 100755
index 0000000..706212f
--- /dev/null
+++ b/images/fullstacked/display-chromium
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+$CHROME_BIN --disable-dev-shm-usage --no-sandbox --no-first-run $@
diff --git a/images/fullstacked/xvfb-chromium b/images/fullstacked/xvfb-chromium
new file mode 100755
index 0000000..953633f
--- /dev/null
+++ b/images/fullstacked/xvfb-chromium
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+find_free_servernum() {
+ i=0
+ while [ -f /tmp/.X$i-lock ]; do
+ i=$(($i + 1))
+ done
+ echo $i
+}
+
+export DISPLAY=":$(find_free_servernum)"
+Xvfb "$DISPLAY" -ac -screen 0 "${XVFB_WHD:-1280x720x16}" -nolisten tcp +render &
+xvfb_pid=$!
+
+echo "(wrapper:) launching with: $@"
+
+function cleanup {
+ kill -TERM $xvfb_pid > /dev/null 2>&1
+}
+
+trap cleanup EXIT
+
+$CHROME_BIN --disable-dev-shm-usage --no-sandbox --disable-gpu --no-first-run $@
\ No newline at end of file
diff --git a/images/fullstacked/xvfb-chromium-webgl b/images/fullstacked/xvfb-chromium-webgl
new file mode 100755
index 0000000..f581a7f
--- /dev/null
+++ b/images/fullstacked/xvfb-chromium-webgl
@@ -0,0 +1,21 @@
+#!/bin/bash
+
+find_free_servernum() {
+ i=0
+ while [ -f /tmp/.X$i-lock ]; do
+ i=$(($i + 1))
+ done
+ echo $i
+}
+
+export DISPLAY=":$(find_free_servernum)"
+Xvfb "$DISPLAY" -ac -screen 0 "${XVFB_WHD:-1280x800x16}" -nolisten tcp +render &
+xvfb_pid=$!
+
+function cleanup {
+ kill -TERM $xvfb_pid > /dev/null 2>&1
+}
+
+trap cleanup EXIT
+
+$CHROME_BIN --no-sandbox --no-first-run --use-gl=osmesa --enable-webgl --ignore-gpu-blacklist --window-size=1024,768 $@
\ No newline at end of file