Skip to content

Add CI/CD pipeline, GitHub Releases, and in-repo Docker support#586

Open
jlaska wants to merge 8 commits into
philippe44:masterfrom
jlaska:ci-releases-docker
Open

Add CI/CD pipeline, GitHub Releases, and in-repo Docker support#586
jlaska wants to merge 8 commits into
philippe44:masterfrom
jlaska:ci-releases-docker

Conversation

@jlaska

@jlaska jlaska commented May 11, 2026

Copy link
Copy Markdown

This PR proposes three improvements:

  1. Moving prebuilt binaries out of git and into proper GitHub Releases with individual per-platform assets (Repository is 2gb+ due to checking in the released zipfiles #577, Better release structure #579)
  2. Adding a CI pipeline that automatically builds all supported platforms using standard apt cross-compilers (no custom toolchain needed — the submodules already ship prebuilt .a archives)
  3. Adding an official multi-arch Docker image built from source in this repo, making an external Docker repository unnecessary.

All changes have been validated end-to-end in a fork before opening this PR.


Summary

Addresses #577 and #579.

  • Move binary zips to Releases — removes AirConnect-1.10.0.zip from the tree and the .gitignore exception, so release artifacts live in GitHub Releases going forward.
  • CI workflow (ci.yml) — validates every push and PR across 10 Linux targets (x86, x86_64, arm, armv5, armv6, aarch64, mips, mipsel, sparc64, powerpc), macOS (arm64 + x86_64 universal), and Windows (Win32) using standard GitHub-hosted runners and apt cross-compilers. FreeBSD and Solaris are excluded (no CI runners available); build.sh remains fully functional for manual builds of those platforms.
  • Release workflow (release.yml) — triggered by v* tags. Builds all automated platforms, uploads each binary as an individual release asset (as requested in Better release structure #579), and also produces a combined zip for backward compatibility.
  • Docker (docker.yml + docker/Dockerfile) — multi-stage build from source, published to ghcr.io/philippe44/airconnect for linux/amd64 and linux/arm64, making an external Docker repository unnecessary. Supports AIRCONNECT_MODE=aircast|airupnp|both.
  • docker-compose.yml — ready-to-use compose file with network_mode: host.
  • README — updated with Docker usage, CI badges, and a link to the Releases page for downloads.

Key implementation note

The cross-compiler concern from #579 turns out to be manageable for the AirConnect source itself: all library submodules (libraop, libpupnp, libcodecs, libmdns, libopenssl, etc.) already ship prebuilt .a static archives under their targets/ directories, so CI compiles just the AirConnect C source (~5,800 lines) using standard apt cross-compiler packages. The CFLAGS per target (e.g. -march=mips32, -mcpu=v7) are taken directly from build.sh.

Test plan

  • Verify CI workflow passes on this PR across all matrix jobs
  • Validate release asset upload and combined zip via test tag in fork
  • Validate Docker multi-arch image build and push to GHCR via test tag in fork
  • Run docker build -f docker/Dockerfile . locally (requires git submodule update --init --recursive first)
  • Run docker compose up and confirm both services start

🤖 Generated with Claude Code

- Remove AirConnect-1.10.0.zip and !AirConnect*.zip gitignore exception;
  binaries now live exclusively in GitHub Releases (closes philippe44#577)
- Add .github/workflows/ci.yml: build validation on every push/PR for
  Linux (x86_64, aarch64, arm, armv6), macOS (arm64), and Windows (Win32)
- Add .github/workflows/release.yml: tag-triggered workflow that builds
  all platforms, uploads individual binaries and a combined zip as release
  assets (closes philippe44#579)
- Add .github/workflows/docker.yml: publishes multi-arch (amd64 + arm64)
  images to ghcr.io/jlaska/airconnect on every release tag
- Add docker/Dockerfile and docker/docker-entrypoint.sh: multi-stage build
  from source, minimal debian:bookworm-slim runtime, AIRCONNECT_MODE env var
  to select aircast | airupnp | both (default)
- Add docker-compose.yml with host networking for mDNS/SSDP discovery
- Add .dockerignore
- Update README: Docker pull instructions, Releases page download link,
  CI badge; remove stale wget-from-master-branch instructions

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@jlaska jlaska marked this pull request as draft May 11, 2026 12:19
jlaska and others added 7 commits May 11, 2026 08:25
The prebuilt linux/arm library archives were compiled with hard-float
ABI (VFP register arguments). arm-linux-gnueabi-gcc (soft-float) cannot
link against them; arm-linux-gnueabihf-gcc (hard-float) is required.
The armv6 target correctly uses gnueabi (soft-float libs).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Without a .sln, $(SolutionDir) resolves to the vcxproj directory
(aircast\ or airupnp\), not the repo root. Pass /p:OutDir explicitly
so all binaries land in bin\, then rename to the release convention.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
gcc alone doesn't pull in libc-dev on Debian. build-essential
includes gcc, make, and the standard C headers.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Workflows already use ${{ github.repository_owner }} and are
namespace-agnostic. Update README and docker-compose.yml so the
PR is ready to use as-is when merged into philippe44/AirConnect.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Using jlaska namespace for testing in the fork; these will be
updated to philippe44 before the upstream PR is merged.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Badges now sit at the very top of the README before the h1 title,
which is standard practice. All references updated from jlaska to
philippe44 so the change is PR-ready.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add x86, armv5, mips, mipsel, sparc64, and powerpc to CI and release
workflows using standard apt cross-compiler packages. Special CFLAGS
from build.sh applied per target (-march=mips32, -mcpu=v7, etc.).

This brings automated platform coverage to 10 Linux targets + macOS
universal + Windows, matching all platforms except FreeBSD and Solaris
which have no available CI runners.

Also reorder README: standalone binary install leads, Docker section
follows. Note FreeBSD/Solaris require manual builds via build.sh.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@jlaska jlaska marked this pull request as ready for review May 12, 2026 00:52
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