Rakefile 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. require 'xcjobs'
  2. require 'json'
  3. def xcode_version
  4. `xcodebuild -version`.split("\n").first.scan(/\d+/).join('.')
  5. end
  6. def destinations(platform: 'iphonesimulator')
  7. if platform == 'iphonesimulator'
  8. if xcode_version.start_with?('8')
  9. [ 'name=iPhone 5,OS=10.0',
  10. 'name=iPhone 5s,OS=10.0',
  11. 'name=iPhone 6,OS=10.0',
  12. 'name=iPhone 6s Plus,OS=10.3.1',
  13. 'name=iPhone SE,OS=10.3.1',
  14. 'name=iPad Air 2,OS=10.0',
  15. 'name=iPad Pro (9.7-inch),OS=10.0',
  16. 'name=iPad Pro (12.9-inch),OS=10.0'
  17. ]
  18. else
  19. [ 'name=iPhone 5,OS=10.0',
  20. 'name=iPhone 5s,OS=10.0',
  21. 'name=iPhone 6,OS=10.0',
  22. 'name=iPhone 6s Plus,OS=10.3.1',
  23. 'name=iPhone SE,OS=10.3.1',
  24. 'name=iPhone 7,OS=11.0',
  25. 'name=iPad Air 2,OS=10.0',
  26. 'name=iPad Pro (9.7-inch),OS=10.0',
  27. 'name=iPad Pro (12.9-inch),OS=10.0',
  28. 'name=iPad Pro (10.5-inch),OS=11.0'
  29. ]
  30. end
  31. elsif platform == 'watchsimulator'
  32. if xcode_version.start_with?('8')
  33. [ 'name=Apple Watch - 38mm,OS=3.2',
  34. 'name=Apple Watch Series 2 - 42mm,OS=3.2'
  35. ]
  36. else
  37. [ 'name=Apple Watch - 38mm,OS=3.2',
  38. 'name=Apple Watch - 42mm,OS=4.0',
  39. 'name=Apple Watch Series 2 - 42mm,OS=4.0'
  40. ]
  41. end
  42. elsif platform == 'appletvsimulator'
  43. if xcode_version.start_with?('8')
  44. [ 'name=Apple TV 1080p,OS=10.2'
  45. ]
  46. else
  47. [ 'name=Apple TV 1080p,OS=10.2',
  48. 'name=Apple TV 1080p,OS=11.0'
  49. ]
  50. end
  51. else
  52. [
  53. 'platform=OS X,arch=x86_64'
  54. ]
  55. end
  56. end
  57. def supportedPlatforms
  58. ['macosx', 'iphoneos', 'iphonesimulator', 'watchos', 'watchsimulator', 'appletvos', 'appletvsimulator']
  59. end
  60. def configurations
  61. ['Debug', 'Release']
  62. end
  63. desc "build for all platforms"
  64. task :build do |t|
  65. supportedPlatforms
  66. .product(configurations)
  67. .map { |platform, configuration| Rake::Task["build:#{platform}:#{configuration.downcase}"] }
  68. .map(&:invoke)
  69. end
  70. namespace :build do
  71. supportedPlatforms.product(configurations).each do |platform, configuration|
  72. XCJobs::Build.new("#{platform}:#{configuration.downcase}") do |t|
  73. t.project = 'KeychainAccess'
  74. t.scheme = 'KeychainAccess'
  75. t.sdk = platform
  76. t.configuration = configuration
  77. t.build_dir = 'build'
  78. t.hide_shell_script_environment = true
  79. t.formatter = 'xcpretty -c'
  80. if ENV['CI']
  81. t.add_build_setting('CODE_SIGN_IDENTITY', '')
  82. t.add_build_setting('CODE_SIGNING_REQUIRED', 'NO')
  83. end
  84. if xcode_version.start_with?('8')
  85. t.add_build_setting('SWIFT_VERSION', '3.0')
  86. if platform == 'iphonesimulator'
  87. t.add_destination('name=iPhone 7,OS=10.3.1')
  88. elsif platform == 'watchsimulator'
  89. t.add_destination('name=Apple Watch - 42mm,OS=3.2')
  90. elsif platform == 'appletvsimulator'
  91. t.add_destination('name=Apple TV 1080p,OS=10.0')
  92. end
  93. else
  94. if platform == 'iphonesimulator'
  95. t.add_destination('name=iPhone 7,OS=11.0')
  96. elsif platform == 'watchsimulator'
  97. t.add_destination('name=Apple Watch - 42mm,OS=4.0')
  98. elsif platform == 'appletvsimulator'
  99. t.add_destination('name=Apple TV 1080p,OS=11.0')
  100. end
  101. end
  102. end
  103. end
  104. task :carthage do
  105. sh %[echo 'github \"kishikawakatsumi/KeychainAccess\"' > Cartfile]
  106. if xcode_version.start_with?('8')
  107. sh %[echo SWIFT_VERSION=\"3.0\" > swift3.xcconfig]
  108. sh %[XCODE_XCCONFIG_FILE=`pwd`/swift3.xcconfig carthage update --no-use-binaries]
  109. else
  110. sh %[carthage update --no-use-binaries]
  111. end
  112. end
  113. end
  114. namespace :test do
  115. supportedPlatforms
  116. .select { |platform| platform == 'macosx' || platform == 'iphonesimulator' || platform == 'appletvsimulator' }
  117. .each do |platform|
  118. task platform do |t|
  119. configurations.each do |configuration|
  120. destinations(platform: platform)
  121. .map { |destination| Rake::Task["test:#{platform}:#{configuration.downcase}:#{destination}"] }
  122. .map(&:invoke)
  123. end
  124. end
  125. end
  126. end
  127. namespace :test do
  128. supportedPlatforms
  129. .select { |platform| platform == 'macosx' || platform == 'iphonesimulator' || platform == 'appletvsimulator' }
  130. .product(configurations)
  131. .each do |platform, configuration|
  132. destinations(platform: platform).each do |destination|
  133. XCJobs::Test.new("#{platform}:#{configuration.downcase}:#{destination}") do |t|
  134. t.project = 'KeychainAccess'
  135. t.scheme = 'KeychainAccess'
  136. t.sdk = platform
  137. t.configuration = configuration
  138. t.add_destination(destination)
  139. t.coverage = true
  140. t.build_dir = 'build'
  141. t.hide_shell_script_environment = true
  142. if xcode_version.start_with?('8')
  143. t.add_build_setting('SWIFT_VERSION', '3.0')
  144. end
  145. t.after_action do
  146. build_coverage_reports()
  147. puts `curl -L https://codecov.io/bash | bash -s -- -f 'coverage.txt'`
  148. end
  149. end
  150. end
  151. end
  152. end
  153. def build_coverage_reports()
  154. project_name = 'KeychainAccess'
  155. profdata = Dir.glob(File.join('build', '/**/Coverage.profdata')).first
  156. Dir.glob(File.join('build', "/**/#{project_name}")) do |target|
  157. output = `xcrun llvm-cov report -instr-profile "#{profdata}" "#{target}" -arch=x86_64`
  158. if $?.success?
  159. puts output
  160. `xcrun llvm-cov show -instr-profile "#{profdata}" "#{target}" -arch=x86_64 -use-color=0 > coverage.txt`
  161. break
  162. end
  163. end
  164. end