chore: bump version to 1.38 #47
Workflow file for this run
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: | |
| push: | |
| tags: | |
| - 'v*' | |
| jobs: | |
| # ============================================================ | |
| # macOS Build | |
| # ============================================================ | |
| build-macos: | |
| runs-on: macos-26 | |
| outputs: | |
| version: ${{ steps.version.outputs.VERSION }} | |
| sha256: ${{ steps.sha256.outputs.SHA256 }} | |
| steps: | |
| - name: Check build environment | |
| run: | | |
| sw_vers | |
| xcodebuild -version | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Extract version | |
| id: version | |
| run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT | |
| - name: Update app version | |
| run: | | |
| VERSION=${{ steps.version.outputs.VERSION }} | |
| sed -i '' "s/MARKETING_VERSION = .*/MARKETING_VERSION = $VERSION;/" KeyStats.xcodeproj/project.pbxproj | |
| echo "Updated MARKETING_VERSION to $VERSION" | |
| - name: Build DMG | |
| run: ./scripts/build_dmg.sh | |
| - name: Validate Sparkle private key | |
| env: | |
| SPARKLE_PRIVATE_KEY: ${{ secrets.SPARKLE_PRIVATE_KEY }} | |
| run: | | |
| if [ -z "$SPARKLE_PRIVATE_KEY" ]; then | |
| echo "SPARKLE_PRIVATE_KEY secret is required for Sparkle appcast signing." | |
| exit 1 | |
| fi | |
| - name: Fetch Sparkle tools (prebuilt) | |
| env: | |
| SPARKLE_VERSION: 2.8.1 | |
| run: | | |
| ARCHIVE_PATH="$RUNNER_TEMP/Sparkle-${SPARKLE_VERSION}.tar.xz" | |
| TOOLS_DIR="$RUNNER_TEMP/sparkle-tools" | |
| curl -fL -o "$ARCHIVE_PATH" \ | |
| "https://github.com/sparkle-project/Sparkle/releases/download/${SPARKLE_VERSION}/Sparkle-${SPARKLE_VERSION}.tar.xz" | |
| mkdir -p "$TOOLS_DIR" | |
| tar -xf "$ARCHIVE_PATH" -C "$TOOLS_DIR" | |
| GENERATE_APPCAST_PATH="$(find "$TOOLS_DIR" -type f -name generate_appcast | head -n1)" | |
| if [[ -z "$GENERATE_APPCAST_PATH" || ! -x "$GENERATE_APPCAST_PATH" ]]; then | |
| echo "Unable to locate executable generate_appcast in Sparkle archive." | |
| exit 1 | |
| fi | |
| echo "SPARKLE_BIN=$(dirname "$GENERATE_APPCAST_PATH")" >> $GITHUB_ENV | |
| "$GENERATE_APPCAST_PATH" --help >/dev/null | |
| - name: Build Sparkle update archive | |
| run: | | |
| APP_NAME="KeyStats" | |
| ARCHIVE_PATH="build/sparkle/$APP_NAME.xcarchive" | |
| STAGING_DIR="build/sparkle/staging" | |
| OUTPUT_DIR="build/sparkle/output" | |
| mkdir -p "$STAGING_DIR" "$OUTPUT_DIR" | |
| xcodebuild -project KeyStats.xcodeproj \ | |
| -scheme KeyStats \ | |
| -configuration Release \ | |
| -derivedDataPath build/sparkle/DerivedData \ | |
| -archivePath "$ARCHIVE_PATH" \ | |
| archive \ | |
| CODE_SIGN_IDENTITY="-" \ | |
| ARCHS="arm64 x86_64" \ | |
| ONLY_ACTIVE_ARCH=NO | |
| APP_PATH="$ARCHIVE_PATH/Products/Applications/$APP_NAME.app" | |
| cp -R "$APP_PATH" "$STAGING_DIR/" | |
| codesign --force --deep --sign - --entitlements KeyStats/KeyStats.entitlements "$STAGING_DIR/$APP_NAME.app" | |
| ditto -c -k --sequesterRsrc --keepParent "$STAGING_DIR/$APP_NAME.app" "$OUTPUT_DIR/$APP_NAME.zip" | |
| - name: Generate Sparkle appcast | |
| env: | |
| SPARKLE_PRIVATE_KEY: ${{ secrets.SPARKLE_PRIVATE_KEY }} | |
| run: | | |
| OUTPUT_DIR="build/sparkle/output" | |
| KEY_FILE="$RUNNER_TEMP/sparkle_private.key" | |
| DOWNLOAD_PREFIX="https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}" | |
| printf "%s" "$SPARKLE_PRIVATE_KEY" > "$KEY_FILE" | |
| "$SPARKLE_BIN/generate_appcast" \ | |
| --ed-key-file "$KEY_FILE" \ | |
| --download-url-prefix "$DOWNLOAD_PREFIX/" \ | |
| -o "$OUTPUT_DIR/appcast.xml" \ | |
| "$OUTPUT_DIR" | |
| grep -q "sparkle:edSignature" "$OUTPUT_DIR/appcast.xml" | |
| - name: Calculate SHA256 | |
| id: sha256 | |
| run: echo "SHA256=$(shasum -a 256 KeyStats.dmg | cut -d ' ' -f 1)" >> $GITHUB_OUTPUT | |
| - name: Prepare macOS artifacts | |
| run: | | |
| mkdir -p dist/macos | |
| cp KeyStats.dmg dist/macos/KeyStats.dmg | |
| cp build/sparkle/output/KeyStats.zip dist/macos/KeyStats.zip | |
| cp build/sparkle/output/appcast.xml dist/macos/appcast.xml | |
| - name: Upload macOS artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: macos-dmg | |
| path: dist/macos/* | |
| # ============================================================ | |
| # Windows Build | |
| # ============================================================ | |
| build-windows: | |
| runs-on: windows-latest | |
| outputs: | |
| version: ${{ steps.version.outputs.VERSION }} | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Extract version | |
| id: version | |
| shell: bash | |
| run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT | |
| - name: Setup .NET | |
| uses: actions/setup-dotnet@v4 | |
| with: | |
| dotnet-version: '8.0.x' | |
| - name: Update app version | |
| shell: pwsh | |
| run: | | |
| $csprojPath = "KeyStats.Windows/KeyStats/KeyStats.csproj" | |
| $version = "${{ steps.version.outputs.VERSION }}" | |
| (Get-Content $csprojPath) -replace '<Version>.*</Version>', "<Version>$version</Version>" | Set-Content $csprojPath | |
| Write-Host "Updated Version to $version" | |
| - name: Build Windows app | |
| shell: pwsh | |
| working-directory: KeyStats.Windows | |
| run: | | |
| .\build.ps1 -Configuration Release | |
| - name: Upload Windows artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: windows-zip | |
| path: KeyStats.Windows/dist/*.zip | |
| # ============================================================ | |
| # Create Release | |
| # ============================================================ | |
| create-release: | |
| needs: [build-macos, build-windows] | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: write | |
| steps: | |
| - name: Download macOS artifact | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: macos-dmg | |
| path: release-assets/macos | |
| - name: Download Windows artifact | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: windows-zip | |
| path: release-assets/windows | |
| - name: List artifacts | |
| run: | | |
| ls -la release-assets/macos | |
| ls -la release-assets/windows | |
| - name: Create Release | |
| uses: softprops/action-gh-release@v1 | |
| with: | |
| files: | | |
| release-assets/macos/KeyStats.dmg | |
| release-assets/macos/KeyStats.zip | |
| release-assets/macos/appcast.xml | |
| release-assets/windows/*.zip | |
| generate_release_notes: true | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Update Homebrew Tap | |
| if: ${{ !contains(github.ref_name, '-beta') }} | |
| env: | |
| TAP_GITHUB_TOKEN: ${{ secrets.TAP_GITHUB_TOKEN }} | |
| run: | | |
| git clone https://x-access-token:${TAP_GITHUB_TOKEN}@github.com/debugtheworldbot/homebrew-keystats.git /tmp/homebrew-keystats | |
| cd /tmp/homebrew-keystats | |
| sed -i "s/version \".*\"/version \"${{ needs.build-macos.outputs.version }}\"/" Casks/keystats.rb | |
| sed -i "s/sha256 \".*\"/sha256 \"${{ needs.build-macos.outputs.sha256 }}\"/" Casks/keystats.rb | |
| git config user.name "github-actions[bot]" | |
| git config user.email "github-actions[bot]@users.noreply.github.com" | |
| git add Casks/keystats.rb | |
| git commit -m "chore: update keystats to v${{ needs.build-macos.outputs.version }}" | |
| git push origin main | |
| - name: Verify Release | |
| run: | | |
| echo "Release v${{ needs.build-macos.outputs.version }} created successfully" |