gct 0.3.91 → 0.4.0

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: 2544c8db653759d99e1ddc1007090e03db770c715f30d9e5f5f770076226ddd0
4
- data.tar.gz: aee1cfc33e68777d545884cdb0025c2018821d83ecb2668ea33a3e8b51cad34f
3
+ metadata.gz: 8eacd230eb51e7c03f69df817172a1684c61a016b476ee9bede1a4490751084c
4
+ data.tar.gz: 4f9525f907f827cbe90806a0fc11b42c64bc4cdefda2f6982da2e2ce6d117e1d
5
5
  SHA512:
6
- metadata.gz: ec1ef12cfdf4ff81fa1fb7678da36d05a50657d5dbf4453718270657755330bed58eba1492ea42ca4ad9ce8c829a6083ac92101ce892ae2f0809741eb464fbdd
7
- data.tar.gz: dd8d0bbf4646aca64790eae2c21aa9910f7912ee202f0a9547048978190813c1bcca6a19e338ce6865d3c73931e72bb0875ad8ae5783dfda8ca8d11b8002c29c
6
+ metadata.gz: d93d45b1ffee87733b11bc2f70fc4c35fb510c99bece66196d87b49dadb98f7a9648bb2a407cc78e98223ffbeafb1523f120ff8fec7b4ca127e9eb461a6dad24
7
+ data.tar.gz: 606a302705d5305cb8d5260d489d551794ffedabea91b7da81bc7ea66cc31042d2dad835a6fd6edccc82369b45d7e4ba5de55a35fceb3b520d29468a73a36115
@@ -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'
@@ -38,7 +38,19 @@ module Gct
38
38
 
39
39
  def run
40
40
  FileBase.root_err
41
- analyze_dependencies
41
+ puts "开始分析podfile文件".green
42
+ puts ""
43
+ exist_dep = FileBase.exist_dependency
44
+ if exist_dep
45
+ tmp_podspecs
46
+ priority_map = FileBase.yaml_dependency_read
47
+ create_tag_by_priority(priority_map)
48
+ else
49
+ untagged_specs = analyze_dependencies
50
+ priority_map = priority_rank(untagged_specs)
51
+ generate_dependency_file(priority_map)
52
+ create_tag_by_priority(priority_map)
53
+ end
42
54
  end
43
55
 
44
56
  def check_branch(branch)
@@ -48,10 +60,9 @@ module Gct
48
60
 
49
61
  def podfile
50
62
  # if check_branch_can_be_update('zeus')
51
- if check_branch('ft/tag') # TODO: Test branch
63
+ # if check_branch('ft/tag') # TODO: Test branch
52
64
  contents = file_contents(@project_id, @file, @branch)
53
65
  contents.force_encoding('UTF-8')
54
- puts contents
55
66
  temp_local_file = TempLocalFile.new(contents, @file)
56
67
  temp_local_file.write
57
68
  full_path = temp_local_file.full_path
@@ -60,25 +71,30 @@ module Gct
60
71
  podfile = Pod::Podfile.from_ruby(full_path, contents)
61
72
  podfile
62
73
  end
63
- end
74
+ # end
64
75
  end
65
76
 
66
- def analyze_dependencies
77
+ def tmp_podspecs
67
78
  untagged_git_dependencies = podfile.dependencies.select { |dependency| dependency.external? && dependency.external_source[:tag].nil? && dependency.external_source[:branch] == Constant.DefaultTagBranch}
68
79
 
69
- untagged_specs = Parallel.map(untagged_git_dependencies, in_threads: 1) do |dep|
80
+ spec_files = Parallel.map(untagged_git_dependencies, in_threads: 1) do |dep|
70
81
  file_name = "#{dep.name}.podspec"
71
82
  podspec_contents = file_contents("#{Constant.NameSpace}#{dep.name}", file_name, Constant.DefaultTagBranch)
72
83
  temp_local_spec_file = TempLocalFile.new(podspec_contents, file_name)
73
84
  temp_local_spec_file.write
74
- spec_file = temp_local_spec_file.full_path
85
+ temp_local_spec_file.full_path
86
+ end
87
+ spec_files
88
+ end
75
89
 
90
+ def analyze_dependencies
91
+ untagged_specs = tmp_podspecs.map do |spec_file|
76
92
  # 创建podspec对象
77
93
  spec = Pod::Specification.from_file(spec_file)
78
94
  gct_spec = Specification.new()
79
95
  gct_spec.name = spec.name
80
96
  gct_spec.priority = 1000
81
- gct_spec.status = SpecPublishStatus::CREATED
97
+ gct_spec.status = SpecPublishStatus::WAITING
82
98
  gct_spec.tag = "0"
83
99
  dependencySpecs = Array.new()
84
100
  if spec.subspecs.length == 0
@@ -86,7 +102,7 @@ module Gct
86
102
  sub_spec = Specification.new()
87
103
  sub_spec.name = dep.root_name
88
104
  sub_spec.priority = 1000
89
- sub_spec.status = SpecPublishStatus::CREATED
105
+ sub_spec.status = SpecPublishStatus::WAITING
90
106
  sub_spec.tag = "0"
91
107
  sub_spec
92
108
  end
@@ -97,7 +113,7 @@ module Gct
97
113
  sub_spec = Specification.new()
98
114
  sub_spec.name = dep.root_name
99
115
  sub_spec.priority = 1000
100
- sub_spec.status = SpecPublishStatus::CREATED
116
+ sub_spec.status = SpecPublishStatus::WAITING
101
117
  sub_spec.tag = "0"
102
118
  sub_spec
103
119
  end
@@ -108,8 +124,7 @@ module Gct
108
124
  gct_spec.dependencySpecs = dependencySpecs
109
125
  gct_spec
110
126
  end
111
-
112
- priority_rank(untagged_specs)
127
+ untagged_specs
113
128
  end
114
129
 
115
130
  def eqlBetweenHash(hash1, hash2)
@@ -133,12 +148,10 @@ module Gct
133
148
  temp_spec_map[spec.name] = spec
134
149
  end
135
150
  temp_spec_map_copy = Hash.new()
136
- count = 1
137
151
 
138
152
  while !(eqlBetweenHash(temp_spec_map, temp_spec_map_copy)) do
139
153
  # 深拷贝
140
154
  temp_spec_map_copy = Marshal.load(Marshal.dump(temp_spec_map))
141
- puts "--- times == #{count} ---"
142
155
  specs.map do |spec|
143
156
  temp_spec = temp_spec_map[spec.name]
144
157
  spec.dependencySpecs.map do |subspec|
@@ -150,11 +163,70 @@ module Gct
150
163
  end
151
164
  end
152
165
  end
153
- count += 1
154
- temp_spec_map.each { |key, value|
155
- puts "#{key} => #{value.priority}"
156
- }
157
166
  end
167
+ dependency_map = Hash.new()
168
+ priority_map = Hash.new()
169
+ temp_spec_map.each do |key, value|
170
+ dependency_map[key] = {"priority" => value.priority, "tag" => value.tag, "status" => value.status}
171
+ end
172
+ priority = 1000
173
+ while priority <= 1000 do
174
+ tmp_hash = Hash.new()
175
+ dependency_map.each do |key, value|
176
+ if (value["priority"] == priority)
177
+ tmp_hash.store(key, {"tag" => value["tag"], "status" => value["status"]})
178
+ dependency_map.delete(value)
179
+ end
180
+ end
181
+ if (tmp_hash.keys.count == 0)
182
+ priority = 1001
183
+ else
184
+ priority_map[priority.to_s] = tmp_hash
185
+ priority -= 1
186
+ end
187
+ end
188
+ priority_map
189
+ end
190
+
191
+ def generate_dependency_file(priority_map)
192
+ yaml_path = "#{Generator::GctFile.temp_folder_path}/#{Constant.DependencyName}"
193
+ FileBase.yaml_write_map(yaml_path, priority_map)
194
+ end
195
+
196
+ # 按优先级打tag, 触发第一个优先级,其他的上一优先级打完之后自动触发
197
+ def create_tag_by_priority(priority_map)
198
+ priority = get_current_need_tag_priority
199
+ value = priority_map[priority.to_s]
200
+ raise "没有需要打tag的库".red if value.keys.count == 0
201
+ value.each do |key, val|
202
+ if val["status"].eql?(SpecPublishStatus::WAITING) || val["status"].eql?(SpecPublishStatus::CANCELED) || val["status"].eql?(SpecPublishStatus::FAILED)
203
+ status = SpecPublishStatus::PENDING
204
+ val["status"] = status
205
+ system "gct update dependency #{key} status #{status}"
206
+ system "gct update tag #{key} --auto-tag"
207
+ end
208
+ end
209
+ end
210
+
211
+ # 当前优先级是否已打完
212
+ def get_current_need_tag_priority
213
+ priority = 1000
214
+ content_map = FileBase.yaml_dependency_read
215
+ priority_map = content_map[priority.to_s]
216
+ is_all_done = true
217
+ while is_all_done do
218
+ priority_map.each do |k, v|
219
+ if !v["status"].eql?(SpecPublishStatus::SUCCESS)
220
+ is_all_done = false
221
+ break
222
+ end
223
+ end
224
+ if is_all_done
225
+ priority -= 1
226
+ priority_map = content_map[priority.to_s]
227
+ end
228
+ end
229
+ priority
158
230
  end
159
231
  end
160
232
  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" "发布中"
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" "发布失败"
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,7 @@
1
1
  require 'gct/command/robot/start'
2
2
  require 'gct/command/robot/finish'
3
+ require 'net/https'
4
+ require 'json'
3
5
 
4
6
  module Gct
5
7
  class Command
@@ -9,6 +11,43 @@ module Gct
9
11
  self.description = <<-DESC
10
12
  发送jenkins和gitlab机器人消息
11
13
  DESC
14
+
15
+ def self.options
16
+ [
17
+ ['--test', '测试机器人,测试webhook'],
18
+ ].concat(super)
19
+ end
20
+
21
+ def initialize(argv)
22
+ @test = argv.flag?('test', false)
23
+ super
24
+ end
25
+
26
+ def robot_send(content)
27
+ if @test
28
+ webhook = FileBase.get_config("gitlab-robot-webhook-test")
29
+ else
30
+ webhook = FileBase.get_config("gitlab-robot-webhook")
31
+ end
32
+ raise "请先设置webhook --> gct config set gitlab-robot-webhook WEBHOOK_URL" if webhook.nil? || webhook.empty?
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
39
+ end
40
+
41
+ data = {
42
+ "msgtype": "markdown",
43
+ "markdown": {
44
+ "content": "#{content}"
45
+ }
46
+ }.to_json
47
+
48
+ header = {'content-type':'application/json'}
49
+ response = http.post(url, data, header)
50
+ end
12
51
  end
13
52
  end
14
53
  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
@@ -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)
@@ -0,0 +1,13 @@
1
+ require 'gct/command/tag/next'
2
+
3
+ module Gct
4
+ class Command
5
+ class Tag < Command
6
+ self.abstract_command = true
7
+ self.summary = 'tag 相关操作'
8
+ self.description = <<-DESC
9
+ tag 相关操作
10
+ DESC
11
+ end
12
+ end
13
+ end
@@ -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
+ @project_name = ENV['CI_PROJECT_NAME']
12
+ super
13
+ end
14
+
15
+ def run
16
+ batch_tag
17
+ end
18
+
19
+ def batch_tag
20
+ value = next_specs
21
+ if val.nil?
22
+ return
23
+ end
24
+ if value.keys.count == 0
25
+ puts "tag已全部打完!!!".green
26
+ # 执行更新podfile的操作
27
+ # system "gct update podfile"
28
+ else
29
+ value.each do |key, val|
30
+ if val["status"].eql?(SpecPublishStatus::WAITING) || val["status"].eql?(SpecPublishStatus::CANCELED) || val["status"].eql?(SpecPublishStatus::FAILED)
31
+ status = SpecPublishStatus::PENDING
32
+ val["status"] = status
33
+ system "gct update dependency #{key} status #{status}"
34
+ system "gct update tag #{key} --auto-tag --update-ci"
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ def next_specs
41
+ priority = get_current_project_priority
42
+ content_map = FileBase.yaml_dependency_read
43
+ priority_map = content_map[priority.to_s]
44
+ is_all_done = true
45
+ priority_map.each do |k, v|
46
+ if !v["status"].eql?("发布成功")
47
+ is_all_done = false
48
+ break
49
+ end
50
+ end
51
+ if is_all_done
52
+ content_map[(priority - 1).to_s]
53
+ else
54
+ nil
55
+ end
56
+ end
57
+
58
+ def get_current_project_priority
59
+ content_map = FileBase.yaml_dependency_read
60
+ priority = 1000
61
+ content_map.each do |k, v|
62
+ if v.keys.include?(@project_name)
63
+ priority = k
64
+ break
65
+ end
66
+ end
67
+ priority
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,41 @@
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
+ CLAide::Argument.new('VERSION', true),
13
+ ]
14
+
15
+ def initialize(argv)
16
+ @version = argv.shift_argument
17
+ super
18
+ end
19
+
20
+ def validate!
21
+ super
22
+ end
23
+
24
+ def run
25
+
26
+ end
27
+
28
+ # 删除和备份
29
+ def remove_and_backup
30
+ d_name = Constant.DependencyName
31
+ Dir.chdir(FileBase.tmp_path) do
32
+ # 备份dependency文件到backup文件夹下
33
+ system "cp #{d_name} ../backup/#{d_name}-#{@version}"
34
+ # 删除tmp文件夹下所有文件
35
+ system "rm -rf *"
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -17,6 +17,7 @@ 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
 
@@ -24,14 +25,17 @@ module Gct
24
25
  @update_version_branch = 'develop'
25
26
  @skip_tag = argv.flag?('skip-tag', false)
26
27
  @update_ci = argv.flag?('update-ci', false)
27
- @file = get_spec_file
28
- name = argv.shift_argument
29
- @name = name.nil? ? @spec.name : name
28
+ @auto_tag = argv.flag?('auto-tag', false)
29
+ @name = argv.shift_argument
30
30
  @tag = argv.shift_argument
31
+ @file = get_spec_file
32
+ if @name.nil?
33
+ @name = @spec.name
34
+ end
31
35
  @project_id = "#{Constant.NameSpace}#{@name}"
32
36
  super
33
37
  end
34
-
38
+
35
39
  def run
36
40
  update_ci_method if @update_ci
37
41
  if @skip_tag
@@ -44,8 +48,17 @@ module Gct
44
48
  def skip_tag_method
45
49
  @new_tag = @spec.version
46
50
  puts "tag == #{@new_tag}"
47
- delete_tag # remove tag
48
- create_tag # create tag
51
+ if !@update_ci
52
+ isEmptyMR = mr_to_master
53
+ if !isEmptyMR
54
+ accept_merge_request
55
+ end
56
+ end
57
+ # remove tag
58
+ `git tag -d #{@new_tag}`
59
+ `git push origin :refs/tags/#{@new_tag}`
60
+ # create tag
61
+ create_tag
49
62
  end
50
63
 
51
64
  def update_ci_method
@@ -54,16 +67,26 @@ module Gct
54
67
  path = File.expand_path("../../init", __FILE__)
55
68
  ci_content = temp_local_file.read_path_file(path, "gitlab-ci.rb")
56
69
  edit_file('.gitlab-ci.yml', ci_content, 'update ci')
57
- mr_to_master
58
- accept_merge_request
70
+ isEmptyMR = mr_to_master
71
+ if !isEmptyMR
72
+ accept_merge_request
73
+ end
59
74
  end
60
75
 
61
76
  def get_spec_file
77
+ spec_file = nil
78
+ if @auto_tag
79
+ raise "podspec名不能为空!!!".red if spec_file.nil? if @name.nil?
80
+ Dir.chdir(FileBase.tmp_path) do
81
+ spec_file = Pathname.glob("#{@name}.podspec").first
82
+ raise "在 #{Dir.pwd} 目录下找不到podspec文件".red if spec_file.nil?
83
+ end
84
+ else
62
85
  spec_file = Pathname.glob('*.podspec').first
63
86
  raise "在 #{Dir.pwd} 目录下找不到podspec文件".red if spec_file.nil?
64
-
65
- @spec = Pod::Specification.from_file(spec_file)
66
- spec_file
87
+ end
88
+ @spec = Pod::Specification.from_file(spec_file)
89
+ spec_file
67
90
  end
68
91
 
69
92
  def update_podspec_version
@@ -90,12 +113,18 @@ module Gct
90
113
 
91
114
  def mr_to_master
92
115
  puts "正在创建MR请求将develop分支合并到master!".green
93
- mr = Gitlab.create_merge_request("#{Constant.NameSpace}#{@name}", "更新版本podpesc版本号", { source_branch: "#{@update_version_branch}", target_branch: 'master' })
116
+ mr = Gitlab.create_merge_request("#{Constant.NameSpace}#{@name}", "mr", { source_branch: "#{@update_version_branch}", target_branch: 'master' })
117
+ # puts mr.to_hash
94
118
  @id = mr.iid
95
119
  puts mr.merge_status
96
- if mr.merge_status == 'cannot_be_merged'
120
+ isEmptyMR = mr.diff_refs.base_sha.eql?(mr.diff_refs.head_sha)
121
+ # puts mr.diff_refs.base_sha
122
+ # puts mr.diff_refs.head_sha
123
+ close_mr if isEmptyMR
124
+ if mr.merge_status == 'cannot_be_merged' && !isEmptyMR
97
125
  raise "Merge有冲突,请前往 https://gi-dev.ccrgt.com/#{Constant.NameSpace}#{@name}/merge_requests/#{@id} 解决".red
98
126
  end
127
+ isEmptyMR
99
128
  end
100
129
 
101
130
  def accept_merge_request
@@ -105,8 +134,8 @@ module Gct
105
134
  end
106
135
  end
107
136
 
108
- def delete_tag
109
- Gitlab.delete_tag("#{@project_id}", "#{@new_tag}")
137
+ def close_mr
138
+ Gitlab.update_merge_request("#{@project_id}", @id, {state_event: 'close'})
110
139
  end
111
140
 
112
141
  def create_tag
@@ -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,10 +7,41 @@ module Gct
7
7
  @path = path
8
8
  end
9
9
 
10
+ def yaml_dependency_read
11
+ path = dependency_path
12
+ config_map = YAML.load(File.open(path, "r"))
13
+ config_map
14
+ end
15
+
16
+ def yaml_dependency_update(pod_name, key, value)
17
+ begin
18
+ path = dependency_path
19
+ config_map = YAML.load(File.open(path, "r"))
20
+ puts config_map
21
+ config_map = Hash.new() if !config_map
22
+ config_map.each do |k, v|
23
+ v.each do |sk, sv|
24
+ if sk.eql?(pod_name)
25
+ sv[key] = value
26
+ if key.eql?("tag")
27
+ sv["status"] = SpecPublishStatus::SUCCESS
28
+ end
29
+ end
30
+ end
31
+ end
32
+ yaml_file = File.open(path, "w")
33
+ YAML::dump(config_map, yaml_file)
34
+ rescue IOError => e
35
+ raise e.message
36
+ ensure
37
+ yaml_file.close unless yaml_file.nil?
38
+ end
39
+ end
40
+
10
41
  def yaml_write(key, value)
11
42
  begin
12
43
  config_map = YAML.load(File.open(@path, "r"))
13
- config_map = Hash.new() if config_map.nil? || config_map.empty?
44
+ config_map = Hash.new() if !config_map
14
45
  config_map[key] = value
15
46
  yaml_file = File.open(@path, "w")
16
47
  YAML::dump(config_map, yaml_file)
@@ -21,6 +52,28 @@ module Gct
21
52
  end
22
53
  end
23
54
 
55
+ def yaml_write_map(path, content)
56
+ begin
57
+ yaml_file = File.open(path, "w")
58
+ YAML::dump(content, yaml_file)
59
+ rescue IOError => e
60
+ raise e.message
61
+ ensure
62
+ yaml_file.close unless yaml_file.nil?
63
+ end
64
+ end
65
+
66
+ def yaml_read_map(path, key)
67
+ begin
68
+ yaml_file = YAML.load(File.open(path, "r"))
69
+ if yaml_file
70
+ yaml_file[key]
71
+ end
72
+ rescue IOError => e
73
+ raise e.message
74
+ end
75
+ end
76
+
24
77
  def yaml_read(key)
25
78
  begin
26
79
  yaml_file = YAML.load(File.open(@path, "r"))
@@ -48,11 +101,24 @@ module Gct
48
101
  "#{Generator::GctFile.config_file_path}"
49
102
  end
50
103
 
104
+ def dependency_path
105
+ "#{Generator::GctFile.temp_folder_path}/#{Constant.DependencyName}"
106
+ end
107
+
108
+ def tmp_path
109
+ "#{Generator::GctFile.temp_folder_path}"
110
+ end
111
+
51
112
  def exist_root
52
113
  root_exist = File.exist?(Generator::GctFile.root_folder_path)
53
114
  root_exist
54
115
  end
55
116
 
117
+ def exist_dependency
118
+ root_exist = File.exist?(dependency_path)
119
+ root_exist
120
+ end
121
+
56
122
  def root_err
57
123
  raise "请先运行命令:gct setup".red if !exist_root
58
124
  end
@@ -2,5 +2,5 @@ module Gct
2
2
  # freeze 冻结对象,将对象变成一个常量
3
3
  # unless 右边的代码块成立,才会运行左边的代码块
4
4
  # defined? 是用来判断本地变量是否存在,也可用来判断是否存在方法
5
- VERSION = "0.3.91".freeze unless defined? Gct::VERSION
5
+ VERSION = "0.4.0".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,10 +30,7 @@ module Gct
30
30
  end
31
31
 
32
32
  module SpecPublishStatus
33
- CREATED = '待分析'
34
- ANALYZING = '分析中'
35
- PREPARING = '准备中'
36
- PENDING = '等待中'
33
+ PENDING = '队列中'
37
34
  WAITING = '待发布'
38
35
  SKIPPED = '已忽略'
39
36
  MERGED = '已合并'
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.91
4
+ version: 0.4.0
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-21 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
@@ -175,7 +180,12 @@ files:
175
180
  - lib/gct/command/setup.rb
176
181
  - lib/gct/command/spec.rb
177
182
  - lib/gct/command/spec/lint.rb
183
+ - lib/gct/command/tag.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