name: Release on: workflow_dispatch: inputs: tag: description: "Tag to release (e.g., v1.0.1)" required: true type: string permissions: contents: write actions: write concurrency: group: release-${{ inputs.tag }} cancel-in-progress: true jobs: build-core: runs-on: ubuntu-latest strategy: matrix: arch: [amd64, arm64] defaults: run: working-directory: core env: TAG: ${{ inputs.tag }} steps: - name: Checkout uses: actions/checkout@v4 with: ref: ${{ inputs.tag }} fetch-depth: 0 - name: Set up Go uses: actions/setup-go@v5 with: go-version-file: ./core/go.mod - name: Format check run: | if [ "$(gofmt -s -l . | wc -l)" -gt 0 ]; then echo "The following files are not formatted:" gofmt -s -l . exit 1 fi - name: Run tests run: go test -v ./... - name: Build dankinstall (${{ matrix.arch }}) env: GOOS: linux CGO_ENABLED: 0 GOARCH: ${{ matrix.arch }} run: | set -eux cd cmd/dankinstall go build -trimpath -ldflags "-s -w -X main.Version=${TAG}" \ -o ../../dankinstall-${{ matrix.arch }} cd ../.. gzip -9 -k dankinstall-${{ matrix.arch }} sha256sum dankinstall-${{ matrix.arch }}.gz > dankinstall-${{ matrix.arch }}.gz.sha256 - name: Build dms (${{ matrix.arch }}) env: GOOS: linux CGO_ENABLED: 0 GOARCH: ${{ matrix.arch }} run: | set -eux cd cmd/dms go build -trimpath -ldflags "-s -w -X main.Version=${TAG}" \ -o ../../dms-${{ matrix.arch }} cd ../.. gzip -9 -k dms-${{ matrix.arch }} sha256sum dms-${{ matrix.arch }}.gz > dms-${{ matrix.arch }}.gz.sha256 - name: Generate shell completions if: matrix.arch == 'amd64' run: | set -eux chmod +x dms-amd64 ./dms-amd64 completion bash > completion.bash ./dms-amd64 completion fish > completion.fish ./dms-amd64 completion zsh > completion.zsh - name: Build dms-distropkg (${{ matrix.arch }}) env: GOOS: linux CGO_ENABLED: 0 GOARCH: ${{ matrix.arch }} run: | set -eux cd cmd/dms go build -trimpath -tags distro_binary -ldflags "-s -w -X main.Version=${TAG}" \ -o ../../dms-distropkg-${{ matrix.arch }} cd ../.. gzip -9 -k dms-distropkg-${{ matrix.arch }} sha256sum dms-distropkg-${{ matrix.arch }}.gz > dms-distropkg-${{ matrix.arch }}.gz.sha256 - name: Upload artifacts (${{ matrix.arch }}) if: matrix.arch == 'arm64' uses: actions/upload-artifact@v4 with: name: core-assets-${{ matrix.arch }} path: | core/dankinstall-${{ matrix.arch }}.gz core/dankinstall-${{ matrix.arch }}.gz.sha256 core/dms-${{ matrix.arch }}.gz core/dms-${{ matrix.arch }}.gz.sha256 core/dms-distropkg-${{ matrix.arch }}.gz core/dms-distropkg-${{ matrix.arch }}.gz.sha256 if-no-files-found: error - name: Upload artifacts with completions if: matrix.arch == 'amd64' uses: actions/upload-artifact@v4 with: name: core-assets-${{ matrix.arch }} path: | core/dankinstall-${{ matrix.arch }}.gz core/dankinstall-${{ matrix.arch }}.gz.sha256 core/dms-${{ matrix.arch }}.gz core/dms-${{ matrix.arch }}.gz.sha256 core/dms-distropkg-${{ matrix.arch }}.gz core/dms-distropkg-${{ matrix.arch }}.gz.sha256 core/completion.bash core/completion.fish core/completion.zsh if-no-files-found: error # update-versions: # runs-on: ubuntu-latest # needs: build-core # steps: # - name: Create GitHub App token # id: app_token # uses: actions/create-github-app-token@v1 # with: # app-id: ${{ secrets.APP_ID }} # private-key: ${{ secrets.APP_PRIVATE_KEY }} # - name: Checkout # uses: actions/checkout@v4 # with: # token: ${{ steps.app_token.outputs.token }} # fetch-depth: 0 # - name: Update VERSION # env: # GH_TOKEN: ${{ steps.app_token.outputs.token }} # run: | # set -euo pipefail # git config user.name "dms-ci[bot]" # git config user.email "dms-ci[bot]@users.noreply.github.com" # version="${GITHUB_REF#refs/tags/}" # echo "Updating to version: $version" # echo "${version}" > quickshell/VERSION # git add quickshell/VERSION # if ! git diff --cached --quiet; then # git commit -m "chore: bump version to $version" # git pull --rebase origin master # git push https://x-access-token:${GH_TOKEN}@github.com/${{ github.repository }}.git HEAD:master # fi # git tag -f "${version}" # git push -f https://x-access-token:${GH_TOKEN}@github.com/${{ github.repository }}.git "${version}" release: runs-on: ubuntu-24.04 needs: [build-core] #, update-versions] env: TAG: ${{ inputs.tag }} steps: - name: Checkout uses: actions/checkout@v4 with: ref: ${{ inputs.tag }} fetch-depth: 0 - name: Fetch updated tag after version bump run: | git fetch origin --force tag ${TAG} git checkout ${TAG} - name: Download core artifacts uses: actions/download-artifact@v4 with: pattern: core-assets-* merge-multiple: true path: ./_core_assets - name: Generate Changelog id: changelog run: | set -e PREVIOUS_TAG=$(git describe --tags --abbrev=0 "${TAG}^" 2>/dev/null || echo "") if [ -z "$PREVIOUS_TAG" ]; then CHANGELOG=$(git log --oneline --pretty=format:"%an|%s (%h)" | grep -v "^github-actions\[bot\]|" | sed 's/^[^|]*|/- /' | head -50) else CHANGELOG=$(git log --oneline --pretty=format:"%an|%s (%h)" "${PREVIOUS_TAG}..${TAG}" | grep -v "^github-actions\[bot\]|" | sed 's/^[^|]*|/- /') fi cat > RELEASE_BODY.md << 'EOF' ## Installation ```bash curl -fsSL https://install.danklinux.com | sh ``` ## Assets ### Complete Packages - **`dms-full-amd64.tar.gz`** - Complete package for x86_64 systems (CLI binaries + QML source + shell completions + installation guide) - **`dms-full-arm64.tar.gz`** - Complete package for ARM64 systems (CLI binaries + QML source + shell completions + installation guide) ### Individual Components - **`dms-cli-amd64.gz`** - DMS CLI binary for x86_64 systems - **`dms-cli-arm64.gz`** - DMS CLI binary for ARM64 systems - **`dms-distropkg-amd64.gz`** - DMS CLI binary built with distro_package tag for AMD64 systems - **`dms-distropkg-arm64.gz`** - DMS CLI binary built with distro_package tag for ARM64 systems - **`dankinstall-amd64.gz`** - Installer binary for x86_64 systems - **`dankinstall-arm64.gz`** - Installer binary for ARM64 systems - **`dms-qml.tar.gz`** - QML source code only ### Checksums - **`*.sha256`** - SHA256 checksums for verifying download integrity **Installation:** Extract the `dms-full-*.tar.gz` package for your architecture and follow the `INSTALL.md` instructions inside. --- EOF cat >> RELEASE_BODY.md << EOF ## What's Changed $CHANGELOG **Full Changelog**: https://github.com/${{ github.repository }}/compare/${PREVIOUS_TAG}...${TAG} EOF echo "changelog<> $GITHUB_OUTPUT cat RELEASE_BODY.md >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT - name: Prepare release assets run: | set -euxo pipefail mkdir -p _release_assets # Copy core binaries and rename dms-*.gz to dms-cli-*.gz for file in _core_assets/dms-*.gz*; do if [ -f "$file" ]; then basename=$(basename "$file") if [[ "$basename" == dms-distropkg-* ]]; then cp "$file" "_release_assets/$basename" else newname=$(echo "$basename" | sed 's/^dms-/dms-cli-/') cp "$file" "_release_assets/$newname" fi fi done # Copy dankinstall binaries cp _core_assets/dankinstall-*.gz* _release_assets/ # Copy completions cp _core_assets/completion.* _release_assets/ 2>/dev/null || true # Create QML source package (exclude build artifacts and git files) # Copy root LICENSE and CONTRIBUTING.md to quickshell/ for packaging cp LICENSE CONTRIBUTING.md quickshell/ # Copy root assets directory to quickshell for systemd service and desktop file cp -r assets quickshell/ # Tar the CONTENTS of quickshell/, not the directory itself (cd quickshell && tar --exclude='.git' \ --exclude='.github' \ --exclude='*.tar.gz' \ -czf ../_release_assets/dms-qml.tar.gz .) # Generate checksum for QML package (cd _release_assets && sha256sum dms-qml.tar.gz > dms-qml.tar.gz.sha256) # Create full packages for each architecture for arch in amd64 arm64; do mkdir -p _temp_full/dms mkdir -p _temp_full/bin mkdir -p _temp_full/completions # Extract QML source tar -xzf _release_assets/dms-qml.tar.gz -C _temp_full/dms # Add CLI binaries if [ -f "_core_assets/dms-${arch}.gz" ]; then gunzip -c "_core_assets/dms-${arch}.gz" > _temp_full/bin/dms chmod +x _temp_full/bin/dms fi if [ -f "_core_assets/dms-distropkg-${arch}.gz" ]; then gunzip -c "_core_assets/dms-distropkg-${arch}.gz" > _temp_full/bin/dms-distropkg chmod +x _temp_full/bin/dms-distropkg fi # Add shell completions for completion in _core_assets/completion.*; do if [ -f "$completion" ]; then cp "$completion" _temp_full/completions/ fi done # Copy docs directory if [ -d "docs" ]; then cp -r docs _temp_full/ fi # Create installation guide cat > _temp_full/INSTALL.md << 'EOFINSTALL' # DankMaterialShell Installation ## Requirements - Wayland compositor (niri or Hyprland recommended) - Quickshell framework - Qt6 ## Installation Steps 1. **Install quickshell assets:** ```bash mkdir -p ~/.config/quickshell cp -r dms ~/.config/quickshell/ ``` 2. **Install the DMS CLI binaries:** ```bash sudo install -m 755 bin/dms /usr/local/bin/dms ``` 3. **Install shell completions (optional):** ```bash # Bash sudo install -m 644 completions/completion.bash /usr/share/bash-completion/completions/dms # Fish sudo install -m 644 completions/completion.fish /usr/share/fish/vendor_completions.d/dms.fish # Zsh sudo install -m 644 completions/completion.zsh /usr/share/zsh/site-functions/_dms ``` 4. **Start the shell:** ```bash dms run ``` ## Configuration - Settings are stored in `~/.config/DankMaterialShell/settings.json` - Plugins go in `~/.config/DankMaterialShell/plugins/` - See the documentation in the `dms/` directory for more details ## Troubleshooting - Run with verbose output: `DMS_LOG_LEVEL=debug dms run` - Ensure all dependencies are installed EOFINSTALL # Create the full package (cd _temp_full && tar -czf "../_release_assets/dms-full-${arch}.tar.gz" .) # Generate checksum (cd _release_assets && sha256sum "dms-full-${arch}.tar.gz" > "dms-full-${arch}.tar.gz.sha256") # Cleanup rm -rf _temp_full done - name: Create GitHub Release uses: softprops/action-gh-release@v2 with: tag_name: ${{ env.TAG }} name: Release ${{ env.TAG }} body: ${{ steps.changelog.outputs.changelog }} files: _release_assets/** draft: false prerelease: ${{ contains(env.TAG, '-') }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}