miniexec 0.0.9 → 0.1.0

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/bin/miniexec +5 -5
  3. data/lib/miniexec.rb +112 -104
  4. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f159f73abf46bbc302ba16f34e5f3ec7eac0fe530e57e06e24e3504f198f2027
4
- data.tar.gz: 41bd239c0271b589f448de12318397324f2e6ab67e6274caaa79405668119ef7
3
+ metadata.gz: 8678ef2aa21bd66fbe29563f4621c2a1656b2c6fbcf0a1a3e231b750d65f9707
4
+ data.tar.gz: a946564ca4922eb7b0d55432e83e5827d310753ca4ebae0d150852db8eb269ec
5
5
  SHA512:
6
- metadata.gz: a86c5c2d96807c1572d2a78a6799e05694987f2bee706fb7b9822a6ee0b6d5481bcc43e4aa3a668957b476a30d6dfb5f054aa37956948cd3e9b8d2dac336af4d
7
- data.tar.gz: 8722200cb309d02e28272ef2977464c1870980442deafacaa0dbd55842eb0fcfab77c0e33bf86bbd2ab18b7c39d48cf67fedbac3225b0ad84848436f36fbfffc
6
+ metadata.gz: 534199cfb3d7ff71b05d2a6bc55591e9a259090375bc0e120c55a93de6ffcaf14aed7f147672543442a250ba165abaa0a41925530008491fae4e831c524953df
7
+ data.tar.gz: 7ce0d9cb62a9c7f0241376c79cbaa393846afd7a8995f22790fe7bb1ed932170eaa555ac8547c8babf3d71306f1e07f9218e89e6e30466870dfc5022f389628f
data/bin/miniexec CHANGED
@@ -44,9 +44,9 @@ end.parse!
44
44
 
45
45
  raise OptionParser::MissingArgument, 'Specify a job with -j' if options[:job].nil?
46
46
 
47
- MiniExec.config(project_path: options[:path])
48
- exec = MiniExec.new options[:job],
49
- docker_url: options[:docker],
50
- binds: options[:binds],
51
- env: options[:env]
47
+ MiniExec::MiniExec.config(project_path: options[:path])
48
+ exec = MiniExec::MiniExec.new options[:job],
49
+ docker_url: options[:docker],
50
+ binds: options[:binds],
51
+ env: options[:env]
52
52
  exec.run_job
data/lib/miniexec.rb CHANGED
@@ -1,124 +1,132 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Main class
4
- class MiniExec
5
- require 'logger'
6
- require 'docker-api'
7
- require 'json'
8
- require 'tempfile'
9
- require 'yaml'
10
- require 'git'
11
- # Class instance variables
12
- @project_path = '.'
13
- @workflow_file = '.gitlab-ci.yml'
4
+ module MiniExec
5
+ class MiniExec
6
+ require 'logger'
7
+ require 'docker-api'
8
+ require 'json'
9
+ require 'tempfile'
10
+ require 'yaml'
11
+ require 'git'
12
+ require_relative './util'
13
+ # Class instance variables
14
+ @project_path = '.'
15
+ @workflow_file = '.gitlab-ci.yml'
14
16
 
15
- class << self
16
- attr_accessor :project_path, :workflow_file
17
- end
17
+ class << self
18
+ attr_accessor :project_path, :workflow_file
19
+ end
18
20
 
19
- def self.config(project_path: @project_path, workflow_file: @workflow_file)
20
- @project_path = project_path
21
- @workflow_file = workflow_file
22
- self
23
- end
21
+ def self.config(project_path: @project_path, workflow_file: @workflow_file)
22
+ @project_path = project_path
23
+ @workflow_file = workflow_file
24
+ self
25
+ end
24
26
 
25
- attr_accessor :script
27
+ attr_accessor :script
26
28
 
27
- def initialize(job,
28
- project_path: self.class.project_path,
29
- docker_url: nil,
30
- binds: [],
31
- env: {})
32
- @job_name = job
33
- @project_path = project_path
34
- @workflow = YAML.load(File.read("#{@project_path}/#{MiniExec.workflow_file}"))
35
- @job = @workflow[job]
36
- @job['name'] = job
37
- @default_image = @workflow['image'] || 'debian:buster-slim'
38
- @image = set_job_image
39
- @script = compile_script
40
- @binds = binds
41
- @env = {}
42
- @env.merge! env
43
- @env.merge! gitlab_env
44
- @env.merge! variables
45
- configure_logger
46
- Docker.options[:read_timeout] = 6000
47
- Docker.url = docker_url if docker_url
48
- end
29
+ def initialize(job,
30
+ project_path: self.class.project_path,
31
+ docker_url: nil,
32
+ binds: [],
33
+ env: {})
34
+ @job_name = job
35
+ @project_path = project_path
36
+ @workflow = YAML.load(File.read("#{@project_path}/#{MiniExec.workflow_file}"))
37
+ @job = @workflow[job]
38
+ @job['name'] = job
39
+ @default_image = @workflow['image'] || 'debian:buster-slim'
40
+ @image = set_job_image
41
+ @binds = binds
42
+ @env = {}
43
+ [
44
+ env,
45
+ gitlab_env,
46
+ @workflow['variables'],
47
+ @job['variables']
48
+ ].each do |var_set|
49
+ @env.merge!(var_set.transform_values { |v| Util.expand_var(v.to_s, @env) }) if var_set
50
+ end
51
+ @script = compile_script
52
+ configure_logger
53
+ Docker.options[:read_timeout] = 6000
54
+ Docker.url = docker_url if docker_url
55
+ end
49
56
 
50
- def run_job
51
- script_path = "/tmp/#{@job['name']}.sh"
52
- @logger.info "Fetching image #{@image}"
53
- Docker::Image.create(fromImage: @image)
54
- @logger.info 'Image fetched'
55
- Dir.chdir(@project_path) do
56
- @logger.info 'Creating container'
57
- container = Docker::Container.create(
58
- Cmd: ['/bin/bash', script_path],
59
- Image: @image,
60
- Volumes: @binds.map { |b| { b => { path_parent: 'rw' } } }.inject(:merge),
61
- Env: @env.map { |k, v| "#{k}=#{v}" }
62
- )
63
- container.store_file(script_path, @script)
64
- container.start({ Binds: [@binds] })
65
- container.tap(&:start).attach { |_, chunk| puts chunk }
57
+ def run_job
58
+ script_path = "/tmp/#{@job['name']}.sh"
59
+ @logger.info "Fetching image #{@image}"
60
+ Docker::Image.create(fromImage: @image)
61
+ @logger.info 'Image fetched'
62
+ Dir.chdir(@project_path) do
63
+ @logger.info 'Creating container'
64
+ container = Docker::Container.create(
65
+ Cmd: ['/bin/bash', script_path],
66
+ Image: @image,
67
+ Volumes: @binds.map { |b| { b => { path_parent: 'rw' } } }.inject(:merge),
68
+ Env: @env.map { |k, v| "#{k}=#{v}" }
69
+ )
70
+ container.store_file(script_path, @script)
71
+ container.start({ Binds: [@binds] })
72
+ container.tap(&:start).attach { |_, chunk| puts chunk }
73
+ end
66
74
  end
67
- end
68
75
 
69
- private
76
+ private
70
77
 
71
- def set_job_image
72
- return @job['image'] if @job['image']
78
+ def set_job_image
79
+ return @job['image'] if @job['image']
73
80
 
74
- @default_image
75
- end
81
+ @default_image
82
+ end
76
83
 
77
- # Set gitlab's predefined env vars as per
78
- # https://docs.gitlab.com/ee/ci/variables/predefined_variables.html
79
- def gitlab_env
80
- g = Git.open(@project_path)
81
- commit = g.gcommit 'HEAD'
82
- tag = g.tags.find { |t| t.objectish == commit.sha }
83
- commit_branch = g.branch.name
84
- if tag.nil?
85
- ref_name = g.branch.name
86
- commit_tag = nil
87
- else
88
- ref_name = tag.name
89
- commit_tag = ref_name
84
+ # Set gitlab's predefined env vars as per
85
+ # https://docs.gitlab.com/ee/ci/variables/predefined_variables.html
86
+ def gitlab_env
87
+ g = Git.open(@project_path)
88
+ commit = g.gcommit 'HEAD'
89
+ tag = g.tags.find { |t| t.objectish == commit.sha }
90
+ commit_branch = g.branch.name
91
+ if tag.nil?
92
+ ref_name = g.branch.name
93
+ commit_tag = nil
94
+ else
95
+ ref_name = tag.name
96
+ commit_tag = ref_name
97
+ end
98
+ {
99
+ 'CI': true,
100
+ 'CI_COMMIT_REF_SHA': commit.sha,
101
+ 'CI_COMMIT_SHORT_SHA': commit.sha[0, 8],
102
+ 'CI_COMMIT_REF_NAME': ref_name,
103
+ 'CI_COMMIT_BRANCH': commit_branch,
104
+ 'CI_COMMIT_TAG': commit_tag,
105
+ 'CI_COMMIT_MESSAGE': commit.message,
106
+ 'CI_COMMIT_REF_PROTECTED': false,
107
+ 'CI_COMMIT_TIMESTAMP': commit.date.strftime('%FT%T')
108
+ }.transform_keys(&:to_s)
90
109
  end
91
- {
92
- 'CI': true,
93
- 'CI_COMMIT_REF_SHA': commit.sha,
94
- 'CI_COMMIT_SHORT_SHA': commit.sha[0, 8],
95
- 'CI_COMMIT_REF_NAME': ref_name,
96
- 'CI_COMMIT_BRANCH': commit_branch,
97
- 'CI_COMMIT_TAG': commit_tag,
98
- 'CI_COMMIT_MESSAGE': commit.message,
99
- 'CI_COMMIT_REF_PROTECTED': false,
100
- 'CI_COMMIT_TIMESTAMP': commit.date.strftime('%FT%T')
101
- }.transform_keys(&:to_s)
102
- end
103
110
 
104
- def variables
105
- globals = @workflow['variables'] || {}
106
- job_locals = @job['variables'] || {}
107
- globals.merge job_locals
108
- end
111
+ def variables
112
+ globals = @workflow['variables'] || {}
113
+ job_locals = @job['variables'] || {}
114
+ globals.merge job_locals
115
+ end
109
116
 
110
- def configure_logger
111
- @logger = Logger.new($stdout)
112
- @logger.formatter = proc do |severity, _, _, msg|
113
- "[#{severity}]: #{msg}\n"
117
+ def configure_logger
118
+ @logger = Logger.new($stdout)
119
+ @logger.formatter = proc do |severity, _, _, msg|
120
+ "[#{severity}]: #{msg}\n"
121
+ end
122
+ @logger.level = ENV['LOGLEVEL'] || Logger::INFO
114
123
  end
115
- @logger.level = ENV['LOGLEVEL'] || Logger::INFO
116
- end
117
124
 
118
- def compile_script
119
- before_script = @job['before_script'] || ''
120
- script = @job['script'] || ''
121
- after_script = @job['after_script'] || ''
122
- [before_script, script, after_script].flatten.join("\n").strip
125
+ def compile_script
126
+ before_script = @job['before_script'] || ''
127
+ script = @job['script'] || ''
128
+ after_script = @job['after_script'] || ''
129
+ [before_script, script, after_script].flatten.join("\n").strip
130
+ end
123
131
  end
124
132
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: miniexec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.9
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martin Pugh
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-04-27 00:00:00.000000000 Z
11
+ date: 2021-05-04 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A minimal interpretor/executor for .gitlab-ci.yml
14
14
  email: pugh@s3kr.it