Proceso de compilación automatizado en iOS

configuración de jenkins

**3 tipos de compilaciones empaquetadas

depuración de aplicaciones:

Certificado de desarrollo, archivo de configuración de desarrollo, la configuración en el script está establecida en Depurar

aplicación ad hoc

Certificado de producción, archivo de configuración Adhoc, la configuración en el script está establecida en Adhoc

lanzamiento de la aplicación

Certificado de producción, archivo de configuración de Appstore, la configuración en el script está establecida en Lanzamiento

** Proceso

-->jenkins selecciona la compilación correspondiente para empaquetar

-->Una vez completado el embalaje, envíalo a Dandelion. Obtenga el código QR y el enlace.

-->Una vez completado el empaquetado, almacene los archivos ipa y dism en el servidor privado y obtenga los enlaces correspondientes.

-->Notificación del grupo DingTalk. Información incluida: nombre del paquete, número de versión, número de compilación, nombre de la rama, entorno de compilación, código QR de Dandelion, enlace de instalación de Dandelion ipa, enlace de descarga de archivos ipa, enlace de descarga de archivos Dysm.

Configuraciones

Tres configuraciones de entorno

Depurar :

1. Abra el paquete de desarrollo (certificado de desarrollo, archivo de configuración jkdj_dev).

2. Utilice #if DEBUG para juzgar dentro del proyecto.

3. Ciertas situaciones que requieren certificados de desarrollo se pueden probar en este entorno, como las pruebas de envío de certificados de desarrollo.

4. El panel de depuración (actualmente la biblioteca privada JKDJ_DebugKit) se agrega a este entorno para permitir el cambio de entorno API, la depuración del rendimiento, etc.

Ad hoc :

1. Cree un paquete ad hoc (certificado de producción, archivo de configuración jkdj_Adhoc)

2. Utilice #if ADHOC para emitir juicios en el proyecto.

3. Ciertas situaciones que requieren certificados de producción se pueden probar en este entorno, como la prueba de envío de certificados de producción.

4. El panel de depuración (actualmente la biblioteca privada JKDJ_DebugKit) se agrega a este entorno para permitir el cambio de entorno API, la depuración del rendimiento, etc.

5. Este entorno también se puede utilizar como paquete de prueba diario.

Lanzamiento :

1. Descargue el paquete Appstore (certificado de producción, archivo de configuración jkdj_Appstore).

2. El panel de depuración ya no se importa a este entorno y el entorno API se fija al entorno de producción.

3. Sólo para tienda de aplicaciones

configuración API

API_Dev: API del entorno de desarrollo

API_Test: API del entorno de prueba

API_Pre: API de entorno de prelanzamiento

API_Dis: API del entorno de producción

GCC_PREPROCESSOR_DEFINITIONS='$$(heredado) $(ApiEnvironment) '

Configuración del proyecto

1. Agregue una nueva configuración de entorno Adhoc en Project

2. Configure la macro predefinida ADHOC=1 en este entorno en el directorio de configuración de compilación de Target-HealthManager.

3. podfile importa la biblioteca privada de depuración, solo en entornos de depuración y ad hoc

pod 'JKDJ_DebugKit', '2.0', :configurations => ['Debug','Adhoc'] #复星健康debug面板(包含环境切换,性能调试能)Plain Text

4. Juicio macro, ejemplo

Panel de Depuración

    #if (defined(DEBUG) || defined(ADHOC))
    [[JKDebugManager shareManager] show];
    #else
    #endif

entorno API

- (NSString *)hostUrl{
        
    #if (defined(DEBUG) || defined(ADHOC))
    {

        #ifdef API_Dev
        return  API_Dev_URL;  //开发环境
        #endif
        
        #ifdef API_Test
        return  API_Test_URL;  //测试环境
        #endif
        
        #ifdef API_Pre
        return  API_Uat_URL;  //预发环境
        #endif
        
        #ifdef API_Dis
        return  API_Distribute_URL;  //生产环境
        #endif
        
        NSUserDefaults * def = [NSUserDefaults standardUserDefaults];
        NSString  * host  = [def objectForKey:NSUserDefault_HostUrl];
        if ([NSString isEmpty:host]) {
            return  API_Distribute_URL;  //生产环境
        }else if ([host rangeOfString:@"api.health2m"].location != NSNotFound) {
            return API_Distribute_URL;
        } else{
            return host;
        }
    }
    
    #else
    {
        return  API_Distribute_URL;  //生产环境
    }
    #endif
}

Script de empaquetado automatizado (utilizado actualmente)

#复星健康自动化打包脚本
#参数 ARCHIVE_TYPE
#{
#    DEVELOPMENT->开发包
#    ADHOC->Adhoc包,日常包
#    APPSTORE->删除appstore的包
#}
#
#实例 bash JKAutoBuild.sh DEVELOPMENT

function auto() {  #构建包

    #打包类型
    ARCHIVE_TYPE=$1
    
    #编译模式
    BUILD_TYPE="Debug"

    EXPORT_TYPE="Develop"

    if [[ $ARCHIVE_TYPE == "DEVELOPMENT" ]]; then

        BUILD_TYPE="Debug"
        EXPORT_TYPE="Develop"

    elif [[ $ARCHIVE_TYPE == "ADHOC" ]]; then

        BUILD_TYPE="Release"
        EXPORT_TYPE="Adhoc"

    elif [[ $ARCHIVE_TYPE == "APPSTORE" ]]; then
    
        BUILD_TYPE="Release"
        EXPORT_TYPE="AppStore"
        
    else
        echo "defult"
    fi


    # 工程名
    APP_NAME="HealthManager"

    # workspace名
    WORK_SPACE="HealthManager.xcworkspace"

    #包名(Package)
    BUNDLEID==`xcodebuild -showBuildSettings | grep PRODUCT_BUNDLE_IDENTIFIER | tr -d 'PRODUCT_BUNDLE_IDENTIFIER ='`

    #info.plist路径
    project_infoplist_path="./${APP_NAME}/Info.plist"
     
    #取版本号
    bundleShortVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" "${project_infoplist_path}")
     
    #取build值
    bundleVersion=`xcodebuild -showBuildSettings | grep CURRENT_PROJECT_VERSION | tr -d 'CURRENT_PROJECT_VERSION ='`

    #时间
    DATE="$(date +%Y%m%d)"

    # IPA路径
    IPAPATH="${APP_NAME}_${BUILD_TYPE}_V${bundleShortVersion}_B${bundleVersion}_${DATE}"

    # xcarchive
    XCARCHIVE="${APP_NAME}_${BUILD_TYPE}_V${bundleShortVersion}_B${bundleVersion}_${DATE}.xcarchive"

    #IPA输入路径
    IPAPATHOUT="./build/${IPAPATH}/${APP_NAME}.ipa"

    #dYSM文件目录
    dYSMPATHOUT="./build/${XCARCHIVE}/dSYMs/${APP_NAME}.app.dSYM"
    #上传appstore
    ##账号
    parameter_username=""
    
    #独立密码
    parameter_password=""

    # 开始计时
    SECONDS=0


    echo "\n\n\033[32m -----------------------Xcode打包-----------------------\033[0m\n\n\n"


    # 清理
    echo "\n\n\033[32m +++++++++++++++++清理中+++++++++++++++++\033[0m\n\n\n"
    xcodebuild -workspace "${WORK_SPACE}" -scheme "${APP_NAME}" -configuration "${BUILD_TYPE}" clean

    # 编译
    echo "\n\n\033[32m +++++++++++++++++编译中+++++++++++++++++\033[0m\n\n\n"
    xcodebuild -workspace "${WORK_SPACE}" -sdk iphoneos -scheme "${APP_NAME}" -archivePath "./build/${XCARCHIVE}" -configuration "${BUILD_TYPE}" archive

    # 打包
    echo "\n\n\033[32m +++++++++++++++++打包中++++++++++++++++++\033[0m\n\n\n"
    xcodebuild -exportArchive -archivePath "./build/${XCARCHIVE}" -exportPath "./build/${IPAPATH}" -exportOptionsPlist "./ExportOptionsPlist/${EXPORT_TYPE}ExportOptionsPlist.plist" -allowProvisioningUpdates

    # 验证
    if [ -f ${IPAPATHOUT} ] ; then
    echo "\n\n\033[32m +++++++++++++++++打包成功,用时 ${SECONDS}s ++++++++++++++++++\033[0m\n\n\n"
    else
    echo "\n\n\033[32m +++++++++++++++++打包失败++++++++++++++++++\033[0m\n\n\n"
    fi

    
    
    
    echo "\n\n\033[32m -----------------------上传到蒲公英-----------------------\033[0m\n\n\n"


    #蒲公英上的user Key
    uKey="4371fb11c6bbccb4c613ae93ded1fef0"

    #蒲公英上的API Key
    apiKey="789438bcbd5da6f7b5620f0ed143e72f"

    #蒲公英版本更新描述,这里取git最后一条提交记录作为描述
    MSG=`git log -1 --pretty=%B`

    #要上传的ipa文件路径
    echo $IPAPATHOUT

    # 执行上传至蒲公英的命令
    echo "++++++++++++++upload+++++++++++++"

    curl -F "file=@${IPAPATHOUT}" -F "uKey=${uKey}" -F "_api_key=${apiKey}" -F "buildUpdateDescription=${MSG}" http://www.pgyer.com/apiv2/app/upload > uploadResponse.json

    #cat uploadResponse.json

    echo
    echo "++++++++++++++提取上传响应信息+++++++++++++"

    uploadResult=`cat $WORKSPACE/uploadResponse.json`


    url1=`echo "${uploadResult##*"buildQRCodeURL"}"`

    urlLength=`expr ${#url1} - 6`

    url2=`echo ${url1:3:$urlLength}`

    buildQRCodeURL=`echo $url2 | sed 's:\\\/:\/:g'`


    if [ ! $buildQRCodeURL ]; then
       echo "~~~~~~~~~~~~~~~~~~~上传失败~~~~~~~~~~~~~~~~~~~"
    else
       echo "~~~~~~~~~~~~~~~~~~~上传成功~~~~~~~~~~~~~~~~~~~"
       echo "构建版本:${bundleShortVersion}"
       echo "二维码链接:${buildQRCodeURL}"
    fi

    echo "buildQRCodeURL=${buildQRCodeURL}\r\nbuildVersion=${bundleShortVersion}">> uploadResult.txt



    echo "\n\n\033[32m -----------------------上传钉钉群通知-----------------------\033[0m\n\n\n"

    curl 'https://oapi.dingtalk.com/robot/send?access_token=48c80fea344d28d6a4c5d2965013a1dd3f54976d01ee39951f39c9b68a4d6f3c' \
       -H 'Content-Type: application/json' \
       -d "{'msgtype':'markdown','markdown':{'title':'复星健康iOS端','text':'### 复星健康iOS端  \n * 构建分支 => ${Branch_Tag}  \n * 构建环境 => ADHOC  \n ![screenshot](${buildQRCodeURL})  \n>'}}"



    echo "\n\n\033[32m -----------------------上传dSYM文件-----------------------\033[0m\n\n\n"

    #只有appstore包才上传bugly
    if [[ ${EXPORT_TYPE} == "AppStore" ]]; then
        

        zip -rj "${dYSMPATHOUT}.zip" ${dYSMPATHOUT}
    
        curl -k "https://api.bugly.qq.com/openapi/file/upload/symbol?app_key=0de566a9-f35a-4d29-b9c4-b7fff662ebe0&app_id=a8b0724bed" --form "api_version=1" --form "app_id=a8b0724bed" --form "app_key=0de566a9-f35a-4d29-b9c4-b7fff662ebe0" --form "symbolType=2"  --form "bundleId=${BUNDLEID}" --form "productVersion=${bundleShortVersion}" --form "channel=AppStore" --form "fileName=${APP_NAME}.app.dSYM.zip" --form "file=@${dYSMPATHOUT}.zip" --verbose

    else
        echo "not upload budly"
    fi


    echo "\n\n\033[32m -----------------------上传AppStore-----------------------\033[0m\n\n\n"
    
    #只有appstore包才上传appstore
    if [[ ${EXPORT_TYPE} == "AppStore" ]]; then
    
        #验证账号密码
        if [ ${#parameter_username} != 0 -a ${#parameter_username} != 0 ]
        then
            echo "\n\033[32m****************\n开始上传AppStore\n****************\033[0m\n"
            
            #验证APP
            altoolPath="/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool"
            "${altoolPath}" --validate-app \
            -f "$IPAPATHOUT" \
            -u "$parameter_username" \
            -p "$parameter_password" \
            --output-format xml
            #上传APP
            "${altoolPath}" --upload-app \
            -f "$IPAPATHOUT" \
            -u "$parameter_username" \
            -p "$parameter_password" \
            --output-format xml
            
            echo "\n\033[32m****************\n上传AppStore完毕\n****************\033[0m\n"
        fi

    fi
}

auto $1

Supongo que te gusta

Origin blog.csdn.net/yezuiqingxin/article/details/120368133
Recomendado
Clasificación