name: Build on: push: branches: - main - dev tags: - 'v*' jobs: increment-version: runs-on: ubuntu-latest if: github.ref == 'refs/heads/main' && !contains(github.event.head_commit.message, '[skip ci]') outputs: version: ${{ steps.bump.outputs.VERSION }} should_build: ${{ steps.bump.outputs.SHOULD_BUILD }} steps: - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 token: ${{ secrets.GITHUB_TOKEN }} - name: Bump patch version id: bump run: | # Get current version from package.json CURRENT=$(grep -Po '"version":\s*"\K[^"]+' package.json | head -1) echo "Current version: $CURRENT" # Split and increment patch MAJOR=$(echo $CURRENT | cut -d. -f1) MINOR=$(echo $CURRENT | cut -d. -f2) PATCH=$(echo $CURRENT | cut -d. -f3) NEW_PATCH=$((PATCH + 1)) NEW_VERSION="${MAJOR}.${MINOR}.${NEW_PATCH}" echo "New version: $NEW_VERSION" # Update package.json sed -i "s/\"version\": \"${CURRENT}\"/\"version\": \"${NEW_VERSION}\"/" package.json # Verify the change grep '"version"' package.json | head -1 echo "VERSION=$NEW_VERSION" >> $GITHUB_OUTPUT echo "SHOULD_BUILD=true" >> $GITHUB_OUTPUT - name: Commit and push version bump run: | git config user.name "GitHub Actions" git config user.email "actions@github.com" git add package.json git commit -m "chore: bump version to ${{ steps.bump.outputs.VERSION }} [skip ci]" git push build-windows: runs-on: windows needs: increment-version if: always() && (needs.increment-version.outputs.should_build == 'true' || needs.increment-version.result == 'skipped') steps: - name: Checkout repository uses: actions/checkout@v4 with: submodules: false ref: ${{ github.ref_name }} - name: Checkout submodules manually shell: powershell run: | git submodule update --init --recursive - name: Pull latest (after version bump) if: github.ref == 'refs/heads/main' shell: powershell run: git pull origin main - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' - name: Install dependencies (root) run: npm ci --prefer-offline - name: Install dependencies (cinny) working-directory: ./cinny run: npm ci --prefer-offline - name: Clean previous builds shell: powershell run: | if (Test-Path cinny/dist) { Remove-Item -Recurse -Force cinny/dist } if (Test-Path dist-electron) { Remove-Item -Recurse -Force dist-electron } - name: Build Electron app run: npm run build:local -- --win env: GH_TOKEN: ${{ secrets.GHTOKEN }} - name: Upload NSIS Installer (x64) uses: actions/upload-artifact@v3 with: name: Paarrot-Setup-x64.exe path: dist-electron/Paarrot-*-win-x64.exe - name: Upload latest.yml uses: actions/upload-artifact@v3 with: name: latest.yml path: dist-electron/latest.yml - name: List build output shell: powershell run: | Get-ChildItem -Path dist-electron -Recurse | Select-Object FullName build-linux: runs-on: ubuntu-latest needs: increment-version if: always() && (needs.increment-version.outputs.should_build == 'true' || needs.increment-version.result == 'skipped') steps: - name: Checkout repository uses: actions/checkout@v4 with: submodules: recursive ref: ${{ github.ref_name }} - name: Pull latest (after version bump) if: github.ref == 'refs/heads/main' run: git pull origin main - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' - name: Install dependencies (root) run: npm ci --prefer-offline - name: Install dependencies (cinny) working-directory: ./cinny run: npm ci --prefer-offline - name: Clean previous builds run: | rm -rf cinny/dist dist-electron - name: Build Electron app run: npm run build:local -- --linux env: GH_TOKEN: ${{ secrets.GHTOKEN }} - name: Upload AppImage uses: actions/upload-artifact@v3 with: name: Paarrot-Linux-x64.AppImage path: dist-electron/Paarrot-*.AppImage - name: Upload latest-linux.yml uses: actions/upload-artifact@v3 with: name: latest-linux.yml path: dist-electron/latest-linux.yml create-release: runs-on: ubuntu-latest needs: [increment-version, build-windows, build-linux] if: always() && (needs.build-windows.result == 'success' || needs.build-linux.result == 'success') steps: - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 ref: ${{ github.ref_name }} - name: Pull latest (after version bump) if: github.ref == 'refs/heads/main' run: git pull origin main - name: Get version id: version run: | # Use version from increment-version job if available, otherwise read from file if [ -n "${{ needs.increment-version.outputs.version }}" ]; then VERSION="${{ needs.increment-version.outputs.version }}" else VERSION=$(grep -Po '"version":\s*"\K[^"]+' package.json | head -1) fi echo "VERSION=$VERSION" >> $GITHUB_OUTPUT echo "Version: $VERSION" - name: Check if tag exists id: tag_check run: | VERSION="${{ steps.version.outputs.VERSION }}" if git rev-parse "v$VERSION" >/dev/null 2>&1; then echo "Tag v$VERSION already exists" echo "exists=true" >> $GITHUB_OUTPUT else echo "Tag v$VERSION does not exist" echo "exists=false" >> $GITHUB_OUTPUT fi - name: Create and push tag if: steps.tag_check.outputs.exists == 'false' run: | git config user.name "GitHub Actions" git config user.email "actions@github.com" git tag -a "v${{ steps.version.outputs.VERSION }}" -m "Release v${{ steps.version.outputs.VERSION }}" git push origin "v${{ steps.version.outputs.VERSION }}" - name: Download all artifacts uses: actions/download-artifact@v3 with: path: artifacts - name: Prepare release files run: | mkdir -p release-files find artifacts -type f \( -name "*.exe" -o -name "*.AppImage" -o -name "*.yml" \) -exec cp {} release-files/ \; ls -la release-files/ - name: Create or Update Release env: GITEA_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | VERSION="${{ steps.version.outputs.VERSION }}" TAG_NAME="v${VERSION}" API_BASE="http://synbox.ruv.wtf:8418/api/v1" REPO="litruv/cinny-desktop" # Delete old releases (keep only current) echo "Cleaning up old releases..." OLD_RELEASES=$(curl -s -H "Authorization: token ${GITEA_TOKEN}" \ "${API_BASE}/repos/${REPO}/releases" | jq -r '.[] | select(.tag_name != "'${TAG_NAME}'") | .id') for OLD_ID in $OLD_RELEASES; do echo "Deleting old release ${OLD_ID}..." OLD_TAG=$(curl -s -H "Authorization: token ${GITEA_TOKEN}" \ "${API_BASE}/repos/${REPO}/releases/${OLD_ID}" | jq -r '.tag_name') # Delete release curl -s -X DELETE -H "Authorization: token ${GITEA_TOKEN}" \ "${API_BASE}/repos/${REPO}/releases/${OLD_ID}" # Delete tag if [ -n "$OLD_TAG" ]; then echo "Deleting old tag ${OLD_TAG}..." curl -s -X DELETE -H "Authorization: token ${GITEA_TOKEN}" \ "${API_BASE}/repos/${REPO}/tags/${OLD_TAG}" fi done # Check if release exists RELEASE_ID=$(curl -s -H "Authorization: token ${GITEA_TOKEN}" \ "${API_BASE}/repos/${REPO}/releases/tags/${TAG_NAME}" | jq -r '.id // empty') if [ -z "$RELEASE_ID" ]; then echo "Creating new release for ${TAG_NAME}..." RELEASE_ID=$(curl -s -X POST \ -H "Authorization: token ${GITEA_TOKEN}" \ -H "Content-Type: application/json" \ -d "{\"tag_name\": \"${TAG_NAME}\", \"name\": \"Release ${TAG_NAME}\", \"body\": \"Release ${VERSION}\", \"draft\": false, \"prerelease\": false}" \ "${API_BASE}/repos/${REPO}/releases" | jq -r '.id') echo "Created release with ID: ${RELEASE_ID}" else echo "Release exists with ID: ${RELEASE_ID}" # Delete existing assets echo "Deleting existing assets..." ASSETS=$(curl -s -H "Authorization: token ${GITEA_TOKEN}" \ "${API_BASE}/repos/${REPO}/releases/${RELEASE_ID}/assets" | jq -r '.[].id') for ASSET_ID in $ASSETS; do echo "Deleting asset ${ASSET_ID}..." curl -s -X DELETE -H "Authorization: token ${GITEA_TOKEN}" \ "${API_BASE}/repos/${REPO}/releases/${RELEASE_ID}/assets/${ASSET_ID}" done fi # Upload new assets echo "Uploading assets..." for FILE in release-files/*; do FILENAME=$(basename "$FILE") echo "Uploading ${FILENAME}..." curl -s -X POST \ -H "Authorization: token ${GITEA_TOKEN}" \ -H "Content-Type: application/octet-stream" \ --data-binary "@${FILE}" \ "${API_BASE}/repos/${REPO}/releases/${RELEASE_ID}/assets?name=${FILENAME}" echo "" done echo "Release complete!" - name: Create GitHub Release env: GH_TOKEN: ${{ secrets.GHTOKEN }} run: | VERSION="${{ steps.version.outputs.VERSION }}" TAG_NAME="v${VERSION}" GITHUB_REPO="Paarrot/Paarrot-Desktop" # Delete old GitHub releases (keep only current) echo "Cleaning up old GitHub releases..." OLD_RELEASES=$(curl -s -H "Authorization: token ${GH_TOKEN}" \ "https://api.github.com/repos/${GITHUB_REPO}/releases" | jq -r '.[] | select(.tag_name != "'${TAG_NAME}'") | .id') for OLD_ID in $OLD_RELEASES; do echo "Deleting old GitHub release ${OLD_ID}..." OLD_TAG=$(curl -s -H "Authorization: token ${GH_TOKEN}" \ "https://api.github.com/repos/${GITHUB_REPO}/releases/${OLD_ID}" | jq -r '.tag_name') # Delete release curl -s -X DELETE -H "Authorization: token ${GH_TOKEN}" \ "https://api.github.com/repos/${GITHUB_REPO}/releases/${OLD_ID}" # Delete tag if [ -n "$OLD_TAG" ]; then echo "Deleting old GitHub tag ${OLD_TAG}..." curl -s -X DELETE -H "Authorization: token ${GH_TOKEN}" \ "https://api.github.com/repos/${GITHUB_REPO}/git/refs/tags/${OLD_TAG}" fi done # Check if release exists on GitHub RELEASE_ID=$(curl -s -H "Authorization: token ${GH_TOKEN}" \ "https://api.github.com/repos/${GITHUB_REPO}/releases/tags/${TAG_NAME}" | jq -r '.id // empty') if [ -z "$RELEASE_ID" ]; then echo "Creating new GitHub release for ${TAG_NAME}..." RELEASE_ID=$(curl -s -X POST \ -H "Authorization: token ${GH_TOKEN}" \ -H "Content-Type: application/json" \ -d "{\"tag_name\": \"${TAG_NAME}\", \"name\": \"Release ${TAG_NAME}\", \"body\": \"Release ${VERSION}\", \"draft\": false, \"prerelease\": false}" \ "https://api.github.com/repos/${GITHUB_REPO}/releases" | jq -r '.id') echo "Created GitHub release with ID: ${RELEASE_ID}" else echo "GitHub release exists with ID: ${RELEASE_ID}" fi # Upload assets to GitHub echo "Uploading assets to GitHub..." UPLOAD_URL=$(curl -s -H "Authorization: token ${GH_TOKEN}" \ "https://api.github.com/repos/${GITHUB_REPO}/releases/${RELEASE_ID}" | jq -r '.upload_url' | sed 's/{?name,label}//') for FILE in release-files/*; do FILENAME=$(basename "$FILE") echo "Uploading ${FILENAME} to GitHub..." curl -s -X POST \ -H "Authorization: token ${GH_TOKEN}" \ -H "Content-Type: application/octet-stream" \ --data-binary "@${FILE}" \ "${UPLOAD_URL}?name=${FILENAME}" echo "" done echo "GitHub release complete!"