When Jenkins is used for iOS release, the process can be split into two parts:

  1. The macOS node is responsible for building the IPA.
  2. Jenkins calls a command-line tool to upload the IPA.

If the IPA has already been generated by Xcode, Fastlane, Flutter, or uni-app cloud packaging, Jenkins only needs to handle the upload stage.

Variables to Prepare in Jenkins

Save the following in Jenkins credentials or environment variables:

APPLE_ID=your@email.com
APP_PASSWORD=xxxx-xxxx-xxxx-xxxx
IPA_PATH=build/app.ipa

Here, APP_PASSWORD is an Apple app-specific password, not the Apple ID login password.

Uploading with AppUploader CLI

After downloading AppUploader, find the command-line tool in the runtime directory.

On Linux/macOS, first add execute permission: chmod +x appuploader_cli.

Jenkins Pipeline example:

pipeline {
    agent any

    environment {
        APPLE_ID = credentials('apple-id')
        APP_PASSWORD = credentials('apple-app-password')
        IPA_PATH = 'build/app.ipa'
    }

    stages {
        stage('Check IPA') {
            steps {
                sh '''
                if [ ! -f "$IPA_PATH" ]; then
                  echo "IPA not found: $IPA_PATH"
                  exit 1
                fi
                '''
            }
        }

        stage('Upload to App Store') {
            steps {
                sh '''
                ./appuploader_cli upload \
                  -f "$IPA_PATH" \
                  -u "$APPLE_ID" \
                  -p "$APP_PASSWORD" \
                  --type ios
                '''
            }
        }
    }
}

Coordination with the Build Stage

If Jenkins is also responsible for building, the division of labor can be as follows:

Stage Tool
Build IPA Xcode / Fastlane / Flutter
Certificates & Profiles AppUploader
Upload IPA AppUploader CLI
Review Submission App Store Connect

When uploading, AppUploader CLI automatically handles upload metadata, including AppStoreInfo.plist, without manual generation.

Post-Upload Verification

Go to “App Store Connect → TestFlight” to confirm whether the new build appears.

If it does not appear, check the following:

  • Whether the Build number has been incremented
  • Whether the Bundle ID is consistent
  • Whether the IPA is signed with an App Store provisioning profile
  • Whether the Apple app-specific password is valid