When Jenkins is used for iOS release, the process can be split into two parts:
- The macOS node is responsible for building the IPA.
- 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