Release #73
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: 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<<EOF" >> $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 }} |