name: Build and Release Clouck on: push: tags: - "v*" - "[0-9]+.[0-9]+.[0-9]+" branches: - main - master workflow_dispatch: inputs: version: description: "Version to build (e.g., v1.0.0)" required: true default: "v1.0.0" jobs: build-macos: runs-on: macos-latest steps: - uses: actions/checkout@v6 - name: Install Qt uses: jurplel/install-qt-action@v4 with: version: "6.5.*" cache: true - name: Configure and Build run: | cmake -B build -S . -DCMAKE_BUILD_TYPE=Release cmake --build build --config Release - name: Create macOS App Bundle run: | # Check what was actually built echo "Contents of build directory:" ls -la build/ # Look for the .app bundle or executable if [ -d "build/Clouck.app" ]; then echo "Found .app bundle" cp -r build/Clouck.app ./ elif [ -f "build/Clouck" ]; then echo "Found standalone executable" # Create app bundle mkdir -p Clouck.app/Contents/MacOS mkdir -p Clouck.app/Contents/Resources cp build/Clouck Clouck.app/Contents/MacOS/ else echo "Looking for executable in build directory..." find build/ -name "Clouck*" -type f # Try to find and copy the first executable EXECUTABLE=$(find build/ -name "Clouck*" -type f | head -1) if [ -n "$EXECUTABLE" ]; then echo "Found executable: $EXECUTABLE" mkdir -p Clouck.app/Contents/MacOS mkdir -p Clouck.app/Contents/Resources cp "$EXECUTABLE" Clouck.app/Contents/MacOS/ else echo "ERROR: No Clouck executable found!" exit 1 fi fi # Create Info.plist cat > Clouck.app/Contents/Info.plist << EOF CFBundleExecutable Clouck CFBundleIdentifier com.clouck.app CFBundleName Clouck CFBundleVersion 1.0.0 CFBundlePackageType APPL LSUIElement EOF - name: Deploy Qt Dependencies run: | if [ -d "Clouck.app" ]; then macdeployqt Clouck.app -dmg || hdiutil create -volname "Clouck" -srcfolder Clouck.app -ov -format UDZO Clouck.dmg else echo "ERROR: Clouck.app not found!" exit 1 fi - name: Upload macOS Artifact uses: actions/upload-artifact@v7 with: name: Clouck-macos path: Clouck.dmg build-windows: runs-on: windows-latest steps: - uses: actions/checkout@v6 - name: Install Qt uses: jurplel/install-qt-action@v4 with: version: "6.5.*" cache: true - name: Configure and Build run: | cmake -B build -S . -DCMAKE_BUILD_TYPE=Release cmake --build build --config Release - name: Create Windows Distribution shell: pwsh run: | # Check what was actually built Get-ChildItem -Path "build" -Recurse -Name New-Item -ItemType Directory -Path Clouck-windows -Force Copy-Item "build/Release/Clouck.exe" -Destination "Clouck-windows/" -ErrorAction SilentlyContinue Copy-Item "build/Release/*.dll" -Destination "Clouck-windows/" -ErrorAction SilentlyContinue windeployqt --release Clouck-windows/Clouck.exe Compress-Archive -Path Clouck-windows -DestinationPath Clouck-windows.zip - name: Upload Windows Artifact uses: actions/upload-artifact@v7 with: name: Clouck-windows path: Clouck-windows.zip build-linux: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Install Dependencies run: | sudo apt-get update sudo apt-get install -y build-essential cmake libx11-dev libxfixes-dev - name: Install Qt uses: jurplel/install-qt-action@v4 with: version: "6.5.*" cache: true - name: Configure CMake run: | cmake -B build -S . -DCMAKE_BUILD_TYPE=Release - name: Build run: cmake --build build --config Release - name: Create Linux Distribution run: | # Check what was actually built echo "Contents of build directory:" ls -la build/ # Look for the executable EXECUTABLE=$(find build/ -name "Clouck" -type f -executable | head -1) if [ -n "$EXECUTABLE" ]; then echo "Found executable: $EXECUTABLE" mkdir -p Clouck-linux cp "$EXECUTABLE" Clouck-linux/ else echo "ERROR: No Clouck executable found!" exit 1 fi # Copy any Qt libraries find build/ -name "*.so*" -exec cp {} Clouck-linux/ \; 2>/dev/null || true # Create tar.gz for distribution tar -czf Clouck-linux.tar.gz Clouck-linux/ - name: Upload Linux Artifact uses: actions/upload-artifact@v7 with: name: Clouck-linux path: Clouck-linux.tar.gz generate-changelog: needs: [ build-macos, build-windows, build-linux ] runs-on: ubuntu-latest if: always() outputs: changelog: ${{ steps.changelog.outputs.changelog }} version: ${{ steps.version.outputs.version }} steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Get Version id: version run: | if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then echo "version=${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT else echo "version=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT fi - name: Generate Changelog id: changelog run: | VERSION="${{ steps.version.outputs.version }}" CHANGELOG=$(git log --pretty=format:"- %s" $(git describe --tags --abbrev=0 HEAD~1)..HEAD 2>/dev/null || echo "- Initial release") echo "changelog<> $GITHUB_OUTPUT echo "## What's New in $VERSION" >> $GITHUB_OUTPUT echo "" >> $GITHUB_OUTPUT echo "$CHANGELOG" >> $GITHUB_OUTPUT echo "" >> $GITHUB_OUTPUT echo "## Downloads" >> $GITHUB_OUTPUT echo "- **macOS**: Clouck.dmg" >> $GITHUB_OUTPUT echo "- **Windows**: Clouck-windows.zip" >> $GITHUB_OUTPUT echo "- **Linux**: Clouck-linux.tar.gz" >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT create-release: needs: [ build-macos, build-windows, build-linux, generate-changelog ] runs-on: ubuntu-latest if: always() steps: - name: Download All Artifacts uses: actions/download-artifact@v8 with: path: artifacts - name: Display Structure run: ls -R artifacts - name: Create Release uses: softprops/action-gh-release@v3 with: name: Clouck ${{ needs.generate-changelog.outputs.version }} body: | Cross-platform clock widget application ${{ needs.generate-changelog.outputs.changelog }} ## Installation ### macOS 1. Download Clouck.dmg 2. Open the DMG file 3. Drag Clouck.app to Applications folder ### Windows 1. Download Clouck-windows.zip 2. Extract the ZIP file 3. Run Clouck.exe ### Linux 1. Download Clouck-linux.tar.gz 2. Extract the tar.gz file 3. Run the Clouck executable ### Features - Always-on-top functionality across all platforms - Fullscreen mode compatibility - Resizable interface - Context menu with customization options - Native platform integration files: | artifacts/Clouck-macos/Clouck.dmg artifacts/Clouck-windows/Clouck-windows.zip artifacts/Clouck-linux/Clouck-linux.tar.gz draft: false prerelease: false generate_release_notes: true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}