From daefd01a86b222bdcaa559805482935dcc5b37d9 Mon Sep 17 00:00:00 2001 From: thelamer Date: Mon, 6 Apr 2026 16:24:53 -0400 Subject: [PATCH] update readme for resolute rebase --- Jenkinsfile | 172 ++++++++++++++++++++++++------------------------ README.md | 42 ++++++++++-- readme-vars.yml | 7 +- 3 files changed, 124 insertions(+), 97 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 8553fb3a..ff8c1c08 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -76,6 +76,7 @@ pipeline { ''' script{ env.EXIT_STATUS = '' + env.CI_TEST_ATTEMPTED = '' env.LS_RELEASE = sh( script: '''docker run --rm quay.io/skopeo/stable:v1 inspect docker://ghcr.io/${LS_USER}/${CONTAINER_NAME}:latest 2>/dev/null | jq -r '.Labels.build_version' | awk '{print $3}' | grep '\\-ls' || : ''', returnStdout: true).trim() @@ -870,6 +871,7 @@ pipeline { script{ env.CI_URL = 'https://ci-tests.linuxserver.io/' + env.IMAGE + '/' + env.META_TAG + '/index.html' env.CI_JSON_URL = 'https://ci-tests.linuxserver.io/' + env.IMAGE + '/' + env.META_TAG + '/report.json' + env.CI_TEST_ATTEMPTED = 'true' } sh '''#! /bin/bash set -e @@ -1073,98 +1075,13 @@ EOF ) ''' } } - // If this is a Pull request send the CI link as a comment on it - stage('Pull Request Comment') { - when { - not {environment name: 'CHANGE_ID', value: ''} - environment name: 'EXIT_STATUS', value: '' - } - steps { - sh '''#! /bin/bash - # Function to retrieve JSON data from URL - get_json() { - local url="$1" - local response=$(curl -s "$url") - if [ $? -ne 0 ]; then - echo "Failed to retrieve JSON data from $url" - return 1 - fi - local json=$(echo "$response" | jq .) - if [ $? -ne 0 ]; then - echo "Failed to parse JSON data from $url" - return 1 - fi - echo "$json" - } - - build_table() { - local data="$1" - - # Get the keys in the JSON data - local keys=$(echo "$data" | jq -r 'to_entries | map(.key) | .[]') - - # Check if keys are empty - if [ -z "$keys" ]; then - echo "JSON report data does not contain any keys or the report does not exist." - return 1 - fi - - # Build table header - local header="| Tag | Passed |\\n| --- | --- |\\n" - - # Loop through the JSON data to build the table rows - local rows="" - for build in $keys; do - local status=$(echo "$data" | jq -r ".[\\"$build\\"].test_success") - if [ "$status" = "true" ]; then - status="✅" - else - status="❌" - fi - local row="| "$build" | "$status" |\\n" - rows="${rows}${row}" - done - - local table="${header}${rows}" - local escaped_table=$(echo "$table" | sed 's/\"/\\\\"/g') - echo "$escaped_table" - } - - if [[ "${CI}" = "true" ]]; then - # Retrieve JSON data from URL - data=$(get_json "$CI_JSON_URL") - # Create table from JSON data - table=$(build_table "$data") - echo -e "$table" - - curl -X POST -H "Authorization: token $GITHUB_TOKEN" \ - -H "Accept: application/vnd.github.v3+json" \ - "https://api.github.com/repos/$LS_USER/$LS_REPO/issues/$PULL_REQUEST/comments" \ - -d "{\\"body\\": \\"I am a bot, here are the test results for this PR: \\n${CI_URL}\\n${SHELLCHECK_URL}\\n${table}\\"}" - else - curl -X POST -H "Authorization: token $GITHUB_TOKEN" \ - -H "Accept: application/vnd.github.v3+json" \ - "https://api.github.com/repos/$LS_USER/$LS_REPO/issues/$PULL_REQUEST/comments" \ - -d "{\\"body\\": \\"I am a bot, here is the pushed image/manifest for this PR: \\n\\n\\`${GITHUBIMAGE}:${META_TAG}\\`\\"}" - fi - ''' - - } - } } /* ###################### - Send status to Discord + Comment on PR and Send status to Discord ###################### */ post { always { - sh '''#!/bin/bash - rm -rf /config/.ssh/id_sign - rm -rf /config/.ssh/id_sign.pub - git config --global --unset gpg.format - git config --global --unset user.signingkey - git config --global --unset commit.gpgsign - ''' - script{ + script { env.JOB_DATE = sh( script: '''date '+%Y-%m-%dT%H:%M:%S%:z' ''', returnStdout: true).trim() @@ -1207,6 +1124,87 @@ EOF "username": "Jenkins"}' ${BUILDS_DISCORD} ''' } } + script { + if (env.GITHUBIMAGE =~ /lspipepr/){ + if (env.CI_TEST_ATTEMPTED == "true"){ + sh '''#! /bin/bash + # Function to retrieve JSON data from URL + get_json() { + local url="$1" + local response=$(curl -s "$url") + if [ $? -ne 0 ]; then + echo "Failed to retrieve JSON data from $url" + return 1 + fi + local json=$(echo "$response" | jq .) + if [ $? -ne 0 ]; then + echo "Failed to parse JSON data from $url" + return 1 + fi + echo "$json" + } + + build_table() { + local data="$1" + + # Get the keys in the JSON data + local keys=$(echo "$data" | jq -r 'to_entries | map(.key) | .[]') + + # Check if keys are empty + if [ -z "$keys" ]; then + echo "JSON report data does not contain any keys or the report does not exist." + return 1 + fi + + # Build table header + local header="| Tag | Passed |\\n| --- | --- |\\n" + + # Loop through the JSON data to build the table rows + local rows="" + for build in $keys; do + local status=$(echo "$data" | jq -r ".[\\"$build\\"].test_success") + if [ "$status" = "true" ]; then + status="✅" + else + status="❌" + fi + local row="| "$build" | "$status" |\\n" + rows="${rows}${row}" + done + + local table="${header}${rows}" + local escaped_table=$(echo "$table" | sed 's/\"/\\\\"/g') + echo "$escaped_table" + } + + if [[ "${CI}" = "true" ]]; then + # Retrieve JSON data from URL + data=$(get_json "$CI_JSON_URL") + # Create table from JSON data + table=$(build_table "$data") + echo -e "$table" + + curl -X POST -H "Authorization: token $GITHUB_TOKEN" \ + -H "Accept: application/vnd.github.v3+json" \ + "https://api.github.com/repos/$LS_USER/$LS_REPO/issues/$PULL_REQUEST/comments" \ + -d "{\\"body\\": \\"I am a bot, here are the test results for this PR: \\n${CI_URL}\\n${SHELLCHECK_URL}\\n${table}\\"}" + else + curl -X POST -H "Authorization: token $GITHUB_TOKEN" \ + -H "Accept: application/vnd.github.v3+json" \ + "https://api.github.com/repos/$LS_USER/$LS_REPO/issues/$PULL_REQUEST/comments" \ + -d "{\\"body\\": \\"I am a bot, here is the pushed image/manifest for this PR: \\n\\n\\`${GITHUBIMAGE}:${META_TAG}\\`\\"}" + fi + ''' + } + } + } + sh '''#!/bin/bash + rm -rf /config/.ssh/id_sign + rm -rf /config/.ssh/id_sign.pub + git config --global --unset gpg.format + git config --global --unset user.signingkey + git config --global --unset commit.gpgsign + ''' } cleanup { sh '''#! /bin/bash diff --git a/README.md b/README.md index 19be11d3..bfe89e4c 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ This image provides various versions that are available via tags. Please read th | arch-i3 | ✅ | i3 Arch *Wayland Support | | arch-kde | ✅ | KDE Arch *Wayland Support | | arch-mate | ✅ | MATE Arch | -| arch-xfce | ✅ | XFCE Arch | +| arch-xfce | ✅ | XFCE Arch *Wayland Support | | debian-i3 | ✅ | i3 Debian *Wayland Support | | debian-kde | ✅ | KDE Debian | | debian-mate | ✅ | MATE Debian | @@ -80,9 +80,9 @@ This image provides various versions that are available via tags. Please read th | fedora-mate | ✅ | MATE Fedora | | fedora-xfce | ✅ | XFCE Fedora | | ubuntu-i3 | ✅ | i3 Ubuntu *Wayland Support | -| ubuntu-kde | ✅ | KDE Ubuntu | +| ubuntu-kde | ✅ | KDE Ubuntu *Wayland Only | | ubuntu-mate | ✅ | MATE Ubuntu | -| ubuntu-xfce | ✅ | XFCE Ubuntu | +| ubuntu-xfce | ✅ | XFCE Ubuntu *Wayland Support | ## Application Setup @@ -134,7 +134,9 @@ To use hardware acceleration in Wayland mode, we distinguish between the card us * `DRINODE`: The path to the GPU used for **Rendering** (EGL). * `DRI_NODE`: The path to the GPU used for **Encoding** (VAAPI/NVENC). -If both variables point to the same device, the container will automatically enable **Zero Copy** encoding, significantly reducing CPU usage and latency. +If both variables point to the same device, the container will automatically enable **Zero Copy** encoding, significantly reducing CPU usage and latency. If they are set to different devices one will be used for **Rendering** and one for **Encoding** with a cpu readback. + +You can also use the environment variable `AUTO_GPU=true`, with this set the first card detected in the container (IE `/dev/dri/renderD128`) will be used and configured for **Zero Copy**. ##### Intel & AMD (Open Source Drivers) @@ -152,13 +154,34 @@ For Intel and AMD GPUs. ##### Nvidia (Proprietary Drivers) +**Note: Nvidia support is currently considered experimental, driver changes can break it at any time.** + **Note: Nvidia support is not available for Alpine-based images.** +**Note: Nvidia frames have issues with hardware decoders in Chromium browsers you need to navigate to `chrome://flags/#disable-accelerated-video-decode` and toggle it to `Disabled` for smooth playback** + **Prerequisites:** -1. **Driver:** Proprietary drivers **580 or higher** are required. -2. **Kernel Parameter:** Set `nvidia-drm.modeset=1` in your host bootloader (GRUB/systemd-boot). -3. **Initialization:** On headless systems, run `nvidia-modprobe --modeset` on the host (once per boot) to initialize the card. +1. **Driver:** Proprietary drivers **580 or higher** are required. **Crucially, you should install the driver using the `.run` file downloaded directly from the Nvidia website.** + * **Unraid:** Use the production branch from the Nvidia Driver Plugin. + +2. **Kernel Parameter:** You must set `nvidia-drm.modeset=1 nvidia_drm.fbdev=1` in your host bootloader. + * **Standard Linux (GRUB):** Edit `/etc/default/grub` and add the parameter to your existing `GRUB_CMDLINE_LINUX_DEFAULT` line: + + ```text + GRUB_CMDLINE_LINUX_DEFAULT=" nvidia-drm.modeset=1 nvidia_drm.fbdev=1" + ``` + + Then apply the changes by running: + + ```bash + sudo update-grub + ``` + + * **Unraid (Syslinux):** Edit the file `/boot/syslinux/syslinux.cfg` and add `nvidia-drm.modeset=1 nvidia_drm.fbdev=1` to the end of the `append` line for the Unraid OS boot entry. + +3. **Hardware Initialization:** **On headless systems, the Nvidia video card requires a physical dummy plug inserted into the GPU so that DRM initializes properly.** + 4. **Docker Runtime:** Configure the host docker daemon to use the Nvidia runtime: ```bash @@ -187,6 +210,8 @@ services: capabilities: [compute,video,graphics,utility] ``` +* **Unraid:** Ensure you're properly setting the DRINODE/DRI_NODE and adding `--gpus all --runtime nvidia` to your extra parameters. + ### SealSkin Compatibility This container is compatible with [SealSkin](https://sealskin.app). @@ -207,12 +232,14 @@ This container is based on [Docker Baseimage Selkies](https://github.com/linuxse | Variable | Description | | :----: | --- | | PIXELFLUX_WAYLAND | **Experimental** If set to true the container will initialize in Wayland mode running [Smithay](https://github.com/Smithay/smithay) and Labwc while enabling zero copy encoding with a GPU | +| SELKIES_DESKTOP | If set to true and in Wayland mode, a simple panel will be initialized with labwc | | CUSTOM_PORT | Internal port the container listens on for http if it needs to be swapped from the default `3000` | | CUSTOM_HTTPS_PORT | Internal port the container listens on for https if it needs to be swapped from the default `3001` | | CUSTOM_WS_PORT | Internal port the container listens on for websockets if it needs to be swapped from the default 8082 | | CUSTOM_USER | HTTP Basic auth username, abc is default. | | DRI_NODE | **Encoding GPU**: Enable VAAPI/NVENC stream encoding and use the specified device IE `/dev/dri/renderD128` | | DRINODE | **Rendering GPU**: Specify which GPU to use for EGL/3D acceleration IE `/dev/dri/renderD129` | +| AUTO_GPU | If set to true and in Wayland mode, we will automatically use the first GPU available for encoding and rendering IE `/dev/dri/renderD128` | | PASSWORD | HTTP Basic auth password, abc is default. If unset there will be no auth | | SUBFOLDER | Subfolder for the application if running a subfolder reverse proxy, need both slashes IE `/subfolder/` | | TITLE | The page title displayed on the web browser, default "Selkies" | @@ -642,6 +669,7 @@ Once registered you can define the dockerfile to use with `-f Dockerfile.aarch64 ## Versions +* **07.04.26:** - Rebase Ubuntu images to Resolute. * **26.03.26:** - Rebase Fedora images to 44. * **24.03.26:** - Update tags that support Wayland to pass ozone platform for chromium. * **27.12.25:** - Rebase Alpine images to 3.23. diff --git a/readme-vars.yml b/readme-vars.yml index dba9e26b..36dddf81 100644 --- a/readme-vars.yml +++ b/readme-vars.yml @@ -22,7 +22,7 @@ development_versions_items: - {tag: "arch-i3", desc: "i3 Arch *Wayland Support"} - {tag: "arch-kde", desc: "KDE Arch *Wayland Support"} - {tag: "arch-mate", desc: "MATE Arch"} - - {tag: "arch-xfce", desc: "XFCE Arch"} + - {tag: "arch-xfce", desc: "XFCE Arch *Wayland Support"} - {tag: "debian-i3", desc: "i3 Debian *Wayland Support"} - {tag: "debian-kde", desc: "KDE Debian"} - {tag: "debian-mate", desc: "MATE Debian"} @@ -35,9 +35,9 @@ development_versions_items: - {tag: "fedora-mate", desc: "MATE Fedora"} - {tag: "fedora-xfce", desc: "XFCE Fedora"} - {tag: "ubuntu-i3", desc: "i3 Ubuntu *Wayland Support"} - - {tag: "ubuntu-kde", desc: "KDE Ubuntu"} + - {tag: "ubuntu-kde", desc: "KDE Ubuntu *Wayland Only"} - {tag: "ubuntu-mate", desc: "MATE Ubuntu"} - - {tag: "ubuntu-xfce", desc: "XFCE Ubuntu"} + - {tag: "ubuntu-xfce", desc: "XFCE Ubuntu *Wayland Support"} # container parameters param_container_name: "{{ project_name }}" param_usage_include_vols: true @@ -126,6 +126,7 @@ init_diagram: | "webtop:latest" <- Base Images # changelog changelogs: + - {date: "07.04.26:", desc: "Rebase Ubuntu images to Resolute."} - {date: "26.03.26:", desc: "Rebase Fedora images to 44."} - {date: "24.03.26:", desc: "Update tags that support Wayland to pass ozone platform for chromium."} - {date: "27.12.25:", desc: "Rebase Alpine images to 3.23."}