citasks 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
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