gct 0.3.93 → 0.4.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a90278a27edf99a940f703b359f26160c3534f51bb8e3ad7dc2b9af240209fe1
4
- data.tar.gz: 9a62537fadb1678a6d8c1969e1b487c844117b1e58c9089038ccc9bbcaba8328
3
+ metadata.gz: 2543169b03dd0c5d196ea4af9fb3214efccfd54165fb5418c3fb36e9f04c0b88
4
+ data.tar.gz: a17f7e2f676904a9c8c6b0acd7ffc08fe0d8db6f07f974f8825e90a120ffa2cb
5
5
  SHA512:
6
- metadata.gz: acfa21c1c8cc42efc63f2d06fd49799146e8a17f6fcbcefc7480a9d2579db448280cdd78ea035bcb9906ab0facaa00926452fe429f7733c35c54b035ca6c411d
7
- data.tar.gz: feafb9b42ecdbc68b5dd91ef4415ebb6d0b0f871a0e70f11fe49537ecfa1319ad282bf1dca09c5c42974ff203c6123dbb3a0bf78b3c749657f0be9fcfff9801c
6
+ metadata.gz: 8c620629c7a89a8758a44c45635ed470cc42330f954c05a2bb7caf0adf2892215f7b40833f702a1378e18e648ec7ce383e5f81520622a5bd4677899ea74c7687
7
+ data.tar.gz: c1ad60709ac0c069086abccd377cf30a106f34f93ca224ca6541a0bcbf6010f521503beff69ee035648d1b74de8f73b751c7e819b638ea84928182d46970faff
data/lib/gct.rb CHANGED
@@ -13,4 +13,8 @@ module Gct
13
13
  require "gct/generator/gct_file"
14
14
  end
15
15
 
16
+ module Database
17
+ require "gct/database/data"
18
+ end
19
+
16
20
  end
@@ -27,6 +27,7 @@ module Gct
27
27
  require 'gct/command/setup'
28
28
  require 'gct/command/update'
29
29
  require 'gct/command/robot'
30
+ require 'gct/command/clean'
30
31
 
31
32
  self.abstract_command = true
32
33
  self.command = 'gct'
@@ -51,8 +52,6 @@ module Gct
51
52
  Colored2.disable!
52
53
  String.send(:define_method, :colorize) { |string, _| string }
53
54
  end
54
-
55
- config_gitlab
56
55
  end
57
56
 
58
57
  def file_contents(project_id, file, branch)
@@ -62,7 +61,7 @@ module Gct
62
61
  end
63
62
 
64
63
  def config_gitlab
65
- if FileBase.exist_root and token and Gitlab.endpoint.nil?
64
+ if FileBase.exist_root and token
66
65
  Gitlab.configure do |config|
67
66
  config.endpoint = 'https://gi-dev.ccrgt.com/api/v4'
68
67
  config.private_token = token
@@ -1,6 +1,7 @@
1
1
  require 'pathname'
2
2
  require 'tmpdir'
3
3
  require 'parallel'
4
+ require 'pp'
4
5
 
5
6
  module Gct
6
7
  class Command
@@ -13,20 +14,27 @@ module Gct
13
14
  self.arguments = [
14
15
  CLAide::Argument.new('PROJECT_ID', true),
15
16
  CLAide::Argument.new('BRANCH', true),
17
+ CLAide::Argument.new('VERSION', true),
16
18
  ]
17
19
 
18
20
  def initialize(argv)
19
21
  gitlab_error
22
+ config_gitlab
20
23
  @update_ci = argv.flag?('update-ci', false)
21
- @project_id = "ios/#{argv.shift_argument}"
24
+ @pre = argv.flag?('pre', false)
25
+ name = argv.shift_argument
26
+ @project_id = "ios/#{name}"
27
+ @project_name = name
22
28
  @branch = argv.shift_argument
29
+ @version = argv.shift_argument
23
30
  @file = 'Podfile'
24
31
  super
25
32
  end
26
33
 
27
34
  def self.options
28
35
  [
29
- ['--update-ci', '是否更新CI']
36
+ ['--update-ci', '是否更新CI'],
37
+ ['--pre', '是否为预发tag'],
30
38
  ].concat(super)
31
39
  end
32
40
 
@@ -34,11 +42,40 @@ module Gct
34
42
  super
35
43
  help! '请输入项目名.' unless @project_id
36
44
  help! '请输入分支名.' unless @branch
45
+ help! '请输入版本号.' unless @version
37
46
  end
38
47
 
39
48
  def run
40
49
  FileBase.root_err
41
- analyze_dependencies
50
+ puts "开始分析podfile文件".green
51
+ puts ""
52
+ where_statement = "and is_pre = #{@pre ? 1 : 0}"
53
+ p_db = Database::Data.new
54
+ p_sql = "select * from project where version = '#{@version}' #{where_statement}"
55
+ p_res = p_db.query(p_sql)
56
+
57
+ if !p_res.nil? && p_res.count > 0
58
+ res_first = nil
59
+ p_res.each do |row|
60
+ res_first = row
61
+ break
62
+ end
63
+ if res_first["is_done"].to_i == 0
64
+ tmp_podspecs
65
+ create_tag_by_priority()
66
+ else
67
+ raise "#{@project_name} #{@version} 版本已经打完tag了!!!".red
68
+ end
69
+ else
70
+ keys = "(version, name, branch" + (@pre ? ", is_pre)" : ")")
71
+ values = "('#{@version}', '#{@project_name}', '#{@branch}'" + (@pre ? ", 1)" : ")")
72
+ db = Database::Data.new
73
+ sql = "insert into project #{keys} values #{values}"
74
+ res = db.query(sql)
75
+ untagged_specs = analyze_dependencies
76
+ priority_rank(untagged_specs)
77
+ create_tag_by_priority()
78
+ end
42
79
  end
43
80
 
44
81
  def check_branch(branch)
@@ -47,38 +84,85 @@ module Gct
47
84
  end
48
85
 
49
86
  def podfile
50
- # if check_branch_can_be_update('zeus')
51
- if check_branch('ft/tag') # TODO: Test branch
52
- contents = file_contents(@project_id, @file, @branch)
53
- contents.force_encoding('UTF-8')
54
- puts contents
55
- temp_local_file = TempLocalFile.new(contents, @file)
56
- temp_local_file.write
57
- full_path = temp_local_file.full_path
58
-
59
- @podfile ||= begin
60
- podfile = Pod::Podfile.from_ruby(full_path, contents)
61
- podfile
62
- end
87
+ contents = file_contents(@project_id, @file, @branch)
88
+ contents.force_encoding('UTF-8')
89
+ temp_local_file = TempLocalFile.new(contents, @file)
90
+ temp_local_file.write
91
+ full_path = temp_local_file.full_path
92
+
93
+ @podfile ||= begin
94
+ podfile = Pod::Podfile.from_ruby(full_path, contents)
95
+ podfile
63
96
  end
64
97
  end
65
98
 
66
- def analyze_dependencies
67
- untagged_git_dependencies = podfile.dependencies.select { |dependency| dependency.external? && dependency.external_source[:tag].nil? && dependency.external_source[:branch] == Constant.DefaultTagBranch}
99
+ def tmp_podspecs
100
+ untagged_git_dependencies = podfile.dependencies.select { |dependency| dependency.external? && dependency.external_source[:tag].nil? && dependency.external_source[:branch] == Constant.DefaultTagFromBranch}
101
+ raise "没有需要打tag的库".red if untagged_git_dependencies.count == 0
68
102
 
69
- untagged_specs = Parallel.map(untagged_git_dependencies, in_threads: 1) do |dep|
103
+ spec_files = Parallel.map(untagged_git_dependencies, in_threads: 1) do |dep|
104
+ project_name = "#{Constant.NameSpace}#{dep.name}"
105
+ branch = Constant.DefaultTagFromBranch
106
+ if @pre
107
+ branch = Constant.PreTagFromBranch
108
+ create_pre_branch(branch, project_name)
109
+ end
70
110
  file_name = "#{dep.name}.podspec"
71
- podspec_contents = file_contents("#{Constant.NameSpace}#{dep.name}", file_name, Constant.DefaultTagBranch)
111
+ podspec_contents = file_contents(project_name, file_name, branch)
72
112
  temp_local_spec_file = TempLocalFile.new(podspec_contents, file_name)
73
113
  temp_local_spec_file.write
74
- spec_file = temp_local_spec_file.full_path
114
+ path = temp_local_spec_file.full_path
115
+ spec = Pod::Specification.from_file(path)
116
+ remove_tag(auto_add_tag(spec.version.to_s), project_name)
117
+ path
118
+ end
119
+ spec_files
120
+ end
121
+
122
+ def create_pre_branch(branch, project_name)
123
+ puts "正在创建#{project_name}预发分支!".green
124
+ bs = Gitlab.branches(project_name)
125
+ to_b = Constant.DefaultTagToBranch
126
+ pre_to_b = Constant.PreTagToBranch
127
+ from_b = Constant.DefaultTagFromBranch
128
+ bs.each do |b|
129
+ if b["name"].eql?(branch)
130
+ Gitlab.delete_branch(project_name, branch)
131
+ end
132
+ if b["name"].eql?(pre_to_b)
133
+ Gitlab.delete_branch(project_name, pre_to_b)
134
+ end
135
+ end
136
+ Gitlab.create_branch(project_name, branch, from_b)
137
+ Gitlab.create_branch(project_name, pre_to_b, to_b)
138
+ end
75
139
 
140
+ def remove_tag(tag, name)
141
+ # 判断是否有这个tag
142
+ tag = "#{tag}#{Constant.PreHuffix}"
143
+ command = `git rev-parse --is-inside-work-tree`
144
+ if command.eql?("true")
145
+ `git tag -d #{tag}`
146
+ `git push origin :refs/tags/#{tag}`
147
+ else
148
+ tags = Gitlab.tags("#{name}")
149
+ tags.each do |t|
150
+ if t["name"].eql?("#{tag}")
151
+ Gitlab.delete_tag("#{name}", "#{tag}")
152
+ break
153
+ end
154
+ end
155
+ end
156
+ end
157
+
158
+ def analyze_dependencies
159
+ untagged_specs = tmp_podspecs.map do |spec_file|
76
160
  # 创建podspec对象
77
161
  spec = Pod::Specification.from_file(spec_file)
78
162
  gct_spec = Specification.new()
79
163
  gct_spec.name = spec.name
80
164
  gct_spec.priority = 1000
81
- gct_spec.status = SpecPublishStatus::CREATED
165
+ gct_spec.status = SpecPublishStatus::WAITING
82
166
  gct_spec.tag = "0"
83
167
  dependencySpecs = Array.new()
84
168
  if spec.subspecs.length == 0
@@ -86,7 +170,7 @@ module Gct
86
170
  sub_spec = Specification.new()
87
171
  sub_spec.name = dep.root_name
88
172
  sub_spec.priority = 1000
89
- sub_spec.status = SpecPublishStatus::CREATED
173
+ sub_spec.status = SpecPublishStatus::WAITING
90
174
  sub_spec.tag = "0"
91
175
  sub_spec
92
176
  end
@@ -97,7 +181,7 @@ module Gct
97
181
  sub_spec = Specification.new()
98
182
  sub_spec.name = dep.root_name
99
183
  sub_spec.priority = 1000
100
- sub_spec.status = SpecPublishStatus::CREATED
184
+ sub_spec.status = SpecPublishStatus::WAITING
101
185
  sub_spec.tag = "0"
102
186
  sub_spec
103
187
  end
@@ -108,8 +192,7 @@ module Gct
108
192
  gct_spec.dependencySpecs = dependencySpecs
109
193
  gct_spec
110
194
  end
111
-
112
- priority_rank(untagged_specs)
195
+ untagged_specs
113
196
  end
114
197
 
115
198
  def eqlBetweenHash(hash1, hash2)
@@ -133,12 +216,10 @@ module Gct
133
216
  temp_spec_map[spec.name] = spec
134
217
  end
135
218
  temp_spec_map_copy = Hash.new()
136
- count = 1
137
219
 
138
220
  while !(eqlBetweenHash(temp_spec_map, temp_spec_map_copy)) do
139
221
  # 深拷贝
140
222
  temp_spec_map_copy = Marshal.load(Marshal.dump(temp_spec_map))
141
- puts "--- times == #{count} ---"
142
223
  specs.map do |spec|
143
224
  temp_spec = temp_spec_map[spec.name]
144
225
  spec.dependencySpecs.map do |subspec|
@@ -150,10 +231,55 @@ module Gct
150
231
  end
151
232
  end
152
233
  end
153
- count += 1
154
- temp_spec_map.each { |key, value|
155
- puts "#{key} => #{value.priority}"
156
- }
234
+ end
235
+
236
+ values = ""
237
+ temp_spec_map.each do |key, value|
238
+ values.concat("('#{@version}', '#{key}', '#{@project_name}', '#{value.tag}', '#{value.status}', #{value.priority}" + (@pre ? ", 1)," : "),"))
239
+ end
240
+ val = values[0, values.length - 1]
241
+ keys = "(project_version, pod_name, project_name, tag_version, tag_status, priority" + (@pre ? ", is_pre)" : ")")
242
+ sql = "insert into tag #{keys} values #{val}"
243
+ db = Database::Data.new
244
+ db.query(sql)
245
+ end
246
+
247
+ # 按优先级打tag, 触发第一个优先级,其他的上一优先级打完之后自动触发
248
+ def create_tag_by_priority()
249
+ db = Database::Data.new
250
+ # 查询优先级最高的为完成打tag的数据
251
+ where_statement = "and is_pre = " + (@pre ? "1" : "0")
252
+ sql = "select * from tag where priority = (select MAX(priority) from tag where project_version = '#{@version}' and tag_status != '#{SpecPublishStatus::SUCCESS}' #{where_statement})"
253
+ result = db.query(sql)
254
+ vals = ""
255
+ ins = ""
256
+ if !result.nil? && result.count > 0
257
+ result.each do |row|
258
+ if row["tag_status"].eql?(SpecPublishStatus::WAITING) || row["tag_status"].eql?(SpecPublishStatus::CANCELED) || row["tag_status"].eql?(SpecPublishStatus::FAILED)
259
+ status = SpecPublishStatus::PENDING
260
+ name = row["pod_name"]
261
+ vals.concat("when pod_name = '#{name}' then '#{status}' ")
262
+ ins.concat("'#{name}',")
263
+ system "gct update dependency #{name} tag_status #{status}"
264
+ skip_tag = ""
265
+ if row["is_tag"].to_i == 1
266
+ skip_tag = "--skip-tag"
267
+ end
268
+ pre = ""
269
+ if row["is_pre"].to_i == 1
270
+ pre = "--pre"
271
+ end
272
+ system "gct update tag #{name} --auto-tag --update-ci #{skip_tag} #{pre}"
273
+ end
274
+ end
275
+ f_ins = ins[0, ins.length - 1]
276
+ sql = "update tag set tag_status = (
277
+ case
278
+ #{vals}
279
+ end
280
+ ) where pod_name in (#{f_ins}) and project_version = '#{@version}'"
281
+ update_db = Database::Data.new
282
+ update_db.query(sql)
157
283
  end
158
284
  end
159
285
  end
@@ -0,0 +1,15 @@
1
+ require 'gct/command/clean/cache'
2
+ require 'gct/command/clean/ci'
3
+ require 'gct/command/clean/lint'
4
+
5
+ module Gct
6
+ class Command
7
+ class Clean < Command
8
+ self.abstract_command = true
9
+ self.summary = '清理缓存的相关操作'
10
+ self.description = <<-DESC
11
+ 清理lint缓存,Xcode build缓存,ci build 缓存
12
+ DESC
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,26 @@
1
+ module Gct
2
+ class Command
3
+ class Clean < Command
4
+ class Cache < Clean
5
+
6
+ self.summary = '清理Xcode build缓存'
7
+ self.description = <<-DESC
8
+ 清理Xcode build缓存
9
+ DESC
10
+
11
+ def initialize(argv)
12
+
13
+ super
14
+ end
15
+
16
+ def run
17
+ home_path = Generator::GctFile.get_system_home_path().rstrip
18
+ xcache_path = "#{home_path}/Library/Developer/Xcode/DerivedData/"
19
+ `rm -rf #{xcache_path}`
20
+ end
21
+
22
+
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,23 @@
1
+ module Gct
2
+ class Command
3
+ class Clean < Command
4
+ class Ci < Clean
5
+
6
+ self.summary = '清除ci缓存'
7
+ self.description = <<-DESC
8
+ 清除ci缓存,默认清除所有
9
+ DESC
10
+
11
+ self.arguments = [
12
+ CLAide::Argument.new('POD_NAME', false),
13
+ ]
14
+
15
+ def initialize(argv)
16
+ super
17
+ end
18
+
19
+
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,28 @@
1
+ module Gct
2
+ class Command
3
+ class Clean < Command
4
+ class Lint < Clean
5
+
6
+ self.summary = '清除lint缓存'
7
+ self.description = <<-DESC
8
+ 清除lint缓存,默认清除所有
9
+ DESC
10
+
11
+ self.arguments = [
12
+ CLAide::Argument.new('POD_NAME', false),
13
+ ]
14
+
15
+ def initialize(argv)
16
+ @pod_name = argv.shift_argument
17
+ super
18
+ end
19
+
20
+ def run
21
+ home_path = Generator::GctFile.get_system_home_path().rstrip
22
+ lintcahce_path = "#{home_path}/Library/Caches/CocoaPods/Pods/External/#{@pod_name}"
23
+ `rm -rf #{lintcahce_path}`
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -7,9 +7,13 @@ push_pod:
7
7
  script:
8
8
  - gct robot start
9
9
  - echo "开始lint 和 push podspec"
10
+ - gct update dependency $CI_PROJECT_NAME "tag_status" "deploying"
11
+ - gct clean lint $CI_PROJECT_NAME
10
12
  - gct repo update
11
13
  - gct repo push
12
14
  - gct robot finish true
15
+ - gct update dependency $CI_PROJECT_NAME "tag_version" $CI_COMMIT_REF_NAME
16
+ - gct update next
13
17
  only:
14
18
  - tags
15
19
  tags:
@@ -19,6 +23,9 @@ on_failure:
19
23
  stage: failure
20
24
  script:
21
25
  - gct robot finish false
26
+ - gct update dependency $CI_PROJECT_NAME "tag_status" "failed"
22
27
  when: on_failure
28
+ only:
29
+ - tags
23
30
  tags:
24
31
  - iOS