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.
- checksums.yaml +4 -4
- data/lib/citasks/ci_lib.rb +137 -73
- data/lib/citasks.rb +1 -0
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 68e80bae84d161e9ec3395316758e1e24c3295cc
|
4
|
+
data.tar.gz: ad54f1b7d33346ca68d22a3de1e327c81710f2ff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2023994cd9fc1842d026939c64c0ae94b24ede895ff15a31cd3e39c0e473b11e76f01e1ddec64b5b5817518f0a943b633856ebf1eb5c63f96290adb2c549cfad
|
7
|
+
data.tar.gz: 713d0e13accb077b129a33514cb312c56a1675e08be3ee3f327abd6db1797fa921830c1380ca071fae9b6c96e6b6c83d5502441fcd28c2cdffb0244a2ed0274c
|
data/lib/citasks/ci_lib.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
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.
|
215
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
242
|
-
|
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
|
-
|
341
|
+
rest_task_index
|
342
|
+
|
257
343
|
desc "deploy into k8s"
|
258
344
|
task "\#{next_task_index}_deploy_to_k8s" do
|
259
|
-
|
260
|
-
|
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
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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