Tuesday 7 April 2015

TeamCity with Xamarin Form

This is my second time setting up the end-to-end continuously integration(CI) /build for mobile application development. The 1st project was purely an end-to-end process for iOS project, with TestFlightApp. This time, I have extended my previous experience to both iOS  and Android projects. 

This page contain information about entities that involved using SVN, TeamCity to compile mobile applications written in Xamarin Forms, and build the projects from the build agent, and finally submit them to TestFairy (No more TestFlight).
It is a complete end-to-end continuously process with the facilities to dispatch to app to the end user or tester automatically. See the diagram below: 

So, what it does? 

  • Developers - commit changes to SVN via the SVN Client installed in Xamarin Studio.
  • Trigger - used to add builds to the queue when an event occurs (like commit a file)
  • Transfer - transfer file from SVN to Build Agent (setup mac mini as a build agent to TeamCity).
  • Major Build Steps:
    • 'mdtool' on Xamarin PCL shared project
    • 'mdtool' on iOS app
    • 'xbuild' on Android app
  • Custom script for publishing
    • Publish iOS app to TestFairy
    • Publish Android app to TestFairy
  • Test fairy send out invitation email



Example Command:
Command Line to build iOS project:
/Applications/Xamarin\ Studio.app/Contents/MacOS/mdtool -v build --project:YouiOSProject.iOS --configuration:"Ad-Hoc|iPhone" YourSolution.sln;


Command Line to build Android project:
Signed
xbuild /t:SignAndroidPackage /p:Configuration=release Droid/YourDroidProject.csproj

xbuild /t:SignAndroidPackage /p:Configuration=release %teamcity.build.checkoutDir%/Droid/YouDroidProject.csproj

Unsigned:
xbuild /t:PackageForAndroid /p:Configuration=release Droid/YourDroidProject.csproj


Publish YouriOSProject.iOS to TestFairy:
If you need dSYM, then you need to zip it:

zip -r %teamcity.build.checkoutDir%/Pro/build/iOS/iPhone/Ad-Hoc/YouriOSProject.app.dSYM.zip %teamcity.build.checkoutDir%/Pro/build/iOS/iPhone/Ad-Hoc/YouriOSProject.app.dSYM

curl -s http://app.testfairy.com/api/upload -F api_key='xxxxxxxxxxxxxxxxxxxx' -F file=@%teamcity.build.checkoutDir%/Pro/build/iOS/iPhone/Ad-Hoc/YouriOSProject.ipa -F symbols_file=@%teamcity.build.checkoutDir%/Pro/build/iOS/iPhone/Ad-Hoc/YouriOSProject.app.dSYM.zip -F testers_groups='TesterGroupInTestFairy' -F comment=‘Hello Built from TeamCity. %env.TEAMCITY_BUILDCONF_NAME% build#: %changesComment%’

Publish YourAndroidProject.Android to TestFairy
curl -s http://app.testfairy.com/api/upload -F api_key='xxxxxxxxxxxxxxxxxxxxx' -F file=@%teamcity.build.checkoutDir%/Pro/build/Droid/Release/YourDroidProject.pro-Signed.apk -F testers_groups='TesterGroupInTestFairy' -F comment=‘Your Droid Project;Built from TeamCity. %env.TEAMCITY_BUILDCONF_NAME% build#: %changesComment%’


SigningSigning is the most tricky thing for mobile application. For instance, you need to create a specific provisioning profile for iOS project; specific target for Android, etc. Well, I will focusing on some concerns of signing Android application here.

AndroidIn order to run on an Android device, packages must be signed. In order to allow quicker build iteration, the Xamarin.Android tasks do not sign packages during the build process, because signing is quite slow. Instead, they are signed (if necessary) before installation or during export, by the IDE or the Install build target. Invoking the SignAndroidPackage target will produce a package with the "- Signed.apk" suffix in the output directory. 

No comments:

Post a Comment

How to run unit test for your Xamarin Application in AppCenter?

How to run unit test for your Xamarin application in AppCenter?  When we talk about Building and Distributing your Xamarin app, you m...