xcodebuild no está comstackndo el proyecto a less que se abra usando Xcode al less una vez para el proyecto integrado Cocoapods

Tengo un proyecto con cápsulas de cocoa.

Aquí está el command que utilizo para build el proyecto.

/ usr / bin / xcodebuild -scheme Jenkins -workspace /Users/Shanetworking/Jenkins/Documents/Jenkins/Jenkins2/Jenkins.xcworkspace -configuration Liberar compilation limpia CONFIGURATION_BUILD_DIR = / Users / Shanetworking / Jenkins / Documents / JenkinsTestNuu / app 'CODE_SIGN_IDENTITY = iPhone Distribución: XXXX yay (3G5FKTZJ2K) 'PRODUCT_BUNDLE_IDENTIFIER = com.XXXX.two PROVISIONING_PROFILE = 6e6506e9-8233-4886-9084-ce21e8f8bbae

El script anterior funciona bien solo si el proyecto se ha abierto usando Xcode al less una vez después de que Xcode no se puede cerrar sin problemas.

Si el proyecto no se ha abierto, entonces si ejecuto el script, la rueda gira a continuación sin ningún progreso para siempre, por ejemplo, en la siguiente image

problema

si se abre una vez en lugar de la rueca abajo, los texts se mostrarán a continuación

=== CLEAN TARGET XWebView OF PROJECT Pods WITH CONFIGURATION Release ===

Comprobar dependencies

Clean.Remove clean /Users/Shanetworking/Jenkins/Documents/JenkinsTestNuu/app/XWebView.framework.dSYM builtin-rm -rf /Users/Shanetworking/Jenkins/Documents/JenkinsTestNuu/app/XWebView.framework.dSYM

Clean.Remove clean /Users/Shanetworking/Jenkins/Library/Developer/Xcode/DerivedData/appanme-bqjwbjcqisegldeaonpytprisnig/Build/Intermediates/Pods.build/Release-iphoneos/XWebView.build builtin-rm -rf / Users / Shanetworking / Jenkins / Biblioteca / Desarrollador / Xcode / DerivedData / appanme-bqjwbjcqisegldeaonpytprisnig / Build / Intermediates / Pods.build / Release-iphoneos / XWebView.build

Clean.Remove clean /Users/Shanetworking/Jenkins/Documents/JenkinsTestNuu/app/XWebView.framework builtin-rm -rf /Users/Shanetworking/Jenkins/Documents/JenkinsTestNuu/app/XWebView.framework

=== CLEAN TARGET Pods OF PROJECT Pods WITH CONFIGURATION Release ===

Comtesting las dependencies, etc.

El problema no se observa en ningún proyecto que no sea cocoapods.

Entonces, ¿cuál sería la causa y cómo resolverlo?

Debe ejecutar la pod install pods antes de build el proyecto para que CocoaPods obtenga los Pods especificados en su Podfile dentro del espacio de trabajo de Jenkins.

Por que sucede

Un análisis rápido de la herramienta diffMerge entre un proyecto abierto por Xcode Vs un mismo proyecto no abierto por Xcode hasta ahora

Análisis de herramientas de combinación de diferencias

A partir de esto podemos ver muchos files relacionados con el esquema que se crean una vez que Xcode lo abre dentro de .xcodeproj

por lo que xcodebuild crea .app utilizando los metadatos relacionados con el esquema, pero como no hay un esquema para build contra su falla

Como resolver esto

Como hay falta de meta datos, no se pudo build, por lo que requiere que Xcode se abra para que los files sean creados automáticamente por Xcode, por lo que habrá algunos esquemas contra los que build.

Pero cuando abre el Xcode, estos files relacionados con Scheme se crean bajo xcuserdata, que es para un usuario en particular. es decir, cada usuario obtiene su propio file que guarda las carpetas de estado abiertas, el último file abierto, etc.

No es una buena idea mantener este file con nosotros.

El problema se puede resolver marcando la checkbox Compartido en Administrar esquemas

Esto mueve los esquemas desde debajo de su xcuserdata individual a una carpeta compartida que se puede cometer a través del control de fuente y puede ignorar xcuserdata sin problemas y mantener la carpeta compartida en el control de origen

Administrar esquemas

Ahora podemos build el código sin abrir el Xcode ni siquiera por una sola vez.

Branding ( interfaz de usuario, configuration de compilation y funcional )

  • Interfaz de usuario
    • Icono de la aplicación y otros íconos
    • iTunes Artwork
  • Construir configuraciones
    • Nombre de la aplicación
    • Identificador de package
    • Perfil de aprovisionamiento
    • Identidad de firma de código
  • Funcional
    • URL específicas de la marca (inicio de session, cierre de session, recuperación de resources, etc.)

Usando terminal

Branding.sh

  #Author: Durai Amuthan(h.duraiamuthan@gmail.com) #This is to achieve multiple branding of an iOS app by configuring the variables below #************ Configuring the brand starts ************ #Directory path where .xcworkspace or .xcodeproj exists PathOfProjectDirectory=/Users/Shanetworking/Jenkins/Documents/JenkinsTestNuu/New/ #Path where info.plist exists PathOfInfoPlist=$PathOfProjectDirectory/XxYyZz #Path to icons where new iTunesArtwork and application icon exixts #Note: Make sure proper naming conventions of file has been followed PathOfNewIcons=/Users/Shanetworking/Jenkins/Documents/icons-two #Path to asset resource where you have kept your application icon. PathOfAppIconSet=$PathOfProjectDirectory/XxYyZz/Icon.xcassets/AppIcon.appiconset #Path where do you want the .app file has to be kept PathToApp=/Users/Shanetworking/Jenkins/Documents/JenkinsTestNuu/app #Path where do you want the .ipa file has to kept PathToIpa=/Users/Shanetworking/Jenkins/Documents/JenkinsTestNuu/ipa #Cocoapods project or project that involves more than one modules are scheme based isWorkspaceBased=true #Path of the Project (.xcodeproj) - applicable for workspace(.xcworkspace) based project PathofProjectFile=$PathOfProjectDirectory/XxYyZz.xcodeproj #Path of the Workspace (.xcworkspace) PathofWorkspaceFile=$PathOfProjectDirectory/XxYyZz.xcworkspace #Name of the target - applicable only for non-workspace(.xcodeproj) based projects Target=XxYyZz #Scheme of the iOS app Scheme=XxYyZz #To ascertain Cocoapods has been used or not isCocoaPodsBased=true #Configuration of the app (Debug -(Development) or Release(Adhoc or Distribution)) Config=Release #For giving access to signing idetity found in KeyChain LoginKeychainPath=/Users/Shanetworking/Jenkins/Library/Keychains/login.keychain LoginKeyChainPassword=xxyyzz #Name of the code signing identity.You can find the name in Keychain or xcode build setting CodeSigningIdentity='iPhone Distribution: Xx Yy Zz Limited (3Z5MHUYJ2L)' #Path of the provisioning profile PathToMobileProvision=/Users/Shanetworking/Jenkins/Desktop/BrandingTest.mobileprovision #UUID value found inside Provisioning profile has to be given #Do not forget to install provisiong profile in the system ProvisioningProfileIdentity=6e6506e9-8233-4886-9084-zf21e8f8bbae #Bundle identifier of the app BundleIdentifier=com.xxyy.zz #AppVersion of the app AppVersion=2.2.2 #App Name Appname=Two #************ Configuring the brand ends ************ #** Creatting the build based on configuration starts ** cd $PathOfInfoPlist echo "****************** Setting App Name ******************" /usr/libexec/PlistBuddy -c "Set :CFBundleName $Appname" info.plist /usr/libexec/PlistBuddy -c "Set :CFBundleDisplayName $Appname" info.plist echo "app name has been set as $Appname" cd $PathOfProjectDirectory echo "****************** Setting AppVersion ******************" /usr/bin/agvtool new-marketing-AppVersion $AppVersion /usr/bin/agvtool new-AppVersion -all $AppVersion echo "****************** Changing app icons & iTunes Artwork ******************" cp -R $PathOfNewIcons/*.png $PathOfAppIconSet echo "App icons has been changed at $PathOfNewIcons" cp -R $PathOfNewIcons/iTunesArtwork@2x $PathOfProjectDirectory/XxYyZz cp -R $PathOfNewIcons/iTunesArtwork $PathOfProjectDirectory/XxYyZz echo "iTunesArtwork has been changed at $PathOfProjectDirectory" #Unlock login keychain security unlock-keychain -p $LoginKeyChainPassword $LoginKeychainPath if $isCocoaPodsBased == 'true' then echo "****************** Installing Cocoapods **********************" /usr/local/bin/pod install echo "Cocoapods has been installed" fi echo "****************** Creating .app ******************" if $isWorkspaceBased == 'true' then /usr/bin/xcodebuild -scheme $Scheme -workspace $PathofWorkspaceFile -configuration $Config clean build CONFIGURATION_BUILD_DIR=$PathToApp "CODE_SIGN_IDENTITY=$CodeSigningIdentity" "PRODUCT_BUNDLE_IDENTIFIER=$BundleIdentifier" "PROVISIONING_PROFILE=$ProvisioningProfileIdentity" else /usr/bin/xcodebuild -target $Target -project $PathofProjectFile -configuration $Config clean build CONFIGURATION_BUILD_DIR=$PathToApp "CODE_SIGN_IDENTITY=$CodeSigningIdentity" "PRODUCT_BUNDLE_IDENTIFIER=$BundleIdentifier" "PROVISIONING_PROFILE=$ProvisioningProfileIdentity" fi echo ".app has been generated at $PathToApp" echo "****************** Creating .ipa *******************" /usr/bin/xcrun -sdk iphoneos PackageApplication -v $PathToApp/XxYyZz.app -o $PathToIpa/$Appname.ipa --embed $PathToMobileProvision --sign "$CodeSigningIdentity" echo "$Appname.ipa has been generated at $PathToIpa" #** Creatting the build based on configuration ends ** 

El file es autodescriptivo que puede comprender fácilmente. Simplemente configure los valores de la variable en el file y llámelo como a continuación.

 sh Branding.sh 

FYI:

Si desea cambiar también otros icons, además del icono de la aplicación y iTunesArtwork, utilice el command cp por ejemplo

 cp path/to/source path/to/destination 

Para saber más info do cp man

Con el file anterior, puede hacer Branding para UI y Build Settings .

Para la marca funcional , debe mantener

  • URL específicas de la marca

  • Otros insumos respectivos para una marca.

en un file de plist separado para que estas cosas también se puedan cambiar de acuerdo con la marca respectiva mientras se construye la aplicación

Archivo Plist

En el lado de la encoding puede personalizar su aplicación para leer los valores de Plist como este

Definición de function:

 func getPlistFile()->Dictionary<String,AnyObject>? { var dictPlistFile:Dictionary<String,AnyObject>? if let path = NSBundle.mainBundle().pathForResource("plistfile", ofType: "plist") { if let dictValue = NSDictionary(contentsOfFile: path) as? Dictionary<String, AnyObject> { dictPlistFile=dictValue } } return dictPlistFile } 

Llamada de function:

 var Value=getPlistFile()?["Key"] 

Puede cambiar los valores de la key de acuerdo con la marca usando el PlistBuddy mientras construye la aplicación

Aquí está la syntax

 /usr/libexec/PlistBuddy -c "Set :Key Value" plistfile.plist 

Usando Jenkins

Podemos reutilizar efectivamente el script de shell aquí en Jenkins

1.Tiene que parametrizar todas las variables en la secuencia de commands de shell en jenkins usando Agregar parámetro … como en la captura de pantalla que he descrito a continuación, he hecho para una variable como esa, tienes que hacerlo para todos los demás

Parametrización

2. Elija ejecutar shell en el Paso de compilation

Paso de compilación

3. Copie la secuencia de commands que está allí entre la creación de la compilation basada en la configuration comienza y la creación de la compilation basada en la configuration finaliza y péguelo en Ejecutar Shell Ejecutar shell

Nota:

  • Reglas de resources

    Hay un error conocido respecto a ResourceRules de Xcode en algunas versiones mientras se construye y empaqueta la aplicación a través de una interfaz que no sea xcode.

    Por lo tanto, debe ejecutarse una vez para desactivar una validation para la ruta de las reglas de resources en xcode . La ruta de las reglas de resources está en desuso y Apple no acepta las aplicaciones que vienen con las reglas de resources, pero si construimos una aplicación sin usar Xcode, el error de validation dice las reglas de resources no se han encontrado, popupán para contrarrestar que tenemos que ejecutar el script solo una vez.

xcode_fix_PackageApplicationResourceRules.sh

 #!/bin/sh # A script to patch xcrun PackageInstallation so that it doesn't use the deprecated --resource-rules # See "Do not use the --resource-rules flag or ResourceRules.plist. They have been obsoleted and will be rejected." # under https://developer.apple.com/library/mac/technotes/tn2206/_index.html#//apple_ref/doc/uid/DTS40007919-CH1-TNTAG205 # Reported as Apple bug #19384243 # # should be run as a user who can modify the PackageApplication file xcodedir=$1 function usage { # FIXME we cannot parse args properly because 2 are optional... echo "USAGE: $0 xcodedir" echo " xcodedir: an install dir like /Application/Xcode6.1.1.app" } if [[ $# -ne 1 ]]; then echo "ERROR: invalid number of arguments" usage exit -1 fi pi="$xcodedir/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/PackageApplication" piorig="$piOrig" if [[ ! -f "$pi" ]]; then echo "$pi file not found. Invalid argument ?" usage exit -1 fi grep resource-rules "$pi" if [[ $? -ne 0 ]]; then echo "PackageApplication doesn't use resource-rules. Skipping" exit 0 fi if [[ -f "$piorig" ]]; then echo "Backup file $piorig already exist. Aborting" exit -1 fi perl -p -i'Orig' -e 'BEGIN{undef $/;} s/,resource-rules(.*sign}).*ResourceRules.plist"/$1/smg' "$pi" echo $? 
  • Desbloquear llavero

    Siempre que ejecute Branding.sh en el terminal, se le solicitará el nombre de usuario y la contraseña como key de acceso del sistema.

    Siempre que ejecute el Trabajo en Jenkins, obtendrá el error " La interacción del usuario no es permitido ".

    por lo que para hacer frente a esto debes seguir los siguientes pasos

    • Abre el acceso de llavero
    • Haga clic derecho en la key privada
    • Seleccione "Obtener información"
    • Seleccione la pestaña "Control de acceso"
    • Haga clic en "Permitir que todas las aplicaciones accedan a este elemento"
    • Haga clic en "Guardar cambios"
    • Ingrese su contraseña
  • Perfil de aprovisionamiento

    si alguna vez obtiene " No se encontró un perfil de aprovisionamiento coincidente ", asegúrese de haber hecho doble clic e instalarlo a través de Xcode.

    En el momento de la installation, verá UUID.mobileprovision en ~ / Library / MobileDevice / Provisioning Profiles /

    Este UUID es el valor dentro de la provisión mobile que significa que está instalado el perfil de aprovisionamiento.

Espero que esto te ayude