gct 0.3.96 → 0.4.5

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: fc724b7284f83afb5c5b2d1bc1e4056179d5b88e45d39dd375942649f8ad760b
4
- data.tar.gz: be50780a0fc37a2bc3fcb5bcf2c403cb8addf005f67ebd2d03ef1d5a28883809
3
+ metadata.gz: bc5178874aff0122f00f85a6514e9358135db71e4dd0495a4f05ffde474ea0c6
4
+ data.tar.gz: a417f23767546eca5321ce5d7e5a077a25cf255db85d6288362b83ebd005d897
5
5
  SHA512:
6
- metadata.gz: 32c305352fa1248ca6587ca5e8e1ef7a2d7bd56bfcf30390e4b769a492f1ef17bffa13df9c3b0c4f3b87bca52ebfaba2b739ccc4b2962a2e4696842943e7479c
7
- data.tar.gz: 0011f8848cb83ace7603b49cbbc713b905213fbf4a9c837cf5ccfb41419d054423fb62ff7b7e97bad919f85fc2c2685e01cf9fa7c35e3dd346a7f92f3acb8134
6
+ metadata.gz: 3c0375212fc22f6b907c7cbdcefcd4ee841ec319702394b3b45892715c5912d43e28f90234e4bcb262d20dfd111e9145b1bfd9fed55c522f14805f212d47311f
7
+ data.tar.gz: 88e9d6bbffe0389c2968bc56e32dcb23a3cfe3604f81362dda57abd92afe46fd5669386b54251b1fe115ecac3e00427d6f23e9915aa8452f21652fe40c68725c
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
@@ -52,8 +52,6 @@ module Gct
52
52
  Colored2.disable!
53
53
  String.send(:define_method, :colorize) { |string, _| string }
54
54
  end
55
-
56
- config_gitlab
57
55
  end
58
56
 
59
57
  def file_contents(project_id, file, branch)
@@ -63,7 +61,7 @@ module Gct
63
61
  end
64
62
 
65
63
  def config_gitlab
66
- if FileBase.exist_root and token and Gitlab.endpoint.nil?
64
+ if FileBase.exist_root and token
67
65
  Gitlab.configure do |config|
68
66
  config.endpoint = 'https://gi-dev.ccrgt.com/api/v4'
69
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
@@ -7,10 +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"
10
11
  - gct clean lint $CI_PROJECT_NAME
11
12
  - gct repo update
12
13
  - gct repo push
13
14
  - gct robot finish true
15
+ - gct update dependency $CI_PROJECT_NAME "tag_version" $CI_COMMIT_REF_NAME
16
+ - gct update next
14
17
  only:
15
18
  - tags
16
19
  tags:
@@ -20,6 +23,7 @@ on_failure:
20
23
  stage: failure
21
24
  script:
22
25
  - gct robot finish false
26
+ - gct update dependency $CI_PROJECT_NAME "tag_status" "failed"
23
27
  when: on_failure
24
28
  only:
25
29
  - 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,5 +1,8 @@
1
1
  require 'gct/command/robot/start'
2
2
  require 'gct/command/robot/finish'
3
+ require 'gct/command/robot/podfile'
4
+ require 'net/https'
5
+ require 'json'
3
6
 
4
7
  module Gct
5
8
  class Command
@@ -9,6 +12,43 @@ module Gct
9
12
  self.description = <<-DESC
10
13
  发送jenkins和gitlab机器人消息
11
14
  DESC
15
+
16
+ def self.options
17
+ [
18
+ ['--test', '测试机器人,测试webhook'],
19
+ ].concat(super)
20
+ end
21
+
22
+ def initialize(argv)
23
+ @test = argv.flag?('test', false)
24
+ super
25
+ end
26
+
27
+ def robot_send(content)
28
+ if @test
29
+ webhook = FileBase.get_config("gitlab-robot-webhook-test")
30
+ else
31
+ webhook = FileBase.get_config("gitlab-robot-webhook")
32
+ end
33
+ raise "请先设置webhook --> gct config set gitlab-robot-webhook WEBHOOK_URL" if webhook.nil? || webhook.empty?
34
+ url = URI(webhook)
35
+
36
+ http = Net::HTTP.new(url.host, url.port)
37
+ if url.scheme == "https"
38
+ http.use_ssl = true
39
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
40
+ end
41
+
42
+ data = {
43
+ "msgtype": "markdown",
44
+ "markdown": {
45
+ "content": "#{content}"
46
+ }
47
+ }.to_json
48
+
49
+ header = {'content-type':'application/json'}
50
+ response = http.post(url, data, header)
51
+ end
12
52
  end
13
53
  end
14
54
  end
@@ -1,5 +1,4 @@
1
- require 'net/https'
2
- require 'json'
1
+
3
2
 
4
3
  module Gct
5
4
  class Command
@@ -35,36 +34,15 @@ module Gct
35
34
  def run
36
35
  puts @build_status.class
37
36
  puts "build_status == #{@build_status}"
38
- if @build_status.eql?('false')
37
+ if @build_status.eql?("false")
39
38
  build_text = "<font color=\"comment\">CI运行失败</font>,请相关人员注意"
40
- elsif @build_status.eql?('true')
39
+ elsif @build_status.eql?("true")
41
40
  build_text = "<font color=\"info\">CI运行成功</font>"
42
41
  end
43
- ci_text = "[点击跳转](#{@ci_url})"
44
-
45
- if @test
46
- webhook = FileBase.get_config("gitlab-robot-webhook-test")
47
- elsif
48
- webhook = FileBase.get_config("gitlab-robot-webhook")
49
- end
50
- raise "请先设置webhook --> gct config set gitlab-robot-webhook WEBHOOK_URL" if webhook.nil? || webhook.empty?
51
- url = URI(webhook)
52
-
53
- http = Net::HTTP.new(url.host, url.port)
54
- if url.scheme == "https"
55
- http.use_ssl = true
56
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
57
- end
58
-
59
- data = {
60
- "msgtype": "markdown",
61
- "markdown": {
62
- "content": "**#{@project_name} #{build_text}**\n\n\n>触发人:#{@user_name}\n\n>tag:#{@tag}\n\n>commitid:#{@commit_sha}\n\n>流水线地址:#{ci_text}"
63
- }
64
- }.to_json
65
-
66
- header = {'content-type':'application/json'}
67
- response = http.post(url, data, header)
42
+ ci_text = "[点击跳转](#{@ci_url})"
43
+
44
+ content = "**#{@project_name} #{build_text}**\n\n\n>触发人:#{@user_name}\n\n>tag:#{@tag}\n\n>commitid:#{@commit_sha}\n\n>流水线地址:#{ci_text}"
45
+ robot_send(content)
68
46
  end
69
47
  end
70
48
  end
@@ -0,0 +1,38 @@
1
+ require 'net/https'
2
+ require 'json'
3
+
4
+ module Gct
5
+ class Command
6
+ class Robot < Command
7
+ class Podfile < Robot
8
+
9
+ self.summary = 'podfile更新通知'
10
+ self.description = <<-DESC
11
+ podfile更新通知
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
+ @project_name = ENV['CI_PROJECT_NAME']
25
+ @tag = ENV['CI_COMMIT_REF_NAME']
26
+ @test = argv.flag?('test', false)
27
+ super
28
+ end
29
+
30
+ def run
31
+ message = " <font color=\"info\">podfile 更新完毕</font>"
32
+ content = "#{message}"
33
+ robot_send(content)
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -28,30 +28,9 @@ module Gct
28
28
  end
29
29
 
30
30
  def run
31
- if @test
32
- webhook = FileBase.get_config("gitlab-robot-webhook-test")
33
- elsif
34
- webhook = FileBase.get_config("gitlab-robot-webhook")
35
- end
36
- raise "请先设置webhook --> gct config set gitlab-robot-webhook WEBHOOK_URL" if webhook.nil? || webhook.empty?
37
- url = URI(webhook)
38
-
39
- http = Net::HTTP.new(url.host, url.port)
40
- if url.scheme == "https"
41
- http.use_ssl = true
42
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
43
- end
44
-
45
31
  message = " <font color=\"info\">#{@tag}</font> 开始打tag"
46
- data = {
47
- "msgtype": "markdown",
48
- "markdown": {
49
- "content": "**#{@project_name}** #{message}"
50
- }
51
- }.to_json
52
-
53
- header = {'content-type':'application/json'}
54
- response = http.post(url, data, header)
32
+ content = "**#{@project_name}** #{message}"
33
+ robot_send(content)
55
34
  end
56
35
  end
57
36
  end
@@ -15,9 +15,18 @@ module Gct
15
15
  create_root_folder
16
16
  create_temp_folder
17
17
  create_config_file
18
+ create_backup_folder
18
19
  puts "setup success!".green
19
20
  end
20
21
 
22
+ def create_backup_folder
23
+ backup_path = Generator::GctFile.backup_folder_path
24
+ if !File.exist?(backup_path)
25
+ system "mkdir #{backup_path}", exception: true
26
+ puts "#{backup_path} 创建成功!".green
27
+ end
28
+ end
29
+
21
30
  def create_root_folder
22
31
  gct_path = Generator::GctFile.root_folder_path
23
32
  if !File.exist?(gct_path)
@@ -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,5 +1,8 @@
1
- require 'gct/command/update/tag'
1
+ require 'gct/command/update/dependency'
2
+ require 'gct/command/update/podfile'
2
3
  require 'gct/command/update/version'
4
+ require 'gct/command/update/next'
5
+ require 'gct/command/update/tag'
3
6
 
4
7
  module Gct
5
8
  class Command
@@ -0,0 +1,22 @@
1
+ module Gct
2
+ class Command
3
+ class Update < Command
4
+ class Analyze < Update
5
+ self.summary = '编译'
6
+ self.description = <<-DESC
7
+ 下一个优先级打tag
8
+ DESC
9
+
10
+ def initialize(argv)
11
+
12
+ super
13
+ end
14
+
15
+ def run
16
+
17
+ end
18
+
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,43 @@
1
+ require 'mysql2'
2
+ module Gct
3
+ class Command
4
+ class Update < Command
5
+ class Dependency < Update
6
+
7
+ self.summary = '更新依赖文件'
8
+ self.description = <<-DESC
9
+ 更新依赖文件
10
+ DESC
11
+
12
+ self.arguments = [
13
+ CLAide::Argument.new('POD_NAME', false),
14
+ CLAide::Argument.new('FIELD', false),
15
+ CLAide::Argument.new('VALUE', false),
16
+ ]
17
+
18
+ def initialize(argv)
19
+ @pod_name = argv.shift_argument
20
+ @field = argv.shift_argument
21
+ @value = argv.shift_argument
22
+ super
23
+ end
24
+
25
+ def validate!
26
+ super
27
+ end
28
+
29
+ def run
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)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,66 @@
1
+ module Gct
2
+ class Command
3
+ class Update < Command
4
+ class Next < Update
5
+ self.summary = '编译'
6
+ self.description = <<-DESC
7
+ 下一个优先级打tag
8
+ DESC
9
+
10
+ def initialize(argv)
11
+ config_gitlab
12
+ @project_name = ENV['CI_PROJECT_NAME']
13
+ super
14
+ end
15
+
16
+ def run
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
31
+ end
32
+
33
+ def batch_tag
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
41
+ puts "tag已全部打完!!!".green
42
+ # 执行更新podfile的操作
43
+ system "gct update podfile"
44
+ else
45
+ result.each do |row|
46
+ if row["tag_status"].eql?(SpecPublishStatus::WAITING) || row["tag_status"].eql?(SpecPublishStatus::CANCELED)
47
+ status = SpecPublishStatus::PENDING
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}"
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,83 @@
1
+ module Gct
2
+ class Command
3
+ class Update < Command
4
+ class Podfile < Update
5
+
6
+ self.summary = '更新podfile文件'
7
+ self.description = <<-DESC
8
+ 更新podfile文件
9
+ DESC
10
+
11
+ self.arguments = [
12
+ ]
13
+
14
+ def initialize(argv)
15
+ config_gitlab
16
+ @version = argv.shift_argument
17
+ super
18
+ end
19
+
20
+ def validate!
21
+ super
22
+ end
23
+
24
+ def run
25
+ initParams
26
+ update_podfile
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
40
+ end
41
+
42
+ def update_podfile
43
+ podspec_content = file_contents(@name, @file, @branch)
44
+ remove_regex = /dev_pod .*/
45
+ podspec_content = podspec_content.gsub!(remove_regex, "")
46
+
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
67
+
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
+
74
+ system "gct robot podfile"
75
+ end
76
+
77
+ def edit_file(content)
78
+ Gitlab.edit_file(@name, @file, @branch, content, "@config #{@version}版本 podfile更新")
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -17,17 +17,26 @@ module Gct
17
17
  [
18
18
  ['--skip-tag', '是否忽略tag,直接触发ci'],
19
19
  ['--update-ci', '是否更新CI'],
20
+ ['--auto-tag', '自动化'],
21
+ ['--pre', '是否预发tag']
20
22
  ].concat(super)
21
23
  end
22
24
 
23
25
  def initialize(argv)
24
- @update_version_branch = 'develop'
26
+ config_gitlab
25
27
  @skip_tag = argv.flag?('skip-tag', false)
26
28
  @update_ci = argv.flag?('update-ci', false)
27
- @file = get_spec_file
28
- name = argv.shift_argument
29
- @name = name.nil? ? @spec.name : name
29
+ @auto_tag = argv.flag?('auto-tag', false)
30
+ @pre = argv.flag?('pre', false)
31
+ @name = argv.shift_argument
30
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
36
+ @file = get_spec_file
37
+ if @name.nil?
38
+ @name = @spec.name
39
+ end
31
40
  @project_id = "#{Constant.NameSpace}#{@name}"
32
41
  super
33
42
  end
@@ -42,27 +51,57 @@ module Gct
42
51
  end
43
52
 
44
53
  def skip_tag_method
45
- @new_tag = @spec.version
46
- puts "tag == #{@new_tag}"
47
54
  if !@update_ci
48
55
  isEmptyMR = mr_to_master
49
56
  if !isEmptyMR
50
57
  accept_merge_request
51
58
  end
52
59
  end
60
+ remove_and_create_tag
61
+ end
62
+
63
+ def remove_and_create_tag
64
+ @new_tag = @spec.version
65
+ puts "new tag"
66
+ puts @new_tag
67
+ if @pre
68
+ @new_tag = "#{@new_tag}" + @pre_tag_suffix
69
+ end
70
+ puts "tag == #{@new_tag}"
53
71
  # remove tag
54
- `git tag -d #{@new_tag}`
55
- `git push origin :refs/tags/#{@new_tag}`
72
+ command = `git rev-parse --is-inside-work-tree`
73
+ if command.eql?("true")
74
+ `git tag -d #{@new_tag}`
75
+ `git push origin :refs/tags/#{@new_tag}`
76
+ else
77
+ remove_tag
78
+ end
56
79
  # create tag
57
80
  create_tag
58
81
  end
59
82
 
83
+ def check_ci
84
+ is_exist_ci = false
85
+ res = Gitlab.tree("#{Constant.NameSpace}#{@name}")
86
+ res.each do |g|
87
+ if g["name"].eql?('.gitlab-ci.yml')
88
+ is_exist_ci = true
89
+ break
90
+ end
91
+ end
92
+ is_exist_ci
93
+ end
94
+
60
95
  def update_ci_method
61
96
  puts "更新ci文件".green
62
97
  temp_local_file = TempLocalFile.new()
63
98
  path = File.expand_path("../../init", __FILE__)
64
99
  ci_content = temp_local_file.read_path_file(path, "gitlab-ci.rb")
65
- edit_file('.gitlab-ci.yml', ci_content, 'update ci')
100
+ if check_ci
101
+ edit_file('.gitlab-ci.yml', ci_content, 'update ci')
102
+ else
103
+ create_file('.gitlab-ci.yml', ci_content, 'init ci')
104
+ end
66
105
  isEmptyMR = mr_to_master
67
106
  if !isEmptyMR
68
107
  accept_merge_request
@@ -70,11 +109,22 @@ module Gct
70
109
  end
71
110
 
72
111
  def get_spec_file
112
+ spec_file = nil
113
+ full_path = nil
114
+ if @auto_tag
115
+ raise "podspec名不能为空!!!".red if spec_file.nil? if @name.nil?
116
+ Dir.chdir(FileBase.tmp_path) do
117
+ spec_file = Pathname.glob("#{@name}.podspec").first
118
+ full_path = spec_file.realpath
119
+ raise "在 #{Dir.pwd} 目录下找不到podspec文件".red if spec_file.nil?
120
+ end
121
+ else
73
122
  spec_file = Pathname.glob('*.podspec').first
123
+ full_path = spec_file
74
124
  raise "在 #{Dir.pwd} 目录下找不到podspec文件".red if spec_file.nil?
75
-
76
- @spec = Pod::Specification.from_file(spec_file)
77
- spec_file
125
+ end
126
+ @spec = Pod::Specification.from_file(full_path)
127
+ spec_file
78
128
  end
79
129
 
80
130
  def update_podspec_version
@@ -86,6 +136,9 @@ module Gct
86
136
  tag = tag_regex.match(version_match)
87
137
  @now_tag = tag
88
138
  @new_tag = @tag || auto_add_tag(tag.to_s)
139
+ if @pre
140
+ @new_tag = "#{@new_tag}" + @pre_tag_suffix
141
+ end
89
142
  replace_string = version_match.gsub(tag_regex, @new_tag)
90
143
  updated_podspec_content = podspec_content.gsub(version_match, replace_string)
91
144
  puts "修改podpsec版本号成功!版本号为:#{@new_tag}".green
@@ -99,15 +152,16 @@ module Gct
99
152
  Gitlab.edit_file(@project_id, file, @update_version_branch, content, commit_message)
100
153
  end
101
154
 
155
+ def create_file(file, content, commit_message)
156
+ Gitlab.create_file(@project_id, file, @update_version_branch, content, commit_message)
157
+ end
158
+
102
159
  def mr_to_master
103
- puts "正在创建MR请求将develop分支合并到master!".green
104
- mr = Gitlab.create_merge_request("#{Constant.NameSpace}#{@name}", "mr", { source_branch: "#{@update_version_branch}", target_branch: 'master' })
105
- # puts mr.to_hash
160
+ puts "正在创建MR请求将#{@update_version_branch}分支合并到#{@update_to_branch}分支!".green
161
+ mr = Gitlab.create_merge_request("#{Constant.NameSpace}#{@name}", "mr", { source_branch: "#{@update_version_branch}", target_branch: "#{@update_to_branch}" })
106
162
  @id = mr.iid
107
163
  puts mr.merge_status
108
164
  isEmptyMR = mr.diff_refs.base_sha.eql?(mr.diff_refs.head_sha)
109
- # puts mr.diff_refs.base_sha
110
- # puts mr.diff_refs.head_sha
111
165
  close_mr if isEmptyMR
112
166
  if mr.merge_status == 'cannot_be_merged' && !isEmptyMR
113
167
  raise "Merge有冲突,请前往 https://gi-dev.ccrgt.com/#{Constant.NameSpace}#{@name}/merge_requests/#{@id} 解决".red
@@ -118,7 +172,7 @@ module Gct
118
172
  def accept_merge_request
119
173
  mr_result = Gitlab.accept_merge_request("#{@project_id}", @id)
120
174
  if mr_result.state == 'merged'
121
- puts "成功合并到master分支".green
175
+ puts "成功合并到#{@update_to_branch}分支".green
122
176
  end
123
177
  end
124
178
 
@@ -126,8 +180,22 @@ module Gct
126
180
  Gitlab.update_merge_request("#{@project_id}", @id, {state_event: 'close'})
127
181
  end
128
182
 
183
+ def remove_tag
184
+ tags = Gitlab.tags("#{@project_id}")
185
+ puts "remove tag is " + "#{@new_tag}"
186
+ tags.each do |t|
187
+ if t["name"].eql?("#{@new_tag}")
188
+ Gitlab.delete_tag("#{@project_id}", "#{@new_tag}")
189
+ break
190
+ end
191
+ end
192
+ end
193
+
129
194
  def create_tag
130
- Gitlab.create_tag("#{@project_id}", "#{@new_tag}", "master")
195
+ Gitlab.create_tag("#{@project_id}", "#{@new_tag}", "#{@update_to_branch}")
196
+ db = Database::Data.new
197
+ 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"
198
+ db.query(sql)
131
199
  puts "打tag成功,开始上传podspec...".green
132
200
  end
133
201
  end
@@ -14,6 +14,7 @@ module Gct
14
14
  ]
15
15
 
16
16
  def initialize(argv)
17
+ config_gitlab
17
18
  @name = argv.shift_argument
18
19
  @version = argv.shift_argument
19
20
  name = @name ||= "iLife"
@@ -21,9 +21,25 @@ module Gct
21
21
  "ios-third/"
22
22
  end
23
23
 
24
- def DefaultTagBranch
24
+ def DefaultTagFromBranch
25
25
  "develop"
26
26
  end
27
+
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"
42
+ end
27
43
  end
28
44
  end
29
45
  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
@@ -7,6 +7,21 @@ module Gct
7
7
  @path = path
8
8
  end
9
9
 
10
+ def read_version
11
+ path = version_path
12
+ if !File.exist?(path)
13
+ return nil
14
+ end
15
+ config_map = YAML.load(File.open(path, "r"))
16
+ config_map
17
+ end
18
+
19
+ def write_version_message(verison, name, branch)
20
+ yaml_path = "#{Generator::GctFile.temp_folder_path}/version"
21
+ content_map = {"version" => verison, "name" => name, "branch" => branch}
22
+ yaml_write_map(yaml_path, content_map)
23
+ end
24
+
10
25
  def yaml_write(key, value)
11
26
  begin
12
27
  config_map = YAML.load(File.open(@path, "r"))
@@ -21,6 +36,28 @@ module Gct
21
36
  end
22
37
  end
23
38
 
39
+ def yaml_write_map(path, content)
40
+ begin
41
+ yaml_file = File.open(path, "w")
42
+ YAML::dump(content, yaml_file)
43
+ rescue IOError => e
44
+ raise e.message
45
+ ensure
46
+ yaml_file.close unless yaml_file.nil?
47
+ end
48
+ end
49
+
50
+ def yaml_read_map(path, key)
51
+ begin
52
+ yaml_file = YAML.load(File.open(path, "r"))
53
+ if yaml_file
54
+ yaml_file[key]
55
+ end
56
+ rescue IOError => e
57
+ raise e.message
58
+ end
59
+ end
60
+
24
61
  def yaml_read(key)
25
62
  begin
26
63
  yaml_file = YAML.load(File.open(@path, "r"))
@@ -48,6 +85,14 @@ module Gct
48
85
  "#{Generator::GctFile.config_file_path}"
49
86
  end
50
87
 
88
+ def version_path
89
+ "#{Generator::GctFile.temp_folder_path}/version"
90
+ end
91
+
92
+ def tmp_path
93
+ "#{Generator::GctFile.temp_folder_path}"
94
+ end
95
+
51
96
  def exist_root
52
97
  root_exist = File.exist?(Generator::GctFile.root_folder_path)
53
98
  root_exist
@@ -2,5 +2,5 @@ module Gct
2
2
  # freeze 冻结对象,将对象变成一个常量
3
3
  # unless 右边的代码块成立,才会运行左边的代码块
4
4
  # defined? 是用来判断本地变量是否存在,也可用来判断是否存在方法
5
- VERSION = "0.3.96".freeze unless defined? Gct::VERSION
5
+ VERSION = "0.4.5".freeze unless defined? Gct::VERSION
6
6
  end
@@ -13,6 +13,10 @@ module Gct
13
13
  "#{get_system_home_path.rstrip}/.gct/config"
14
14
  end
15
15
 
16
+ def self.backup_folder_path
17
+ "#{get_system_home_path.rstrip}/.gct/backup"
18
+ end
19
+
16
20
  # 获取系统用户名
17
21
  def self.get_system_user_name
18
22
  # windows
@@ -30,15 +30,12 @@ module Gct
30
30
  end
31
31
 
32
32
  module SpecPublishStatus
33
- CREATED = '待分析'
34
- ANALYZING = '分析中'
35
- PREPARING = '准备中'
36
- PENDING = '等待中'
37
- WAITING = '待发布'
38
- SKIPPED = '已忽略'
39
- MERGED = '已合并'
40
- DEPLOYING = '发布中'
41
- SUCCESS = '发布成功'
42
- FAILED = '发布失败'
43
- CANCELED = '已取消'
33
+ PENDING = 'pending'
34
+ WAITING = 'waiting'
35
+ SKIPPED = 'skipped'
36
+ MERGED = 'merged'
37
+ DEPLOYING = 'deploying'
38
+ SUCCESS = 'success'
39
+ FAILED = 'failed'
40
+ CANCELED = 'canceled'
44
41
  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.3.96
4
+ version: 0.4.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - jieming
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-30 00:00:00.000000000 Z
11
+ date: 2020-10-20 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
@@ -176,14 +190,20 @@ files:
176
190
  - lib/gct/command/repo/update.rb
177
191
  - lib/gct/command/robot.rb
178
192
  - lib/gct/command/robot/finish.rb
193
+ - lib/gct/command/robot/podfile.rb
179
194
  - lib/gct/command/robot/start.rb
180
195
  - lib/gct/command/setup.rb
181
196
  - lib/gct/command/spec.rb
182
197
  - lib/gct/command/spec/lint.rb
183
198
  - lib/gct/command/update.rb
199
+ - lib/gct/command/update/analyze.rb
200
+ - lib/gct/command/update/dependency.rb
201
+ - lib/gct/command/update/next.rb
202
+ - lib/gct/command/update/podfile.rb
184
203
  - lib/gct/command/update/tag.rb
185
204
  - lib/gct/command/update/version.rb
186
205
  - lib/gct/constant.rb
206
+ - lib/gct/database/data.rb
187
207
  - lib/gct/file_base.rb
188
208
  - lib/gct/gct_version.rb
189
209
  - lib/gct/generator/gct_file.rb