Reusable GitHub Actions & workflows

Ship mobile apps to TestFlight
& Google Play without the pain.

Code signing, build, archive, and upload — collapsed into a single uses: line for iOS and Android. Centralized signing, org-level secrets, and one pipeline every repo gets fixes for at once.

jobs:
  ios:
    uses: mieweb/actions/.github/workflows/build-ios-from-meteor.yml@v2
    secrets: inherit
    with:
      app_identifier: org.mieweb.os.dev
      meteor_server: https://app.example.com

Push, and TestFlight gets a build.

The pain it removes

Shipping an iOS app from CI is deceptively hard. The build is the easy part — the pain is everything around it.

Code signing is a black hole

Certs, provisioning profiles, keychains, the Developer portal, .p12 exports, App Store Connect API keys. Get one wrong and you get a cryptic failure after a 20-minute build.

Secrets copied everywhere

Every repo re-pastes the same base64 cert, team ID, and API key. Rotate a cert and you're editing ten repos by hand.

150 lines of drifting YAML

Xcode select, Node + Meteor/Expo setup, pod install, Fastlane, archive, upload — copy-pasted between repos, then drifting out of sync.

"Works on my machine"

Local builds sign fine; CI fails because the runner has no keychain and no certs. Debugging means pushing commit after commit on a slow macOS runner.

Fastlane / Ruby / CocoaPods tax

Pinning Ruby, bundler caching, gem installs, Cordova pod quirks — incidental work that has nothing to do with your app.

These actions absorb all of it

Signing is centralized, secrets live once at the org level, and the whole pipeline is one line every repo gets fixes for at once.

Components

Composite action

prepare-meteor-cordova-env

Prepare a Meteor/Cordova iOS build environment — Xcode, Node, Meteor, npm install — before building.

Composite action

prepare-expo-env

Prepare an Expo build environment — Xcode, Node, JS deps — before expo prebuild.

Composite action

prepare-android-env

Prepare a Meteor/Cordova Android build environment — JDK, Node, Android SDK, Gradle, Meteor — before building.

Composite action

run-meteor-build

Run meteor build for a platform with a configurable DDP server URL and output directory.

Composite action

sign-archive-upload-ios

Sign, archive, and optionally upload an iOS app to TestFlight. Use directly for bare React Native or custom pipelines.

Composite action

build-sign-android

Build and sign an Android AAB/APK from a Cordova/Gradle project — direct-keystore or fastlane signing.

Composite action

publish-android-to-play

Upload a signed AAB to a Google Play track — internal, beta, or production with staged rollout.

Reusable workflow

build-ios-from-meteor.yml

One-call end-to-end pipeline for Meteor/Cordova iOS apps.

Reusable workflow

build-ios-from-expo.yml

One-call end-to-end pipeline for Expo iOS apps.

Reusable workflow

build-android-from-meteor.yml

One-call end-to-end pipeline for Meteor/Cordova Android apps — build, sign, and publish to Google Play.

Reusable workflow

build-mobile-from-meteor.yml

One-call pipeline that builds iOS and Android in parallel from a single caller.

Quick start

1

Store signing secrets at the org level

Add APPLE_TEAM_ID, MATCH_GIT_BASIC_AUTHORIZATION, MATCH_PASSWORD, APPLE_API_KEY_ID, APPLE_API_ISSUER_ID, and APPLE_API_KEY_P8_BASE64 once. Every repo inherits them.

2

Call the reusable workflow

Add a workflow to your repo with secrets: inherit and your app identifier.

name: iOS
on: [push]
jobs:
  ios:
    uses: mieweb/actions/.github/workflows/build-ios-from-meteor.yml@v2
    secrets: inherit
    with:
      app_identifier: org.mieweb.os.dev
      meteor_server: https://app.example.com
3

Push

TestFlight gets a signed build. No keychain wrangling, no copy-pasted YAML.