Rakefile 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. require 'xcjobs'
  2. xcode_version = `xcodebuild -version`.split("\n").first.scan(/\d+/).join('.')
  3. if xcode_version.start_with?('10')
  4. def destinations(platform: 'iphonesimulator')
  5. if platform == 'iphonesimulator'
  6. [ 'name=iPhone X,OS=12.0'
  7. ]
  8. elsif platform == 'watchsimulator'
  9. [ 'name=Apple Watch Series 4 - 40mm,OS=5.0',
  10. 'name=Apple Watch Series 4 - 44mm,OS=5.0'
  11. ]
  12. elsif platform == 'appletvsimulator'
  13. [ 'name=Apple TV 4K,OS=12.0'
  14. ]
  15. else
  16. [
  17. 'platform=OS X,arch=x86_64'
  18. ]
  19. end
  20. end
  21. elsif xcode_version.start_with?('9.4')
  22. def destinations(platform: 'iphonesimulator')
  23. if platform == 'iphonesimulator'
  24. [ 'name=iPhone 7,OS=11.4',
  25. 'name=iPhone 8,OS=11.4',
  26. 'name=iPhone X,OS=11.4'
  27. ]
  28. elsif platform == 'watchsimulator'
  29. [ 'name=Apple Watch - 38mm,OS=4.0',
  30. 'name=Apple Watch - 42mm,OS=4.0'
  31. ]
  32. elsif platform == 'appletvsimulator'
  33. [ 'name=Apple TV 4K,OS=11.0'
  34. ]
  35. else
  36. [
  37. 'platform=OS X,arch=x86_64'
  38. ]
  39. end
  40. end
  41. elsif xcode_version.start_with?('9')
  42. def destinations(platform: 'iphonesimulator')
  43. if platform == 'iphonesimulator'
  44. [ 'name=iPhone 6s Plus,OS=11.0',
  45. 'name=iPhone SE,OS=11.0',
  46. 'name=iPhone 7,OS=11.0',
  47. 'name=iPhone 8,OS=11.0',
  48. 'name=iPhone X,OS=11.0',
  49. 'name=iPad Air 2,OS=11.0',
  50. 'name=iPad Pro (9.7-inch),OS=11.0',
  51. 'name=iPad Pro (12.9-inch),OS=11.0'
  52. ]
  53. elsif platform == 'watchsimulator'
  54. [ 'name=Apple Watch - 38mm,OS=4.0',
  55. 'name=Apple Watch - 42mm,OS=4.0'
  56. ]
  57. elsif platform == 'appletvsimulator'
  58. [ 'name=Apple TV 1080p,OS=11.0'
  59. ]
  60. else
  61. [
  62. 'platform=OS X,arch=x86_64'
  63. ]
  64. end
  65. end
  66. elsif xcode_version.start_with?('8.3')
  67. def destinations(platform: 'iphonesimulator')
  68. if platform == 'iphonesimulator'
  69. [ 'name=iPhone 5,OS=10.3.1',
  70. 'name=iPhone 5s,OS=10.3.1',
  71. 'name=iPhone 6,OS=10.3.1',
  72. 'name=iPhone 6s Plus,OS=10.3.1',
  73. 'name=iPhone SE,OS=10.3.1',
  74. 'name=iPad Air 2,OS=10.3.1',
  75. 'name=iPad Pro (9.7-inch),OS=10.3.1',
  76. 'name=iPad Pro (12.9-inch),OS=10.3.1'
  77. ]
  78. elsif platform == 'watchsimulator'
  79. [ 'name=Apple Watch - 38mm,OS=3.0',
  80. 'name=Apple Watch - 42mm,OS=3.0'
  81. ]
  82. elsif platform == 'appletvsimulator'
  83. [ 'name=Apple TV 1080p,OS=10.0'
  84. ]
  85. else
  86. [
  87. 'platform=OS X,arch=x86_64'
  88. ]
  89. end
  90. end
  91. elsif xcode_version.start_with?('8.0')
  92. def destinations(platform: 'iphonesimulator')
  93. if platform == 'iphonesimulator'
  94. [ 'name=iPhone 5,OS=10.0',
  95. 'name=iPhone 5s,OS=10.0',
  96. 'name=iPhone 6,OS=10.0',
  97. 'name=iPhone 6s Plus,OS=10.0',
  98. 'name=iPhone SE,OS=10.0',
  99. 'name=iPad Air 2,OS=10.0',
  100. 'name=iPad Pro (9.7 inch),OS=10.0',
  101. 'name=iPad Pro (12.9 inch),OS=10.0'
  102. ]
  103. elsif platform == 'watchsimulator'
  104. [ 'name=Apple Watch - 38mm,OS=3.0',
  105. 'name=Apple Watch - 42mm,OS=3.0'
  106. ]
  107. elsif platform == 'appletvsimulator'
  108. [ 'name=Apple TV 1080p,OS=10.0'
  109. ]
  110. else
  111. [
  112. 'platform=OS X,arch=x86_64'
  113. ]
  114. end
  115. end
  116. elsif xcode_version.start_with?('7.3') || xcode_version.start_with?('7.2')
  117. def destinations(platform: 'iphonesimulator')
  118. if platform == 'iphonesimulator'
  119. [ 'name=iPad 2,OS=8.1',
  120. 'name=iPad Air,OS=8.1',
  121. 'name=iPhone 4s,OS=8.1',
  122. 'name=iPhone 4s,OS=8.3',
  123. 'name=iPhone 4s,OS=8.4',
  124. 'name=iPhone 4s,OS=9.0',
  125. 'name=iPhone 4s,OS=9.2',
  126. 'name=iPhone 5,OS=8.1',
  127. 'name=iPhone 5s,OS=8.1',
  128. 'name=iPhone 6,OS=8.1',
  129. 'name=iPhone 6,OS=8.2',
  130. 'name=iPhone 6,OS=8.3',
  131. 'name=iPhone 6,OS=8.4',
  132. 'name=iPhone 6,OS=9.0',
  133. 'name=iPhone 6,OS=9.2',
  134. 'name=iPhone 6 Plus,OS=8.1',
  135. 'name=iPhone 6 Plus,OS=8.2',
  136. 'name=iPhone 6 Plus,OS=8.3',
  137. 'name=iPhone 6 Plus,OS=8.4',
  138. 'name=iPhone 6 Plus,OS=9.0',
  139. 'name=iPhone 6 Plus,OS=9.2'
  140. ]
  141. elsif platform == 'watchsimulator'
  142. [ 'name=Apple Watch - 38mm,OS=2.0',
  143. 'name=Apple Watch - 42mm,OS=2.0',
  144. 'name=Apple Watch - 38mm,OS=2.1',
  145. 'name=Apple Watch - 42mm,OS=2.1',
  146. ]
  147. elsif platform == 'appletvsimulator'
  148. [ 'name=Apple TV 1080p,OS=9.0',
  149. 'name=Apple TV 1080p,OS=9.1',
  150. ]
  151. else
  152. [
  153. 'platform=OS X,arch=x86_64'
  154. ]
  155. end
  156. end
  157. elsif xcode_version.start_with?('7.1')
  158. def destinations(platform: 'iphonesimulator')
  159. if platform == 'iphonesimulator'
  160. [ 'name=iPad 2,OS=8.1',
  161. 'name=iPad Air,OS=8.1',
  162. 'name=iPhone 4s,OS=8.1',
  163. 'name=iPhone 4s,OS=8.3',
  164. 'name=iPhone 4s,OS=8.4',
  165. 'name=iPhone 4s,OS=9.0',
  166. 'name=iPhone 4s,OS=9.1',
  167. 'name=iPhone 5,OS=8.1',
  168. 'name=iPhone 5s,OS=8.1',
  169. 'name=iPhone 6,OS=8.1',
  170. 'name=iPhone 6,OS=8.2',
  171. 'name=iPhone 6,OS=8.3',
  172. 'name=iPhone 6,OS=8.4',
  173. 'name=iPhone 6,OS=9.0',
  174. 'name=iPhone 6,OS=9.1',
  175. 'name=iPhone 6 Plus,OS=8.1',
  176. 'name=iPhone 6 Plus,OS=8.2',
  177. 'name=iPhone 6 Plus,OS=8.3',
  178. 'name=iPhone 6 Plus,OS=8.4',
  179. 'name=iPhone 6 Plus,OS=9.0',
  180. 'name=iPhone 6 Plus,OS=9.1'
  181. ]
  182. elsif platform == 'watchsimulator'
  183. [ 'name=Apple Watch - 38mm,OS=2.0',
  184. 'name=Apple Watch - 42mm,OS=2.0',
  185. ]
  186. elsif platform == 'appletvsimulator'
  187. [ 'name=Apple TV 1080p,OS=9.0',
  188. ]
  189. else
  190. [
  191. 'platform=OS X,arch=x86_64'
  192. ]
  193. end
  194. end
  195. elsif xcode_version.start_with?('7.0')
  196. def destinations(platform: 'iphonesimulator')
  197. if platform == 'iphonesimulator'
  198. [ 'name=iPad 2,OS=8.1',
  199. 'name=iPad Air,OS=8.1',
  200. 'name=iPhone 4s,OS=8.1',
  201. 'name=iPhone 4s,OS=8.3',
  202. 'name=iPhone 4s,OS=8.4',
  203. 'name=iPhone 4s,OS=9.0',
  204. 'name=iPhone 5,OS=8.1',
  205. 'name=iPhone 5s,OS=8.1',
  206. 'name=iPhone 6,OS=8.1',
  207. 'name=iPhone 6,OS=8.2',
  208. 'name=iPhone 6,OS=8.3',
  209. 'name=iPhone 6,OS=8.4',
  210. 'name=iPhone 6,OS=9.0',
  211. 'name=iPhone 6 Plus,OS=8.1',
  212. 'name=iPhone 6 Plus,OS=8.2',
  213. 'name=iPhone 6 Plus,OS=8.3',
  214. 'name=iPhone 6 Plus,OS=8.4',
  215. 'name=iPhone 6 Plus,OS=9.0',
  216. ]
  217. elsif platform == 'watchsimulator'
  218. [ 'name=Apple Watch - 38mm,OS=2.0',
  219. 'name=Apple Watch - 42mm,OS=2.0',
  220. ]
  221. else
  222. [
  223. 'platform=OS X,arch=x86_64'
  224. ]
  225. end
  226. end
  227. else
  228. def destinations(platform: 'iphonesimulator')
  229. if platform == 'iphonesimulator'
  230. [ 'name=iPad 2,OS=8.1',
  231. 'name=iPad Air,OS=8.1',
  232. 'name=iPhone 4s,OS=8.1',
  233. 'name=iPhone 4s,OS=8.4',
  234. 'name=iPhone 5,OS=8.1',
  235. 'name=iPhone 5s,OS=8.1',
  236. 'name=iPhone 6,OS=8.1',
  237. 'name=iPhone 6,OS=8.2',
  238. 'name=iPhone 6,OS=8.4',
  239. 'name=iPhone 6 Plus,OS=8.1',
  240. 'name=iPhone 6 Plus,OS=8.2',
  241. 'name=iPhone 6 Plus,OS=8.4',
  242. ]
  243. elsif platform == 'watchsimulator'
  244. [ 'name=Apple Watch - 38mm,OS=2.0',
  245. 'name=Apple Watch - 42mm,OS=2.0',
  246. ]
  247. else
  248. [
  249. 'platform=OS X,arch=x86_64'
  250. ]
  251. end
  252. end
  253. end
  254. def schemes
  255. ['UICKeyChainStore', 'libUICKeyChainStore']
  256. end
  257. if xcode_version.start_with?('7.0')
  258. def supportedPlatforms
  259. ['macosx', 'iphoneos', 'iphonesimulator', 'watchos', 'watchsimulator']
  260. end
  261. elsif xcode_version.start_with?('6')
  262. def supportedPlatforms
  263. ['macosx', 'iphoneos', 'iphonesimulator']
  264. end
  265. else
  266. def supportedPlatforms
  267. ['macosx', 'iphoneos', 'iphonesimulator', 'watchos', 'watchsimulator', 'appletvos', 'appletvsimulator']
  268. end
  269. end
  270. def configurations
  271. ['Debug', 'Release']
  272. end
  273. desc "build for all platforms"
  274. task :build do |t|
  275. supportedPlatforms
  276. .product(configurations)
  277. .map { |platform, configuration| Rake::Task["build:#{platform}:#{configuration.downcase}"] }
  278. .map(&:invoke)
  279. end
  280. namespace :build do
  281. schemes.each do |scheme|
  282. supportedPlatforms.product(configurations).each do |platform, configuration|
  283. XCJobs::Build.new("#{platform}:#{configuration.downcase}") do |t|
  284. t.project = 'UICKeyChainStore'
  285. t.scheme = scheme
  286. t.sdk = platform
  287. t.configuration = configuration
  288. if xcode_version.start_with?('10')
  289. if platform == 'iphonesimulator'
  290. t.add_destination('name=iPhone X,OS=12.0')
  291. elsif platform == 'watchsimulator'
  292. t.add_destination('name=Apple Watch Series 4 - 44mm,OS=5.0')
  293. elsif platform == 'appletvsimulator'
  294. t.add_destination('name=Apple TV 4K,OS=12.0')
  295. end
  296. elsif xcode_version.start_with?('9.4')
  297. if platform == 'iphonesimulator'
  298. t.add_destination('name=iPhone 7,OS=11.4')
  299. elsif platform == 'watchsimulator'
  300. t.add_destination('name=Apple Watch - 42mm,OS=3.2')
  301. elsif platform == 'appletvsimulator'
  302. t.add_destination('name=Apple TV 4K,OS=11.0')
  303. end
  304. elsif xcode_version.start_with?('9.0')
  305. if platform == 'iphonesimulator'
  306. t.add_destination('name=iPhone 6,OS=11.0')
  307. elsif platform == 'watchsimulator'
  308. t.add_destination('name=Apple Watch - 42mm,OS=3.1')
  309. elsif platform == 'appletvsimulator'
  310. t.add_destination('name=Apple TV 1080p,OS=11.0')
  311. end
  312. elsif xcode_version.start_with?('8.0')
  313. if platform == 'iphonesimulator'
  314. t.add_destination('name=iPhone 6,OS=10.0')
  315. elsif platform == 'watchsimulator'
  316. t.add_destination('name=Apple Watch - 42mm,OS=3.0')
  317. elsif platform == 'appletvsimulator'
  318. t.add_destination('name=Apple TV 1080p,OS=10.0')
  319. end
  320. elsif xcode_version.start_with?('7.3') || xcode_version.start_with?('7.2')
  321. if platform == 'iphonesimulator'
  322. t.add_destination('name=iPhone 6,OS=9.2')
  323. elsif platform == 'watchsimulator'
  324. t.add_destination('name=Apple Watch - 42mm,OS=2.1')
  325. elsif platform == 'appletvsimulator'
  326. t.add_destination('name=Apple TV 1080p,OS=9.1')
  327. end
  328. end
  329. t.build_dir = 'build'
  330. t.hide_shell_script_environment = true
  331. t.formatter = 'xcpretty -c'
  332. if ENV['CI']
  333. t.add_build_setting('CODE_SIGN_IDENTITY', '')
  334. t.add_build_setting('CODE_SIGNING_REQUIRED', 'NO')
  335. end
  336. end
  337. end
  338. end
  339. end
  340. namespace :test do
  341. supportedPlatforms
  342. .select { |platform| platform == 'macosx' || platform == 'iphonesimulator' || platform == 'appletvsimulator' }
  343. .each do |platform|
  344. task platform do |t|
  345. configurations.each do |configuration|
  346. destinations(platform: platform)
  347. .map { |destination| Rake::Task["test:#{platform}:#{configuration.downcase}:#{destination}"] }
  348. .map(&:invoke)
  349. end
  350. end
  351. end
  352. end
  353. namespace :test do
  354. supportedPlatforms
  355. .select { |platform| platform == 'macosx' || platform == 'iphonesimulator' || platform == 'appletvsimulator' }
  356. .product(configurations)
  357. .each do |platform, configuration|
  358. destinations(platform: platform).each do |destination|
  359. XCJobs::Test.new("#{platform}:#{configuration.downcase}:#{destination}") do |t|
  360. t.project = 'UICKeyChainStore'
  361. t.scheme = 'UICKeyChainStore'
  362. t.sdk = platform
  363. t.configuration = configuration
  364. t.add_destination(destination)
  365. t.coverage = true
  366. t.build_dir = 'build'
  367. t.hide_shell_script_environment = true
  368. t.after_action do
  369. build_coverage_reports()
  370. puts `curl -L https://codecov.io/bash | bash -s -- -f 'coverage.txt'`
  371. end
  372. end
  373. end
  374. end
  375. end
  376. def build_coverage_reports()
  377. project_name = 'UICKeyChainStore'
  378. profdata = Dir.glob(File.join('build', '/**/Coverage.profdata')).first
  379. Dir.glob(File.join('build', "/**/#{project_name}")) do |target|
  380. output = `xcrun llvm-cov report -instr-profile "#{profdata}" "#{target}" -arch=x86_64`
  381. if $?.success?
  382. puts output
  383. `xcrun llvm-cov show -instr-profile "#{profdata}" "#{target}" -arch=x86_64 -use-color=0 > coverage.txt`
  384. break
  385. end
  386. end
  387. end