appuploader-cli CI/CD Auto IPA Upload Tutorial: the upload and info Commands

Integrate appuploader-cli into CI/CD: upload an IPA automatically with one command, no Xcode/Mac needed. Hands-on with upload and info.

If your build pipeline runs on machines without a Mac (for example, a Windows/Linux CI runner), or you simply want to turn the IPA upload step from “manually clicking a button” into “a single command”, appuploader-cli was built for exactly this scenario: it is the command-line tool distributed alongside the main program of AppUploader, functionally equivalent to the “Submit to App Store” button on the web version’s “Files & Submission” page, but it depends on neither Xcode nor macOS.

Prerequisites

The Apple ID used with the upload / info commands must first be authorized on appuploader.net (i.e., the AppUploader license). If it is not authorized or the license has expired, you will get a license failed / license expired message. You can view and activate the license status in “Account Overview”.

Step 1: Locate the executable

appuploader-cli is packaged together with the main program and lives in the runtime/ directory under the installation directory:

  • macOS: runtime/darwin/appuploader-cli
  • Windows: runtime/windows/appuploader-cli.exe

Just enter that directory to run it directly, or add the directory to the CI runner’s PATH environment variable so you can call it directly from scripts.

There is also an appuploader-adi in the same directory; it serves a different purpose (internal use). Do not confuse it with appuploader-cli.

Step 2: Upload the IPA/PKG

1appuploader upload -f <path to IPA/PKG> -u <Apple ID> -p <app-specific password> [--type ios]
Parameter Description
-f, --file Path to the IPA / PKG file to upload (required)
-u, --username Apple ID email (required)
-p, --password App-specific password, in the format xxxx-xxxx-xxxx-xxxx (required, not the login password)
--type Package type: ios / osx / appletvos / xros, defaults to ios

Example:

1appuploader upload -f Payload.ipa -u dev@example.com -p abcd-efgh-ijkl-mnop

The upload process prints progress and result logs in real time. On failure, the log carries the specific reason (such as a duplicate package, a version number conflict, or a signature mismatch), making it easy to pinpoint the problem directly in the CI logs.

Step 3 (optional): Generate the App Store resource description file locally

If you only want to validate the package contents locally before uploading, or you need an AppStoreInfo.plist for another upload tool, use the info command. It only performs local analysis and does not actually upload:

1appuploader info -u <Apple ID> <file path> [-o output file] [--format xml|binary]

The --deterministic parameter fixes fields that would otherwise change, such as the UUID, process ID, and timestamp, making it easy to compare output byte by byte in CI and well suited to writing automated tests.

How to integrate into a CI/CD pipeline

Whether you use Jenkins, GitHub Actions, or any other CI system, the integration is the same: after the build produces the IPA, add a step that runs the appuploader upload command, and inject the Apple ID and app-specific password through the pipeline’s secret/environment-variable mechanism instead of hard-coding them in the script. Because appuploader-cli itself does not depend on macOS, your CI runner does not need to be a Mac either.

Quick troubleshooting

  • license failed / license expired: The Apple ID in use has not been authorized on appuploader.net, or the license has expired. Go to “Account Overview” to activate or renew it.
  • Wrong app-specific password: -p expects the xxxx-xxxx-xxxx-xxxx app-specific password generated by Apple, not the Apple ID login password.
  • Prefer a graphical interface: upload corresponds to the “Submit to App Store” button on the web version’s “Files & Submission” page; the info command is currently available only from the command line.

Go to https://appuploader.net to get appuploader-cli and integrate IPA upload into your automation pipeline.