DMS Copr Stable Release (Manual) #53
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: DMS Copr Stable Release | |
| on: | |
| workflow_run: | |
| workflows: ["Create Release from DMS"] | |
| types: [completed] | |
| branches: [master] | |
| workflow_dispatch: | |
| inputs: | |
| version: | |
| description: 'Versioning (e.g., 0.1.14, leave empty for latest release)' | |
| required: false | |
| default: '' | |
| jobs: | |
| build-and-upload: | |
| runs-on: ubuntu-latest | |
| if: ${{ github.event.workflow_run.conclusion == 'success' || github.event_name == 'workflow_dispatch' }} | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Determine version | |
| id: version | |
| run: | | |
| if [ -n "${{ github.event.inputs.version }}" ]; then | |
| VERSION="${{ github.event.inputs.version }}" | |
| echo "Using manual version: $VERSION" | |
| elif [ "${{ github.event_name }}" = "workflow_run" ]; then | |
| VERSION=$(curl -s https://api.github.com/repos/${{ github.repository }}/releases/latest | jq -r '.tag_name' | sed 's/^v//') | |
| echo "Using latest release version from workflow_run: $VERSION" | |
| else | |
| VERSION=$(curl -s https://api.github.com/repos/${{ github.repository }}/releases/latest | jq -r '.tag_name' | sed 's/^v//') | |
| echo "Using latest release version: $VERSION" | |
| fi | |
| echo "version=$VERSION" >> $GITHUB_OUTPUT | |
| echo "✅ Building DMS stable version: $VERSION" | |
| - name: Setup build environment | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y rpm wget curl jq gzip | |
| mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS} | |
| echo "✅ RPM build environment ready" | |
| - name: Download release assets | |
| run: | | |
| VERSION="${{ steps.version.outputs.version }}" | |
| cd ~/rpmbuild/SOURCES | |
| echo "📦 Downloading DMS QML source for v${VERSION}..." | |
| # Download DMS QML source | |
| wget "https://github.com/AvengeMedia/DankMaterialShell/releases/download/v${VERSION}/dms-qml.tar.gz" || { | |
| echo "❌ Failed to download dms-qml.tar.gz for v${VERSION}" | |
| exit 1 | |
| } | |
| echo "✅ Source downloaded" | |
| echo "Note: dms-cli and dgop binaries will be downloaded during build based on target architecture" | |
| ls -lh | |
| - name: Generate stable spec file | |
| run: | | |
| VERSION="${{ steps.version.outputs.version }}" | |
| CHANGELOG_DATE="$(date '+%a %b %d %Y')" | |
| cat > ~/rpmbuild/SPECS/dms.spec <<'SPECEOF' | |
| # Spec for DMS stable releases - Generated by GitHub Actions | |
| %global debug_package %{nil} | |
| %global version VERSION_PLACEHOLDER | |
| %global pkg_summary DankMaterialShell - Material 3 inspired shell for Wayland compositors | |
| Name: dms | |
| Version: %{version} | |
| Release: 1%{?dist} | |
| Summary: %{pkg_summary} | |
| License: GPL-3.0-only | |
| URL: https://github.com/AvengeMedia/DankMaterialShell | |
| Source0: dms-qml.tar.gz | |
| BuildRequires: gzip | |
| BuildRequires: wget | |
| Requires: (quickshell or quickshell-git) | |
| Requires: accountsservice | |
| Requires: dms-cli | |
| Requires: dgop | |
| Recommends: brightnessctl | |
| Recommends: cava | |
| Recommends: cliphist | |
| Recommends: hyprpicker | |
| Recommends: matugen | |
| Recommends: wl-clipboard | |
| Recommends: NetworkManager | |
| Recommends: qt6-qtmultimedia | |
| Suggests: qt6ct | |
| %description | |
| DankMaterialShell (DMS) is a modern Wayland desktop shell built with Quickshell | |
| and optimized for the niri and hyprland compositors. Features notifications, | |
| app launcher, wallpaper customization, and fully customizable with plugins. | |
| Includes auto-theming for GTK/Qt apps with matugen, 20+ customizable widgets, | |
| process monitoring, notification center, clipboard history, dock, control center, | |
| lock screen, and comprehensive plugin system. | |
| %package -n dms-cli | |
| Summary: DankMaterialShell CLI tool | |
| License: GPL-3.0-only | |
| URL: https://github.com/AvengeMedia/danklinux | |
| %description -n dms-cli | |
| Command-line interface for DankMaterialShell configuration and management. | |
| Provides native DBus bindings, NetworkManager integration, and system utilities. | |
| %package -n dgop | |
| Summary: Stateless CPU/GPU monitor for DankMaterialShell | |
| License: MIT | |
| URL: https://github.com/AvengeMedia/dgop | |
| Provides: dgop | |
| %description -n dgop | |
| DGOP is a stateless system monitoring tool that provides CPU, GPU, memory, and | |
| network statistics. Designed for integration with DankMaterialShell but can be | |
| used standalone. This package always includes the latest stable dgop release. | |
| %prep | |
| %setup -q -c -n dms-qml | |
| # Download architecture-specific binaries during build | |
| # This ensures the correct architecture is used for each build target | |
| case "%{_arch}" in | |
| x86_64) | |
| ARCH_SUFFIX="amd64" | |
| ;; | |
| aarch64) | |
| ARCH_SUFFIX="arm64" | |
| ;; | |
| *) | |
| echo "Unsupported architecture: %{_arch}" | |
| exit 1 | |
| ;; | |
| esac | |
| # Download dms-cli for target architecture | |
| wget -O %{_builddir}/dms-cli.gz "https://github.com/AvengeMedia/danklinux/releases/latest/download/dms-distropkg-${ARCH_SUFFIX}.gz" || { | |
| echo "Failed to download dms-cli for architecture %{_arch}" | |
| exit 1 | |
| } | |
| gunzip -c %{_builddir}/dms-cli.gz > %{_builddir}/dms-cli | |
| chmod +x %{_builddir}/dms-cli | |
| # Download dgop for target architecture | |
| wget -O %{_builddir}/dgop.gz "https://github.com/AvengeMedia/dgop/releases/latest/download/dgop-linux-${ARCH_SUFFIX}.gz" || { | |
| echo "Failed to download dgop for architecture %{_arch}" | |
| exit 1 | |
| } | |
| gunzip -c %{_builddir}/dgop.gz > %{_builddir}/dgop | |
| chmod +x %{_builddir}/dgop | |
| %build | |
| %install | |
| install -Dm755 %{_builddir}/dms-cli %{buildroot}%{_bindir}/dms | |
| install -Dm755 %{_builddir}/dgop %{buildroot}%{_bindir}/dgop | |
| install -dm755 %{buildroot}%{_datadir}/quickshell/dms | |
| cp -r %{_builddir}/dms-qml/* %{buildroot}%{_datadir}/quickshell/dms/ | |
| rm -rf %{buildroot}%{_datadir}/quickshell/dms/.git* | |
| rm -f %{buildroot}%{_datadir}/quickshell/dms/.gitignore | |
| rm -rf %{buildroot}%{_datadir}/quickshell/dms/.github | |
| rm -f %{buildroot}%{_datadir}/quickshell/dms/*.spec | |
| %posttrans | |
| # Clean up old installation path from previous versions (only if empty) | |
| if [ -d "%{_sysconfdir}/xdg/quickshell/dms" ]; then | |
| # Remove directories only if empty (preserves any user-added files) | |
| rmdir "%{_sysconfdir}/xdg/quickshell/dms" 2>/dev/null || true | |
| rmdir "%{_sysconfdir}/xdg/quickshell" 2>/dev/null || true | |
| rmdir "%{_sysconfdir}/xdg" 2>/dev/null || true | |
| fi | |
| # Restart DMS for active users after upgrade | |
| if [ "$1" -ge 2 ]; then | |
| # Find all quickshell DMS processes (PID and username) | |
| while read pid cmd; do | |
| username=$(ps -o user= -p "$pid" 2>/dev/null) | |
| [ "$username" = "root" ] && continue | |
| [ -z "$username" ] && continue | |
| # Get user's UID and validate session | |
| user_uid=$(id -u "$username" 2>/dev/null) | |
| [ -z "$user_uid" ] && continue | |
| [ ! -d "/run/user/$user_uid" ] && continue | |
| wayland_display=$(tr '\0' '\n' < /proc/$pid/environ 2>/dev/null | grep '^WAYLAND_DISPLAY=' | cut -d= -f2) | |
| [ -z "$wayland_display" ] && continue | |
| echo "Restarting DMS for user: $username" | |
| # Run as user with full Wayland session environment | |
| runuser -u "$username" -- /bin/sh -c " | |
| export XDG_RUNTIME_DIR=/run/user/$user_uid | |
| export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$user_uid/bus | |
| export WAYLAND_DISPLAY=$wayland_display | |
| export PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:\$PATH | |
| dms restart >/dev/null 2>&1 | |
| " 2>/dev/null || true | |
| break | |
| done < <(pgrep -a -f 'quickshell.*dms' 2>/dev/null) | |
| fi | |
| %files | |
| %license LICENSE | |
| %doc README.md CONTRIBUTING.md | |
| %{_datadir}/quickshell/dms/ | |
| %files -n dms-cli | |
| %{_bindir}/dms | |
| %files -n dgop | |
| %{_bindir}/dgop | |
| %changelog | |
| * CHANGELOG_DATE_PLACEHOLDER AvengeMedia <[email protected]> - VERSION_PLACEHOLDER-1 | |
| - Stable release VERSION_PLACEHOLDER | |
| - Built from GitHub release | |
| - Includes latest dms-cli and dgop binaries | |
| SPECEOF | |
| sed -i "s/VERSION_PLACEHOLDER/${VERSION}/g" ~/rpmbuild/SPECS/dms.spec | |
| sed -i "s/CHANGELOG_DATE_PLACEHOLDER/${CHANGELOG_DATE}/g" ~/rpmbuild/SPECS/dms.spec | |
| echo "✅ Spec file generated for v${VERSION}" | |
| echo "" | |
| echo "=== Spec file preview ===" | |
| head -40 ~/rpmbuild/SPECS/dms.spec | |
| - name: Build SRPM | |
| id: build | |
| run: | | |
| cd ~/rpmbuild/SPECS | |
| echo "🔨 Building SRPM..." | |
| rpmbuild -bs dms.spec | |
| SRPM=$(ls ~/rpmbuild/SRPMS/*.src.rpm | tail -n 1) | |
| SRPM_NAME=$(basename "$SRPM") | |
| echo "srpm_path=$SRPM" >> $GITHUB_OUTPUT | |
| echo "srpm_name=$SRPM_NAME" >> $GITHUB_OUTPUT | |
| echo "✅ SRPM built: $SRPM_NAME" | |
| echo "" | |
| echo "=== SRPM Info ===" | |
| rpm -qpi "$SRPM" | |
| - name: Upload SRPM artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: dms-stable-srpm-${{ steps.version.outputs.version }} | |
| path: ${{ steps.build.outputs.srpm_path }} | |
| retention-days: 90 | |
| - name: Install Copr CLI | |
| run: | | |
| sudo apt-get install -y python3-pip | |
| pip3 install copr-cli | |
| mkdir -p ~/.config | |
| cat > ~/.config/copr << EOF | |
| [copr-cli] | |
| login = ${{ secrets.COPR_LOGIN }} | |
| username = avengemedia | |
| token = ${{ secrets.COPR_TOKEN }} | |
| copr_url = https://copr.fedorainfracloud.org | |
| EOF | |
| chmod 600 ~/.config/copr | |
| echo "✅ Copr CLI configured" | |
| - name: Upload to Copr | |
| run: | | |
| SRPM="${{ steps.build.outputs.srpm_path }}" | |
| VERSION="${{ steps.version.outputs.version }}" | |
| echo "🚀 Uploading SRPM to avengemedia/dms..." | |
| echo " SRPM: $(basename $SRPM)" | |
| echo " Version: $VERSION" | |
| BUILD_OUTPUT=$(copr-cli build avengemedia/dms "$SRPM" --nowait 2>&1) | |
| echo "$BUILD_OUTPUT" | |
| BUILD_ID=$(echo "$BUILD_OUTPUT" | grep -oP 'Build was added to.*\K[0-9]+' || echo "unknown") | |
| if [ "$BUILD_ID" != "unknown" ]; then | |
| echo "✅ Build submitted successfully!" | |
| echo "🔗 https://copr.fedorainfracloud.org/coprs/avengemedia/dms/build/$BUILD_ID/" | |
| else | |
| echo "⚠️ Could not extract build ID, but upload may have succeeded" | |
| fi | |
| - name: Build summary | |
| if: always() | |
| run: | | |
| echo "### 🎉 DMS Stable Build Summary" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "- **Version:** ${{ steps.version.outputs.version }}" >> $GITHUB_STEP_SUMMARY | |
| echo "- **SRPM:** ${{ steps.build.outputs.srpm_name }}" >> $GITHUB_STEP_SUMMARY | |
| echo "- **Project:** https://copr.fedorainfracloud.org/coprs/avengemedia/dms/" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "Stable release has been built and uploaded to Copr!" >> $GITHUB_STEP_SUMMARY |