gct 0.3.92 → 0.4.1

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: f56c709eefbd77dd98e8a28edc0843b6aa03b6736a4d5c395b7e5ebbdb788dba
4
- data.tar.gz: 53e1af2275b00d0aa11a83199f9d830ac63559f99a9f63fb046f63ca8e5dfb93
3
+ metadata.gz: 61f99077edb53ba0cf05eca381a814b9f41a17ecc191cc68a1950c2402dff1b7
4
+ data.tar.gz: 3132fd74ec8fd026ea13921f717e68c8f7bbb4aba1ee1265ba057eef823cd8cd
5
5
  SHA512:
6
- metadata.gz: 898c5d910ceec03da053813748b246121ff5cc379910f4b86ebf1ef5ab46096a7e86e8c7cf2e9dba381abe29c138dc263be5fd49a54a42b130562bc0ed8ce184
7
- data.tar.gz: ec2228784c42ac7bf0ef80e1a7e422e9c1f9f2df630350febf66a04bf49411f3aa8a61f85e453f226ff0cf77160b9d220ad8e2b6382a90243d9eae29649450f0
6
+ metadata.gz: 92432f4c66aa5d9a19c27c0c5c22ceb53253ff118e34586934516790134474d3f0c9360ef8dad2b51e8c7cd737d0441e1c019942ff8d4f94d2449d33d109ec19
7
+ data.tar.gz: 83d92ca4f72529e5be6db516fc667bc9dbddc6783e29aa0eaac68f109d91df346545b0c52be5fc14759b2cd03603f86ea8fcd94320e4f6e00ed23f83dd7f569e
@@ -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
@@ -13,13 +13,18 @@ module Gct
13
13
  self.arguments = [
14
14
  CLAide::Argument.new('PROJECT_ID', true),
15
15
  CLAide::Argument.new('BRANCH', true),
16
+ CLAide::Argument.new('VERSION', true),
16
17
  ]
17
18
 
18
19
  def initialize(argv)
19
20
  gitlab_error
21
+ config_gitlab
20
22
  @update_ci = argv.flag?('update-ci', false)
21
- @project_id = "ios/#{argv.shift_argument}"
23
+ name = argv.shift_argument
24
+ @project_id = "ios/#{name}"
25
+ @project_name = name
22
26
  @branch = argv.shift_argument
27
+ @version = argv.shift_argument
23
28
  @file = 'Podfile'
24
29
  super
25
30
  end
@@ -34,11 +39,25 @@ module Gct
34
39
  super
35
40
  help! '请输入项目名.' unless @project_id
36
41
  help! '请输入分支名.' unless @branch
42
+ help! '请输入版本号.' unless @version
37
43
  end
38
44
 
39
45
  def run
40
46
  FileBase.root_err
41
- analyze_dependencies
47
+ puts "开始分析podfile文件".green
48
+ 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)
55
+ else
56
+ untagged_specs = analyze_dependencies
57
+ priority_map = priority_rank(untagged_specs)
58
+ generate_dependency_file(priority_map)
59
+ create_tag_by_priority(priority_map)
60
+ end
42
61
  end
43
62
 
44
63
  def check_branch(branch)
@@ -48,10 +67,10 @@ module Gct
48
67
 
49
68
  def podfile
50
69
  # if check_branch_can_be_update('zeus')
51
- if check_branch('ft/tag') # TODO: Test branch
70
+ # if check_branch('ft/tag') # TODO: Test branch
52
71
  contents = file_contents(@project_id, @file, @branch)
72
+ # puts contents
53
73
  contents.force_encoding('UTF-8')
54
- puts contents
55
74
  temp_local_file = TempLocalFile.new(contents, @file)
56
75
  temp_local_file.write
57
76
  full_path = temp_local_file.full_path
@@ -60,25 +79,30 @@ module Gct
60
79
  podfile = Pod::Podfile.from_ruby(full_path, contents)
61
80
  podfile
62
81
  end
63
- end
82
+ # end
64
83
  end
65
84
 
66
- def analyze_dependencies
85
+ def tmp_podspecs
67
86
  untagged_git_dependencies = podfile.dependencies.select { |dependency| dependency.external? && dependency.external_source[:tag].nil? && dependency.external_source[:branch] == Constant.DefaultTagBranch}
68
87
 
69
- untagged_specs = Parallel.map(untagged_git_dependencies, in_threads: 1) do |dep|
88
+ spec_files = Parallel.map(untagged_git_dependencies, in_threads: 1) do |dep|
70
89
  file_name = "#{dep.name}.podspec"
71
90
  podspec_contents = file_contents("#{Constant.NameSpace}#{dep.name}", file_name, Constant.DefaultTagBranch)
72
91
  temp_local_spec_file = TempLocalFile.new(podspec_contents, file_name)
73
92
  temp_local_spec_file.write
74
- spec_file = temp_local_spec_file.full_path
93
+ temp_local_spec_file.full_path
94
+ end
95
+ spec_files
96
+ end
75
97
 
98
+ def analyze_dependencies
99
+ untagged_specs = tmp_podspecs.map do |spec_file|
76
100
  # 创建podspec对象
77
101
  spec = Pod::Specification.from_file(spec_file)
78
102
  gct_spec = Specification.new()
79
103
  gct_spec.name = spec.name
80
104
  gct_spec.priority = 1000
81
- gct_spec.status = SpecPublishStatus::CREATED
105
+ gct_spec.status = SpecPublishStatus::WAITING
82
106
  gct_spec.tag = "0"
83
107
  dependencySpecs = Array.new()
84
108
  if spec.subspecs.length == 0
@@ -86,7 +110,7 @@ module Gct
86
110
  sub_spec = Specification.new()
87
111
  sub_spec.name = dep.root_name
88
112
  sub_spec.priority = 1000
89
- sub_spec.status = SpecPublishStatus::CREATED
113
+ sub_spec.status = SpecPublishStatus::WAITING
90
114
  sub_spec.tag = "0"
91
115
  sub_spec
92
116
  end
@@ -97,7 +121,7 @@ module Gct
97
121
  sub_spec = Specification.new()
98
122
  sub_spec.name = dep.root_name
99
123
  sub_spec.priority = 1000
100
- sub_spec.status = SpecPublishStatus::CREATED
124
+ sub_spec.status = SpecPublishStatus::WAITING
101
125
  sub_spec.tag = "0"
102
126
  sub_spec
103
127
  end
@@ -108,8 +132,7 @@ module Gct
108
132
  gct_spec.dependencySpecs = dependencySpecs
109
133
  gct_spec
110
134
  end
111
-
112
- priority_rank(untagged_specs)
135
+ untagged_specs
113
136
  end
114
137
 
115
138
  def eqlBetweenHash(hash1, hash2)
@@ -133,12 +156,10 @@ module Gct
133
156
  temp_spec_map[spec.name] = spec
134
157
  end
135
158
  temp_spec_map_copy = Hash.new()
136
- count = 1
137
159
 
138
160
  while !(eqlBetweenHash(temp_spec_map, temp_spec_map_copy)) do
139
161
  # 深拷贝
140
162
  temp_spec_map_copy = Marshal.load(Marshal.dump(temp_spec_map))
141
- puts "--- times == #{count} ---"
142
163
  specs.map do |spec|
143
164
  temp_spec = temp_spec_map[spec.name]
144
165
  spec.dependencySpecs.map do |subspec|
@@ -150,11 +171,73 @@ module Gct
150
171
  end
151
172
  end
152
173
  end
153
- count += 1
154
- temp_spec_map.each { |key, value|
155
- puts "#{key} => #{value.priority}"
156
- }
157
174
  end
175
+ dependency_map = Hash.new()
176
+ priority_map = Hash.new()
177
+ temp_spec_map.each do |key, value|
178
+ dependency_map[key] = {"priority" => value.priority, "tag" => value.tag, "status" => value.status}
179
+ 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)
202
+ end
203
+
204
+ # 按优先级打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
233
+ end
234
+ end
235
+ if is_all_done
236
+ priority -= 1
237
+ priority_map = content_map[priority.to_s]
238
+ end
239
+ end
240
+ priority
158
241
  end
159
242
  end
160
243
  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
@@ -5,11 +5,15 @@ stages:
5
5
  push_pod:
6
6
  stage: push
7
7
  script:
8
- - gct robot start
8
+ - gct robot start --test
9
9
  - echo "开始lint 和 push podspec"
10
+ - gct update dependency $CI_PROJECT_NAME "status" "deploying"
11
+ - gct clean lint $CI_PROJECT_NAME
10
12
  - gct repo update
11
13
  - gct repo push
12
- - gct robot finish true
14
+ - gct robot finish true --test
15
+ - gct update dependency $CI_PROJECT_NAME "tag" $CI_COMMIT_REF_NAME
16
+ - gct update next
13
17
  only:
14
18
  - tags
15
19
  tags:
@@ -18,7 +22,10 @@ push_pod:
18
22
  on_failure:
19
23
  stage: failure
20
24
  script:
21
- - gct robot finish false
25
+ - gct robot finish false --test
26
+ - gct update dependency $CI_PROJECT_NAME "status" "failed"
22
27
  when: on_failure
28
+ only:
29
+ - tags
23
30
  tags:
24
31
  - iOS
@@ -2,6 +2,7 @@ require 'gct/command/op/gems'
2
2
  require 'gct/command/op/gitconf'
3
3
  require 'gct/command/op/xcache'
4
4
  require 'gct/command/op/root'
5
+ require 'gct/command/op/lint'
5
6
 
6
7
  module Gct
7
8
  class Command
@@ -0,0 +1,35 @@
1
+ module Gct
2
+ class Command
3
+ class Op < Command
4
+ class Lint < Op
5
+
6
+ self.summary = '打开lint 缓存文件夹'
7
+ self.description = <<-DESC
8
+ 打开lint 缓存文件夹
9
+ DESC
10
+
11
+ self.arguments = [
12
+ ]
13
+
14
+ def initialize(argv)
15
+ super
16
+ end
17
+
18
+ def validate!
19
+ super
20
+ end
21
+
22
+ def run
23
+ openLintCache
24
+ end
25
+
26
+ def openLintCache
27
+ lintCache = '~/Library/Caches/CocoaPods/Pods/External/'
28
+ puts "Xcode缓存路径为:#{lintCache}".green
29
+ system "open #{lintCache}"
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+
@@ -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
@@ -15,6 +14,12 @@ module Gct
15
14
  CLAide::Argument.new('BUILD_STATUS', true),
16
15
  ]
17
16
 
17
+ def self.options
18
+ [
19
+ ['--test', '测试机器人,测试webhook'],
20
+ ].concat(super)
21
+ end
22
+
18
23
  def initialize(argv)
19
24
  @project_name = ENV['CI_PROJECT_NAME']
20
25
  @user_name = ENV['GITLAB_USER_NAME']
@@ -22,31 +27,22 @@ module Gct
22
27
  @build_status = argv.shift_argument
23
28
  @commit_sha = ENV['CI_COMMIT_SHA']
24
29
  @ci_url = ENV['CI_PIPELINE_URL']
30
+ @test = argv.flag?('test', false)
25
31
  super
26
32
  end
27
33
 
28
34
  def run
29
- build_text = @build_status ? "<font color=\"info\">CI运行成功</font>" : "<font color=\"comment\">CI运行失败</font>,请相关人员注意"
30
- ci_text = "[点击跳转](#{@ci_url})"
31
-
32
- webhook = FileBase.get_config("gitlab-robot-webhook")
33
- url = URI(webhook)
34
-
35
- http = Net::HTTP.new(url.host, url.port)
36
- if url.scheme == "https"
37
- http.use_ssl = true
38
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
35
+ puts @build_status.class
36
+ puts "build_status == #{@build_status}"
37
+ if @build_status.eql?("false")
38
+ build_text = "<font color=\"comment\">CI运行失败</font>,请相关人员注意"
39
+ elsif @build_status.eql?("true")
40
+ build_text = "<font color=\"info\">CI运行成功</font>"
39
41
  end
40
-
41
- data = {
42
- "msgtype": "markdown",
43
- "markdown": {
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
- }
46
- }.to_json
47
-
48
- header = {'content-type':'application/json'}
49
- 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)
50
46
  end
51
47
  end
52
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
@@ -14,33 +14,23 @@ module Gct
14
14
  self.arguments = [
15
15
  ]
16
16
 
17
+ def self.options
18
+ [
19
+ ['--test', '测试机器人,测试webhook'],
20
+ ].concat(super)
21
+ end
22
+
17
23
  def initialize(argv)
18
24
  @project_name = ENV['CI_PROJECT_NAME']
19
25
  @tag = ENV['CI_COMMIT_REF_NAME']
26
+ @test = argv.flag?('test', false)
20
27
  super
21
28
  end
22
29
 
23
30
  def run
24
- webhook = FileBase.get_config("gitlab-robot-webhook")
25
- raise "请先设置webhook --> gct config set gitlab-robot-webhook WEBHOOK_URL" if webhook.nil? || webhook.empty?
26
- url = URI(webhook)
27
-
28
- http = Net::HTTP.new(url.host, url.port)
29
- if url.scheme == "https"
30
- http.use_ssl = true
31
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
32
- end
33
-
34
31
  message = " <font color=\"info\">#{@tag}</font> 开始打tag"
35
- data = {
36
- "msgtype": "markdown",
37
- "markdown": {
38
- "content": "**#{@project_name}** #{message}"
39
- }
40
- }.to_json
41
-
42
- header = {'content-type':'application/json'}
43
- response = http.post(url, data, header)
32
+ content = "**#{@project_name}** #{message}"
33
+ robot_send(content)
44
34
  end
45
35
  end
46
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)
@@ -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,36 @@
1
+ module Gct
2
+ class Command
3
+ class Update < Command
4
+ class Dependency < Update
5
+
6
+ self.summary = '更新依赖文件'
7
+ self.description = <<-DESC
8
+ 更新依赖文件
9
+ DESC
10
+
11
+ self.arguments = [
12
+ # CLAide::Argument.new('PRIORITY', false),
13
+ CLAide::Argument.new('POD_NAME', false),
14
+ CLAide::Argument.new('KEY', false),
15
+ CLAide::Argument.new('VALUE', false),
16
+ ]
17
+
18
+ def initialize(argv)
19
+ # @priority = argv.shift_argument
20
+ @pod_name = argv.shift_argument
21
+ @key = argv.shift_argument
22
+ @value = argv.shift_argument
23
+ super
24
+ end
25
+
26
+ def validate!
27
+ super
28
+ end
29
+
30
+ def run
31
+ FileBase.yaml_dependency_update(@pod_name, @key, @value)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,72 @@
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
+ batch_tag
18
+ end
19
+
20
+ def batch_tag
21
+ specs = next_specs
22
+ if specs.nil?
23
+ return
24
+ end
25
+ if specs.keys.count == 0
26
+ puts "tag已全部打完!!!".green
27
+ # 执行更新podfile的操作
28
+ system "gct update podfile"
29
+ else
30
+ specs.each do |key, val|
31
+ if val["status"].eql?(SpecPublishStatus::WAITING) || val["status"].eql?(SpecPublishStatus::CANCELED) || val["status"].eql?(SpecPublishStatus::FAILED)
32
+ 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"
36
+ end
37
+ end
38
+ end
39
+ 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
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,79 @@
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
+ 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
31
+ update_podfile
32
+ remove_and_backup
33
+ end
34
+
35
+ def update_podfile
36
+ podspec_content = file_contents(@name, @file, @branch)
37
+
38
+ remove_regex = /dev_pod .*/
39
+ 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
+
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
+ }
57
+
58
+ edit_file(podspec_content)
59
+ system "gct robot podfile"
60
+ end
61
+
62
+ def edit_file(content)
63
+ Gitlab.edit_file(@name, @file, @branch, content, "@config #{@version}版本 podfile更新")
64
+ 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
+ end
77
+ end
78
+ end
79
+ end
@@ -17,21 +17,26 @@ module Gct
17
17
  [
18
18
  ['--skip-tag', '是否忽略tag,直接触发ci'],
19
19
  ['--update-ci', '是否更新CI'],
20
+ ['--auto-tag', '自动化'],
20
21
  ].concat(super)
21
22
  end
22
23
 
23
24
  def initialize(argv)
25
+ config_gitlab
24
26
  @update_version_branch = 'develop'
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
+ @name = argv.shift_argument
30
31
  @tag = argv.shift_argument
32
+ @file = get_spec_file
33
+ if @name.nil?
34
+ @name = @spec.name
35
+ end
31
36
  @project_id = "#{Constant.NameSpace}#{@name}"
32
37
  super
33
38
  end
34
-
39
+
35
40
  def run
36
41
  update_ci_method if @update_ci
37
42
  if @skip_tag
@@ -44,8 +49,22 @@ module Gct
44
49
  def skip_tag_method
45
50
  @new_tag = @spec.version
46
51
  puts "tag == #{@new_tag}"
47
- delete_tag # remove tag
48
- create_tag # create tag
52
+ if !@update_ci
53
+ isEmptyMR = mr_to_master
54
+ if !isEmptyMR
55
+ accept_merge_request
56
+ end
57
+ end
58
+ # remove tag
59
+ command = `git rev-parse --is-inside-work-tree`
60
+ if command.eql?("true")
61
+ `git tag -d #{@new_tag}`
62
+ `git push origin :refs/tags/#{@new_tag}`
63
+ else
64
+ remove_tag
65
+ end
66
+ # create tag
67
+ create_tag
49
68
  end
50
69
 
51
70
  def update_ci_method
@@ -54,16 +73,29 @@ module Gct
54
73
  path = File.expand_path("../../init", __FILE__)
55
74
  ci_content = temp_local_file.read_path_file(path, "gitlab-ci.rb")
56
75
  edit_file('.gitlab-ci.yml', ci_content, 'update ci')
57
- mr_to_master
58
- accept_merge_request
76
+ isEmptyMR = mr_to_master
77
+ if !isEmptyMR
78
+ accept_merge_request
79
+ end
59
80
  end
60
81
 
61
82
  def get_spec_file
83
+ spec_file = nil
84
+ full_path = nil
85
+ if @auto_tag
86
+ raise "podspec名不能为空!!!".red if spec_file.nil? if @name.nil?
87
+ Dir.chdir(FileBase.tmp_path) do
88
+ spec_file = Pathname.glob("#{@name}.podspec").first
89
+ full_path = spec_file.realpath
90
+ raise "在 #{Dir.pwd} 目录下找不到podspec文件".red if spec_file.nil?
91
+ end
92
+ else
62
93
  spec_file = Pathname.glob('*.podspec').first
94
+ full_path = spec_file
63
95
  raise "在 #{Dir.pwd} 目录下找不到podspec文件".red if spec_file.nil?
64
-
65
- @spec = Pod::Specification.from_file(spec_file)
66
- spec_file
96
+ end
97
+ @spec = Pod::Specification.from_file(full_path)
98
+ spec_file
67
99
  end
68
100
 
69
101
  def update_podspec_version
@@ -90,12 +122,18 @@ module Gct
90
122
 
91
123
  def mr_to_master
92
124
  puts "正在创建MR请求将develop分支合并到master!".green
93
- mr = Gitlab.create_merge_request("#{Constant.NameSpace}#{@name}", "更新版本podpesc版本号", { source_branch: "#{@update_version_branch}", target_branch: 'master' })
125
+ mr = Gitlab.create_merge_request("#{Constant.NameSpace}#{@name}", "mr", { source_branch: "#{@update_version_branch}", target_branch: 'master' })
126
+ # puts mr.to_hash
94
127
  @id = mr.iid
95
128
  puts mr.merge_status
96
- if mr.merge_status == 'cannot_be_merged'
129
+ 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
+ close_mr if isEmptyMR
133
+ if mr.merge_status == 'cannot_be_merged' && !isEmptyMR
97
134
  raise "Merge有冲突,请前往 https://gi-dev.ccrgt.com/#{Constant.NameSpace}#{@name}/merge_requests/#{@id} 解决".red
98
135
  end
136
+ isEmptyMR
99
137
  end
100
138
 
101
139
  def accept_merge_request
@@ -105,7 +143,11 @@ module Gct
105
143
  end
106
144
  end
107
145
 
108
- def delete_tag
146
+ def close_mr
147
+ Gitlab.update_merge_request("#{@project_id}", @id, {state_event: 'close'})
148
+ end
149
+
150
+ def remove_tag
109
151
  Gitlab.delete_tag("#{@project_id}", "#{@new_tag}")
110
152
  end
111
153
 
@@ -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"
@@ -24,6 +24,10 @@ module Gct
24
24
  def DefaultTagBranch
25
25
  "develop"
26
26
  end
27
+
28
+ def DependencyName
29
+ "dependency"
30
+ end
27
31
  end
28
32
  end
29
33
  end
@@ -7,6 +7,57 @@ 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
+
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
+
10
61
  def yaml_write(key, value)
11
62
  begin
12
63
  config_map = YAML.load(File.open(@path, "r"))
@@ -21,6 +72,28 @@ module Gct
21
72
  end
22
73
  end
23
74
 
75
+ def yaml_write_map(path, content)
76
+ begin
77
+ yaml_file = File.open(path, "w")
78
+ YAML::dump(content, yaml_file)
79
+ rescue IOError => e
80
+ raise e.message
81
+ ensure
82
+ yaml_file.close unless yaml_file.nil?
83
+ end
84
+ end
85
+
86
+ def yaml_read_map(path, key)
87
+ begin
88
+ yaml_file = YAML.load(File.open(path, "r"))
89
+ if yaml_file
90
+ yaml_file[key]
91
+ end
92
+ rescue IOError => e
93
+ raise e.message
94
+ end
95
+ end
96
+
24
97
  def yaml_read(key)
25
98
  begin
26
99
  yaml_file = YAML.load(File.open(@path, "r"))
@@ -48,11 +121,28 @@ module Gct
48
121
  "#{Generator::GctFile.config_file_path}"
49
122
  end
50
123
 
124
+ def dependency_path
125
+ "#{Generator::GctFile.temp_folder_path}/#{Constant.DependencyName}"
126
+ end
127
+
128
+ def version_path
129
+ "#{Generator::GctFile.temp_folder_path}/version"
130
+ end
131
+
132
+ def tmp_path
133
+ "#{Generator::GctFile.temp_folder_path}"
134
+ end
135
+
51
136
  def exist_root
52
137
  root_exist = File.exist?(Generator::GctFile.root_folder_path)
53
138
  root_exist
54
139
  end
55
140
 
141
+ def exist_dependency
142
+ root_exist = File.exist?(dependency_path)
143
+ root_exist
144
+ end
145
+
56
146
  def root_err
57
147
  raise "请先运行命令:gct setup".red if !exist_root
58
148
  end
@@ -2,5 +2,5 @@ module Gct
2
2
  # freeze 冻结对象,将对象变成一个常量
3
3
  # unless 右边的代码块成立,才会运行左边的代码块
4
4
  # defined? 是用来判断本地变量是否存在,也可用来判断是否存在方法
5
- VERSION = "0.3.92".freeze unless defined? Gct::VERSION
5
+ VERSION = "0.4.1".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.92
4
+ version: 0.4.1
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-29 00:00:00.000000000 Z
11
+ date: 2020-08-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -149,6 +149,10 @@ files:
149
149
  - lib/gct/command/autotag.rb
150
150
  - lib/gct/command/build.rb
151
151
  - lib/gct/command/build/r.rb
152
+ - lib/gct/command/clean.rb
153
+ - lib/gct/command/clean/cache.rb
154
+ - lib/gct/command/clean/ci.rb
155
+ - lib/gct/command/clean/lint.rb
152
156
  - lib/gct/command/config.rb
153
157
  - lib/gct/command/config/get.rb
154
158
  - lib/gct/command/config/set.rb
@@ -163,6 +167,7 @@ files:
163
167
  - lib/gct/command/op.rb
164
168
  - lib/gct/command/op/gems.rb
165
169
  - lib/gct/command/op/gitconf.rb
170
+ - lib/gct/command/op/lint.rb
166
171
  - lib/gct/command/op/root.rb
167
172
  - lib/gct/command/op/xcache.rb
168
173
  - lib/gct/command/repo.rb
@@ -171,11 +176,16 @@ files:
171
176
  - lib/gct/command/repo/update.rb
172
177
  - lib/gct/command/robot.rb
173
178
  - lib/gct/command/robot/finish.rb
179
+ - lib/gct/command/robot/podfile.rb
174
180
  - lib/gct/command/robot/start.rb
175
181
  - lib/gct/command/setup.rb
176
182
  - lib/gct/command/spec.rb
177
183
  - lib/gct/command/spec/lint.rb
178
184
  - lib/gct/command/update.rb
185
+ - lib/gct/command/update/analyze.rb
186
+ - lib/gct/command/update/dependency.rb
187
+ - lib/gct/command/update/next.rb
188
+ - lib/gct/command/update/podfile.rb
179
189
  - lib/gct/command/update/tag.rb
180
190
  - lib/gct/command/update/version.rb
181
191
  - lib/gct/constant.rb