name: Build Lotus Chat Desktop on: push: branches: [main] workflow_dispatch: env: GITEA_URL: https://code.lotusguild.org REPO: LotusGuild/cinny-desktop jobs: build-windows: runs-on: windows steps: - uses: actions/checkout@v4 - name: Checkout submodules (shallow) shell: powershell run: git submodule update --init --depth=1 - name: Install frontend deps shell: powershell run: cd cinny; npm ci - name: Install Tauri deps shell: powershell run: npm ci - name: Build shell: powershell env: TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }} TAURI_SIGNING_PRIVATE_KEY_PASSWORD: '' NODE_OPTIONS: '--max_old_space_size=4096' run: npm run tauri -- build -- --bundles nsis - name: Upload to release shell: powershell env: TOKEN: ${{ secrets.RELEASE_TOKEN }} run: | # Extract version from built artifact filename $nsis = "src-tauri\target\release\bundle\nsis" $setupExe = Get-ChildItem "$nsis\Cinny_*_x64-setup.exe" | Select-Object -First 1 $VERSION = $setupExe.Name -replace 'Cinny_(.+)_x64-setup\.exe','$1' Write-Host "Version: $VERSION" # Get or create the latest release $release = Invoke-RestMethod -Uri "$env:GITEA_URL/api/v1/repos/$env:REPO/releases/tags/latest" ` -Headers @{ Authorization = "token $env:TOKEN" } -ErrorAction SilentlyContinue if (-not $release) { $release = Invoke-RestMethod -Uri "$env:GITEA_URL/api/v1/repos/$env:REPO/releases" ` -Method Post ` -Headers @{ Authorization = "token $env:TOKEN"; "Content-Type" = "application/json" } ` -Body "{`"tag_name`":`"latest`",`"name`":`"Lotus Chat $VERSION`",`"prerelease`":true,`"body`":`"Built from ${{ github.sha }}`"}" } $releaseId = $release.id $nsis = "src-tauri\target\release\bundle\nsis" $files = @( "$nsis\Cinny_${VERSION}_x64-setup.exe", "$nsis\Cinny_${VERSION}_x64-setup.nsis.zip", "$nsis\Cinny_${VERSION}_x64-setup.nsis.zip.sig" ) $names = @("LotusChat-x86_64-setup.exe", "LotusChat-x86_64-setup.nsis.zip", "LotusChat-x86_64-setup.nsis.zip.sig") for ($i = 0; $i -lt $files.Length; $i++) { $bytes = [System.IO.File]::ReadAllBytes($files[$i]) Invoke-RestMethod -Uri "$env:GITEA_URL/api/v1/repos/$env:REPO/releases/$releaseId/assets?name=$($names[$i])" ` -Method Post ` -Headers @{ Authorization = "token $env:TOKEN"; "Content-Type" = "application/octet-stream" } ` -Body $bytes } build-linux: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: submodules: true - uses: actions/setup-node@v4 with: node-version-file: .node-version - name: Install system deps run: | apt-get update apt-get install -y \ curl wget file \ libwebkit2gtk-4.1-dev \ libssl-dev \ libxdo-dev \ libayatana-appindicator3-dev \ librsvg2-dev \ patchelf \ xdg-utils - uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 with: workspaces: src-tauri - name: Install frontend deps run: cd cinny && npm ci - name: Install Tauri deps run: npm ci - name: Build env: TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }} TAURI_SIGNING_PRIVATE_KEY_PASSWORD: '' NODE_OPTIONS: '--max_old_space_size=4096' run: npm run tauri -- build - name: Upload to release env: TOKEN: ${{ secrets.RELEASE_TOKEN }} run: | # Extract version from built artifact filename — no file reads needed DEB=$(ls src-tauri/target/release/bundle/deb/Cinny_*_amd64.deb | head -1) VERSION=$(basename "$DEB" | sed 's/Cinny_\(.*\)_amd64\.deb/\1/') echo "Version: $VERSION" # Get or create the latest release RELEASE=$(curl -sf "$GITEA_URL/api/v1/repos/$REPO/releases/tags/latest" \ -H "Authorization: token $TOKEN" 2>/dev/null || true) RELEASE_ID=$(echo "$RELEASE" | python3 -c "import sys,json; print(json.load(sys.stdin).get('id',''))" 2>/dev/null || true) if [ -z "$RELEASE_ID" ] || [ "$RELEASE_ID" = "None" ]; then RELEASE_ID=$(curl -sf -X POST "$GITEA_URL/api/v1/repos/$REPO/releases" \ -H "Authorization: token $TOKEN" \ -H "Content-Type: application/json" \ -d "{\"tag_name\":\"latest\",\"name\":\"Lotus Chat $VERSION\",\"prerelease\":true,\"body\":\"Built from ${{ github.sha }}\"}" \ | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])") fi APPIMAGE="src-tauri/target/release/bundle/appimage/Cinny_${VERSION}_amd64.AppImage" for file in \ "LotusChat-x86_64.deb|$DEB" \ "LotusChat-x86_64.AppImage|${APPIMAGE}" \ "LotusChat-x86_64.AppImage.tar.gz|${APPIMAGE}.tar.gz" \ "LotusChat-x86_64.AppImage.tar.gz.sig|${APPIMAGE}.tar.gz.sig"; do name="${file%%|*}" path="${file##*|}" echo "Uploading $name" curl -sf -X POST \ "$GITEA_URL/api/v1/repos/$REPO/releases/$RELEASE_ID/assets?name=$name" \ -H "Authorization: token $TOKEN" \ -H "Content-Type: application/octet-stream" \ --data-binary @"$path" done