Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Travis CI + TestFlight integration (updated for Travis' new Mac VM setup / xctool)
language: objective-c
xcode_workspace: "<WorkspaceName.xcworkspace>"
xcode_scheme: "<SchemaName>"
script: xctool -workspace <WorkspaceName.xcworkspace> -scheme <SchemeName> -configuration Release build archive
before_script:
- ./scripts/travis/add-key.sh
after_script:
- ./scripts/travis/remove-key.sh
after_success:
- ./scripts/travis/testflight.sh
env:
global:
- APPNAME="<AppName>"
- 'DEVELOPER_NAME="iPhone Distribution: <My Company> (<ID>)"'
- PROFILE_UUID=XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

Deploy an app automatically to testflight using travis ci.

  1. Copy the .travis.yml into your repo (replace app name, developer name and provisionin profile uuid)
  2. Create the folder "scripts/travis"
  3. Export the following things from the Keychain app
  4. "Apple Worldwide Developer Relations Certification Authority" into scripts/travis/apple.cer
  5. Your iPhone Distribution certificate into scripts/travis/dist.cer
  6. Your iPhone Distribution private key into scripts/travis/dist.p12 (choose a password)
  7. Execute travis encrypt "KEY_PASSWORD=YOUR_KEY_PASSWORD" --add
  8. Execute travis encrypt "TEAM_TOKEN=TESTFLIGHT_TEAM_TOKEN" --add
  9. Execute travis encrypt "API_TOKEN=TESTFLIGHT_API_TOKEN" --add
  10. Copy add-key.sh, remove-key.sh and testflight.sh into scripts/travis
  11. Commit
security create-keychain -p travis ios-build.keychain
security import ./scripts/travis/apple.cer -k ~/Library/Keychains/ios-build.keychain -T /usr/bin/codesign
security import ./scripts/travis/dist.cer -k ~/Library/Keychains/ios-build.keychain -T /usr/bin/codesign
security import ./scripts/travis/dist.p12 -k ~/Library/Keychains/ios-build.keychain -P $KEY_PASSWORD -T /usr/bin/codesign
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
cp ./scripts/travis/profile/* ~/Library/MobileDevice/Provisioning\ Profiles/
security delete-keychain ios-build.keychain
rm -f ~/Library/MobileDevice/Provisioning\ Profiles/*
#!/bin/sh
if [[ "$TRAVIS_PULL_REQUEST" != "false" ]]; then
echo "This is a pull request. No deployment will be done."
exit 0
fi
if [[ "$TRAVIS_BRANCH" != "master" ]]; then
echo "Testing on a branch other than master. No deployment will be done."
exit 0
fi
PROVISIONING_PROFILE="$HOME/Library/MobileDevice/Provisioning Profiles/$PROFILE_UUID.mobileprovision"
RELEASE_DATE=`date '+%Y-%m-%d %H:%M:%S'`
OUTPUTDIR="$PWD/build/Release-iphoneos"
mkdir -p $OUTPUTDIR
LATEST_ARCHIVE_PATH=`find ~/Library/Developer/Xcode/Archives -type d -Btime -60m -name '*.xcarchive' | head -1`
echo $LATEST_ARCHIVE_PATH
PRODUCT_PATH="$LATEST_ARCHIVE_PATH/Products/Applications/$APPNAME.app"
DSYM_PATH="$LATEST_ARCHIVE_PATH/dSYMs/$APPNAME.app.dSYM"
echo $PRODUCT_PATH
echo $DSYM_PATH
echo "********************"
echo "* Signing *"
echo "********************"
xcrun -log -sdk iphoneos PackageApplication -v "$PRODUCT_PATH" -o "$OUTPUTDIR/$APPNAME.ipa" -sign "$DEVELOPER_NAME" -embed "$PROVISIONING_PROFILE"
RELEASE_NOTES="Build: $TRAVIS_BUILD_NUMBER\nUploaded: $RELEASE_DATE"
zip -r -9 "$OUTPUTDIR/$APPNAME.app.dSYM.zip" "$DSYM_PATH"
# IPA_SIZE=$(stat -c%s "$OUTPUTDIR/$APPNAME.ipa")
# echo "IPA $IPA_SIZE"
# DSYM_SIZE=$(stat -c%s "$OUTPUTDIR/$APPNAME.app.dSYM.zip")
# echo "DSYM $DSYM_SIZE"
echo "********************"
echo "* Uploading *"
echo "********************"
curl http://testflightapp.com/api/builds.json \
-F file="@$OUTPUTDIR/$APPNAME.ipa" \
-F dsym="@$OUTPUTDIR/$APPNAME.app.dSYM.zip" \
-F api_token="$API_TOKEN" \
-F team_token="$TEAM_TOKEN" \
-F distribution_lists='Internal' \
-F notes="$RELEASE_NOTES" -vs
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment