Distribute a signed mobile build (.ipa/.apk) to testers: upload to your S3, generate install manifests + QR, push 'build ready' to the Fjord app. Self-hosted TestFlight.
- JavaScript 80.3%
- Shell 15.1%
- Makefile 4.6%
|
All checks were successful
test / unit (push) Successful in 5s
Distribute a signed mobile build (.ipa/.apk) to testers: upload to your own S3, generate the install manifest (iOS itms-services plist / Android install page), presign the download links, optionally render a QR, and push 'build ready, tap to install' to the Fjord relay. Self-hosted TestFlight / Firebase App Distribution; no github.com, no third-party. node20 action. Vendors a dependency-free SigV4 presigner (validated against AWS's reference signing-key vector) for presigned PUT upload + GET install links, so the bucket stays private. Offline suite: SigV4 vector + manifest unit tests, plus iOS/Android integration against a mock S3 + relay. |
||
|---|---|---|
| .forgejo/workflows | ||
| src | ||
| tests | ||
| .gitignore | ||
| action.yml | ||
| CHANGELOG.md | ||
| LICENSE | ||
| Makefile | ||
| README.md | ||
Fjord Distribute
Self-hosted TestFlight. Take a signed .ipa/.apk, upload it to your own
S3, generate the install manifest (iOS itms-services plist / Android install
page), presign the download links, and push "build ready, tap to install" to the
Fjord app. No third-party distribution service, no github.com.
Part of the Fjord Actions
bundle. Pairs with
apple-codesign-action
(sign first) and
fjord-notify-action
(the relay it pushes to).
Usage
jobs:
beta:
runs-on: macos # for iOS signing; android can run on linux
env:
RASTER_ARTIFACTS_S3_BUCKET: ${{ vars.RASTER_ARTIFACTS_S3_BUCKET }}
RASTER_ARTIFACTS_S3_ENDPOINT: ${{ vars.RASTER_ARTIFACTS_S3_ENDPOINT }}
RASTER_ARTIFACTS_S3_REGION: ${{ vars.RASTER_ARTIFACTS_S3_REGION }}
RASTER_ARTIFACTS_S3_ACCESS_KEY_ID: ${{ secrets.ARTIFACTS_S3_KEY_ID }}
RASTER_ARTIFACTS_S3_SECRET_ACCESS_KEY: ${{ secrets.ARTIFACTS_S3_SECRET }}
steps:
- uses: actions/checkout@v6
- run: ./build-and-sign.sh # produces build/MyApp.ipa
- uses: https://rasterhub.com/rasterstate/fjord-distribute-action@v1
with:
path: build/MyApp.ipa
bundle-id: com.acme.app
version: ${{ github.ref_name }}
channel: beta
env:
FJORD_RELAY_URL: ${{ vars.FJORD_RELAY_URL }}
FJORD_RELAY_TOKEN: ${{ secrets.FJORD_RELAY_TOKEN }}
Testers get a push in the Fjord app, tap Install, and the build lands on the device. The install/download links are presigned (default 7 days), so the bucket stays private.
Inputs
| Input | Default | Description |
|---|---|---|
path |
(required) | The signed .ipa or .apk. |
platform |
auto |
ios / android (inferred from the extension). |
bundle-id |
iOS bundle identifier (required for .ipa). |
|
title |
repo name | App title shown to testers. |
version |
GITHUB_REF_NAME |
Version/build label. |
channel |
internal |
Distribution channel (part of the storage path). |
scope |
GITHUB_REPOSITORY |
Storage key prefix. |
expires-days |
7 |
Lifetime of the presigned links. |
qr |
true |
Render a scannable QR (needs qrencode on the runner). |
notify |
true |
Push "build ready" to the Fjord relay. |
relay-url / relay-token |
FJORD_RELAY_* env |
Relay endpoint + token. |
Outputs
| Output | Description |
|---|---|
install-url |
itms-services:// link (iOS) or the apk URL (Android). |
download-url |
Presigned direct download. |
manifest-url |
Presigned plist (iOS) / install page (Android). |
version |
The version label used. |
How it works
- Uploads to your artifacts S3 (
RASTER_ARTIFACTS_S3_*, the same backend the cache/artifact actions use) under<scope>/<channel>/<version>/, via a presigned PUT, so no extra credentials handling and the bucket stays private. - iOS: generates an
itms-servicesplist pointing at the presigned.ipaURL, uploads it, and returnsitms-services://?action=download-manifest&url=.... iOS requires the plist and ipa to be HTTPS; presigned S3 URLs are. - Android: uploads a small install page and returns the presigned apk URL.
- Bundled SigV4 presigner (no AWS SDK) works against any S3-compatible endpoint, virtual-hosted or path-style.
There is no GitHub Actions equivalent: GitHub has no app-distribution target.
License
MIT, see LICENSE.