diff --git a/.github/workflows/zwift_build_matrix.yaml b/.github/workflows/zwift_build_matrix.yaml new file mode 100644 index 0000000..cd482f1 --- /dev/null +++ b/.github/workflows/zwift_build_matrix.yaml @@ -0,0 +1,49 @@ +name: Zwift matrix build +on: + workflow_dispatch: +jobs: + zwift_build: + runs-on: ubuntu-22.04 + timeout-minutes: 360 + strategy: + matrix: + wine-version: ["8.0.2~bookworm-1", "8.0.1~bookworm-1", "8.0.0.0~bookworm-1", "7.0.2~bookworm-1", "7.0.1~bookworm-1", "7.0.0.0~bookworm-1", "6.0.4~bookworm-1", "6.0.3~bookworm-1", "6.0.2~bookworm-1"] + winetricks-version: ["master", "20230212", "20210206"] + wine-mono-version: ["7.0.0","7.1.0","7.1.1","7.2.0","7.3.0","7.4.0","8.0.0","8.1.0"] + steps: + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Install dependencies + run: sudo apt-get install -y x11-xserver-utils x11-apps + + - uses: netbrain/free-disk-space-action@v0.0.1 + + - name: Checkout + uses: actions/checkout@v4 + + - name: Build zwift + run: | + set -x + export VERSION=$(curl -s http://cdn.zwift.com/gameassets/Zwift_Updates_Root/Zwift_ver_cur.xml | grep -oP 'sversion="\K.*?(?=")' | cut -f 1 -d ' ') + export BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ') + + echo "Starting build..." + Xvfb :99 -ac -screen 0 "800x600x24" -nolisten tcp & + sleep 3 + export DISPLAY=:99 + docker build \ + --build-arg="WINE_VERSION=${{ matrix.wine-version }}" \ + --build-arg="WINETRICKS_VERSION=${{ matrix.winetricks-version }}" \ + --build-arg="WINE_MONO_VERSION=${{ matrix.wine-mono-version }}" \ + -t netbrain/zwift:build . + xhost + + docker run --name zwift \ + --privileged \ + -e DISPLAY=$DISPLAY \ + --device /dev/dri \ + -v /tmp:/tmp \ + netbrain/zwift:build diff --git a/Dockerfile b/Dockerfile index 616388c..7a719c2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,7 +11,78 @@ RUN git clone https://github.com/quietvoid/runfromprocess-rs . RUN cargo build --target x86_64-pc-windows-gnu --release -FROM netbrain/wine:latest +FROM debian:bookworm-slim as wine-base +ARG WINE_VERSION=7.0.0.0~bookworm-1 +ARG WINETRICKS_VERSION=20210206 +ARG WINE_MONO_VERSION=7.0.0 +ENV NVIDIA_VISIBLE_DEVICES \ + ${NVIDIA_VISIBLE_DEVICES:-all} +ENV NVIDIA_DRIVER_CAPABILITIES \ + ${NVIDIA_DRIVER_CAPABILITIES:+$NVIDIA_DRIVER_CAPABILITIES,}graphics,compat32,utility +ENV WINEDEBUG ${WINEDEBUG:-fixme-all} + +RUN dpkg --add-architecture i386 + +RUN \ + apt-get update && \ + apt-get install -y --no-install-recommends \ + sudo \ + wget \ + unzip \ + gnupg2 \ + procps \ + winbind \ + pulseaudio \ + ca-certificates \ + libxau6 libxau6:i386 \ + libxdmcp6 libxdmcp6:i386 \ + libxcb1 libxcb1:i386 \ + libxext6 libxext6:i386 \ + libx11-6 libx11-6:i386 \ + libglvnd0 libglvnd0:i386 \ + libgl1 libgl1:i386 \ + libglx0 libglx0:i386 \ + libegl1 libegl1:i386 \ + libgles2 libgles2:i386 \ + libgl1-mesa-glx libgl1-mesa-glx:i386 \ + libgl1-mesa-dri libgl1-mesa-dri:i386 && \ + wget -qO - http://dl.winehq.org/wine-builds/winehq.key | apt-key add - && \ + echo "deb https://dl.winehq.org/wine-builds/debian/ bookworm main" > \ + /etc/apt/sources.list.d/winehq.list && \ + sed -i '/^Types: deb/{:a; N; /\n$/!ba; s/Suites: \(.*\)/Suites: bullseye \1/}' /etc/apt/sources.list.d/debian.sources && \ + apt-get update && \ + apt-get -y install --install-recommends \ + winehq-stable=${WINE_VERSION} \ + wine-stable=${WINE_VERSION} \ + wine-stable-amd64=${WINE_VERSION} \ + wine-stable-i386=${WINE_VERSION} && \ + rm -rf /var/lib/apt/lists/* + +RUN echo "/usr/local/nvidia/lib" >> /etc/ld.so.conf.d/nvidia.conf && \ + echo "/usr/local/nvidia/lib64" >> /etc/ld.so.conf.d/nvidia.conf + +# Required for non-glvnd setups. +ENV LD_LIBRARY_PATH /usr/lib/x86_64-linux-gnu:/usr/lib/i386-linux-gnu${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}:/usr/local/nvidia/lib:/usr/local/nvidia/lib64 + +COPY pulse-client.conf /etc/pulse/client.conf + +RUN \ + wget \ + https://raw.githubusercontent.com/Winetricks/winetricks/${WINETRICKS_VERSION}/src/winetricks \ + -O /usr/local/bin/winetricks && \ + chmod +x /usr/local/bin/winetricks + +RUN adduser --disabled-password --gecos '' user && \ + adduser user sudo && \ + echo '%SUDO ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers + +USER user +WORKDIR /home/user + +RUN wget https://dl.winehq.org/wine/wine-mono/${WINE_MONO_VERSION}/wine-mono-${WINE_MONO_VERSION}-x86.msi \ + -P /home/user/.cache/wine + +FROM wine-base LABEL org.opencontainers.image.authors="Kim Eik " LABEL org.opencontainers.image.title="netbrain/zwift" diff --git a/entrypoint.sh b/entrypoint.sh index fc57931..4294b93 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -54,7 +54,7 @@ fi if [ ! "$(ls -A .)" ] # is directory empty? then #install dotnet > 4.7.2 - winetricks --unattended dotnet48 win10 + winetricks --force --unattended dotnet48 win10 #prevents warning when starting zwift for the first time winetricks --unattended dotnet20 win10 diff --git a/pulse-client.conf b/pulse-client.conf new file mode 100644 index 0000000..325e4ed --- /dev/null +++ b/pulse-client.conf @@ -0,0 +1,9 @@ +# Connect to the host's server using the mounted UNIX socket +default-server = unix:/run/user/1000/pulse/native + +# Prevent a server running in the container +autospawn = no +daemon-binary = /bin/true + +# Prevent the use of shared memory +enable-shm = false