Skip to content

fix(ci): ship Linux release as a self-contained AppImage again - #107

Merged
NonPolynomialTim merged 2 commits into
mainfrom
fix/ci-linux-appimage
Jul 30, 2026
Merged

fix(ci): ship Linux release as a self-contained AppImage again#107
NonPolynomialTim merged 2 commits into
mainfrom
fix/ci-linux-appimage

Conversation

@NonPolynomialTim

Copy link
Copy Markdown
Collaborator

Why

v2.0.0 replaced the v1.8.4 AppImage with a bare, dynamically-linked openxcom binary. A bare binary needs the matching system SDL libraries and a new-enough glibc to even start — so players on other distros report "can't run it" while the regular OXCE works. (Reported by a player on the Linux download.)

What

Restore the self-contained AppImage in the build-linux job of ci-main.yml, and mirror it into the PR gate copy in ci-validate.yml:

  • container: ubuntu:20.04 — an AppImage bundles its libs but not glibc, so its portability floor is the build host's glibc. Building on ubuntu-latest (glibc 2.39) would lock out older distros and reproduce the bug; the 20.04 container drops the floor to glibc 2.31. Same container pattern as build-winxp.
  • linuxdeploy bundles the binary + its shared libs into OpenXcoop-x86_64.AppImage (v1.8.4 asset name kept). APPIMAGE_EXTRACT_AND_RUN=1 because hosted runners have no FUSE. Reuses the repo's res/linux/openxcom.desktop + icon.
  • The data folders still ship next to the AppImage in the tarball; the game finds common/, standard/ and rendezvous.json via the ./ (CWD) entry in findDataFolders(), so no source change is needed — same behaviour as v1.8.4. A HOW_TO_RUN.txt spells out "run it from this folder".
  • CHANGELOG [Unreleased] entry.

Not covered / notes

  • Not yet run through CI. YAML validates and the logic mirrors the working build-winxp container job; the AppImage build itself is exercised by this PR's build-linux gate and, post-merge, by the nightly.
  • linuxdeploy resolves libs via ldd. SDL 1.2 debian libs link their codecs directly (unlike SDL2_image/_mixer, which dlopen), so libpng/vorbis get bundled. If a build ever errors on a missing codec, add --library flags.
  • The ci-validate copy stops at the asserted tree (no upload), so it proves the AppImage builds but produces no downloadable artifact — the testable tarball comes from the nightly (ci-mainpkg-linux, 7-day retention).

🤖 Generated with Claude Code

NonPolynomialTim and others added 2 commits July 30, 2026 18:56
v2.0.0 replaced the v1.8.4 AppImage with a bare dynamically-linked
binary, which needs matching system SDL libraries and a new-enough glibc
to start - so players on other distros cannot run it.

Rebuild build-linux in an ubuntu:20.04 container (glibc 2.31) and bundle
the binary + its libs into OpenXcoop-x86_64.AppImage via linuxdeploy. The
data folders still ship next to it (the game finds them via the "./" CWD
entry in findDataFolders), plus a HOW_TO_RUN.txt. The container drops
sudo and installs git/python3 before checkout, matching build-winxp.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ci-validate's build-linux mirrors ci-main's so a PR cannot land a Linux
build that only works post-merge. Apply the same ubuntu:20.04 container +
linuxdeploy AppImage step here, and assert the AppImage (not the bare
binary) in the staged tree. This gate still uploads nothing, so it proves
the AppImage packaging without producing a downloadable artifact.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@NonPolynomialTim
NonPolynomialTim enabled auto-merge (squash) July 30, 2026 23:05
@NonPolynomialTim
NonPolynomialTim merged commit 5df26db into main Jul 30, 2026
10 checks passed
NonPolynomialTim added a commit that referenced this pull request Jul 31, 2026
…read)

Rebuilt as a single clean delta on top of main (the branch predated #107's
squash, so its old pre-squash AppImage commits conflicted with main).

build-linux now: debian:11 (glibc 2.31 floor) + jsoncpp 1.9.5 built from
source into /usr/local (distro 1.9.4/1.7.4 makes the coop code's raw
int64/uint64 -> Json::Value writes ambiguous on gcc) + -pthread (glibc
2.31 has a separate libpthread the CMake build never links). Validated
green end-to-end via a branch ci-main dispatch. Mirrored into ci-validate.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
NonPolynomialTim added a commit that referenced this pull request Jul 31, 2026
…read) (#108)

Rebuilt as a single clean delta on top of main (the branch predated #107's
squash, so its old pre-squash AppImage commits conflicted with main).

build-linux now: debian:11 (glibc 2.31 floor) + jsoncpp 1.9.5 built from
source into /usr/local (distro 1.9.4/1.7.4 makes the coop code's raw
int64/uint64 -> Json::Value writes ambiguous on gcc) + -pthread (glibc
2.31 has a separate libpthread the CMake build never links). Validated
green end-to-end via a branch ci-main dispatch. Mirrored into ci-validate.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant