-
-
Save ericdagenais/1525227 to your computer and use it in GitHub Desktop.
Titanium Mobile Rakefile Build and TestFlight API Script for iOS
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
DEV_PROVISIONING_UUID = 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX' | |
DEV_SIGN = 'Your Signing Name' | |
ADHOC_PROVISIONING_UUID = 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX' | |
ADHOC_SIGN = 'Your Signing Name' | |
DEV_APP_DEVICE = 'ipad' # or iphone, universal | |
IPHONE_SDK_VERSION = '5.0' | |
TF_TEAM_TOKEN = 'insert TestFlight team token here' | |
TF_API_TOKEN = 'insert TestFlight API token here' | |
TF_DIST_LISTS = 'Core Dev' | |
PIECEABLE_EMAIL = '[email protected]' | |
import 'titanium_build.rake' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# | |
# Titanium Mobile Rakefile Build and TestFlight API Script for iOS | |
# | |
# +Helps to automate building packages, zipping debug symbols, and TestFlight uploads | |
# | |
# +Also provides a convenient command line interface to the Titanium build system | |
# which comes in handy when using a text editor | |
# | |
# https://gist.github.com/1525227 | |
# | |
# Eric Dagenais | |
# 2012-05-20 | |
# | |
# Quickstart: | |
# 1a. Create a file named 'Rakefile' with the contents between =begin and =end (not including | |
# =begin and =end) | |
# 1b. Replace the placeholders with the appropriate values and save the file at the root level | |
# of your Titanium project (the same folder where tiapp.xml resides) | |
# 2. 'rake run' will run the app in the simulator | |
# 3. 'rake testflight' will upload the adhoc build and debug symbols to TestFlight | |
# 4. 'rake -T' for complete usage | |
# | |
=begin | |
DEV_PROVISIONING_UUID = 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX' | |
DEV_SIGN = 'Your Signing Name' | |
ADHOC_PROVISIONING_UUID = 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX' | |
ADHOC_SIGN = 'Your Signing Name' | |
DEV_APP_DEVICE = 'ipad' # or iphone, universal | |
IPHONE_SDK_VERSION = '5.0' | |
TF_TEAM_TOKEN = 'insert TestFlight team token here' | |
TF_API_TOKEN = 'insert TestFlight API token here' | |
TF_DIST_LISTS = 'Core Dev' | |
PIECEABLE_EMAIL = '[email protected]' | |
import 'titanium_build.rake' | |
=end | |
require 'rubygems' | |
require 'json' | |
require 'rexml/document' | |
require 'uri' | |
xmlConfig = REXML::Document.new(File.new('tiapp.xml')).elements | |
devAppName = "#{xmlConfig["ti:app/name"].text}" | |
devAppId = "#{xmlConfig["ti:app/id"].text}" | |
xmlVersion = "#{xmlConfig["ti:app/version"].text}" | |
sdkVersion = "#{xmlConfig["ti:app/sdk-version"].text}" | |
BUILDER = "/Library/Application Support/Titanium/mobilesdk/osx/#{sdkVersion}/iphone/builder.py" | |
PROJDIR = "#{Dir.pwd}/" | |
RAKELOG = "build/iphone/rake.log" | |
version = "#{devAppName}-#{xmlVersion}" | |
if(File.directory?("build/adhoc/#{version}")) | |
version = "#{version}-#{Time.now.strftime("%Y%m%d-%H%M%S")}" | |
puts "WARNING: build for version #{xmlVersion} already exists, adding timestamp ==> #{version}" | |
end | |
desc "Same as run" | |
task :default => [:run] | |
desc "Build and run app in simulator (development)" | |
task :run do | |
sh BUILDER, 'run', PROJDIR, IPHONE_SDK_VERSION, devAppId, devAppName, DEV_APP_DEVICE | |
end | |
desc "Build and run app in simulator (development)" | |
task :run4 do | |
sh BUILDER, 'run', PROJDIR, "4.3", devAppId, devAppName, DEV_APP_DEVICE | |
end | |
desc "Build full app for simulator (development)" | |
task :buildfull do | |
sh BUILDER, 'buildfull', IPHONE_SDK_VERSION, PROJDIR, devAppId, devAppName, DEV_APP_DEVICE | |
end | |
desc "Build and install app on device via iTunes (development)" | |
task :install do | |
sh BUILDER, 'install', IPHONE_SDK_VERSION, PROJDIR, devAppId, devAppName, DEV_PROVISIONING_UUID, DEV_SIGN, DEV_APP_DEVICE | |
end | |
desc "Build distribution app package for device (adhoc)" | |
task :distribute do | |
Dir.mkdir(File.dirname(RAKELOG)) unless File.directory?(File.dirname(RAKELOG)) | |
puts "[INFO] Building #{version}..." | |
sh "'#{BUILDER}' 'distribute' #{IPHONE_SDK_VERSION} '#{PROJDIR}' '#{devAppId}' '#{devAppName}' #{ADHOC_PROVISIONING_UUID} '#{ADHOC_SIGN}' '#{PROJDIR}build/adhoc' #{DEV_APP_DEVICE} > #{RAKELOG}" | |
puts "[INFO] App package: build/iphone/build/Release-iphoneos/#{devAppName}.app" | |
end | |
desc "Build distribution ipa file for device and dSYM zip file (adhoc)" | |
task :adhoc => [:distribute] do | |
puts "[INFO] Archiving #{version}..." | |
FileUtils.mkdir_p "build/adhoc/#{version}" | |
File.open("build/adhoc/#{version}/version.txt",'w') do |f| | |
f.puts(version) | |
end | |
sh "/usr/bin/xcrun -sdk iphoneos PackageApplication -v build/iphone/build/Release-iphoneos/#{devAppName}.app -o '#{PROJDIR}build/adhoc/#{version}/#{version}.ipa' >> #{RAKELOG}" | |
FileUtils.cp File.expand_path("~/Library/MobileDevice/Provisioning Profiles/#{ADHOC_PROVISIONING_UUID}.mobileprovision"), "build/adhoc/#{version}/#{devAppName}-dev.mobileprovision" | |
sh "ditto -ck --keepParent --sequesterRsrc build/adhoc/#{version} build/adhoc/#{version}.zip >> #{RAKELOG}" | |
sh "ditto -ck --keepParent --sequesterRsrc build/iphone/build/Release-iphoneos/#{devAppName}.app.dSYM build/adhoc/#{version}-dSYM.zip >> #{RAKELOG}" | |
puts "[INFO] Zipped AdHoc IPA package: build/adhoc/#{version}.zip" | |
puts "[INFO] Zipped dSYM: build/adhoc/#{version}-dSYM.zip" | |
end | |
namespace :log do | |
desc "View the rake log" | |
task :log do | |
sh "cat #{RAKELOG}" | |
end | |
desc "View the build log" | |
task :buildlog do | |
sh "cat build/iphone/build/build.log" | |
end | |
end | |
desc "Same as log:log" | |
task :log => ["log:log"] | |
desc "Clean the build" | |
task :clean do | |
FileUtils.rm_rf "build/iphone" | |
FileUtils.mkdir_p "build/iphone" | |
puts "[INFO] Cleaned build/iphone" | |
end | |
namespace :testflight do | |
desc "Build and submit a distribution archive and debug symbols to TestFlight" | |
task :submit => [:adhoc] do | |
submittf version | |
puts "[INFO] Submission to TestFlight complete [#{version}]" | |
end | |
desc "Submit the previously built adhoc archive and debug symbols to TestFlight" | |
task :submitlast do | |
latest = getLatest | |
submittf latest[latest.length-1] | |
puts "[INFO] Submission to TestFlight complete [#{version}]" | |
end | |
# Deploy a specific build version to TestFlight (ipa and dSYM); upon success, open the edit page for the TestFlight build in a web browser | |
def submittf(version) | |
responsefile = "build/adhoc/#{version}/testflight.json" | |
releasenotes = File.read("RELEASE_NOTES.txt") | |
sh 'curl', '-o', "#{responsefile}", 'http://testflightapp.com/api/builds.json', '-F', "file=@build/adhoc/#{version}/#{version}.ipa", '-F', "api_token=#{TF_API_TOKEN}", '-F', "team_token=#{TF_TEAM_TOKEN}", '-F', "notes=#{releasenotes}", '-F', 'notify=False', '-F', "distribution_lists=#{TF_DIST_LISTS}" do |ok, status| | |
# '-F', "dsym=@build/adhoc/#{version}-dSYM.zip", | |
ok or fail "Testflight deployment failed" | |
end | |
response = nil | |
begin | |
json = File.read(responsefile) | |
response = JSON.parse(json) | |
rescue | |
end | |
if !response.nil? && !response['config_url'].nil? | |
puts json | |
response['config_url']['/complete/'] = '/edit/' | |
sh 'open', response['config_url'] | |
else | |
sh 'open', 'https://testflightapp.com/dashboard/builds/' | |
end | |
end | |
end | |
desc "Same as testflight:submit" | |
task :testflight => ["testflight:submit"] | |
namespace :pieceable do | |
desc "Build and submit a distribution archive to Pieceable Software" | |
task :submit => [:buildfull] do | |
submitpc devAppName, version | |
puts "[INFO] Submission to Pieceable Software complete [#{version}]" | |
end | |
def submitpc(devAppName, version) | |
responsefile = "build/#{version}/pieceable.txt" | |
Dir.mkdir(File.dirname(responsefile)) unless File.directory?(File.dirname(responsefile)) | |
sh "ditto -cz build/iphone/build/Debug-iphonesimulator/#{devAppName}.app - | curl -o #{responsefile} http://www.pieceable.com/view/publish -F 'email=#{PIECEABLE_EMAIL}' -F 'file=@-'" | |
text = File.read(responsefile) | |
puts text | |
urls = URI.extract(text) | |
if urls.length > 0 | |
sh 'open', urls[urls.length-1] | |
end | |
end | |
end | |
desc "Same as pieceable:submit" | |
task :pieceable => ["pieceable:submit"] | |
def getLatest | |
(Dir.glob("build/adhoc/*/").max_by {|f| File.mtime(f)}).split(File::SEPARATOR) | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment