diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml new file mode 100644 index 0000000..74dc0c7 --- /dev/null +++ b/.github/workflows/create-release.yml @@ -0,0 +1,229 @@ +name: Create volmix Release + +on: + workflow_dispatch: + inputs: + version: + description: 'Release version (e.g., v1.0.1)' + required: true + type: string + build_type: + description: 'Build type' + required: true + default: 'release' + type: choice + options: + - 'release' + - 'debug' + prerelease: + description: 'Mark as prerelease' + required: false + default: false + type: boolean + architectures: + description: 'Architectures to build (comma-separated)' + required: false + default: 'amd64,arm64' + type: string + +jobs: + build-packages: + runs-on: ubuntu-latest + strategy: + matrix: + architecture: ${{ fromJSON(format('["{0}"]', join(split(inputs.architectures, ','), '","'))) }} + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build package for ${{ matrix.architecture }} + run: | + echo "Building Debian package for ${{ matrix.architecture }}" + echo "Build type: ${{ inputs.build_type }}" + + # Use our existing build script with parameters + chmod +x build-package.sh + ./build-package.sh "${{ matrix.architecture }}" "${{ inputs.build_type }}" + + - name: Verify package creation + run: | + echo "Checking for generated .deb packages..." + debs=$(find . -maxdepth 1 -type f -name '*.deb') + if [ -z "$debs" ]; then + echo "ERROR: No .deb packages found!" + exit 1 + fi + + # Show package info + echo "Package details for ${{ matrix.architecture }}:" + for deb in $debs; do + echo "=== $deb ===" + dpkg --info "$deb" + echo + done + + - name: Upload build artifacts + uses: actions/upload-artifact@v4 + with: + name: volmix-packages-${{ matrix.architecture }}-${{ inputs.build_type }} + path: | + *.deb + *.changes + *.buildinfo + retention-days: 7 + compression-level: 0 + overwrite: true + + create-release: + needs: build-packages + runs-on: ubuntu-latest + permissions: + contents: write + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Download all build artifacts + uses: actions/download-artifact@v4 + with: + pattern: volmix-packages-* + merge-multiple: true + path: ./packages + + - name: List downloaded packages + run: | + echo "Downloaded packages:" + find ./packages -name "*.deb" -type f | sort + + - name: Generate release notes + id: release_notes + run: | + echo "Generating release notes for ${{ inputs.version }}" + + # Get current date + BUILD_DATE=$(date -u '+%Y-%m-%d %H:%M:%S UTC') + + # Count packages + DEB_COUNT=$(find ./packages -name "*.deb" -type f | wc -l) + + # List architectures built + ARCHS="" + for deb in ./packages/*.deb; do + if [ -f "$deb" ]; then + arch=$(dpkg-deb -f "$deb" Architecture 2>/dev/null) + if [ $? -ne 0 ] || [ -z "$arch" ]; then + echo "WARNING: Failed to get architecture for $deb, skipping." + continue + fi + if [[ ! "$ARCHS" =~ $arch ]]; then + ARCHS="$ARCHS $arch" + fi + fi + done + ARCHS=$(echo "$ARCHS" | xargs) # trim whitespace + + # Create release notes + cat > release_notes.md << EOF + # volmix ${{ inputs.version }} + + Per-application audio control tool for Linux using PulseAudio. + + ## 📦 Package Information + - **Build Date**: $BUILD_DATE + - **Build Type**: ${{ inputs.build_type }} + - **Architectures**: $ARCHS + - **Packages**: $DEB_COUNT .deb files + + ## 📥 Installation + + ### Debian/Ubuntu: + \`\`\`bash + # Download the appropriate .deb package for your architecture + wget https://github.com/cwage/volmix/releases/download/${{ inputs.version }}/volmix_*_.deb + + # Install the package + sudo dpkg -i volmix_*_.deb + + # Install any missing dependencies + sudo apt-get install -f + \`\`\` + + ### Available Architectures: + EOF + + # Add download links for each architecture + for deb in ./packages/*.deb; do + if [ -f "$deb" ]; then + basename_deb=$(basename "$deb") + arch=$(dpkg-deb -f "$deb" Architecture 2>/dev/null) + if [ $? -ne 0 ] || [ -z "$arch" ]; then + echo "- **Unknown Architecture**: [\`$basename_deb\`](https://github.com/cwage/volmix/releases/download/${{ inputs.version }}/$basename_deb) (Error reading architecture)" >> release_notes.md + else + size=$(ls -lh "$deb" | awk '{print $5}') + echo "- **$arch**: [\`$basename_deb\`](https://github.com/cwage/volmix/releases/download/${{ inputs.version }}/$basename_deb) ($size)" >> release_notes.md + fi + fi + done + + cat >> release_notes.md << EOF + + ## 🚀 Features + - System tray integration with volume control popup + - Per-application volume control for active audio streams + - Master volume control via mouse wheel on tray icon + - Toggle popup visibility by clicking tray icon + - Right-click context menu for quick access to quit option + + ## 🐛 Bug Reports + Please report issues at: https://github.com/cwage/volmix/issues + EOF + + echo "Release notes generated:" + cat release_notes.md + + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ inputs.version }} + name: volmix ${{ inputs.version }} + body_path: release_notes.md + prerelease: ${{ inputs.prerelease }} + files: | + ./packages/*.deb + ./packages/*.changes + ./packages/*.buildinfo + fail_on_unmatched_files: false + generate_release_notes: false + make_latest: ${{ !inputs.prerelease }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Generate workflow summary + run: | + echo "## 🎉 Release Created Successfully!" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "**Release**: [${{ inputs.version }}](https://github.com/cwage/volmix/releases/tag/${{ inputs.version }})" >> $GITHUB_STEP_SUMMARY + echo "**Build Type**: ${{ inputs.build_type }}" >> $GITHUB_STEP_SUMMARY + echo "**Prerelease**: ${{ inputs.prerelease }}" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📦 Packages Included" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + for deb in ./packages/*.deb; do + if [ -f "$deb" ]; then + basename_deb=$(basename "$deb") + arch=$(dpkg-deb -f "$deb" Architecture 2>/dev/null) + if [ $? -ne 0 ] || [ -z "$arch" ]; then + echo "⚠️ Warning: Failed to extract architecture from $basename_deb" >> $GITHUB_STEP_SUMMARY + arch="unknown" + fi + size=$(ls -lh "$deb" | awk '{print $5}') + echo "- **$arch**: \`$basename_deb\` ($size)" >> $GITHUB_STEP_SUMMARY + fi + done + echo "" >> $GITHUB_STEP_SUMMARY + echo "🔗 [View Release](https://github.com/cwage/volmix/releases/tag/${{ inputs.version }})" >> $GITHUB_STEP_SUMMARY \ No newline at end of file diff --git a/.github/workflows/release-on-tag.yml b/.github/workflows/release-on-tag.yml new file mode 100644 index 0000000..949ff83 --- /dev/null +++ b/.github/workflows/release-on-tag.yml @@ -0,0 +1,181 @@ +name: Release on Tag + +on: + push: + tags: + - 'v*' # Trigger on version tags like v1.0.0, v1.0.1, etc. + +jobs: + release: + runs-on: ubuntu-latest + permissions: + contents: write + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Get tag version + id: get_version + run: | + VERSION=${GITHUB_REF#refs/tags/} + echo "VERSION=$VERSION" >> $GITHUB_OUTPUT + echo "Building release for version: $VERSION" + + # Determine if this is a prerelease based on version format + if [[ "$VERSION" =~ -[a-zA-Z] ]]; then + echo "PRERELEASE=true" >> $GITHUB_OUTPUT + else + echo "PRERELEASE=false" >> $GITHUB_OUTPUT + fi + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + # Build packages for multiple architectures in parallel + - name: Build amd64 package + run: | + echo "Building amd64 package..." + chmod +x build-package.sh + ./build-package.sh "amd64" "release" + mkdir -p packages/amd64 + + # Move build artifacts with proper error handling + shopt -s nullglob + files=( *.deb *.changes *.buildinfo ) + if [ ${#files[@]} -eq 0 ]; then + echo "ERROR: No build artifacts (*.deb, *.changes, *.buildinfo) found for amd64." >&2 + exit 1 + fi + mv "${files[@]}" packages/amd64/ + shopt -u nullglob + + - name: Build arm64 package + run: | + echo "Building arm64 package..." + ./build-package.sh "arm64" "release" + mkdir -p packages/arm64 + + # Move build artifacts with proper error handling + shopt -s nullglob + files=( *.deb *.changes *.buildinfo ) + if [ ${#files[@]} -eq 0 ]; then + echo "ERROR: No build artifacts (*.deb, *.changes, *.buildinfo) found for arm64." >&2 + exit 1 + fi + mv "${files[@]}" packages/arm64/ + shopt -u nullglob + + - name: Collect all packages + run: | + echo "Collecting all built packages..." + mkdir -p release-packages + find packages/ -name "*.deb" -exec cp {} release-packages/ \; + find packages/ -name "*.changes" -exec cp {} release-packages/ \; + find packages/ -name "*.buildinfo" -exec cp {} release-packages/ \; + + echo "Final package list:" + ls -la release-packages/ + + - name: Generate release notes + id: release_notes + run: | + VERSION="${{ steps.get_version.outputs.VERSION }}" + BUILD_DATE=$(date -u '+%Y-%m-%d %H:%M:%S UTC') + + # Count packages and get architectures + DEB_COUNT=$(find release-packages/ -name "*.deb" -type f | wc -l) + ARCHS="" + + for deb in release-packages/*.deb; do + if [ -f "$deb" ]; then + arch=$(dpkg-deb -f "$deb" Architecture 2>/dev/null) + if [ $? -ne 0 ] || [ -z "$arch" ]; then + echo "WARNING: Failed to get architecture for $deb, using 'unknown'" + arch="unknown" + fi + if [[ ! "$ARCHS" =~ $arch ]]; then + ARCHS="$ARCHS $arch" + fi + fi + done + ARCHS=$(echo "$ARCHS" | xargs) + + cat > release_notes.md << EOF + # volmix $VERSION + + Per-application audio control tool for Linux using PulseAudio. + + ## 📦 Package Information + - **Build Date**: $BUILD_DATE + - **Architectures**: $ARCHS + - **Packages**: $DEB_COUNT .deb files + + ## 📥 Installation + + ### Debian/Ubuntu: + \`\`\`bash + # Download the appropriate package for your architecture + wget https://github.com/cwage/volmix/releases/download/$VERSION/volmix_*_.deb + + # Install the package + sudo dpkg -i volmix_*_.deb + + # Install any missing dependencies + sudo apt-get install -f + \`\`\` + + ### Available Downloads: + EOF + + # Add download information for each package + for deb in release-packages/*.deb; do + if [ -f "$deb" ]; then + basename_deb=$(basename "$deb") + arch=$(dpkg-deb -f "$deb" Architecture 2>/dev/null) + if [ $? -ne 0 ] || [ -z "$arch" ]; then + echo "- **Unknown Architecture**: [\`$basename_deb\`](https://github.com/cwage/volmix/releases/download/$VERSION/$basename_deb) (Error reading architecture)" >> release_notes.md + else + size=$(ls -lh "$deb" | awk '{print $5}') + echo "- **$arch**: [\`$basename_deb\`](https://github.com/cwage/volmix/releases/download/$VERSION/$basename_deb) ($size)" >> release_notes.md + fi + fi + done + + cat >> release_notes.md << EOF + + ## 🚀 Features + - System tray integration with per-app volume control + - Toggle popup window by clicking tray icon + - Mouse wheel volume control on tray icon + - Clean, streamlined interface + - Real-time audio stream detection + + ## 🛠️ Requirements + - PulseAudio + - GTK3 + - Linux desktop environment with system tray support + + ## 🐛 Issues & Support + Report bugs: https://github.com/cwage/volmix/issues + EOF + + echo "Generated release notes:" + cat release_notes.md + + - name: Create Release + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ steps.get_version.outputs.VERSION }} + name: volmix ${{ steps.get_version.outputs.VERSION }} + body_path: release_notes.md + prerelease: ${{ steps.get_version.outputs.PRERELEASE }} + files: | + release-packages/*.deb + release-packages/*.changes + release-packages/*.buildinfo + fail_on_unmatched_files: false + generate_release_notes: false + make_latest: ${{ steps.get_version.outputs.PRERELEASE == 'false' }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file