How to publish an iOS App to crashlytics via jenkins? - ios

I have my Xcode pro on svn repository,
on archiving I can successfully upload and distribute my app through crashlytics,
But now I wish to invoke jenkins to do unit testing after I update on svn and want jenkins to upload it to Crashlytics via or some other way.

I have automated the same, that is running the tests after which the build is uploaded to Crashlytics using a tool called Fastlane. It is pretty simple setting up by following the docs provided. You just have to include the fastlane commands in the shell while configuring the build steps of the job and also the api token and build secret as environment variables in Jenkins.
https://docs.fastlane.tools/

Related

Firebase or Sonatype Nexus for artefacts created through Jenkins

I want to integrate Jenkins for mobile app that has backend in java (creates .jar file using maven and store it on AWS S3) and frontend for Android in Kotlin (creates .apk file using gradle) and iOS (uses fastlane to create .ipa file). The plan is to take created builds, run tests and, if successful to put them ready for the deployment.
Now, my question is what would be the best way to handle builds that are created through Jenkins pipelines?
Do I put them all in Sonatype Nexus (or some other repo for builds) for example, do the tests and, if successful, transfer the builds to S3 (backend), firebase (Android) or TestFlight (iOS)?
If you have any suggestions for the way the pipeline should be organised (or you have to suggest the literature), it would be very helpful.

iOS - Continuous Integration with Fastlane / Bamboo

We have an On-Premise Bamboo Server hosted on RHEL & we want to Integrate FastLane to automate our Mobile App CI/CD process.
We have a Mac laptop which is used for iOS build but the plan is to automate the process.
Can someone give any pointers to integrate the FastLane with the on-prem Bamboo CI server.
Initial Setup
Setup a Bamboo Remote Agent on your Mac Laptop where you want to automate the process. In order to do so you'll need to be on a license tier that supports the remote agent. Atlassian has step-by-step instructions for setting up the agent on your Mac.
Ensure that the latest XCode is installed.
Follow the instructions to setup Fastlane on your Mac. Even though Bamboo has the task step built-in, you will still need to configure the capability on the Mac. Failure to do so will result in your RHEL server thinking it can do the iOS builds. You should see in the job configuration and requirements page that only the Mac can execute this build job.
Configuring Fastlane
Follow the Fastlane guide for integrating with Bamboo.
Look into setting up Match so that you do not run into as many provisioning profile signing issues with Fastlane. This will also allow anyone on the team to continue to build.
Pitfalls
iOS Provisioning Profile errors are fairly common when setting up this process.
Permission issues often cause errors. The Bamboo logs should tell you what the problem is.

Can configure Jenkins pipeline with fastlane commands in xcode project file

i'm working on iOS project which have continous intergration set up, i wanted to create a jenkins pipeline for my project to run automation steps to do build,test and etc operations. For the automation process i'm using Fastlane tool, so how can i sync up the jenkins pipeline with my Fastlane commands in it? I got few examples related to maven commands in pipeline file, as maven plugin option is already available in jenkins, similary how can i achieve the same for fastlane. I need few examples to write my declarative pipeline syntax in my xcode project jenkins file.
Also i would like to know should the jenkinspipe line file should be inside the xcode project or it should be under the master branch ?
Any help is appreciated.
Thanks.
Refer Following Document for configuration of jenkins with fastlane.
https://docs.fastlane.tools/actions/upload_to_app_store/#jenkins-integration

Problems uploading my iOS crash to crashlytics from a test built through Jenkins

Under Xcode Target Build Phases, I have a script that enables crashlytics for my iOS app. This is determined by an
ENABLE_CRASHLYTICS variable and whether it is set or not. I can successfully upload a forced crash when I deploy from my local Xcode to a device so the script is working correctly.
However, when it comes to a build via my Jenkins job, the crashes are not being uploaded. I can see that my Script from the Build phases runs but that the ENABLE_CRASHLYTICS variable is not set and therefore crashlytics is disabled so no crash reporting from that test build distributed via HockeyApp.
In my Jenkins job at the Build -> Execute Shell step, I do have
ENABLE_CRASHLYTICS=1
Am I missing something else?
Thanks!
The problem is that you are exporting the ENABLE_CRASHLYTICS environment variable in an "Execute shell" step. Once the shell step has completed, that environment is gone — the variables will not be carried over to subsequent build steps.
So by the time the Xcode build step executes, that particular environment variable is no longer available.
You can also use the EnvInject plugin to inject environment variables during a build. Variables set up using this plugin will be available to all subsequent build steps.

Apple CI / Xcode Service and Jenkins

Is there a way/plugin to integrate the new Xcode service and/or the new Apple CI with Jenkins?
Why?
A main issue with having a Jenkins server + an OSX build slave connected via ssh is that Unit Tests do not work, as the iOS Simulator needs a graphical environment which is not present in this configuration.
I hope that it is possible to integrate the Xcode service (which supports Unit Testing) with Jenkins.
It could be that using the Apple CI will be enough for my needs, but this question aims at the integration of the Xcode service with Jenkins.
What I do already know
I have experience with the existing Xcode Jenkins plugin, but it seems not to support the brand new Xcode service or the new Apple CI. I'm especially keen on unit testing via CI (which did not work properly over a ssh session with the old way).
What I want to know
I'd like info on the following issues currently not working with Jenkins and an ssh connected build slave:
Unit Tests on a headless system
Acceptance tests with Frank or similar
Automatic Provisioning Profile updating (Apple CI does that)
And info on things that currently do work fine with Jenkins and an ssh connected build slave and still should work with an Xcode service integration:
Builds of different build configurations (Release, Debug, TestFlight) / schemes
Automatic Build number increment
(With Jenkins I can set the build number in my project to ${BUILD_NUMBER}, and Jenkins sets this environment variable according to its build number. When the Apple CI does the builds most probably it will set the build number instead.)
Handling/synchronization of Build number between Jenkins & Apple CI
Accessing build products of the Apple CI from different Jenkins Jobs
e.g. for a Job to upload to TestFlight
Backup of builds
Automatic builds on git push to a specific branch
E-Mail notifications
Some additional questions/hints
I'm not sure whether the Apple CI == Xcode service or if the Apple CI just uses the Xcode service. In the latter case the Xcode service just would be like an intelligent build slave, and Jenkins maybe could use that to do builds and tests, but manage build numbers and products by itself.
I'm aware that the Apple CI is an separate CI, and integrating several CIs with each other is not the most easy or useful way to go. I just fear that the Apple CI is not flexible enough for my needs (see above), and that the old way with Jenkins bears some problems (see above).
I believe you are going to have to choose either jenkins or xcode server, not both. I don't know much about xcode server, but I do know about jenkins and xcode 5.
Builds with different configurations:
In the xcode plugin, you can set the scheme to use.
Automatic Build Number Increment
I added a parameter to my jenkins job called XCODEBUILDNUMBER. And whenever I start a build, I simply copy the build number out of my xcode project (I increment it manually. Mine looks like 080813A) and paste it into the XCODEBUILD parameter. I use this to name my output files, etc. There are plugins for jenkins that can automatically increment your build number, but they don't integrate, or sync with xcode.
Handling/synchronization of Build number between Jenkins & Apple CI
As I said before, I don't know of a way to sync the build numbers, but I just thought of a possible solution. You could use the command line tool plistbuddy, to set the build number in your info.plist, as a build step in your jenkins job.
Unit Tests
I have not successfully made unit tests work with Xcode5, but I know that the xcode plugin for jenkins supports it. I believe that the absence of the "Test After Build" key in the project settings may have something to do with it. If you make it work, i'd love to know. (I am also keen on making this work)
Acceptance Tests
From what I can tell, Frank is a command line tool. You can easily integrate it into your Jenkins job, and I believe that it will fail the build if your tests don't pass.
Accessing build products of the Apple CI from different Jenkins Jobs
Not completely sure what you mean, but with jenkins you can archive your build product (a .ipa), for later download and upload to a service like testflight. Again, I don't know much about Xcode Server (CI).
Backup of builds
As I said before, jenkins can archive your build product. Also, I use the the ${BUILD_NUMBER} variable in my build products directory, so I have a different directory for each build. This directory is also backed up to my Time Machine, and important builds copied to my web directory.
Automatic builds on git push to a specific branch
With the jenkins git plugin, you can make jenkins poll your scm in a interval specified by you, and can trigger a build on a change.
E-Mail notifications
I am sure that there is a plugin for this. (that emails you when a build failed/succeeded. in fact, this may be built-in)
In Closing
The xcode CI is a full independent CI, that may be hard to integrate with jenkins. Personally, I would recommend jenkins simply due to its extendability. Sorry I don't know much about Xcode Server.
I've got unit tests running in Jenkins with Xcode 5 on my OS X build slave. Instead of using the Xcode plugin, I run as an execute shell build step:
xcodebuild test -scheme <scheme> -configuration Coverage -sdk iphonesimulator7.0 -destination OS=7.0,name="iPhone Retina (4-inch)"
My coverage configuration is the exact same as my Debug config, except Generate Test Coverage Reports is set to YES, and Instrument Program Flow is set to YES. This is done so test coverage files are created. Due to a bug in Xcode 5, I call __gcov_flush(); in the tearDown of all my tests. I pipe the output of this xcodebuild command into ocunit2junit to get test reports in Jenkins.

Resources