Search code examples
iosjenkinsjenkins-pluginsxcodebuildtestflight

Jenkins + iOS + TestFlight API


I installed a Jenkins and startet a Project with the Git Plugin, Xcode Plugin and the Testflight Plugin.

I can create automatic builds with the setup, but it is failing at the point on creating the .ipa files for Testflight.

The problem are at Debug and Release settings in different ways though…

If i try to create a .ipa via the Debug settings it will fail at the point that there is no build/Debug-iphoneos folder (i tried to turn of the clean option but it didn't helped). But the Xcode Build is not failing on the command line

When i try to switch to Release the linker is failing (ld).

Whithout the .ipa files i can't submit to Testflight and get a automated Test distributing.


Solution

  • Here is the script I'm using. (Obviously I removed the personal information, but you should be fine to understand it).

    TARGET_NAME="-"     # Target name
    TARGET_SDK="iphoneos"                   # Target SDK: iphoneos
    CONFIGURATION="Release"     # Build Configuration
    BUILD_DIR="build"                       # Directory where the build is generated
    ARCHS="armv7"                           # Valid Architectures
    APP_NAME="-"                # Application name
    
    ## Provisioning configurations
    BUILD_ARCHIVED_DIR="BuildArchived"                  # Directory with the history of builds
    DEVELOPER_NAME="-"  # Developer name
    PROVISIONING_PROFILE=Prototype.mobileprovision      # Provisioning profile file
    PROVISIONING_DIR=~/Library/MobileDevice/Provisioning\ Profiles/                     # Provisioning dir
    
    ## TestFlight App
    TESTFLIGHT_API_TOKEN="-"    
    TESTFLIGHT_TEAM_TOKEN="-"
    
    
    #Release Notes
    BUILDSCRIPTS_DIR="build"
    TESTFLIGHT_RELEASE_NOTES_FILE="ios_testflight-releasenotes"
    
    
    #Distribution Lists
    TESTFLIGHT_DISTRIBUTION_LISTS="Jenkins"
    
    
    # Returns to the root directory of the build
    cd ../ios
    
    PROJECT_BUILDDIR="${BUILD_DIR}/${CONFIGURATION}-${TARGET_SDK}"
    CURRENT_DIR=`pwd`
    
    # fix for the newest sdk
    # Only export the environment variable if the location exists,
    # otherwise it breaks the signing process!
    if [ -f "/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate" ]
    then
      echo Export environment variable for codesign_allocate location
      export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
    fi
    
    
    #changing the build version
    INFO_PLIST_PATH="${CURRENT_DIR}/${TARGET_NAME}/${TARGET_NAME}-Info.plist"
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion ${SVN_REVISION}" $INFO_PLIST_PATH
    
    
    # compile project
    echo Building Project
    xcodebuild -target "${TARGET_NAME}" -sdk "${TARGET_SDK}" ARCHS=${ARCHS} -configuration "${CONFIGURATION}" clean build
    
    #Check if build succeeded
    #if [ $? != 0 ]
    #then
    #  exit 1
    #fi
    
    # Create output dir ($x) if doesn't exist
    mkdir -p $BUILD_ARCHIVED_DIR
    
    # .ipa file generation
    echo Generating .ipa file 
    /usr/bin/xcrun -sdk "${TARGET_SDK}" PackageApplication -v     "${PROJECT_BUILDDIR}/${APP_NAME}.app" -o     "${CURRENT_DIR}/${BUILD_ARCHIVED_DIR}/${APP_NAME}.ipa" --sign "${DEVELOPER_NAME}" 
    
    #zipping the .dSYM to send to Testflight
    echo Generating zip file
    /usr/bin/zip -r "${CURRENT_DIR}/${BUILD_ARCHIVED_DIR}/${APP_NAME}.app.dSYM.zip" "${CURRENT_DIR}/${PROJECT_BUILDDIR}/${APP_NAME}.app.dSYM"
    
    echo Sending to TestFlight
    curl http://testflightapp.com/api/builds.json -F file="@${CURRENT_DIR}/${BUILD_ARCHIVED_DIR}/${APP_NAME}.ipa" -F dsym="@${CURRENT_DIR}/${BUILD_ARCHIVED_DIR}/${APP_NAME}.app.dSYM.zip" -F api_token="${TESTFLIGHT_API_TOKEN}" -F team_token="${TESTFLIGHT_TEAM_TOKEN}" -F notes="This build was uploaded via the upload API" -F notify=False -F distribution_lists="${TESTFLIGHT_DISTRIBUTION_LISTS}" 
    echo Submission ended