Project

xcjobs

0.04
No commit activity in last 3 years
No release in over 3 years
Provides rake tasks for Xcode build
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
 Dependencies

Development

~> 1.7
~> 10.0
>= 0
 Project Readme

XCJobs

Gem Version Build Status Coverage Status Code Climate Dependency Status

Support the automation of release process of iOS/OSX apps with CI

Installation

Add this line to your application's Gemfile:

gem 'xcjobs'

And then execute:

$ bundle

Or install it yourself as:

$ gem install xcjobs

Usage

Test application

XCJobs::Test.new do |t|
  t.workspace = 'Example'
  t.scheme = 'Example'
  t.configuration = 'Release'
  t.add_destination('name=iPad 2,OS=7.1')
  t.add_destination('name=iPad Air,OS=8.1')
  t.formatter = 'xcpretty -c'
end
$ rake -T

rake test                       # test application
$ rake test

xcodebuild test -workspace Example.xcworkspace -scheme Example -sdk iphonesimulator -configuration Release -destination name=iPad 2,OS=7.1 -destination -destination name=iPad Air,OS=8.1 CODE_SIGN_IDENTITY="" GCC_SYMBOLS_PRIVATE_EXTERN=NO

Build application

XCJobs::Build.new do |t|
  t.workspace = 'Example'
  t.scheme = 'Example'
  t.configuration = 'Release'
  t.signing_identity = 'iPhone Distribution: Katsumi Kishikawa'
  t.build_dir = 'build'
  t.formatter = 'xcpretty -c'
end
$ rake -T

rake build                      # build application
$ rake build

xcodebuild build -workspace Example.xcworkspace -scheme Example -configuration Release -derivedDataPath build CONFIGURATION_TEMP_DIR=build/temp CODE_SIGN_IDENTITY=iPhone Distribution: kishikawa katsumi

Export IPA from xcarchive

XCJobs::Archive.new do |t|
  t.workspace = 'Example'
  t.scheme = 'Example'
  t.configuration = 'Release'
  t.signing_identity = 'iPhone Distribution: Katsumi Kishikawa'
  t.build_dir = 'build'
  t.formatter = 'xcpretty -c'
end

XCJobs::Export.new do |t|
  t.archive_path = File.join('build', 'Example.xcarchive')
  t.export_path = File.join('build', 'Example.ipa')
  t.export_provisioning_profile = 'Ad_Hoc.mobileprovision'
  t.formatter = 'xcpretty -c'
end
$ rake -T

rake build:archive              # make xcarchive
rake build:export               # export from an archive
$ bundle exec rake build:archive

xcodebuild archive -workspace Example.xcworkspace -scheme Example -configuration Release -archivePath build/Example -derivedDataPath build CONFIGURATION_TEMP_DIR=build/temp CODE_SIGN_IDENTITY=iPhone Distribution: kishikawa katsumi
$ bundle exec rake build:export

xcodebuild -exportArchive -exportFormat IPA -archivePath build/Example.xcarchive -exportPath build/Example.ipa -exportProvisioningProfile Ad Hoc Provisioning Profile

Distribute (Upload to Crittercism/TestFlight/DeployGate/HockeyApp)

XCJobs::Distribute::Crittercism.new do |t|
  t.app_id = 'xxx...'
  t.key = 'yyy...'
  t.dsym = File.join('build', 'dSYMs.zip')
end

XCJobs::Distribute::TestFlight.new do |t|
  t.file = File.join('build', "#{Example}.ipa")
  t.api_token = 'xxx...'
  t.team_token = 'yyy...'
  t.notify = true
  t.replace = true
  t.distribution_lists = 'Dev'
  t.notes = "Uploaded: #{DateTime.now.strftime("%Y/%m/%d %H:%M:%S")}"
end

XCJobs::Distribute::DeployGate.new do |t|
  t.owner_name = 'kishikawakatsumi'
  t.file = File.join('build', "#{Example}.ipa")
  t.token = 'xxx...'
  t.message = "Uploaded: #{DateTime.now.strftime("%Y/%m/%d %H:%M:%S")}" # optional
  t.distribution_key = 'yyy...' # optional
  t.release_note = '...' # optional
  t.disable_notify = false # optional
  t.visibility = 'public' # optional
end

XCJobs::Distribute::Crashlytics.new do |t|
  t.framework_path = '/path/to/Crashlytics.framework'
  t.file = File.join('build', "#{Example}.ipa")
  t.api_key = 'xxx...'
  t.build_secret = 'yyy...'
  t.notes = "Uploaded: #{DateTime.now.strftime("%Y/%m/%d %H:%M:%S")}" # optional
  t.notifications = true # optional
  t.add_email('TestEmail@crashlytics.com')
  t.add_email('AmazingTester@twitter.com')
  t.add_group_alias('GroupAlias')
  t.add_group_alias('GroupAlias2')
end

XCJobs::Distribute::HockeyApp.new do |t|
  t.file = File.join('build', "#{Example}.ipa")
  t.dsym = File.join('build', 'dSYMs.zip') # optional
  t.token = 'xxx...'
  t.identifier = 'xxx...'
  t.notes = "Uploaded: #{DateTime.now.strftime("%Y/%m/%d %H:%M:%S")}" # optional
  t.notes_type = 1 # optional
end
$ rake -T

rake distribute:crittercism     # upload dSYMs to Crittercism
rake distribute:testflight      # upload IPA to TestFlight
rake distribute:deploygate      # upload IPA to DeployGate
rake distribute:hockeyapp       # upload IPA & dSYMs to HockeyApp

Install/Remove certificates (For Travis CI)

XCJobs::Certificate.new do |t|
  passphrase = "password1234"

  t.add_certificate('./certificates/apple.cer')
  t.add_certificate('./certificates/appstore.cer')
  t.add_certificate('./certificates/appstore.p12', passphrase)
  t.add_certificate('./certificates/adhoc.cer')
  t.add_certificate('./certificates/adhoc.p12', passphrase)

  t.add_profile('AppStore')
  t.add_profile('Ad Hoc')
end
$ rake -T

rake profiles:install           # install provisioning profiles

rake certificates:install       # install certificates
rake certificates:remove        # remove certificates

Bumping version

XCJobs::InfoPlist::Version.new do |t|
  t.path = File.join('Example', 'Info.plist')
end
$ rake -T

rake version                    # Print the current version
rake version:bump:major         # Bump major version (X.0.0)
rake version:bump:minor         # Bump minor version (0.X.0)
rake version:bump:patch         # Bump patch version (0.0.X)
rake version:current            # Print the current version
rake version:set_build_number   # Sets build version to number of commits
rake version:set_build_version  # Sets build version to last git commit hash

Measuring code coverage

XCJobs::Test.new('test:ios') do |t|
  t.workspace = 'Example'
  t.scheme = 'Example'
  t.configuration = 'Release'
  t.add_destination('name=iPhone 5s,OS=8.1')
  t.coverage = true # enable code coverage
  t.formatter = 'xcpretty -c'
end

Send coverage report to Coveralls

XCJobs::Coverage::Coveralls.new() do |t|
  t.add_extension('.m')
  t.add_exclude('Example')
end

Automate with Travis CI

# Gemfile
source 'https://rubygems.org'

gem 'rake'
gem 'cocoapods'
gem 'xcpretty'
gem 'xcjobs'
# .travis.yml
language: objective-c
osx_image: xcode61
cache:
  directories:
    - vendor/bundle
    - Pods
install:
  - bundle install --path=vendor/bundle --binstubs=vendor/bin
  - bundle exec pod install
script:
  - bundle exec rake ${ACTION}
env:
  global:
    - LANG=en_US.UTF-8
    - LC_ALL=en_US.UTF-8
  matrix:
    - ACTION=test
    - ACTION="profiles:install certificates:install version:set_build_version build:archive build:export distribute:crittercism distribute:testflight certificates:remove"

Contributing

  1. Fork it ( https://github.com/[my-github-username]/xcjobs/fork )
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request