gct 0.4.1 → 0.4.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 61f99077edb53ba0cf05eca381a814b9f41a17ecc191cc68a1950c2402dff1b7
4
- data.tar.gz: 3132fd74ec8fd026ea13921f717e68c8f7bbb4aba1ee1265ba057eef823cd8cd
3
+ metadata.gz: 3c891620cdbf1ca7ebfbfea728c7119c50bdf57681153578179651c3dd5b92de
4
+ data.tar.gz: a141431922d4a1d38fc8a7feb9702da7023524eac255dde2e3433c97dd5b1b76
5
5
  SHA512:
6
- metadata.gz: 92432f4c66aa5d9a19c27c0c5c22ceb53253ff118e34586934516790134474d3f0c9360ef8dad2b51e8c7cd737d0441e1c019942ff8d4f94d2449d33d109ec19
7
- data.tar.gz: 83d92ca4f72529e5be6db516fc667bc9dbddc6783e29aa0eaac68f109d91df346545b0c52be5fc14759b2cd03603f86ea8fcd94320e4f6e00ed23f83dd7f569e
6
+ metadata.gz: 924af3952e8779c161663672988ed5b590841f5e9c4dca9d1c1acccd8d578a3d18ffd39f100e8539d980d7ce5b30145bf616d2fc159ab9d48cc1673ce674a8dc
7
+ data.tar.gz: 8e103f59abf58ea19c52628b947827a3b74e86aaafa7cdd42c4ab310a75b189f0530253fe1ea4106a7ab8758a5bdb50de683c76813f116c3d414e71b948e5515
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
@@ -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
@@ -20,6 +21,7 @@ module Gct
20
21
  gitlab_error
21
22
  config_gitlab
22
23
  @update_ci = argv.flag?('update-ci', false)
24
+ @pre = argv.flag?('pre', false)
23
25
  name = argv.shift_argument
24
26
  @project_id = "ios/#{name}"
25
27
  @project_name = name
@@ -31,7 +33,8 @@ module Gct
31
33
 
32
34
  def self.options
33
35
  [
34
- ['--update-ci', '是否更新CI']
36
+ ['--update-ci', '是否更新CI'],
37
+ ['--pre', '是否为预发tag'],
35
38
  ].concat(super)
36
39
  end
37
40
 
@@ -46,17 +49,32 @@ module Gct
46
49
  FileBase.root_err
47
50
  puts "开始分析podfile文件".green
48
51
  puts ""
49
- FileBase.write_version_message(@version, @project_name, @branch)
50
- exist_dep = FileBase.exist_dependency
51
- if exist_dep
52
- tmp_podspecs
53
- priority_map = FileBase.yaml_dependency_read
54
- create_tag_by_priority(priority_map)
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
55
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)
56
75
  untagged_specs = analyze_dependencies
57
- priority_map = priority_rank(untagged_specs)
58
- generate_dependency_file(priority_map)
59
- create_tag_by_priority(priority_map)
76
+ priority_rank(untagged_specs)
77
+ create_tag_by_priority()
60
78
  end
61
79
  end
62
80
 
@@ -66,34 +84,76 @@ module Gct
66
84
  end
67
85
 
68
86
  def podfile
69
- # if check_branch_can_be_update('zeus')
70
- # if check_branch('ft/tag') # TODO: Test branch
71
- contents = file_contents(@project_id, @file, @branch)
72
- # puts contents
73
- contents.force_encoding('UTF-8')
74
- temp_local_file = TempLocalFile.new(contents, @file)
75
- temp_local_file.write
76
- full_path = temp_local_file.full_path
77
-
78
- @podfile ||= begin
79
- podfile = Pod::Podfile.from_ruby(full_path, contents)
80
- podfile
81
- end
82
- # 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
96
+ end
83
97
  end
84
98
 
85
99
  def tmp_podspecs
86
- untagged_git_dependencies = podfile.dependencies.select { |dependency| dependency.external? && dependency.external_source[:tag].nil? && dependency.external_source[:branch] == Constant.DefaultTagBranch}
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
87
102
 
88
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
89
110
  file_name = "#{dep.name}.podspec"
90
- podspec_contents = file_contents("#{Constant.NameSpace}#{dep.name}", file_name, Constant.DefaultTagBranch)
111
+ podspec_contents = file_contents(project_name, file_name, branch)
91
112
  temp_local_spec_file = TempLocalFile.new(podspec_contents, file_name)
92
113
  temp_local_spec_file.write
93
- 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
94
118
  end
95
119
  spec_files
96
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
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
97
157
 
98
158
  def analyze_dependencies
99
159
  untagged_specs = tmp_podspecs.map do |spec_file|
@@ -172,72 +232,55 @@ module Gct
172
232
  end
173
233
  end
174
234
  end
175
- dependency_map = Hash.new()
176
- priority_map = Hash.new()
235
+
236
+ values = ""
177
237
  temp_spec_map.each do |key, value|
178
- dependency_map[key] = {"priority" => value.priority, "tag" => value.tag, "status" => value.status}
238
+ values.concat("('#{@version}', '#{key}', '#{@project_name}', '#{value.tag}', '#{value.status}', #{value.priority}" + (@pre ? ", 1)," : "),"))
179
239
  end
180
- priority = 1000
181
- while priority <= 1000 do
182
- tmp_hash = Hash.new()
183
- dependency_map.each do |key, value|
184
- if (value["priority"] == priority)
185
- tmp_hash.store(key, {"tag" => value["tag"], "status" => value["status"]})
186
- dependency_map.delete(value)
187
- end
188
- end
189
- if (tmp_hash.keys.count == 0)
190
- priority = 1001
191
- else
192
- priority_map[priority.to_s] = tmp_hash
193
- priority -= 1
194
- end
195
- end
196
- priority_map
197
- end
198
-
199
- def generate_dependency_file(priority_map)
200
- yaml_path = "#{Generator::GctFile.temp_folder_path}/#{Constant.DependencyName}"
201
- FileBase.yaml_write_map(yaml_path, priority_map)
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)
202
245
  end
203
246
 
204
247
  # 按优先级打tag, 触发第一个优先级,其他的上一优先级打完之后自动触发
205
- def create_tag_by_priority(priority_map)
206
- priority = get_current_need_tag_priority
207
- puts "priority is #{priority}"
208
- value = priority_map[priority.to_s]
209
- raise "没有需要打tag的库".red if value.keys.count == 0
210
- value.each do |key, val|
211
- if val["status"].eql?(SpecPublishStatus::WAITING) || val["status"].eql?(SpecPublishStatus::CANCELED) || val["status"].eql?(SpecPublishStatus::FAILED)
212
- is_skip = val["status"].eql?(SpecPublishStatus::FAILED) || val["status"].eql?(SpecPublishStatus::CANCELED)
213
- status = SpecPublishStatus::PENDING
214
- val["status"] = status
215
- system "gct update dependency #{key} status #{status}"
216
- puts "gct update tag #{key} --auto-tag #{is_skip ? "--skip-tag" : ""}"
217
- system "gct update tag #{key} --auto-tag --update-ci #{is_skip ? "--skip-tag" : ""}"
218
- end
219
- end
220
- end
221
-
222
- # 当前优先级是否已打完
223
- def get_current_need_tag_priority
224
- priority = 1000
225
- content_map = FileBase.yaml_dependency_read
226
- priority_map = content_map[priority.to_s]
227
- is_all_done = true
228
- while is_all_done do
229
- priority_map.each do |k, v|
230
- if !v["status"].eql?(SpecPublishStatus::SUCCESS)
231
- is_all_done = false
232
- break
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}"
233
273
  end
234
274
  end
235
- if is_all_done
236
- priority -= 1
237
- priority_map = content_map[priority.to_s]
275
+ f_ins = ins[0, ins.length - 1]
276
+ sql = "update tag set tag_status = (
277
+ case
278
+ #{vals}
238
279
  end
280
+ ) where pod_name in (#{f_ins}) and project_version = '#{@version}'"
281
+ update_db = Database::Data.new
282
+ update_db.query(sql)
239
283
  end
240
- priority
241
284
  end
242
285
  end
243
286
  end
@@ -5,14 +5,12 @@ stages:
5
5
  push_pod:
6
6
  stage: push
7
7
  script:
8
- - gct robot start --test
9
8
  - echo "开始lint 和 push podspec"
10
- - gct update dependency $CI_PROJECT_NAME "status" "deploying"
9
+ - gct update dependency $CI_PROJECT_NAME "tag_status" "deploying"
11
10
  - gct clean lint $CI_PROJECT_NAME
12
11
  - gct repo update
13
12
  - gct repo push
14
- - gct robot finish true --test
15
- - gct update dependency $CI_PROJECT_NAME "tag" $CI_COMMIT_REF_NAME
13
+ - gct update dependency $CI_PROJECT_NAME "tag_version" $CI_COMMIT_REF_NAME
16
14
  - gct update next
17
15
  only:
18
16
  - tags
@@ -22,8 +20,8 @@ push_pod:
22
20
  on_failure:
23
21
  stage: failure
24
22
  script:
25
- - gct robot finish false --test
26
- - gct update dependency $CI_PROJECT_NAME "status" "failed"
23
+ - gct robot finish false
24
+ - gct update dependency $CI_PROJECT_NAME "tag_status" "failed"
27
25
  when: on_failure
28
26
  only:
29
27
  - tags
@@ -24,9 +24,9 @@ module Gct
24
24
  end
25
25
 
26
26
  def pushRepo
27
- puts "pod 命令为:pod repo push iOSCRGTPodSource --sources=#{Constant.GitURL}iOSCRGTPodSource.git --verbose --skip-import-validation --use-libraries --allow-warnings".green
27
+ puts "pod 命令为:pod repo push iOSCRGTPodSource --sources=#{Constant.GitURL}iOSCRGTPodSource.git --verbose --skip-import-validation --use-libraries --allow-warnings --use-modular-headers".green
28
28
  # exception: ruby 2.6 以上生效
29
- system "pod repo push iOSCRGTPodSource --sources=#{Constant.GitURL}iOSCRGTPodSource.git --verbose --skip-import-validation --use-libraries --allow-warnings", exception: true
29
+ system "pod repo push iOSCRGTPodSource --sources=#{Constant.GitURL}iOSCRGTPodSource.git --verbose --skip-import-validation --use-libraries --allow-warnings --use-modular-headers", exception: true
30
30
  end
31
31
  end
32
32
  end
@@ -1,6 +1,7 @@
1
1
  require 'gct/command/robot/start'
2
2
  require 'gct/command/robot/finish'
3
3
  require 'gct/command/robot/podfile'
4
+ require 'gct/command/robot/summary'
4
5
  require 'net/https'
5
6
  require 'json'
6
7
 
@@ -0,0 +1,34 @@
1
+ require 'net/https'
2
+ require 'json'
3
+
4
+ module Gct
5
+ class Command
6
+ class Robot < Command
7
+ class Summary < Robot
8
+
9
+ self.summary = '汇总'
10
+ self.description = <<-DESC
11
+ 汇总
12
+ DESC
13
+
14
+ self.arguments = [
15
+ ]
16
+
17
+ def self.options
18
+ [
19
+ ['--test', '测试机器人,测试webhook'],
20
+ ].concat(super)
21
+ end
22
+
23
+ def initialize(argv)
24
+ @test = argv.flag?('test', false)
25
+ super
26
+ end
27
+
28
+ def run
29
+
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -22,8 +22,8 @@ module Gct
22
22
  end
23
23
 
24
24
  def run
25
- system "pod lib lint --sources=#{Constant.GitURL}iOSCRGTPodSource.git --allow-warnings --verbose --skip-import-validation --use-libraries", exception: true
26
- # lint_spec
25
+ # system "pod lib lint --sources=#{Constant.GitURL}iOSCRGTPodSource.git --allow-warnings --verbose --skip-import-validation --use-libraries", exception: true
26
+ lint_spec
27
27
  end
28
28
 
29
29
  def generate_podfile(pod_name, spec_path)
@@ -1,3 +1,4 @@
1
+ require 'mysql2'
1
2
  module Gct
2
3
  class Command
3
4
  class Update < Command
@@ -9,16 +10,14 @@ module Gct
9
10
  DESC
10
11
 
11
12
  self.arguments = [
12
- # CLAide::Argument.new('PRIORITY', false),
13
13
  CLAide::Argument.new('POD_NAME', false),
14
- CLAide::Argument.new('KEY', false),
14
+ CLAide::Argument.new('FIELD', false),
15
15
  CLAide::Argument.new('VALUE', false),
16
16
  ]
17
17
 
18
18
  def initialize(argv)
19
- # @priority = argv.shift_argument
20
19
  @pod_name = argv.shift_argument
21
- @key = argv.shift_argument
20
+ @field = argv.shift_argument
22
21
  @value = argv.shift_argument
23
22
  super
24
23
  end
@@ -28,7 +27,15 @@ module Gct
28
27
  end
29
28
 
30
29
  def run
31
- FileBase.yaml_dependency_update(@pod_name, @key, @value)
30
+ db = Database::Data.new
31
+ set_val = ""
32
+ if (@field.eql?("tag_version"))
33
+ set_val = "t.#{@field} = '#{@value}', t.tag_status = '#{SpecPublishStatus::SUCCESS}'"
34
+ else
35
+ set_val = "t.#{@field} = '#{@value}'"
36
+ end
37
+ sql = "update tag t left join project p on t.project_version = p.version set #{set_val} where t.pod_name = '#{@pod_name}' and p.is_done = 0"
38
+ db.query(sql)
32
39
  end
33
40
  end
34
41
  end
@@ -14,58 +14,52 @@ module Gct
14
14
  end
15
15
 
16
16
  def run
17
- batch_tag
17
+ db = Database::Data.new
18
+ sql = "select * from project where is_done = 0 limit 1"
19
+ res = db.query(sql)
20
+ if !res.nil? && res.count > 0
21
+ res.each do |row|
22
+ @project_name = row["name"]
23
+ @branch = row["branch"]
24
+ @version = row["version"]
25
+ puts "pre is #{row["is_pre"].to_i == 1}"
26
+ @pre = row["is_pre"].to_i == 1
27
+ break
28
+ end
29
+ batch_tag
30
+ end
18
31
  end
19
32
 
20
33
  def batch_tag
21
- specs = next_specs
22
- if specs.nil?
23
- return
24
- end
25
- if specs.keys.count == 0
34
+ db = Database::Data.new
35
+ # 查询优先级最高的为完成打tag的数据
36
+ where_statement = "and is_pre = " + (@pre ? "1" : "0")
37
+ sql = "select * from tag where priority = (select MAX(priority) from tag where project_version = '#{@version}' and tag_status != '#{SpecPublishStatus::SUCCESS}' #{where_statement})"
38
+ result = db.query(sql)
39
+ puts result.count
40
+ if result.count == 0
26
41
  puts "tag已全部打完!!!".green
27
42
  # 执行更新podfile的操作
28
43
  system "gct update podfile"
29
44
  else
30
- specs.each do |key, val|
31
- if val["status"].eql?(SpecPublishStatus::WAITING) || val["status"].eql?(SpecPublishStatus::CANCELED) || val["status"].eql?(SpecPublishStatus::FAILED)
45
+ result.each do |row|
46
+ if row["tag_status"].eql?(SpecPublishStatus::WAITING) || row["tag_status"].eql?(SpecPublishStatus::CANCELED)
32
47
  status = SpecPublishStatus::PENDING
33
- val["status"] = status
34
- system "gct update dependency #{key} status #{status}"
35
- system "gct update tag #{key} --auto-tag --update-ci"
48
+ name = row["pod_name"]
49
+ skip_tag = ""
50
+ if row["is_tag"].to_i == 1
51
+ skip_tag = "--skip-tag"
52
+ end
53
+ pre = ""
54
+ if row["is_pre"].to_i == 1
55
+ pre = "--pre"
56
+ end
57
+ system "gct update dependency #{name} status #{status}"
58
+ system "gct update tag #{name} --auto-tag --update-ci #{skip_tag} #{pre}"
36
59
  end
37
60
  end
38
61
  end
39
62
  end
40
-
41
- def next_specs
42
- content_map = FileBase.yaml_dependency_read
43
- if content_map.nil?
44
- return nil
45
- end
46
- priority = 1000
47
- content_map.each do |k, v|
48
- if v.keys.include?(@project_name)
49
- priority = k
50
- break
51
- end
52
- end
53
-
54
- priority_map = content_map[priority.to_s]
55
- is_all_done = true
56
- priority_map.each do |k, v|
57
- if !v["status"].eql?(SpecPublishStatus::SUCCESS)
58
- is_all_done = false
59
- break
60
- end
61
- end
62
-
63
- if is_all_done
64
- content_map[(priority.to_i - 1).to_s]
65
- else
66
- nil
67
- end
68
- end
69
63
  end
70
64
  end
71
65
  end
@@ -22,57 +22,62 @@ module Gct
22
22
  end
23
23
 
24
24
  def run
25
- version_map = FileBase.read_version
26
- @name = "ios/#{version_map["name"]}"
27
- @branch = version_map["branch"]
28
- @verison = version_map["version"]
29
- @file = "Podfile"
30
- puts @version
25
+ initParams
31
26
  update_podfile
32
- remove_and_backup
27
+ end
28
+
29
+ def initParams
30
+ db = Database::Data.new
31
+ sql = "select * from project where is_done = 0 order by 'create_time' desc"
32
+ result = db.query(sql)
33
+ result.each do |row|
34
+ @name = "ios/#{row["name"]}"
35
+ @branch = row["branch"]
36
+ @version = row["version"]
37
+ @file = "Podfile"
38
+ break
39
+ end
33
40
  end
34
41
 
35
42
  def update_podfile
36
43
  podspec_content = file_contents(@name, @file, @branch)
37
-
38
44
  remove_regex = /dev_pod .*/
39
45
  podspec_content = podspec_content.gsub!(remove_regex, "")
40
-
41
- # dependency
42
- dependency_map = FileBase.yaml_dependency_read
43
- dependencies = Array.new()
44
- dependency_map.each do |k, v|
45
- dependencies << v
46
- end
47
46
 
48
- dependencies.each { |dep|
49
- dep.keys.each { |k|
50
- value = dep[k]
51
- tag = value["tag"]
52
- update_regex = /.*#{k}.*/
53
- update_match = update_regex.match(podspec_content).to_s
54
- podspec_content = podspec_content.gsub!(update_match, " pod '#{k}', '#{tag}'")
55
- }
56
- }
47
+ db = Database::Data.new
48
+ sql = "select * from tag where project_version = '#{@version}'"
49
+ result = db.query(sql)
50
+ if result.count == 0
51
+ puts "ERROR: 没有tag库".red
52
+ return
53
+ end
54
+ result.each do |row|
55
+ name = row["pod_name"]
56
+ tag = row["tag_version"]
57
+ update_regex = /.*#{name}.*/
58
+ update_match = update_regex.match(podspec_content).to_s
59
+ update_str = " pod '#{name}', '#{tag}'"
60
+ if update_match.empty?
61
+ empty_match = "# Pods for iLife"
62
+ podspec_content = podspec_content.gsub!(empty_match, "#{empty_match} \n#{update_str}") # Pods for iLife
63
+ else
64
+ podspec_content = podspec_content.gsub!(update_match, update_str)
65
+ end
66
+ end
57
67
 
58
68
  edit_file(podspec_content)
69
+
70
+ u_db = Database::Data.new
71
+ u_sql = "update project set is_done = 1 where version = '#{@version}'"
72
+ u_db.query(u_sql)
73
+
59
74
  system "gct robot podfile"
75
+ system "gct robot summary"
60
76
  end
61
77
 
62
78
  def edit_file(content)
63
79
  Gitlab.edit_file(@name, @file, @branch, content, "@config #{@version}版本 podfile更新")
64
80
  end
65
-
66
- # 删除和备份
67
- def remove_and_backup
68
- d_name = Constant.DependencyName
69
- Dir.chdir(FileBase.tmp_path) do
70
- # 备份dependency文件到backup文件夹下
71
- system "cp #{d_name} ../backup/#{d_name}-#{@version}"
72
- # 删除tmp文件夹下所有文件
73
- system "rm -rf *"
74
- end
75
- end
76
81
  end
77
82
  end
78
83
  end
@@ -18,17 +18,21 @@ module Gct
18
18
  ['--skip-tag', '是否忽略tag,直接触发ci'],
19
19
  ['--update-ci', '是否更新CI'],
20
20
  ['--auto-tag', '自动化'],
21
+ ['--pre', '是否预发tag']
21
22
  ].concat(super)
22
23
  end
23
24
 
24
25
  def initialize(argv)
25
26
  config_gitlab
26
- @update_version_branch = 'develop'
27
27
  @skip_tag = argv.flag?('skip-tag', false)
28
28
  @update_ci = argv.flag?('update-ci', false)
29
29
  @auto_tag = argv.flag?('auto-tag', false)
30
+ @pre = argv.flag?('pre', false)
30
31
  @name = argv.shift_argument
31
32
  @tag = argv.shift_argument
33
+ @pre_tag_suffix = Constant.PreHuffix
34
+ @update_version_branch = @pre ? Constant.PreTagFromBranch : Constant.DefaultTagFromBranch
35
+ @update_to_branch = @pre ? Constant.PreTagToBranch : Constant.DefaultTagToBranch
32
36
  @file = get_spec_file
33
37
  if @name.nil?
34
38
  @name = @spec.name
@@ -47,14 +51,21 @@ module Gct
47
51
  end
48
52
 
49
53
  def skip_tag_method
54
+ isEmptyMR = mr_to_master
55
+ if !isEmptyMR
56
+ accept_merge_request
57
+ end
58
+ remove_and_create_tag
59
+ end
60
+
61
+ def remove_and_create_tag
50
62
  @new_tag = @spec.version
51
- puts "tag == #{@new_tag}"
52
- if !@update_ci
53
- isEmptyMR = mr_to_master
54
- if !isEmptyMR
55
- accept_merge_request
56
- end
63
+ puts "new tag"
64
+ puts @new_tag
65
+ if @pre
66
+ @new_tag = "#{@new_tag}" + @pre_tag_suffix
57
67
  end
68
+ puts "tag == #{@new_tag}"
58
69
  # remove tag
59
70
  command = `git rev-parse --is-inside-work-tree`
60
71
  if command.eql?("true")
@@ -67,12 +78,45 @@ module Gct
67
78
  create_tag
68
79
  end
69
80
 
81
+ def check_ci
82
+ is_exist_ci = false
83
+ res = Gitlab.tree("#{Constant.NameSpace}#{@name}")
84
+ res.each do |g|
85
+ if g["name"].eql?('.gitlab-ci.yml')
86
+ is_exist_ci = true
87
+ break
88
+ end
89
+ end
90
+ is_exist_ci
91
+ end
92
+
70
93
  def update_ci_method
71
- puts "更新ci文件".green
94
+ puts "正在检查CI文件".green
72
95
  temp_local_file = TempLocalFile.new()
73
96
  path = File.expand_path("../../init", __FILE__)
74
97
  ci_content = temp_local_file.read_path_file(path, "gitlab-ci.rb")
75
- edit_file('.gitlab-ci.yml', ci_content, 'update ci')
98
+ if check_ci
99
+ # 检查 ci 文件是否有变化
100
+ remote_content = file_contents("#{Constant.NameSpace}#{@name}", '.gitlab-ci.yml', @update_version_branch)
101
+ remote_content.force_encoding('UTF-8')
102
+ strip_remote_content = remote_content.gsub(/\s/,'')
103
+ ci_content.force_encoding('UTF-8')
104
+ strip_ci_content = ci_content.gsub(/\s/,'')
105
+
106
+ if strip_ci_content.eql?strip_remote_content
107
+ puts "无需更新CI文件".green
108
+ else
109
+ edit_file('.gitlab-ci.yml', ci_content, 'update ci')
110
+ mr_to_master_if_need
111
+ end
112
+ else
113
+ create_file('.gitlab-ci.yml', ci_content, 'init ci')
114
+ mr_to_master_if_need
115
+ end
116
+
117
+ end
118
+
119
+ def mr_to_master_if_need
76
120
  isEmptyMR = mr_to_master
77
121
  if !isEmptyMR
78
122
  accept_merge_request
@@ -107,9 +151,12 @@ module Gct
107
151
  tag = tag_regex.match(version_match)
108
152
  @now_tag = tag
109
153
  @new_tag = @tag || auto_add_tag(tag.to_s)
154
+ if @pre
155
+ @new_tag = "#{@new_tag}" + @pre_tag_suffix
156
+ end
110
157
  replace_string = version_match.gsub(tag_regex, @new_tag)
111
158
  updated_podspec_content = podspec_content.gsub(version_match, replace_string)
112
- puts "修改podpsec版本号成功!版本号为:#{@new_tag}".green
159
+ puts "#{@name} 更新版本号为:#{@new_tag}".green
113
160
  edit_file(@file, updated_podspec_content, "@config 更新版本号:#{@new_tag}")
114
161
  mr_to_master
115
162
  accept_merge_request
@@ -120,15 +167,16 @@ module Gct
120
167
  Gitlab.edit_file(@project_id, file, @update_version_branch, content, commit_message)
121
168
  end
122
169
 
170
+ def create_file(file, content, commit_message)
171
+ Gitlab.create_file(@project_id, file, @update_version_branch, content, commit_message)
172
+ end
173
+
123
174
  def mr_to_master
124
- puts "正在创建MR请求将develop分支合并到master!".green
125
- mr = Gitlab.create_merge_request("#{Constant.NameSpace}#{@name}", "mr", { source_branch: "#{@update_version_branch}", target_branch: 'master' })
126
- # puts mr.to_hash
175
+ puts "正在创建MR请求将#{@update_version_branch}分支合并到#{@update_to_branch}分支!".green
176
+ mr = Gitlab.create_merge_request("#{Constant.NameSpace}#{@name}", "mr", { source_branch: "#{@update_version_branch}", target_branch: "#{@update_to_branch}" })
127
177
  @id = mr.iid
128
178
  puts mr.merge_status
129
179
  isEmptyMR = mr.diff_refs.base_sha.eql?(mr.diff_refs.head_sha)
130
- # puts mr.diff_refs.base_sha
131
- # puts mr.diff_refs.head_sha
132
180
  close_mr if isEmptyMR
133
181
  if mr.merge_status == 'cannot_be_merged' && !isEmptyMR
134
182
  raise "Merge有冲突,请前往 https://gi-dev.ccrgt.com/#{Constant.NameSpace}#{@name}/merge_requests/#{@id} 解决".red
@@ -139,7 +187,7 @@ module Gct
139
187
  def accept_merge_request
140
188
  mr_result = Gitlab.accept_merge_request("#{@project_id}", @id)
141
189
  if mr_result.state == 'merged'
142
- puts "成功合并到master分支".green
190
+ puts "成功合并到#{@update_to_branch}分支".green
143
191
  end
144
192
  end
145
193
 
@@ -148,12 +196,22 @@ module Gct
148
196
  end
149
197
 
150
198
  def remove_tag
151
- Gitlab.delete_tag("#{@project_id}", "#{@new_tag}")
199
+ tags = Gitlab.tags("#{@project_id}")
200
+ puts "remove tag is " + "#{@new_tag}"
201
+ tags.each do |t|
202
+ if t["name"].eql?("#{@new_tag}")
203
+ Gitlab.delete_tag("#{@project_id}", "#{@new_tag}")
204
+ break
205
+ end
206
+ end
152
207
  end
153
208
 
154
209
  def create_tag
155
- Gitlab.create_tag("#{@project_id}", "#{@new_tag}", "master")
156
- puts "打tag成功,开始上传podspec...".green
210
+ Gitlab.create_tag("#{@project_id}", "#{@new_tag}", "#{@update_to_branch}")
211
+ db = Database::Data.new
212
+ sql = "update tag t left join project p on t.project_version = p.version set t.is_tag = 1 where t.pod_name = '#{@name}' and t.is_tag != 1 and p.is_done = 0"
213
+ db.query(sql)
214
+ puts "开始上传podspec... 请在CI中查看结果".green
157
215
  end
158
216
  end
159
217
  end
@@ -21,12 +21,24 @@ module Gct
21
21
  "ios-third/"
22
22
  end
23
23
 
24
- def DefaultTagBranch
24
+ def DefaultTagFromBranch
25
25
  "develop"
26
26
  end
27
27
 
28
- def DependencyName
29
- "dependency"
28
+ def PreTagFromBranch
29
+ "pre_develop"
30
+ end
31
+
32
+ def DefaultTagToBranch
33
+ "master"
34
+ end
35
+
36
+ def PreTagToBranch
37
+ "pre_master"
38
+ end
39
+
40
+ def PreHuffix
41
+ "-pre"
30
42
  end
31
43
  end
32
44
  end
@@ -0,0 +1,28 @@
1
+ require 'mysql2'
2
+
3
+ module Gct
4
+ module Database
5
+ class Data
6
+ def initialize
7
+ @host = FileBase.get_config("host")
8
+ @password = FileBase.get_config("password")
9
+ raise "请设置数据库ip地址!".red if @host.nil?
10
+ raise "请设置数据库密码!".red if @password.nil?
11
+ end
12
+
13
+ def query(sql)
14
+ client = nil
15
+ puts "current sql is 👇👇👇"
16
+ puts sql
17
+ begin
18
+ client = Mysql2::Client.new(:host => @host, :username => "root", :database => "ios_db", :password => @password, :encoding => "utf8")
19
+ client.query(sql)
20
+ rescue => exception
21
+ puts exception
22
+ ensure
23
+ client.close
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -22,42 +22,6 @@ module Gct
22
22
  yaml_write_map(yaml_path, content_map)
23
23
  end
24
24
 
25
- def yaml_dependency_read
26
- path = dependency_path
27
- if !File.exist?(path)
28
- return nil
29
- end
30
- config_map = YAML.load(File.open(path, "r"))
31
- config_map
32
- end
33
-
34
- def yaml_dependency_update(pod_name, key, value)
35
- path = dependency_path
36
- if !File.exist?(dependency_path)
37
- return
38
- end
39
- begin
40
- config_map = YAML.load(File.open(path, "r"))
41
- config_map = Hash.new() if !config_map
42
- config_map.each do |k, v|
43
- v.each do |sk, sv|
44
- if sk.eql?(pod_name)
45
- sv[key] = value
46
- if key.eql?("tag")
47
- sv["status"] = SpecPublishStatus::SUCCESS
48
- end
49
- end
50
- end
51
- end
52
- yaml_file = File.open(path, "w")
53
- YAML::dump(config_map, yaml_file)
54
- rescue IOError => e
55
- raise e.message
56
- ensure
57
- yaml_file.close unless yaml_file.nil?
58
- end
59
- end
60
-
61
25
  def yaml_write(key, value)
62
26
  begin
63
27
  config_map = YAML.load(File.open(@path, "r"))
@@ -121,10 +85,6 @@ module Gct
121
85
  "#{Generator::GctFile.config_file_path}"
122
86
  end
123
87
 
124
- def dependency_path
125
- "#{Generator::GctFile.temp_folder_path}/#{Constant.DependencyName}"
126
- end
127
-
128
88
  def version_path
129
89
  "#{Generator::GctFile.temp_folder_path}/version"
130
90
  end
@@ -138,11 +98,6 @@ module Gct
138
98
  root_exist
139
99
  end
140
100
 
141
- def exist_dependency
142
- root_exist = File.exist?(dependency_path)
143
- root_exist
144
- end
145
-
146
101
  def root_err
147
102
  raise "请先运行命令:gct setup".red if !exist_root
148
103
  end
@@ -2,5 +2,5 @@ module Gct
2
2
  # freeze 冻结对象,将对象变成一个常量
3
3
  # unless 右边的代码块成立,才会运行左边的代码块
4
4
  # defined? 是用来判断本地变量是否存在,也可用来判断是否存在方法
5
- VERSION = "0.4.1".freeze unless defined? Gct::VERSION
5
+ VERSION = "0.4.9".freeze unless defined? Gct::VERSION
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gct
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - jieming
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-08-25 00:00:00.000000000 Z
11
+ date: 2020-11-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: mysql2
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: claide
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -178,6 +192,7 @@ files:
178
192
  - lib/gct/command/robot/finish.rb
179
193
  - lib/gct/command/robot/podfile.rb
180
194
  - lib/gct/command/robot/start.rb
195
+ - lib/gct/command/robot/summary.rb
181
196
  - lib/gct/command/setup.rb
182
197
  - lib/gct/command/spec.rb
183
198
  - lib/gct/command/spec/lint.rb
@@ -189,6 +204,7 @@ files:
189
204
  - lib/gct/command/update/tag.rb
190
205
  - lib/gct/command/update/version.rb
191
206
  - lib/gct/constant.rb
207
+ - lib/gct/database/data.rb
192
208
  - lib/gct/file_base.rb
193
209
  - lib/gct/gct_version.rb
194
210
  - lib/gct/generator/gct_file.rb