pindo 4.6.9 → 4.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. checksums.yaml +4 -4
  2. data/lib/pindo/base/aeshelper.rb +48 -2
  3. data/lib/pindo/base/funlog.rb +89 -0
  4. data/lib/pindo/base/githelper.rb +30 -12
  5. data/lib/pindo/base/plaininformative.rb +3 -0
  6. data/lib/pindo/base/standarderror.rb +1 -0
  7. data/lib/pindo/base/xcodeconst.rb +251 -0
  8. data/lib/pindo/client/applovinclient.rb +6 -3
  9. data/lib/pindo/client/aws3sclient.rb +33 -46
  10. data/lib/pindo/client/bossclient.rb +1 -1
  11. data/lib/pindo/client/pgyerclient.rb +78 -14
  12. data/lib/pindo/command/appstore/iap.rb +43 -0
  13. data/lib/pindo/command/appstore/itcapp.rb +41 -0
  14. data/lib/pindo/command/appstore/metadata.rb +43 -0
  15. data/lib/pindo/command/appstore/screenshots.rb +43 -0
  16. data/lib/pindo/command/appstore/upload.rb +40 -0
  17. data/lib/pindo/command/appstore.rb +17 -0
  18. data/lib/pindo/command/deploy/build.rb +109 -0
  19. data/lib/pindo/{deploy → command/deploy}/bundleid.rb +1 -1
  20. data/lib/pindo/command/deploy/cert.rb +179 -0
  21. data/lib/pindo/command/deploy/configproj.rb +105 -0
  22. data/lib/pindo/{deploy → command/deploy}/getitcinfo.rb +1 -1
  23. data/lib/pindo/{deploy → command/deploy}/iap.rb +30 -9
  24. data/lib/pindo/{deploy → command/deploy}/itcapp.rb +0 -1
  25. data/lib/pindo/{deploy → command/deploy}/itcinfo.rb +2 -3
  26. data/lib/pindo/{deploy → command/deploy}/pem.rb +3 -2
  27. data/lib/pindo/{deploy → command/deploy}/resign.rb +14 -63
  28. data/lib/pindo/command/deploy.rb +44 -0
  29. data/lib/pindo/{dev → command/dev}/autobuild.rb +17 -80
  30. data/lib/pindo/{dev → command/dev}/autoresign.rb +17 -64
  31. data/lib/pindo/{dev → command/dev}/createbuild.rb +0 -2
  32. data/lib/pindo/{dev → command/dev}/debug.rb +6 -2
  33. data/lib/pindo/command/dev/pgyercert.rb +75 -0
  34. data/lib/pindo/command/dev.rb +25 -0
  35. data/lib/pindo/command/env.rb +17 -0
  36. data/lib/pindo/{ipa → command/ipa}/autoresign.rb +18 -70
  37. data/lib/pindo/{ipa → command/ipa}/import.rb +47 -102
  38. data/lib/pindo/{ipa → command/ipa}/output.rb +38 -135
  39. data/lib/pindo/command/ipa.rb +16 -0
  40. data/lib/pindo/{lib → command/lib}/update.rb +19 -10
  41. data/lib/pindo/command/lib.rb +16 -0
  42. data/lib/pindo/{pgyer → command/pgyer}/apptest.rb +7 -29
  43. data/lib/pindo/{pgyer → command/pgyer}/comment.rb +7 -30
  44. data/lib/pindo/{pgyer → command/pgyer}/download.rb +35 -30
  45. data/lib/pindo/{pgyer → command/pgyer}/login.rb +3 -4
  46. data/lib/pindo/command/pgyer/resign.rb +111 -0
  47. data/lib/pindo/command/pgyer/upload.rb +123 -0
  48. data/lib/pindo/command/pgyer.rb +18 -0
  49. data/lib/pindo/{repo.rb → command/repo.rb} +4 -4
  50. data/lib/pindo/{utils → command/utils}/applovin.rb +43 -33
  51. data/lib/pindo/{utils → command/utils}/boss.rb +3 -3
  52. data/lib/pindo/command/utils/icon.rb +81 -0
  53. data/lib/pindo/{utils → command/utils}/renewproj.rb +1 -0
  54. data/lib/pindo/command/utils.rb +26 -0
  55. data/lib/pindo/command.rb +23 -26
  56. data/lib/pindo/module/build/swarkhelper.rb +95 -0
  57. data/lib/pindo/module/cert/certhelper.rb +176 -0
  58. data/lib/pindo/module/cert/keychainhelper.rb +138 -0
  59. data/lib/pindo/module/{pemcreate.rb → cert/pemhelper.rb} +3 -1
  60. data/lib/pindo/module/cert/provisioninghelper.rb +137 -0
  61. data/lib/pindo/module/cert/xcodecerthelper.rb +301 -0
  62. data/lib/pindo/module/{pgyerhelper.rb → pgyer/pgyerhelper.rb} +246 -35
  63. data/lib/pindo/module/xcode/xcodeappconfig.rb +188 -0
  64. data/lib/pindo/module/xcode/xcodebuildconfig.rb +12 -0
  65. data/lib/pindo/module/xcode/xcodebuildhelper.rb +312 -0
  66. data/lib/pindo/module/xcode/xcoderesconstant.rb +248 -0
  67. data/lib/pindo/module/xcode/xcodereshandler.rb +198 -0
  68. data/lib/pindo/module/xcode/xcodereshelper.rb +120 -0
  69. data/lib/pindo/options/appconfigoptions.rb +1 -0
  70. data/lib/pindo/options/deployoptions.rb +38 -41
  71. data/lib/pindo/version.rb +1 -1
  72. metadata +109 -97
  73. data/lib/pindo/deploy/Fastfile +0 -233
  74. data/lib/pindo/deploy/build.rb +0 -167
  75. data/lib/pindo/deploy/cert.rb +0 -508
  76. data/lib/pindo/deploy/configproj.rb +0 -89
  77. data/lib/pindo/deploy.rb +0 -44
  78. data/lib/pindo/dev.rb +0 -23
  79. data/lib/pindo/env/flutter.rb +0 -59
  80. data/lib/pindo/env/flutter.sh +0 -116
  81. data/lib/pindo/env.rb +0 -17
  82. data/lib/pindo/ipa.rb +0 -22
  83. data/lib/pindo/lib.rb +0 -18
  84. data/lib/pindo/module/buildconfighelper.rb +0 -13
  85. data/lib/pindo/module/buildhelper.rb +0 -76
  86. data/lib/pindo/module/config_project.sh +0 -143
  87. data/lib/pindo/module/configprojhelper.rb +0 -631
  88. data/lib/pindo/module/icon_contents.json +0 -116
  89. data/lib/pindo/module/imessage_icon.json +0 -91
  90. data/lib/pindo/module/imgset_contents.json +0 -21
  91. data/lib/pindo/module/launchimg_contents.json +0 -21
  92. data/lib/pindo/module/xcodebuildpre.rb +0 -258
  93. data/lib/pindo/pgyer/upload.rb +0 -234
  94. data/lib/pindo/pgyer.rb +0 -17
  95. data/lib/pindo/utils/icon.rb +0 -91
  96. data/lib/pindo/utils/icon.sh +0 -133
  97. data/lib/pindo/utils/podindex.rb +0 -56
  98. data/lib/pindo/utils/podindex.sh +0 -30
  99. data/lib/pindo/utils.rb +0 -29
  100. /data/lib/pindo/{deploy → command/deploy}/check.rb +0 -0
  101. /data/lib/pindo/{deploy → command/deploy}/confusecode.rb +0 -0
  102. /data/lib/pindo/{deploy → command/deploy}/confuseproj.rb +0 -0
  103. /data/lib/pindo/{deploy → command/deploy}/fabric.rb +0 -0
  104. /data/lib/pindo/{deploy → command/deploy}/initconfig.rb +0 -0
  105. /data/lib/pindo/{deploy → command/deploy}/pullconfig.rb +0 -0
  106. /data/lib/pindo/{deploy → command/deploy}/pushconfig.rb +0 -0
  107. /data/lib/pindo/{deploy → command/deploy}/quswark.rb +0 -0
  108. /data/lib/pindo/{deploy → command/deploy}/quswauth.rb +0 -0
  109. /data/lib/pindo/{deploy → command/deploy}/reportbug.rb +0 -0
  110. /data/lib/pindo/{deploy → command/deploy}/tag.rb +0 -0
  111. /data/lib/pindo/{deploy → command/deploy}/updateconfig.rb +0 -0
  112. /data/lib/pindo/{deploy → command/deploy}/uploadipa.rb +0 -0
  113. /data/lib/pindo/{dev → command/dev}/confusecode.rb +0 -0
  114. /data/lib/pindo/{dev → command/dev}/confuseproj.rb +0 -0
  115. /data/lib/pindo/{dev → command/dev}/pub.rb +0 -0
  116. /data/lib/pindo/{dev → command/dev}/renewcert.rb +0 -0
  117. /data/lib/pindo/{env → command/env}/dreamstudio.rb +0 -0
  118. /data/lib/pindo/{env → command/env}/quarkenv.rb +0 -0
  119. /data/lib/pindo/{env → command/env}/swarkenv.rb +0 -0
  120. /data/lib/pindo/{env → command/env}/workhard.rb +0 -0
  121. /data/lib/pindo/{lib → command/lib}/forcepush.rb +0 -0
  122. /data/lib/pindo/{lib → command/lib}/lint.rb +0 -0
  123. /data/lib/pindo/{lib → command/lib}/push.rb +0 -0
  124. /data/lib/pindo/{repo → command/repo}/clone.rb +0 -0
  125. /data/lib/pindo/{repo → command/repo}/create.rb +0 -0
  126. /data/lib/pindo/{repo → command/repo}/login.rb +0 -0
  127. /data/lib/pindo/{repo → command/repo}/search.rb +0 -0
  128. /data/lib/pindo/{setup.rb → command/setup.rb} +0 -0
  129. /data/lib/pindo/{upgrade.rb → command/upgrade.rb} +0 -0
  130. /data/lib/pindo/{utils → command/utils}/clearcert.rb +0 -0
  131. /data/lib/pindo/{utils → command/utils}/device.rb +0 -0
  132. /data/lib/pindo/{utils → command/utils}/tgate.rb +0 -0
  133. /data/lib/pindo/{utils → command/utils}/xcassets.rb +0 -0
  134. /data/lib/pindo/{utils → command/utils}/xcassets.sh +0 -0
  135. /data/lib/pindo/module/{appstore_in_app_purchase.rb → appstore/appstore_in_app_purchase.rb} +0 -0
  136. /data/lib/pindo/module/{appstore_metadata_connect_api_helper.rb → appstore/appstore_metadata_connect_api_helper.rb} +0 -0
  137. /data/lib/pindo/module/{appstore_metadata_fastlane_helper.rb → appstore/appstore_metadata_fastlane_helper.rb} +0 -0
  138. /data/lib/pindo/module/{iap_tier.json → appstore/iap_tier.json} +0 -0
  139. /data/lib/pindo/module/{commonconfuseproj.rb → build/commonconfuseproj.rb} +0 -0
  140. /data/lib/pindo/module/{xcodehelper.rb → xcode/xcodehelper.rb} +0 -0
@@ -24,6 +24,7 @@ module Pindo
24
24
  [
25
25
  ['--appstore', 'appstore模式,一般不用'],
26
26
  ['--install', '是否运行applovin脚本'],
27
+ ['--upload', '保存ids, 留作applovin网络不好情况使用'],
27
28
  ].concat(super)
28
29
  end
29
30
 
@@ -31,6 +32,7 @@ module Pindo
31
32
 
32
33
  @args_appstore_flag = argv.flag?('appstore', false)
33
34
  @args_install_flag = argv.flag?('install', false)
35
+ @args_upload_flag = argv.flag?('upload', false)
34
36
 
35
37
  super(argv)
36
38
  @additional_args = argv.remainder!
@@ -44,7 +46,11 @@ module Pindo
44
46
 
45
47
  skadnetwork_id_array = []
46
48
 
49
+ Funlog.instance.fancyinfo_start("正在请求applovin数据...")
50
+
47
51
  applovin_res_json = req_applovin_json
52
+ # puts JSON.pretty_generate(applovin_res_json)
53
+
48
54
  if !applovin_res_json.nil? && !applovin_res_json["skadnetwork_ids"].nil?
49
55
  applovin_res_json["skadnetwork_ids"].each do |network_id|
50
56
  skadnetwork_id_array << network_id["skadnetwork_id"]
@@ -52,44 +58,51 @@ module Pindo
52
58
  end
53
59
 
54
60
  applovin_media_res_json = req_applovin_mediia_json
61
+ # puts JSON.pretty_generate(applovin_media_res_json)
55
62
  if !applovin_media_res_json.nil? && !applovin_media_res_json["mediationSKAdnetworkIdsSpecs"].nil?
56
63
  applovin_media_res_json["mediationSKAdnetworkIdsSpecs"].each do |media_item|
57
64
  skadnetwork_id_array = skadnetwork_id_array + media_item["skAdnetworkIds"]
58
65
  end
59
66
  end
60
67
 
61
- skadnetwork_id_array = skadnetwork_id_array.uniq
62
- if !skadnetwork_id_array.nil? && skadnetwork_id_array.size.size > 50
63
- puts "SKAdNetworkItems Size: #{skadnetwork_id_array.size}"
68
+ skadnetwork_id_array = skadnetwork_id_array.uniq || []
69
+
70
+ Funlog.instance.fancyinfo_success("请求applovin数据,获取到#{skadnetwork_id_array.size}条数据...")
71
+
72
+ if !skadnetwork_id_array.nil? && skadnetwork_id_array.size > 50
73
+ # puts "From Applovin SKAdNetworkItems Size: #{skadnetwork_id_array.size}"
74
+ if @args_upload_flag
75
+ applovin_config_file = File.join(pindo_single_config.pindo_common_configdir,"applovin_client_config.json")
76
+ origin_json = {}
77
+ if File.exist?(applovin_config_file)
78
+ origin_json = JSON.parse(File.read(applovin_config_file))
79
+ end
80
+ origin_json["SKAdNetworkItems"] = skadnetwork_id_array
81
+ File.write(applovin_config_file, JSON.pretty_generate(origin_json))
82
+ git_addpush_repo(path:pindo_single_config.pindo_common_configdir, message:"Applovin SKAdNetworkItems", commit_file_params:["applovin_client_config.json"])
83
+ end
64
84
  else
85
+ Funlog.instance.fancyinfo_start("网络拉取applovin数据太少,从缓存中获取数据...")
65
86
  config_file = File.join(File::expand_path(Pindoconfig.instance.pindo_common_configdir), "applovin_client_config.json")
66
87
  config_json = JSON.parse(File.read(config_file))
67
88
  skadnetwork_id_array = skadnetwork_id_array + config_json["SKAdNetworkItems"]
68
- puts "SKAdNetworkItems Size: #{skadnetwork_id_array.size}"
89
+ # puts "From Config SKAdNetworkItems Size: #{skadnetwork_id_array.size}"
90
+ Funlog.instance.fancyinfo_success("网络拉取applovin数据太少,从缓存中获取到#{skadnetwork_id_array.size}条数据...")
69
91
  end
70
92
 
71
-
72
- current_dir = Dir.pwd
73
- project_fullname = nil
74
- Dir.chdir(current_dir)
75
- Dir.foreach(current_dir) do |file|
76
- if file =~ /(.*).xcodeproj/
77
- project_fullname = file
78
- break;
79
- end
80
- end
81
- project_root_dir = current_dir
82
93
 
94
+ Funlog.instance.fancyinfo_start("正在写入Xcode中...")
95
+
96
+ skadnetwork_id_array = skadnetwork_id_array.uniq || []
83
97
 
98
+ project_root_dir = Dir.pwd
99
+ xcodeproj_file_name = Dir.glob(File.join(project_root_dir, "/*.xcodeproj")).max_by {|f| File.mtime(f)}
84
100
 
85
- plist_file_name = File.join(project_root_dir, "Applovin-info.plist")
86
- if !project_fullname.nil?
87
- proj_name = File.basename(project_fullname, ".xcodeproj")
101
+ plist_file_name = File.join(project_root_dir, "AppEntry/Info.plist")
102
+ if !xcodeproj_file_name.nil?
103
+ proj_name = File.basename(xcodeproj_file_name, ".xcodeproj")
88
104
  plist_file_name = get_applovin_infoplist(project_dir:project_root_dir, proj_name:proj_name)
89
105
  end
90
-
91
-
92
- puts plist_file_name
93
106
 
94
107
 
95
108
  info_plist_dict = {}
@@ -105,9 +118,6 @@ module Pindo
105
118
  info_plist_dict["NSAppTransportSecurity"]["NSAllowsArbitraryLoads"] = true
106
119
  end
107
120
 
108
- # puts JSON.pretty_generate(info_plist_dict["SKAdNetworkItems"])
109
- # puts 111
110
- # info_plist_dict["NSUserTrackingUsageDescription"] = info_plist_dict["NSUserTrackingUsageDescription"] || "Your data will be used to provide you a better experience. We don't share any data with 3rd parties."
111
121
 
112
122
  if !skadnetwork_id_array.nil? && skadnetwork_id_array.size > 0
113
123
  info_plist_dict["SKAdNetworkItems"] = []
@@ -118,13 +128,11 @@ module Pindo
118
128
  end
119
129
  end
120
130
 
121
-
122
-
123
131
  Xcodeproj::Plist.write_to_path(info_plist_dict, plist_file_name)
124
-
125
132
 
133
+ Funlog.instance.fancyinfo_success("Xcode中applovin数据修改完成!")
126
134
 
127
- if @args_install_flag && !project_fullname.nil?
135
+ if @args_install_flag && !xcodeproj_file_name.nil? && File.exist?(xcodeproj_file_name)
128
136
 
129
137
  pindo_common_dir = pindo_single_config.pindo_common_configdir
130
138
 
@@ -136,15 +144,17 @@ module Pindo
136
144
  project_script_file = File.join(project_root_dir, "AppLovinQualityServiceSetup-ios.rb")
137
145
  FileUtils.cp_r(app_lovin_script, project_script_file)
138
146
  command = "ruby " + project_script_file
139
- puts command
140
- system command
141
-
147
+ # puts command
148
+ system command
142
149
  end
150
+
151
+
143
152
  end
144
153
 
154
+
145
155
  def get_applovin_infoplist(project_dir:nil, proj_name:nil)
146
156
 
147
- info_plist_path = File.join(project_dir, "Applovin-info.plist")
157
+ info_plist_path = File.join(project_dir, "AppEntry/Info.plist")
148
158
  proj_fullname = File.join(project_dir, proj_name) + ".xcodeproj"
149
159
  if File.exist?(proj_fullname)
150
160
  project_obj = Xcodeproj::Project.open(proj_fullname)
@@ -163,7 +173,6 @@ module Pindo
163
173
 
164
174
  def req_applovin_json
165
175
 
166
-
167
176
  begin
168
177
  # https://dash.applovin.com/docs/v1/skadnetwork_ids.json
169
178
  applovin_url = "https://dash.applovin.com/docs/v1/skadnetwork_ids.json"
@@ -174,6 +183,7 @@ module Pindo
174
183
  end
175
184
 
176
185
  applovin_res_json = JSON.parse(res.body)
186
+
177
187
  return applovin_res_json
178
188
  rescue Exception => e
179
189
  return nil
@@ -110,15 +110,15 @@ module Pindo
110
110
  if @platform.nil?
111
111
  @platform = current_config_json["app_setting"]["kGUKeyAppPlatform"]
112
112
  end
113
-
113
+
114
114
  if base_url.nil?
115
115
  base_url = current_config_json["app_setting"]["kGUKeyAppClientHost"]
116
116
  end
117
117
  end
118
118
 
119
119
  app_version = @appversion || "1.0.0"
120
- bundle_id = @bundleid || "com.heroneverdie101.fancyapptest"
121
- platform = @platform || "iOS_Funny_Test"
120
+ bundle_id = @bundleid || "com.heroneverdie101.fancyapp"
121
+ platform = @platform || "iOS_Funny_Release"
122
122
  apptype = @apptype || "FunnyApp"
123
123
 
124
124
  boss_client = BossClient.new(app_type:apptype, is_dev:false, base_url:base_url)
@@ -0,0 +1,81 @@
1
+
2
+
3
+ require 'highline/import'
4
+ require 'fileutils'
5
+ require 'json'
6
+ require "pindo/base/xcodeconst"
7
+ require 'pindo/module/xcode/xcodereshelper'
8
+
9
+ module Pindo
10
+ class Command
11
+ class Utils < Command
12
+ class Icon < Utils
13
+
14
+ extend Executable
15
+ executable :sips
16
+
17
+
18
+ self.summary = '根据1024*1024icon生成Xcode标准icon文件'
19
+
20
+ self.description = <<-DESC
21
+ 根据1024*1024icon生成Xcode标准icon文件,用法:pindo utils icon path/to/demo.png
22
+ DESC
23
+
24
+
25
+ self.arguments = [
26
+ CLAide::Argument.new('path/to/demo.png', true),
27
+ ]
28
+
29
+ def self.options
30
+ [
31
+ ['--install', '生成icon后拷贝进Xcode工程里, 用法 pindo utils icon --install'],
32
+ ].concat(super)
33
+ end
34
+
35
+ def initialize(argv)
36
+ @icon_name = argv.shift_argument
37
+ @args_install_flag = argv.flag?('install', false)
38
+ super(argv)
39
+ @additional_args = argv.remainder!
40
+ end
41
+
42
+ def validate!
43
+ super
44
+ help! 'Need a icon name' if @icon_name.nil? || @icon_name.empty?
45
+ end
46
+
47
+ def run
48
+ icon_name = @icon_name
49
+ time = Time.now.strftime('%m%d-%H%M%S')
50
+ new_icon_dir = File.join(Dir.pwd, "icon_"+time)
51
+
52
+
53
+ Funlog.instance.fancyinfo_start("正在生成icon...")
54
+ begin
55
+ XcodeResHelper.create_icons(icon_name: icon_name, new_icon_dir: new_icon_dir)
56
+ Funlog.instance.fancyinfo_success("生成icon成功!")
57
+ rescue StandardError => e
58
+ Funlog.instance.fancyinfo_error("生成icon失败!")
59
+ end
60
+
61
+
62
+ if @args_install_flag
63
+ Funlog.instance.fancyinfo_start("正在给Xcode替换icon...")
64
+ XcodeResHelper.install_icon(proj_dir: Dir.pwd, new_icon_dir: new_icon_dir)
65
+ Funlog.instance.fancyinfo_success("Xcode替换icon完成!")
66
+ begin
67
+ FileUtils.remove_dir(new_icon_dir)
68
+ rescue StandardError => e
69
+
70
+ end
71
+ else
72
+ puts "open #{new_icon_dir}"
73
+ end
74
+
75
+ end
76
+
77
+
78
+ end
79
+ end
80
+ end
81
+ end
@@ -2,6 +2,7 @@
2
2
  require 'xcodeproj'
3
3
  require 'find'
4
4
  require 'fileutils'
5
+ require 'pindo/module/xcode/xcodehelper'
5
6
 
6
7
  module Pindo
7
8
  class Command
@@ -0,0 +1,26 @@
1
+
2
+ require 'pindo/command/utils/icon'
3
+ require 'pindo/command/utils/renewproj'
4
+ require 'pindo/command/utils/clearcert'
5
+ require 'pindo/command/utils/xcassets'
6
+ require 'pindo/command/utils/device'
7
+ require 'pindo/command/utils/applovin'
8
+ require 'pindo/command/utils/tgate'
9
+ require 'pindo/command/utils/boss'
10
+
11
+
12
+ module Pindo
13
+ class Command
14
+
15
+ class Utils < Command
16
+
17
+
18
+ self.abstract_command = true
19
+
20
+ self.summary = '其他工具类的相关命令'
21
+
22
+
23
+ end
24
+
25
+ end
26
+ end
data/lib/pindo/command.rb CHANGED
@@ -3,11 +3,13 @@
3
3
  require 'claide'
4
4
  require 'json'
5
5
  require 'pindo/version'
6
- require 'pindo/config/pindoconfig'
6
+ require 'pindo/base/funlog'
7
+ require 'pindo/base/hashhelper'
7
8
  require 'pindo/base/plaininformative'
8
9
  require 'pindo/base/githelper'
9
10
  require 'pindo/client/giteeclient'
10
- require 'pindo/base/hashhelper'
11
+ require 'pindo/config/pindoconfig'
12
+
11
13
 
12
14
  module Pindo
13
15
  class Informative < PlainInformative
@@ -20,33 +22,28 @@ module Pindo
20
22
 
21
23
  include Pindo::Githelper
22
24
  include Pindoconfig::Mixin
25
+ include Funlog::Mixin
23
26
 
24
27
  require 'pindo/options/deployoptions'
25
-
26
-
27
28
  require 'pindo/module/appselect'
28
- require 'pindo/module/buildconfighelper'
29
- require 'pindo/module/buildhelper'
30
- require 'pindo/module/pemcreate'
31
- require 'pindo/module/commonconfuseproj'
32
- require 'pindo/module/xcodebuildpre'
33
- require 'pindo/module/xcodehelper'
34
- require 'pindo/module/configprojhelper'
35
- require 'pindo/module/appstore_in_app_purchase'
36
- require 'pindo/module/appstore_metadata_fastlane_helper'
37
- require 'pindo/module/appstore_metadata_connect_api_helper'
38
-
39
-
40
- require 'pindo/deploy'
41
- require 'pindo/dev'
42
- require 'pindo/env'
43
- require 'pindo/lib'
44
- require 'pindo/utils'
45
- require 'pindo/pgyer'
46
- require 'pindo/setup'
47
- require 'pindo/repo'
48
- require 'pindo/upgrade'
49
- require 'pindo/ipa'
29
+ require 'pindo/module/build/commonconfuseproj'
30
+ require 'pindo/module/cert/xcodecerthelper'
31
+
32
+ require 'pindo/module/appstore/appstore_in_app_purchase'
33
+ require 'pindo/module/appstore/appstore_metadata_fastlane_helper'
34
+ require 'pindo/module/appstore/appstore_metadata_connect_api_helper'
35
+
36
+ require 'pindo/command/deploy'
37
+ require 'pindo/command/dev'
38
+ require 'pindo/command/env'
39
+ require 'pindo/command/lib'
40
+ require 'pindo/command/utils'
41
+ require 'pindo/command/pgyer'
42
+ require 'pindo/command/setup'
43
+ require 'pindo/command/repo'
44
+ require 'pindo/command/upgrade'
45
+ require 'pindo/command/ipa'
46
+ require 'pindo/command/appstore'
50
47
 
51
48
 
52
49
  attr_accessor :args_help_flag
@@ -0,0 +1,95 @@
1
+ require 'highline/import'
2
+ require 'xcodeproj'
3
+ require 'json'
4
+ require 'yaml'
5
+
6
+
7
+ module Pindo
8
+ module SwarkHelper
9
+
10
+ def check_swark_authorize(config_json:nil, buid_type:nil)
11
+ if !config_json.nil? && config_json['project_info']['xcode_build_type'] && config_json["project_info"]["xcode_build_type"].include?("swark")
12
+
13
+ app_config_dir = File.join(File::expand_path(pindo_single_config.pindo_dir), @deploy_identifier)
14
+ swark_authorize_file = File.join(app_config_dir, "swark_authorize.json")
15
+ if File.exist?(swark_authorize_file)
16
+ swark_authorize_json=JSON.parse(File.read(swark_authorize_file))
17
+ unless swark_authorize_json && swark_authorize_json['swark_authorize_status']
18
+ show_swark_authorize_error(swark_authorize_json:swark_authorize_json , buid_type:buid_type)
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+ def show_swark_authorize_error(swark_authorize_json:nil, buid_type:nil)
25
+
26
+ puts "++++ +++ Need authorize !!! ++++"
27
+ puts "+++ Need authorize !!! ++++"
28
+ puts "+++ Need authorize !!! +++++"
29
+ puts " =========================="
30
+ puts
31
+
32
+ puts "方法一:"
33
+ command = " 1. swark authorize "
34
+ command = command + swark_authorize_json["swark_authorize_teamid"] + "." + swark_authorize_json["swark_authorize_bundleid"]
35
+ puts command
36
+ command = " 2. 修改swark_authorize.json 中的 swark_authorize_status = true 并且提交"
37
+ puts
38
+
39
+ puts "方法二:"
40
+ puts " pindo deploy quswark"
41
+ if buid_type.downcase.to_s.include?("appstore")
42
+ raise Informative, "Need swark authorize !!!"
43
+ end
44
+ end
45
+
46
+
47
+ def add_swark_entitlement(entitlements_plist_path:nil, bundle_id_dict:nil)
48
+ if @config_json['project_info']['xcode_build_type'] && @config_json["project_info"]["xcode_build_type"].include?("swark")
49
+ if File.exist?(entitlements_plist_path)
50
+ entitlements_plist_dict = Xcodeproj::Plist.read_from_path(entitlements_plist_path)
51
+
52
+ key_value = @team_id_vaule
53
+ key_value = key_value + "." + @bundle_id
54
+ entitlements_plist_dict['keychain-access-groups'] = [key_value]
55
+
56
+ Xcodeproj::Plist.write_to_path(entitlements_plist_dict, entitlements_plist_path)
57
+ end
58
+ end
59
+ end
60
+
61
+ def add_swark_authorize_json
62
+ if @build_type == "appstore" && @config_json['project_info']['xcode_build_type'] && @config_json["project_info"]["xcode_build_type"].include?("swark")
63
+
64
+ app_config_dir = clong_buildconfig_repo(repo_name: @deploy_repo_name)
65
+ swark_authorize_file = File.join(app_config_dir, "swark_authorize.json")
66
+ if File.exist?(swark_authorize_file)
67
+ swark_authorize_json=JSON.parse(File.read(swark_authorize_file))
68
+ if swark_authorize_json && swark_authorize_json['swark_authorize_status']
69
+ puts "swark already authorize success !!! "
70
+ else
71
+ swark_authorize_json = swark_authorize_json || {}
72
+ swark_authorize_json['swark_authorize_teamid'] = @team_id_vaule
73
+ swark_authorize_json['swark_authorize_bundleid'] = @bundle_id
74
+ swark_authorize_json['swark_authorize_status'] = false
75
+ File.open(swark_authorize_file, "w") do |f|
76
+ f.write(JSON.pretty_generate(swark_authorize_json))
77
+ end
78
+ git_addpush_repo(path:app_config_dir, message:"add swark authorize json")
79
+ end
80
+ else
81
+ swark_authorize_json = swark_authorize_json || {}
82
+ swark_authorize_json['swark_authorize_teamid'] = @team_id_vaule
83
+ swark_authorize_json['swark_authorize_bundleid'] = @bundle_id
84
+ swark_authorize_json['swark_authorize_status'] = false
85
+ File.open(swark_authorize_file, "w") do |f|
86
+ f.write(JSON.pretty_generate(swark_authorize_json))
87
+ end
88
+ git_addpush_repo(path:app_config_dir, message:"add swark authorize json")
89
+ end
90
+
91
+ end
92
+ end
93
+
94
+ end
95
+ end
@@ -0,0 +1,176 @@
1
+
2
+ require 'match'
3
+ require 'openssl'
4
+ require 'pindo/base/aeshelper'
5
+ require 'pindo/module/cert/keychainhelper'
6
+ require 'pindo/module/cert/provisioninghelper'
7
+
8
+
9
+ module Pindo
10
+
11
+ module CertHelper
12
+
13
+ def server_name(keychain_name)
14
+ ["match", keychain_name].join("_")
15
+ end
16
+
17
+ def get_cert_info(cer_certificate)
18
+ # can receive a certificate path or the file data
19
+ begin
20
+ if File.exist?(cer_certificate)
21
+ cer_certificate = File.binread(cer_certificate)
22
+ end
23
+ rescue ArgumentError
24
+ # cert strings have null bytes; suppressing output
25
+ end
26
+
27
+ cert = OpenSSL::X509::Certificate.new(cer_certificate)
28
+
29
+ # openssl output:
30
+ # subject= /UID={User ID}/CN={Certificate Name}/OU={Certificate User}/O={Organisation}/C={Country}
31
+ cert_info = cert.subject.to_s.gsub(/\s*subject=\s*/, "").tr("/", "\n")
32
+ out_array = cert_info.split("\n")
33
+ openssl_keys_to_readable_keys = {
34
+ 'UID' => 'User ID',
35
+ 'CN' => 'Common Name',
36
+ 'OU' => 'Organisation Unit',
37
+ 'O' => 'Organisation',
38
+ 'C' => 'Country',
39
+ 'notBefore' => 'Start Datetime',
40
+ 'notAfter' => 'End Datetime'
41
+ }
42
+
43
+ return out_array.map { |x| x.split(/=+/) if x.include?("=") }
44
+ .compact
45
+ .map { |k, v| [openssl_keys_to_readable_keys.fetch(k, k), v] }
46
+ .push([openssl_keys_to_readable_keys.fetch("notBefore"), cert.not_before])
47
+ .push([openssl_keys_to_readable_keys.fetch("notAfter"), cert.not_after])
48
+ rescue => ex
49
+ raise Informative, "get_cert_info: #{ex}"
50
+ return {}
51
+ end
52
+
53
+ def select_cert_or_key(paths:)
54
+ cert_id_path = ENV['MATCH_CERTIFICATE_ID'] ? paths.find { |path| path.include?(ENV['MATCH_CERTIFICATE_ID']) } : nil
55
+ cert_id_path || paths.last
56
+ end
57
+
58
+ def is_cert_valid?(cer_certificate_path)
59
+ cert = OpenSSL::X509::Certificate.new(File.binread(cer_certificate_path))
60
+ now = Time.now.utc
61
+ return (now <=> cert.not_after) == -1
62
+ end
63
+
64
+ def isMac?
65
+ (/darwin/ =~ RUBY_PLATFORM) != nil
66
+ end
67
+
68
+ def install_certs(certs_dir:nil, cert_type:nil)
69
+
70
+
71
+ if !cert_type.downcase.include?("development")
72
+ cert_type = "distribution"
73
+ end
74
+
75
+ certs = Dir[File.join(certs_dir, "certs", cert_type.to_s, "*.cer")]
76
+ keys = Dir[File.join(certs_dir, "certs", cert_type.to_s, "*.p12")]
77
+
78
+ if certs.count == 0 || keys.count == 0
79
+ raise Informative, "No certificates found in #{certs_dir}"
80
+ else
81
+ output_dir = Dir.mktmpdir
82
+ decrypt_password = "Gxtest#1"
83
+
84
+ Funlog.instance.fancyinfo_start("正在安装证书...")
85
+
86
+ cert_path = AESHelper.decrypt_specific_file(src_file: certs.first, password:decrypt_password, output_dir: output_dir)
87
+ key_path = AESHelper.decrypt_specific_file(src_file: keys.first, password:decrypt_password, output_dir: output_dir)
88
+
89
+ unless is_cert_valid?(cert_path)
90
+ raise Informative, "Your certificate '#{File.basename(cert_path)}' is not valid, please check end date and renew it if necessary"
91
+ end
92
+
93
+ if isMac?
94
+
95
+ keychain_name = "login.keychain"
96
+
97
+ if FastlaneCore::CertChecker.installed?(cert_path, in_keychain: nil)
98
+ Funlog.instance.fancyinfo_success("证书#{File.basename(cert_path)}已安装,无需重复安装!")
99
+ else
100
+ cert_password = "goodcert1"
101
+ keychain = 'login.keychain'
102
+ keychain_path = FastlaneCore::Helper.keychain_path(keychain)
103
+
104
+ KeychainHelper.import_file(cert_path, keychain_path, keychain_password: cert_password, certificate_password: "", skip_set_partition_list: false, output: false)
105
+ KeychainHelper.import_file(key_path, keychain_path, keychain_password: cert_password, certificate_password: "", skip_set_partition_list: false, output: false)
106
+
107
+
108
+ Funlog.instance.fancyinfo_success("证书'#{File.basename(cert_path)}'安装完成!")
109
+ end
110
+ else
111
+ puts "非Mac电脑不支持安装证书."
112
+ end
113
+
114
+ end
115
+
116
+ def install_provisionfiles(certs_dir:nil, bundle_id_map:nil, cert_type:nil)
117
+
118
+ if cert_type.downcase.include?("development")
119
+ cert_type = "Development"
120
+ elsif cert_type.downcase.include?("Adhoc")
121
+ cert_type = "Adhoc"
122
+ else
123
+ cert_type = "AppStore"
124
+ end
125
+
126
+ un_exist_files = []
127
+
128
+ provisioning_info_array = []
129
+
130
+
131
+
132
+ provisioning_info_array = []
133
+
134
+ bundle_id_map.each do |type, bundle_id_temp|
135
+ profile_filename = File.join(certs_dir, "profiles", cert_type.downcase.to_s,[cert_type.to_s, bundle_id_temp].join('_') + '.mobileprovision')
136
+
137
+ unless File.exist?(profile_filename)
138
+ un_exist_files << profile_filename
139
+ next
140
+ end
141
+ puts "正在安装 #{profile_filename}..."
142
+ decrypt_password = "Gxtest#1"
143
+ output_dir = Dir.mktmpdir
144
+ file_decrypt = AESHelper.decrypt_specific_file(src_file: profile_filename, password:decrypt_password, output_dir: output_dir)
145
+ destpath = Provisioninghelper.install(file_decrypt)
146
+ parsed_data = Provisioninghelper.parse(destpath)
147
+
148
+ provisioning_info = {}
149
+ provisioning_info['type'] = type
150
+ provisioning_info['bundle_id'] = bundle_id_temp
151
+ provisioning_info['profile_name'] = parsed_data['Name']
152
+ provisioning_info['profile_path'] = destpath
153
+
154
+ cert_info = get_cert_info(parsed_data["DeveloperCertificates"].first.string).to_h
155
+ provisioning_info['signing_identity'] = cert_info["Common Name"]
156
+ provisioning_info['team_id'] = parsed_data["TeamIdentifier"].first
157
+
158
+ puts JSON.pretty_generate(provisioning_info)
159
+ provisioning_info_array << provisioning_info
160
+ end
161
+
162
+
163
+
164
+ if un_exist_files.size > 0
165
+ raise Informative, "The following profiles do not exist: #{un_exist_files.join(', ')}"
166
+ end
167
+
168
+ return provisioning_info_array
169
+ end
170
+
171
+
172
+ end
173
+
174
+
175
+ end
176
+ end