citasks 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/citasks/ci_lib.rb +137 -73
  3. data/lib/citasks.rb +1 -0
  4. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 61342eea10fb6965562862aa798de4148ba392fe
4
- data.tar.gz: 8a38bf71b2c16b40d9ed4e133b3d8aad2ea668a5
3
+ metadata.gz: 68e80bae84d161e9ec3395316758e1e24c3295cc
4
+ data.tar.gz: ad54f1b7d33346ca68d22a3de1e327c81710f2ff
5
5
  SHA512:
6
- metadata.gz: 57153b1f2ef44b3b34a23b8856a4feffc59b49ca05c4bb8e36a9334c4c74bfc0d11ca735c2e593df39316bcfafbc4070d11b3427dc741849f7446346e160fc84
7
- data.tar.gz: 605d55609a5728ae6b2399a5585fe0b9394f12b646a4a9c10ed6cca9aaaf379ae93ab2718dc5caae326d1bddfc4c0925cc3071adeef2f64925b4652f22373e4c
6
+ metadata.gz: 2023994cd9fc1842d026939c64c0ae94b24ede895ff15a31cd3e39c0e473b11e76f01e1ddec64b5b5817518f0a943b633856ebf1eb5c63f96290adb2c549cfad
7
+ data.tar.gz: 713d0e13accb077b129a33514cb312c56a1675e08be3ee3f327abd6db1797fa921830c1380ca071fae9b6c96e6b6c83d5502441fcd28c2cdffb0244a2ed0274c
@@ -1,5 +1,12 @@
1
1
  require 'gitlab'
2
2
  require 'securerandom'
3
+ require "erb"
4
+
5
+ def _write fullpath, content
6
+ File.open fullpath, "w" do |fh|
7
+ fh.puts content
8
+ end
9
+ end
3
10
 
4
11
  module JenkinsTools
5
12
  WORKFLOW_PLUGIN = ENV["WORKFLOW_PLUGIN"] || "workflow-job@2.14.1"
@@ -10,7 +17,7 @@ module JenkinsTools
10
17
  # git_repo_url = http://virtuous-porcupine-gitlab-ce/wenzm/icp-static-web.git, gitlab-wenzm-password
11
18
  def self.gen_job_xml job_name, xml_file_name, git_repo_url, repo_credential_id_in_jenkins,token_to_trigger_build_remotely = SecureRandom.uuid
12
19
  secret_token = "{AQAAABAAAAAQ76W/e/wjLSZ6yxDaU6oaB3rUABFZ/jw6NVzpJkLGL/8=}" #empty??? TODO
13
- xmls= <<~EOF
20
+ _write xml_file_name, <<~EOF
14
21
  <?xml version='1.0' encoding='UTF-8'?>
15
22
  <flow-definition plugin="#{WORKFLOW_PLUGIN}">
16
23
  <actions/>
@@ -69,15 +76,10 @@ module JenkinsTools
69
76
  <disabled>false</disabled>
70
77
  </flow-definition>
71
78
  EOF
72
-
73
- File.open xml_file_name, "w" do |fh|
74
- fh.puts xmls
75
- end
76
-
77
79
  end
78
80
 
79
81
  def self.gen_jenkins_file
80
- content= <<~EOF
82
+ _write "Jenkinsfile", <<~EOF
81
83
  //A Jenkinsfile for start
82
84
  podTemplate(label: 'my-pod',
83
85
  containers:[
@@ -130,11 +132,6 @@ module JenkinsTools
130
132
  }
131
133
  }
132
134
  EOF
133
-
134
- File.open "Jenkinsfile", "w" do |fh|
135
- fh.puts content
136
- end
137
-
138
135
  end
139
136
 
140
137
  def self.post_new_job job_name, xml_file, base_url, user, token
@@ -194,102 +191,175 @@ end
194
191
 
195
192
  module Builder
196
193
  def self.create_env app_name
197
- envs = <<~EOF
194
+ _write ".env.build", <<~EOF
198
195
  IMAGE_NAME=#{app_name}
199
196
 
200
197
  PRIVATE_DOCKER_REGISTRY_NAME=master.cfc
201
198
  PRIVATE_DOCKER_REGISTRY_PORT=8500
202
199
  PRIVATE_DOCKER_REGISTRY_IP=#{ENV["ICP_MASTER_IP"]}
200
+ PRIVATE_DOCKER_REGISTRY_NAMESPACE=default
203
201
 
204
202
  PRIVATE_DOCKER_REGISTRY_USER=admin
205
203
  PRIVATE_DOCKER_REGISTRY_USER_PASSWORD=admin
206
-
207
204
  EOF
208
-
209
- File.open ".env.build", "w" do |fh|
210
- fh.puts envs
211
- end
212
205
  end
213
206
 
214
- def self.create_rakefile
215
- content = <<~OUTEOF
216
- require 'sshkit_addon'
217
- require 'dotenv'
218
- require "yaml"
207
+ def self.create_lib_files
208
+ FileUtils.mkdir_p lib_dir = "build_libs"
219
209
 
220
- Dotenv.load ".env.build"
210
+ _write lib_dir + "/helpers.rb", <<~EOF
211
+ require "yaml"
221
212
 
213
+ require_relative "docker.rb"
214
+ require_relative "k8s.rb"
215
+
222
216
  @task_index=0
223
217
  def next_task_index
224
218
  @task_index += 1
225
219
  sprintf("%02d", @task_index)
226
220
  end
227
221
 
222
+ def rest_task_index
223
+ @task_index = 0
224
+ end
225
+ EOF
226
+
227
+ _write lib_dir + "/shell.rb", <<~EOF
228
+ module ShellCommandConstructor
229
+ def self.construct_command strings_or_list, connector = " && "
230
+ list = case strings_or_list
231
+ when Array
232
+ strings_or_list
233
+ when String
234
+ strings_or_list.split(/\\n/)
235
+ end
236
+ list.each_with_object([]) do |line, obj|
237
+ line.strip!
238
+ next if line.empty?
239
+ next if line =~ /^#/
240
+ obj.push line
241
+ end.join connector
242
+ end
243
+ end
244
+
245
+ module Shell
246
+ def self.run cmd
247
+ unless system(cmd)
248
+ fail "Failed to execute \#{cmd}"
249
+ end
250
+ end
251
+
252
+ def self.test cmd
253
+ system cmd
254
+ end
255
+ end
256
+ EOF
257
+
258
+ _write lib_dir + "/docker.rb", <<~EOF
259
+ require_relative "shell"
260
+
261
+ module DockerTools
262
+ def self.add_etc_hosts
263
+ etc_hosts_entry = sprintf("%s %s", ENV["PRIVATE_DOCKER_REGISTRY_IP"], ENV["PRIVATE_DOCKER_REGISTRY_NAME"])
264
+ Shell.run %Q(echo "\#{etc_hosts_entry}" >> /etc/hosts)
265
+ end
266
+
267
+ def self.push_to_registry image_name, tag
268
+ private_registry = sprintf("%s:%s", ENV["PRIVATE_DOCKER_REGISTRY_NAME"], ENV["PRIVATE_DOCKER_REGISTRY_PORT"])
269
+ namespace = ENV["PRIVATE_DOCKER_REGISTRY_NAMESPACE"]
270
+
271
+ cmds = ShellCommandConstructor.construct_command %Q{
272
+ docker login -u \#{ENV["PRIVATE_DOCKER_REGISTRY_USER"]} -p \#{ENV["PRIVATE_DOCKER_REGISTRY_USER_PASSWORD"]} \#{private_registry}
273
+
274
+ docker tag \#{image_name}:\#{tag} \#{private_registry}/\#{namespace}/\#{image_name}:\#{tag}
275
+ docker push \#{private_registry}/\#{namespace}/\#{image_name}:\#{tag}
276
+ }
277
+ Shell.run cmds
278
+ end
279
+ end
280
+ EOF
281
+
282
+ _write lib_dir + '/k8s.rb', <<~EOF
283
+ require "erb"
284
+ require_relative "shell"
285
+
286
+ module KubeTools
287
+ def self.create_new_yaml yaml_template_file, yaml_file, data = {}
288
+ erb = ERB.new(File.read(yaml_template_file))
289
+ b = binding
290
+
291
+ data.each_pair do |key, value|
292
+ b.local_variable_set(key, value)
293
+ end
294
+
295
+ File.open yaml_file, "w" do |fh|
296
+ fh.puts erb.result(b)
297
+ end
298
+ end
299
+
300
+ def self.deploy_to_k8s deployment, yaml_file, image_name, new_image_name
301
+ if Shell.test %Q(kubectl get deployment | grep \#{deployment} )
302
+ Shell.run %Q(kubectl apply -f \#{yaml_file})
303
+ Shell.run %Q(kubectl set image deployment/\#{deployment} \#{image_name}=\#{new_image_name})
304
+
305
+ Shell.run %Q(kubectl rollout status deployment/\#{deployment})
306
+ else
307
+ puts "no deployment yet. create it"
308
+ Shell.run %Q(kubectl create -f \#{yaml_file} --record)
309
+ end
310
+ end
311
+ end
312
+ EOF
313
+
314
+ end
315
+
316
+ def self.create_rakefile
317
+ _write "build.rb", <<~OUTEOF
318
+ require 'dotenv'
319
+ Dotenv.load ".env.build"
320
+ require_relative "build_libs/helpers"
321
+
228
322
  image_name = ENV["IMAGE_NAME"]
229
323
  tag=ENV["BUILD_NUMBER"]||"B1"
230
324
 
231
325
  namespace "docker" do
232
- @task_index=0
326
+ rest_task_index
327
+
233
328
  desc "build docker image"
234
329
  task "\#{next_task_index}_build_image" do
235
- sh %Q(env)
236
330
  sh %Q(docker build -t \#{image_name}:\#{tag} .)
237
331
  end
238
332
 
239
333
  desc "push to ICp registry"
240
334
  task "\#{next_task_index}_push_to_ICp_registry" do
241
- etc_hosts_entry = sprintf("%s %s", ENV["PRIVATE_DOCKER_REGISTRY_IP"], ENV["PRIVATE_DOCKER_REGISTRY_NAME"])
242
- private_registry = sprintf("%s:%s", ENV["PRIVATE_DOCKER_REGISTRY_NAME"], ENV["PRIVATE_DOCKER_REGISTRY_PORT"])
243
-
244
- cmds = ShellCommandConstructor.construct_command %Q{
245
- echo "\#{etc_hosts_entry}" >> /etc/hosts
246
- docker login -u \#{ENV["PRIVATE_DOCKER_REGISTRY_USER"]} -p \#{ENV["PRIVATE_DOCKER_REGISTRY_USER"]} \#{private_registry}
247
-
248
- docker tag \#{image_name}:\#{tag} \#{private_registry}/default/\#{image_name}:\#{tag}
249
- docker push \#{private_registry}/default/\#{image_name}:\#{tag}
250
- }
251
- sh cmds
335
+ DockerTools.add_etc_hosts
336
+ DockerTools.push_to_registry image_name, tag_name
252
337
  end
253
338
  end
254
339
 
255
340
  namespace "k8s" do
256
- @task_index=0
341
+ rest_task_index
342
+
257
343
  desc "deploy into k8s"
258
344
  task "\#{next_task_index}_deploy_to_k8s" do
259
- file = "\#{image_name}.k8.template.yaml"
260
- docs = YAML.load_stream File.read(file)
345
+ yaml_template_file = "\#{image_name}.k8.template.yaml"
346
+ yaml_file = "\#{image_name}.yaml"
347
+
261
348
  private_registry = sprintf("%s:%s", ENV["PRIVATE_DOCKER_REGISTRY_NAME"], ENV["PRIVATE_DOCKER_REGISTRY_PORT"])
262
- new_image_name = "\#{private_registry}/default/\#{image_name}:\#{tag}"
263
-
264
- File.open yaml_file = "\#{image_name}.yaml", "w" do |fh|
265
- docs.each do |doc|
266
- if doc["kind"] == "Deployment"
267
- doc["spec"]["template"]["spec"]["containers"][0]["image"] = new_image_name
268
- end
269
- fh.puts doc.to_yaml
270
- end
271
- end
349
+ namespace = ENV["PRIVATE_DOCKER_REGISTRY_NAMESPACE"]
350
+ full_new_image_name = "\#{private_registry}/\#{namespace}/\#{image_name}:\#{tag}"
351
+ data = {
352
+ new_image: full_new_image_name
353
+ }
354
+
355
+ KubeTools.create_new_yaml yaml_template_file, yaml_file, data
272
356
 
273
357
  deployment = image_name
274
- sh %Q(kubectl get deployment | grep \#{deployment} ) do |ok, res|
275
- if ok #already exists
276
- sh %Q(kubectl apply -f \#{yaml_file})
277
- sh %Q(kubectl set image deployment/\#{deployment} \#{image_name}=\#{new_image_name})
278
-
279
- sh %Q(kubectl rollout status deployment/\#{deployment})
280
- else
281
- puts "no deployment yet. create it"
282
- sh %Q(kubectl create -f \#{yaml_file} --record)
283
- end
284
- end
358
+ KubeTools.deploy_to_k8s deployment, yaml_file, image_name, full_new_image_name
285
359
 
286
360
  end
287
361
  end
288
362
  OUTEOF
289
-
290
- File.open "build.rb", "w" do |fh|
291
- fh.puts content
292
- end
293
363
  end
294
364
 
295
365
  def self.create_dockerfile
@@ -305,7 +375,7 @@ module Builder
305
375
  end
306
376
 
307
377
  def self.create_k8_file app_name
308
- content = <<~EOF
378
+ _write "#{app_name}.k8.template.yaml", <<~EOF
309
379
  apiVersion: extensions/v1beta1
310
380
  kind: Deployment
311
381
  metadata:
@@ -322,8 +392,7 @@ module Builder
322
392
  spec:
323
393
  containers:
324
394
  - name: #{app_name}
325
- #this will be replaced dynamically in the deployment
326
- image: #{app_name}:latest
395
+ image: <%= new_image %>
327
396
  imagePullSecrets:
328
397
  - name: admin.registrykey
329
398
  ---
@@ -359,10 +428,5 @@ module Builder
359
428
  serviceName: #{app_name}
360
429
  servicePort: http
361
430
  EOF
362
-
363
- File.open "#{app_name}.k8.template.yaml", "w" do |fh|
364
- fh.puts content
365
- end
366
-
367
431
  end
368
432
  end
data/lib/citasks.rb CHANGED
@@ -22,6 +22,7 @@ namespace "Jenkins" do
22
22
  JenkinsTools.gen_jenkins_file
23
23
 
24
24
  Builder.create_env job_name
25
+ Builder.create_lib_files
25
26
  Builder.create_rakefile
26
27
  Builder.create_k8_file job_name
27
28
  Builder.create_dockerfile
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: citasks
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Zhimin Wen