Skip to content

ci: the AppImage tooling runs without FUSE - #29

Merged
jcelerier merged 1 commit into
masterfrom
ci/appimage-no-fuse
Oct 11, 2026
Merged

jcelerier merged 1 commit into
masterfrom
ci/appimage-no-fuse

Conversation

@jcelerier

Copy link
Copy Markdown
Member

Every Linux packaging job that goes through these actions dies after about
twenty minutes of building, at the first AppImage it has to write. This is what
sat-mtl/livepose#83 only failing check was:

/usr/bin/fusermount3: mount failed: Operation not permitted
Cannot mount AppImage, please check your FUSE setup.
open dir error: No such file or directory
##[error]Process completed with exit code 127.

appimagetool is itself an AppImage, so running it needs either FUSE — which is
unavailable under rootless docker on the self-hosted host — or
APPIMAGE_EXTRACT_AND_RUN. score's own appimage.yml sets it on the job, with
this same reasoning in a comment, and ci/appimage.deps.sh says in so many
words that libfuse2 is therefore not required. A caller reaching those same
scripts through these actions has to set it too, and did not.

Two steps, one per AppImage that gets written

action step script AppImage
custom-score-build Build ci/appimage.build.sh score's own — where livepose#83 failed
package-custom-app Create custom app packages tools/create-app-linux.sh the app's own — the next place it would have failed

The second one matters: livepose never got that far, so fixing only the first
would have moved the failure rather than removed it.

Verified

appimagetool on a minimal AppDir with no fusermount on $PATH:

exit result
variable unset 127 open dir error: No such file or directory, no output file — the CI failure verbatim
APPIMAGE_EXTRACT_AND_RUN=1 0 AppImage written

The --appimage-extract at create-app-linux.sh:57 was checked the same way
and exits 0 with no FUSE, so those two steps are the whole exposure.

Both files parse as YAML and the variable lands on the intended step only.

Why here rather than only in score

score is getting the same default in ci/appimage.build.sh through
ossia/score#2330, but every tool repo pins
ossia/actions/...@master and builds score from score's master, so a fix that
lives only in score reaches none of them until that PR merges. This one takes
effect as soon as it lands.

🤖 Generated with Claude Code

https://claude.ai/code/session_019QYyvhRXvSMSRQPaq12Teq

Every Linux packaging job that goes through these actions dies after
about twenty minutes of building, at the first AppImage it has to write:

    /usr/bin/fusermount3: mount failed: Operation not permitted
    Cannot mount AppImage, please check your FUSE setup.
    open dir error: No such file or directory
    ##[error]Process completed with exit code 127.

appimagetool is itself an AppImage, so running it needs either FUSE --
unavailable under rootless docker on the self-hosted host -- or
APPIMAGE_EXTRACT_AND_RUN. score's own appimage.yml sets that on the job,
with the same reasoning in a comment, and ci/appimage.deps.sh says in so
many words that libfuse2 is therefore not required; a caller reaching
the same scripts through these actions has to set it too, and did not.

Two steps need it, one per AppImage that gets written:

- custom-score-build's Build, which runs score's ci/appimage.build.sh
  (this is where sat-mtl/livepose#83 failed)
- package-custom-app's Create custom app packages, which runs
  tools/create-app-linux.sh for the app's own AppImage -- the next place
  it would have failed

Checked with appimagetool on an AppDir with no fusermount on $PATH:
unset, exit 127 with the same "open dir error" line and no output file;
with the variable, exit 0 and the AppImage is written. The
`--appimage-extract` at create-app-linux.sh:57 was checked the same way
and needs no FUSE, so those two steps are the whole exposure.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019QYyvhRXvSMSRQPaq12Teq
jcelerier added a commit to ossia/score that referenced this pull request Oct 11, 2026
`ci/appimage.build.sh` runs appimagetool, which is itself an AppImage, so
it needs either FUSE or APPIMAGE_EXTRACT_AND_RUN. FUSE is unavailable
under rootless docker on the self-hosted host, which is why
appimage.yml sets the variable on the job and appimage.deps.sh says in
so many words that libfuse2 is therefore not required.

The tool repositories reach the same script through
ossia/actions/custom-score-build, which did not set it, so every
packaging job that went that way died at the same place:

    /usr/bin/fusermount3: mount failed: Operation not permitted
    Cannot mount AppImage, please check your FUSE setup.
    open dir error: No such file or directory
    ##[error]Process completed with exit code 127.

That is fixed in the action itself, in ossia/actions#29, which is what
actually unblocks the tools -- they pin the action at @master. The
default here is for anyone running the script by hand on a machine
without FUSE, and `${VAR:-1}` leaves a caller that wants FUSE able to
ask for it.

Reproduced and checked locally by running appimagetool on an AppDir with
no fusermount on $PATH: unset, it exits 127 with the same "open dir
error" line; with the variable, exit 0 and the AppImage is written.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019QYyvhRXvSMSRQPaq12Teq
@jcelerier
jcelerier merged commit 14b0e48 into master Oct 11, 2026
jcelerier added a commit to ossia/score that referenced this pull request Oct 12, 2026
`ci/appimage.build.sh` runs appimagetool, which is itself an AppImage, so
it needs either FUSE or APPIMAGE_EXTRACT_AND_RUN. FUSE is unavailable
under rootless docker on the self-hosted host, which is why
appimage.yml sets the variable on the job and appimage.deps.sh says in
so many words that libfuse2 is therefore not required.

The tool repositories reach the same script through
ossia/actions/custom-score-build, which did not set it, so every
packaging job that went that way died at the same place:

    /usr/bin/fusermount3: mount failed: Operation not permitted
    Cannot mount AppImage, please check your FUSE setup.
    open dir error: No such file or directory
    ##[error]Process completed with exit code 127.

That is fixed in the action itself, in ossia/actions#29, which is what
actually unblocks the tools -- they pin the action at @master. The
default here is for anyone running the script by hand on a machine
without FUSE, and `${VAR:-1}` leaves a caller that wants FUSE able to
ask for it.

Reproduced and checked locally by running appimagetool on an AppDir with
no fusermount on $PATH: unset, it exits 127 with the same "open dir
error" line; with the variable, exit 0 and the AppImage is written.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019QYyvhRXvSMSRQPaq12Teq
jcelerier added a commit to ossia/score that referenced this pull request Oct 12, 2026
`ci/appimage.build.sh` runs appimagetool, which is itself an AppImage, so
it needs either FUSE or APPIMAGE_EXTRACT_AND_RUN. FUSE is unavailable
under rootless docker on the self-hosted host, which is why
appimage.yml sets the variable on the job and appimage.deps.sh says in
so many words that libfuse2 is therefore not required.

The tool repositories reach the same script through
ossia/actions/custom-score-build, which did not set it, so every
packaging job that went that way died at the same place:

    /usr/bin/fusermount3: mount failed: Operation not permitted
    Cannot mount AppImage, please check your FUSE setup.
    open dir error: No such file or directory
    ##[error]Process completed with exit code 127.

That is fixed in the action itself, in ossia/actions#29, which is what
actually unblocks the tools -- they pin the action at @master. The
default here is for anyone running the script by hand on a machine
without FUSE, and `${VAR:-1}` leaves a caller that wants FUSE able to
ask for it.

Reproduced and checked locally by running appimagetool on an AppDir with
no fusermount on $PATH: unset, it exits 127 with the same "open dir
error" line; with the variable, exit 0 and the AppImage is written.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019QYyvhRXvSMSRQPaq12Teq
jcelerier added a commit to ossia/score that referenced this pull request Oct 13, 2026
`ci/appimage.build.sh` runs appimagetool, which is itself an AppImage, so
it needs either FUSE or APPIMAGE_EXTRACT_AND_RUN. FUSE is unavailable
under rootless docker on the self-hosted host, which is why
appimage.yml sets the variable on the job and appimage.deps.sh says in
so many words that libfuse2 is therefore not required.

The tool repositories reach the same script through
ossia/actions/custom-score-build, which did not set it, so every
packaging job that went that way died at the same place:

    /usr/bin/fusermount3: mount failed: Operation not permitted
    Cannot mount AppImage, please check your FUSE setup.
    open dir error: No such file or directory
    ##[error]Process completed with exit code 127.

That is fixed in the action itself, in ossia/actions#29, which is what
actually unblocks the tools -- they pin the action at @master. The
default here is for anyone running the script by hand on a machine
without FUSE, and `${VAR:-1}` leaves a caller that wants FUSE able to
ask for it.

Reproduced and checked locally by running appimagetool on an AppDir with
no fusermount on $PATH: unset, it exits 127 with the same "open dir
error" line; with the variable, exit 0 and the AppImage is written.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019QYyvhRXvSMSRQPaq12Teq
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