miniexec 0.0.9 → 0.1.0

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/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