# Primary path for player-facing binaries: every *published* GitHub Release on this repo # is mirrored to your self-hosted Gitea (same tag). No public GitHub distro repo. # # Triggers: # - release: published / released → GitHub “Release” (not a raw git tag alone). # - workflow_dispatch → Actions → this workflow → “Run workflow” (enter tag). # # Troubleshooting: “Re-run failed jobs” on an OLD run replays the *original* workflow # YAML (e.g. still runs `npm run pack:win` without --publish never). After changing this # file on default branch, start a *new* run via “Run workflow”, not Re-run on a pre-fix run. # # Important: pushing only a git tag does NOT run this — you must create/publish a # Release on github.com (Releases → Draft/new release → Publish). The workflow # definition must exist on the repo DEFAULT branch (GitHub runs it from there). # # Steps: Windows (NSIS+portable) + Linux (AppImage) in parallel, launcher from DEFAULT BRANCH # overlay on tag checkout → merge with GitHub release assets → upload all to Gitea. # # Secrets: GITEA_BASE_URL, GITEA_TOKEN, GITEA_OWNER, GITEA_REPO # Optional variable: GITEA_TARGET_REF (see tools/fractured-launcher-electron/README.md) # # Job guard: edit `if:` if github.repository is not HighSocietyRaiding/Fractured. name: Sync release to Gitea on: release: types: [published, released] workflow_dispatch: inputs: tag: description: 'Git tag only (e.g. v0.7.11-paragon-foo). NOT the release title — open the release and copy the tag next to the title.' required: true type: string permissions: contents: read concurrency: group: gitea-release-sync-${{ github.repository }}-${{ github.event_name == 'workflow_dispatch' && github.event.inputs.tag || github.event.release.tag_name }} cancel-in-progress: false jobs: meta: runs-on: ubuntu-latest if: github.repository == 'HighSocietyRaiding/Fractured' outputs: tag: ${{ steps.t.outputs.tag }} steps: - name: Resolve tag id: t shell: bash run: | set -euo pipefail if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then RAW="${{ github.event.inputs.tag }}" else RAW="${{ github.event.release.tag_name }}" fi TAG="$(printf '%s' "$RAW" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')" if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then if [ -z "$TAG" ]; then echo '::error::Tag input is empty. Paste the git tag (e.g. v0.7.11-…).' exit 1 fi if printf '%s' "$TAG" | grep -q '[[:space:]]'; then echo '::error::Tag contains whitespace — that is usually the **release title**, not the tag. On GitHub → Releases → open the release → copy the **tag** (short ref like v0.7.11-…), not the long title line.' exit 1 fi fi { echo "tag<<__TAG_EOF__" echo "$TAG" echo "__TAG_EOF__" } >> "$GITHUB_OUTPUT" build-electron: needs: meta if: github.repository == 'HighSocietyRaiding/Fractured' runs-on: windows-latest timeout-minutes: 45 steps: - uses: actions/checkout@v4 with: ref: ${{ needs.meta.outputs.tag }} # Release tags often point at server/game commits that predate launcher lib fixes. # Always pack the launcher from default branch so app.asar includes the full tree. - name: Overlay launcher from default branch shell: bash run: | set -euo pipefail DB="${{ github.event.repository.default_branch }}" git fetch --no-tags --depth=1 origin "+refs/heads/${DB}:refs/remotes/origin/${DB}" git checkout "origin/${DB}" -- tools/fractured-launcher-electron - uses: actions/setup-node@v4 with: node-version: '20' cache: npm cache-dependency-path: tools/fractured-launcher-electron/package-lock.json - name: Install and pack (NSIS + portable) working-directory: tools/fractured-launcher-electron run: | npm ci node -p "'Launcher package.json version: ' + require('./package.json').version" npm run pack:win - name: Stage launcher files for upload shell: pwsh run: | New-Item -ItemType Directory -Force -Path launcher-publish | Out-Null Copy-Item tools/fractured-launcher-electron/dist/*.exe launcher-publish/ if (Test-Path tools/fractured-launcher-electron/dist/latest.yml) { Copy-Item tools/fractured-launcher-electron/dist/latest.yml launcher-publish/ } - uses: actions/upload-artifact@v4 with: name: electron-dist-windows path: launcher-publish/ build-electron-linux: needs: meta if: github.repository == 'HighSocietyRaiding/Fractured' runs-on: ubuntu-latest timeout-minutes: 45 steps: - uses: actions/checkout@v4 with: ref: ${{ needs.meta.outputs.tag }} - name: Overlay launcher from default branch shell: bash run: | set -euo pipefail DB="${{ github.event.repository.default_branch }}" git fetch --no-tags --depth=1 origin "+refs/heads/${DB}:refs/remotes/origin/${DB}" git checkout "origin/${DB}" -- tools/fractured-launcher-electron - uses: actions/setup-node@v4 with: node-version: '20' cache: npm cache-dependency-path: tools/fractured-launcher-electron/package-lock.json - name: Install and pack (AppImage) working-directory: tools/fractured-launcher-electron run: | npm ci node -p "'Launcher package.json version: ' + require('./package.json').version" npm run pack:linux - name: Stage Linux launcher for upload shell: bash run: | set -euo pipefail mkdir -p launcher-linux-publish shopt -s nullglob cp -f tools/fractured-launcher-electron/dist/*.AppImage launcher-linux-publish/ 2>/dev/null || true for f in tools/fractured-launcher-electron/dist/latest.yml tools/fractured-launcher-electron/dist/latest-linux.yml; do if [ -f "$f" ]; then cp -f "$f" launcher-linux-publish/; fi done ls -la launcher-linux-publish/ if ! compgen -G "launcher-linux-publish/*.AppImage" > /dev/null; then echo "No AppImage under dist/ — electron-builder linux target failed" >&2 exit 1 fi - uses: actions/upload-artifact@v4 with: name: electron-dist-linux path: launcher-linux-publish/ sync-gitea: needs: [meta, build-electron, build-electron-linux] if: github.repository == 'HighSocietyRaiding/Fractured' runs-on: ubuntu-latest env: GITEA_BASE_URL: ${{ secrets.GITEA_BASE_URL }} GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} GITEA_OWNER: ${{ secrets.GITEA_OWNER }} GITEA_REPO: ${{ secrets.GITEA_REPO }} GITEA_TARGET_REF: ${{ vars.GITEA_TARGET_REF }} steps: - uses: actions/checkout@v4 with: # Script may not exist on older release tags; always use default branch. ref: ${{ github.event.repository.default_branch }} sparse-checkout: | tools/fractured-launcher-electron/scripts sparse-checkout-cone-mode: true - uses: actions/download-artifact@v4 with: name: electron-dist-windows path: /tmp/electron-win - uses: actions/download-artifact@v4 with: name: electron-dist-linux path: /tmp/electron-linux - name: Merge GitHub release assets + Electron build env: GH_TOKEN: ${{ github.token }} run: | set -euo pipefail . tools/fractured-launcher-electron/scripts/release-sync-filters.sh TAG="${{ needs.meta.outputs.tag }}" mkdir -p combined mkdir -p /tmp/from-main if gh release download "$TAG" -R "${{ github.repository }}" -D /tmp/from-main 2>/tmp/dl.err; then shopt -s nullglob for f in /tmp/from-main/*; do if [ -f "$f" ]; then bn=$(basename "$f") if should_skip_merge_from_github "$bn"; then echo "Skipping GitHub release asset (CI launcher or excluded): $bn" continue fi cp -f "$f" combined/ fi done echo "Merged assets from ${{ github.repository }} release $TAG" else echo "GitHub release download note (continuing with launcher only):" cat /tmp/dl.err || true fi shopt -s nullglob for f in /tmp/electron-win/* /tmp/electron-linux/*; do if [ -f "$f" ]; then cp -f "$f" combined/ fi done ls -la combined/ - name: Upload to Gitea run: | set -euo pipefail for v in GITEA_BASE_URL GITEA_TOKEN GITEA_OWNER GITEA_REPO; do if [ -z "${!v:-}" ]; then echo "Missing secret $v — add it under repo Settings → Secrets and variables → Actions." >&2 exit 1 fi done bash tools/fractured-launcher-electron/scripts/upload-release-to-gitea.sh combined "${{ needs.meta.outputs.tag }}"