ood_packaging 0.0.1.r2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/ood_packaging +81 -0
- data/lib/ood_packaging/build.rb +329 -0
- data/lib/ood_packaging/build_box/docker-image/Dockerfile.erb +39 -0
- data/lib/ood_packaging/build_box/docker-image/RPM-GPG-KEY-ondemand +30 -0
- data/lib/ood_packaging/build_box/docker-image/Rakefile +3 -0
- data/lib/ood_packaging/build_box/docker-image/inituidgid.sh.erb +21 -0
- data/lib/ood_packaging/build_box/docker-image/install.sh.erb +88 -0
- data/lib/ood_packaging/build_box/docker-image/setuser.rb +16 -0
- data/lib/ood_packaging/build_box.rb +143 -0
- data/lib/ood_packaging/options.rb +8 -0
- data/lib/ood_packaging/package.rb +326 -0
- data/lib/ood_packaging/rake_task.rb +40 -0
- data/lib/ood_packaging/string_ext.rb +20 -0
- data/lib/ood_packaging/tasks.rb +117 -0
- data/lib/ood_packaging/utils.rb +104 -0
- data/lib/ood_packaging/version.rb +37 -0
- data/lib/ood_packaging.rb +11 -0
- metadata +120 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: '08137cd4ccfc377bfd70ad3ef9f10b1af265f873397323848fab54c546ae0e5e'
|
4
|
+
data.tar.gz: d180ca4601d18558d9d37e607fb1ac5c27406d893709bd2cd1c837565140c834
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 37002fb96167b8310a3cb42bd6a3d4980ba0410d96b8eb3921e44de456a481c2f6c07f6dfda1b02da960043e12bfa0b474eac4fc2dda89021c9f0ff04610e7ed
|
7
|
+
data.tar.gz: e93b9c5b83b07637220354dedf9b17acdabaee8f53c2b9225ff9ac4adf7034c4b10c94ed2497a468f516a7c393094d04df6ff5b4091802648597fa4948241f4a
|
data/bin/ood_packaging
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'optparse'
|
5
|
+
libdir = File.expand_path(File.join(__dir__, '../lib'))
|
6
|
+
$LOAD_PATH.unshift(libdir) if Dir.exist?(libdir)
|
7
|
+
require 'ood_packaging'
|
8
|
+
|
9
|
+
options = {}
|
10
|
+
OptionParser.new do |opts|
|
11
|
+
opts.banner = 'Usage: ood_packaging [options] package'
|
12
|
+
|
13
|
+
opts.on('-w', '--work=DIR', String, 'Work directory path') do |v|
|
14
|
+
options[:work_dir] = v
|
15
|
+
end
|
16
|
+
|
17
|
+
opts.on('-o', '--output=DIR', String, 'Output directory path') do |v|
|
18
|
+
options[:output_dir] = v
|
19
|
+
end
|
20
|
+
|
21
|
+
opts.on('-d', '--dist=DIST', String, 'Distribution to build') do |v|
|
22
|
+
options[:dist] = v
|
23
|
+
end
|
24
|
+
|
25
|
+
opts.on('-V', '--version=VERSION', String, 'Version of package to build') do |v|
|
26
|
+
options[:version] = v
|
27
|
+
end
|
28
|
+
|
29
|
+
opts.on('-T', '--tar', 'Create tar archive for package') do
|
30
|
+
options[:tar] = true
|
31
|
+
end
|
32
|
+
|
33
|
+
opts.on('-t', '--tar-only', 'Only create tar archive') do
|
34
|
+
options[:tar_only] = true
|
35
|
+
end
|
36
|
+
|
37
|
+
opts.on('-G', '--gpg-name', String, 'GPG key name') do |v|
|
38
|
+
options[:gpg_name] = v
|
39
|
+
end
|
40
|
+
|
41
|
+
opts.on('-g', '--gpg-pubkey', String, 'GPG public key path') do |v|
|
42
|
+
options[:gpg_pubkey] = v
|
43
|
+
end
|
44
|
+
|
45
|
+
opts.on('-S', '--skip-gpg', 'Skip GPG signing') do
|
46
|
+
options[:gpg_sign] = false
|
47
|
+
end
|
48
|
+
|
49
|
+
opts.on('--skip-clean-output', 'Skip clean up of output directory') do
|
50
|
+
options[:clean_output_dir] = false
|
51
|
+
end
|
52
|
+
|
53
|
+
opts.on('--skip-clean-work', 'Skip clean up of work directory') do
|
54
|
+
options[:clean_work_dir] = false
|
55
|
+
end
|
56
|
+
|
57
|
+
opts.on('-s', '--skip-download', 'Skip source download') do
|
58
|
+
options[:skip_download] = true
|
59
|
+
end
|
60
|
+
|
61
|
+
opts.on('-A', '--attach', 'Attach to build box after build') do
|
62
|
+
options[:attach] = true
|
63
|
+
end
|
64
|
+
|
65
|
+
opts.on('--debug', 'Show debug output') do
|
66
|
+
options[:debug] = true
|
67
|
+
end
|
68
|
+
|
69
|
+
opts.on('-h', '--help', 'Show this help message') do
|
70
|
+
puts opts
|
71
|
+
exit
|
72
|
+
end
|
73
|
+
end.parse!(ARGV)
|
74
|
+
|
75
|
+
if ARGV.size != 1
|
76
|
+
puts 'ERROR: Must provide package path'.red
|
77
|
+
exit 1
|
78
|
+
end
|
79
|
+
options[:package] = ARGV[0]
|
80
|
+
|
81
|
+
OodPackaging::Package.new(options).run!
|
@@ -0,0 +1,329 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'ood_packaging/utils'
|
4
|
+
require 'ood_packaging/string_ext'
|
5
|
+
require 'English'
|
6
|
+
require 'rake'
|
7
|
+
require 'rake/file_utils'
|
8
|
+
require 'yaml'
|
9
|
+
|
10
|
+
# Class to handle builds of packages from within buildbox container
|
11
|
+
class OodPackaging::Build
|
12
|
+
include OodPackaging::Utils
|
13
|
+
include FileUtils
|
14
|
+
|
15
|
+
attr_accessor :build_box
|
16
|
+
|
17
|
+
def initialize
|
18
|
+
@build_box = OodPackaging::BuildBox.new(dist: ENV['DIST'])
|
19
|
+
end
|
20
|
+
|
21
|
+
def config
|
22
|
+
@config ||= begin
|
23
|
+
c = packaging_config
|
24
|
+
c.merge!(c[build_box.dist]) if c.key?(build_box.dist)
|
25
|
+
c.transform_keys(&:to_sym)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def package
|
30
|
+
ENV['PACKAGE']
|
31
|
+
end
|
32
|
+
|
33
|
+
def debug?
|
34
|
+
ENV['DEBUG'] == 'true'
|
35
|
+
end
|
36
|
+
|
37
|
+
def gpg_sign?
|
38
|
+
ENV['GPG_SIGN'] == 'true'
|
39
|
+
end
|
40
|
+
|
41
|
+
def version
|
42
|
+
ENV['VERSION']
|
43
|
+
end
|
44
|
+
|
45
|
+
def rpm_version
|
46
|
+
version.gsub(/^v/, '').split('-', 2)[0]
|
47
|
+
end
|
48
|
+
|
49
|
+
def rpm_release
|
50
|
+
v = version.split('-', 2)
|
51
|
+
return '1' if v.size < 2
|
52
|
+
|
53
|
+
v[1].gsub('-', '.')
|
54
|
+
end
|
55
|
+
|
56
|
+
def deb_version
|
57
|
+
version.gsub(/^v/, '').gsub('-', '.')
|
58
|
+
end
|
59
|
+
|
60
|
+
def rpm_defines
|
61
|
+
defines = ["--define 'git_tag #{version}'"]
|
62
|
+
defines.concat ["--define 'package_version #{rpm_version}'"]
|
63
|
+
defines.concat ["--define 'package_release #{rpm_release}'"]
|
64
|
+
defines.concat ["--define 'scl #{config[:scl]}'"] if config[:scl]
|
65
|
+
defines
|
66
|
+
end
|
67
|
+
|
68
|
+
def cmd_suffix
|
69
|
+
return '' if debug?
|
70
|
+
|
71
|
+
' 2>/dev/null 1>/dev/null'
|
72
|
+
end
|
73
|
+
|
74
|
+
def spec_dir
|
75
|
+
@spec_dir ||= if Dir.exist?('/package/rpm')
|
76
|
+
'/package/rpm'
|
77
|
+
elsif Dir.exist?('/package/packaging/rpm')
|
78
|
+
'/package/packaging/rpm'
|
79
|
+
elsif Dir.exist?('/package/packaging')
|
80
|
+
'/package/packaging'
|
81
|
+
else
|
82
|
+
'/package'
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def deb_build_dir
|
87
|
+
@deb_build_dir ||= if Dir.exist?('/package/deb/build')
|
88
|
+
'/package/deb/build'
|
89
|
+
else
|
90
|
+
'/package/build'
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def debian_dir
|
95
|
+
@debian_dir ||= if Dir.exist?('/package/deb/debian')
|
96
|
+
'/package/deb/debian'
|
97
|
+
elsif Dir.exist?('/package/packaging/deb')
|
98
|
+
'/package/packaging/deb'
|
99
|
+
else
|
100
|
+
'/package/debian'
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def deb_work_dir
|
105
|
+
File.join(work_dir, deb_name)
|
106
|
+
end
|
107
|
+
|
108
|
+
def spec_file
|
109
|
+
@spec_file ||= Dir["#{spec_dir}/*.spec"][0]
|
110
|
+
end
|
111
|
+
|
112
|
+
def output_dir
|
113
|
+
File.join('/output', build_box.dist)
|
114
|
+
end
|
115
|
+
|
116
|
+
def work_dir
|
117
|
+
File.join('/work', build_box.dist)
|
118
|
+
end
|
119
|
+
|
120
|
+
def packaging_config
|
121
|
+
@packaging_config ||= begin
|
122
|
+
path = File.join(spec_dir, 'packaging.yaml')
|
123
|
+
path = File.join(debian_dir, 'packaging.yaml') if build_box.deb?
|
124
|
+
if File.exist?(path)
|
125
|
+
YAML.load_file(path)
|
126
|
+
else
|
127
|
+
{}
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def deb_name
|
133
|
+
"#{package}-#{deb_version}"
|
134
|
+
end
|
135
|
+
|
136
|
+
def rpms
|
137
|
+
@rpms ||= Dir["#{output_dir}/*.rpm"].grep_v(/.src.rpm$/)
|
138
|
+
end
|
139
|
+
|
140
|
+
def run!
|
141
|
+
fix_env!
|
142
|
+
env_dump! if debug?
|
143
|
+
bootstrap_rpm! if build_box.rpm?
|
144
|
+
bootstrap_deb! if build_box.deb?
|
145
|
+
install_dependencies!
|
146
|
+
rpmbuild! if build_box.rpm?
|
147
|
+
debuild! if build_box.deb?
|
148
|
+
copy_output!
|
149
|
+
gpg_sign! if build_box.rpm? && gpg_sign?
|
150
|
+
sanity!
|
151
|
+
end
|
152
|
+
|
153
|
+
def fix_env!
|
154
|
+
ENV.delete('GEM_PATH')
|
155
|
+
end
|
156
|
+
|
157
|
+
def env_dump!
|
158
|
+
ENV.sort.to_h.each_pair do |k, v|
|
159
|
+
puts "#{k}=#{v}"
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
def bootstrap_rpm!
|
164
|
+
puts '== Bootstrap RPM =='.blue
|
165
|
+
bootstrap_gpg! if gpg_sign?
|
166
|
+
if podman_runtime?
|
167
|
+
puts "\tBootstrap /root".blue
|
168
|
+
sh "cp -r #{ctr_rpmmacros} #{ctr_gpg_dir} /root/"
|
169
|
+
sh "sed -i 's|/home/ood|/root|g' /root/.rpmmacros"
|
170
|
+
end
|
171
|
+
puts "\tBootstrap work dir".blue
|
172
|
+
sh "mkdir -p #{work_dir}/{RPMS,SRPMS,SOURCES,SPECS,rpmbuild/BUILD}"
|
173
|
+
bootstrap_copy_source!
|
174
|
+
bootstrap_get_source!
|
175
|
+
end
|
176
|
+
|
177
|
+
def bootstrap_gpg!
|
178
|
+
puts "\tBootstrap GPG".blue
|
179
|
+
sh "sed -i 's|@GPG_NAME@|#{ENV['GPG_NAME']}|g' #{ctr_rpmmacros}"
|
180
|
+
sh "gpg --batch --passphrase-file #{gpg_passphrase} --import #{gpg_private_key}#{cmd_suffix}"
|
181
|
+
sh "sudo rpm --import #{ENV['GPG_PUBKEY']}#{cmd_suffix}" if ENV['GPG_PUBKEY']
|
182
|
+
end
|
183
|
+
|
184
|
+
def bootstrap_copy_source!
|
185
|
+
puts "\tCopy sources".blue
|
186
|
+
if build_box.rpm?
|
187
|
+
sh "find #{spec_dir} -maxdepth 1 -type f -exec cp {} #{work_dir}/SOURCES/ \\;"
|
188
|
+
sh "find #{spec_dir} -maxdepth 1 -mindepth 1 -type d -exec cp -r {} #{work_dir}/SOURCES/ \\;"
|
189
|
+
elsif build_box.deb?
|
190
|
+
sh "cp -a #{deb_build_dir}/* #{work_dir}/"
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
def bootstrap_get_source!
|
195
|
+
if ENV['SKIP_DOWNLOAD'] == 'true'
|
196
|
+
puts "\tSKIP_DOWNLOAD detected, skipping download sources".blue
|
197
|
+
return
|
198
|
+
end
|
199
|
+
output = `spectool #{rpm_defines.join(' ')} -l -R -S #{spec_file} 2>&1 | grep 'Source0:'`.strip
|
200
|
+
exit_code = $CHILD_STATUS.exitstatus
|
201
|
+
if exit_code.zero?
|
202
|
+
source = File.join(work_dir, 'SOURCES', File.basename(output))
|
203
|
+
tar = File.join(work_dir, 'SOURCES', ENV['TAR_NAME'])
|
204
|
+
sh "mv #{tar} #{source}" if !File.exist?(source) && File.exist?(tar)
|
205
|
+
end
|
206
|
+
puts "\tDownloading sources defined in #{spec_file}".blue
|
207
|
+
sh "spectool #{rpm_defines.join(' ')} -g -R -S #{spec_file}#{cmd_suffix}"
|
208
|
+
end
|
209
|
+
|
210
|
+
def bootstrap_deb!
|
211
|
+
puts '== Bootstrap DEB =='.blue
|
212
|
+
unless Dir.exist?(work_dir)
|
213
|
+
puts "\tCreating #{work_dir}".blue
|
214
|
+
sh "mkdir -p #{work_dir}"
|
215
|
+
end
|
216
|
+
bootstrap_copy_source!
|
217
|
+
puts "\tExtract source".blue
|
218
|
+
Dir.chdir(work_dir) do
|
219
|
+
sh "tar -xf #{deb_name}.tar.gz"
|
220
|
+
end
|
221
|
+
puts "\tBootstrap debian build files".blue
|
222
|
+
Dir.chdir(deb_work_dir) do
|
223
|
+
sh "dh_make -s -y --createorig -f ../#{deb_name}.tar.gz#{cmd_suffix} || true"
|
224
|
+
sh "dch -b -v #{deb_version} --controlmaint 'Release #{deb_version}'#{cmd_suffix}"
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
def install_dependencies!
|
229
|
+
puts '== Install Dependencies =='.blue
|
230
|
+
if build_box.rpm?
|
231
|
+
install_rpm_dependencies!
|
232
|
+
elsif build_box.deb?
|
233
|
+
install_deb_dependencies!
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
def install_rpm_dependencies!
|
238
|
+
cmd = ['sudo']
|
239
|
+
cmd.concat [build_box.package_manager, 'builddep'] if build_box.dnf?
|
240
|
+
cmd.concat ['yum-builddep'] if build_box.package_manager == 'yum'
|
241
|
+
cmd.concat ['-y']
|
242
|
+
cmd.concat rpm_defines
|
243
|
+
cmd.concat ['--spec'] if build_box.dnf?
|
244
|
+
cmd.concat [spec_file]
|
245
|
+
sh "#{cmd.join(' ')}#{cmd_suffix}"
|
246
|
+
end
|
247
|
+
|
248
|
+
def install_deb_dependencies!
|
249
|
+
sh "sudo apt update -y#{cmd_suffix}"
|
250
|
+
tool = [
|
251
|
+
'DEBIAN_FRONTEND=noninteractive apt-cudf-get --solver aspcud',
|
252
|
+
'-o APT::Get::Assume-Yes=1 -o APT::Get::Allow-Downgrades=1',
|
253
|
+
'-o Debug::pkgProblemResolver=0 -o APT::Install-Recommends=0'
|
254
|
+
]
|
255
|
+
cmd = [
|
256
|
+
'mk-build-deps --install --remove --root-cmd sudo',
|
257
|
+
"--tool='#{tool.join(' ')}'"
|
258
|
+
]
|
259
|
+
Dir.chdir(deb_work_dir) do
|
260
|
+
sh "#{cmd.join(' ')}#{cmd_suffix}"
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
def rpmbuild!
|
265
|
+
puts "== RPM build spec=#{spec_file} ==".blue
|
266
|
+
cmd = ['rpmbuild', '-ba']
|
267
|
+
cmd.concat rpm_defines
|
268
|
+
cmd.concat [spec_file]
|
269
|
+
sh "#{cmd.join(' ')}#{cmd_suffix}"
|
270
|
+
end
|
271
|
+
|
272
|
+
def debuild!
|
273
|
+
puts "== DEB build package=#{deb_work_dir} ==".blue
|
274
|
+
prepend_path = ''
|
275
|
+
prepend_path = "--prepend-path=#{config[:prepend_path]}" if config[:prepend_path]
|
276
|
+
Dir.chdir(deb_work_dir) do
|
277
|
+
sh "debuild --no-lintian --preserve-env #{prepend_path}#{cmd_suffix}"
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
def copy_output!
|
282
|
+
puts '== Copy output =='.blue
|
283
|
+
unless Dir.exist?(output_dir)
|
284
|
+
puts "\tCreating #{output_dir}".blue
|
285
|
+
sh "mkdir -p #{output_dir}"
|
286
|
+
end
|
287
|
+
if build_box.rpm?
|
288
|
+
puts "\tcopy #{work_dir}/**/*.rpm -> #{output_dir}/".blue
|
289
|
+
sh "find #{work_dir} -type f -name '*.rpm' -exec cp {} #{output_dir}/ \\;"
|
290
|
+
elsif build_box.deb?
|
291
|
+
puts "\tcopy #{work_dir}/*.deb #{output_dir}/".blue
|
292
|
+
sh "cp #{work_dir}/*.deb #{output_dir}/"
|
293
|
+
end
|
294
|
+
end
|
295
|
+
|
296
|
+
def gpg_sign!
|
297
|
+
puts '== GPG sign RPMs =='.blue
|
298
|
+
rpms.each do |rpm|
|
299
|
+
puts "\tGPG signing #{rpm}".blue
|
300
|
+
cmd = []
|
301
|
+
# Work around differences in RHEL
|
302
|
+
cmd.concat ['cat /dev/null | setsid'] unless build_box.dnf?
|
303
|
+
cmd.concat ['rpmsign', '--addsign', rpm]
|
304
|
+
sh "#{cmd.join(' ')}#{cmd_suffix}"
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
308
|
+
def sanity!
|
309
|
+
puts '== Sanity tests =='.blue
|
310
|
+
failure = false
|
311
|
+
if build_box.rpm? && gpg_sign?
|
312
|
+
rpms.each do |rpm|
|
313
|
+
puts "\tTest GPG signing #{rpm}".blue
|
314
|
+
output = `rpm -K #{rpm} 2>&1`
|
315
|
+
exit_code = $CHILD_STATUS.exitstatus
|
316
|
+
puts output if debug?
|
317
|
+
if exit_code != 0
|
318
|
+
puts "\tGPG check failure: exit code #{exit_code}".red
|
319
|
+
failure = true
|
320
|
+
end
|
321
|
+
if output !~ /(pgp|OK)/
|
322
|
+
puts "\tRPM not GPG signed".red
|
323
|
+
failure = true
|
324
|
+
end
|
325
|
+
end
|
326
|
+
end
|
327
|
+
exit 1 if failure
|
328
|
+
end
|
329
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
FROM <%= base_image %>
|
2
|
+
MAINTAINER Trey Dockendorf <tdockendorf@osc.edu>
|
3
|
+
ENV LANG=en_US.UTF-8
|
4
|
+
ENV LC_CTYPE=en_US.UTF-8
|
5
|
+
ENV USER=<%= ctr_user %>
|
6
|
+
ENV GEM_PATH=<%= ctr_gems_dir %>:
|
7
|
+
<% if scl? -%>
|
8
|
+
RUN yum update -y && yum clean all && rm -rf /var/cache/yum/*
|
9
|
+
RUN yum install -y yum-utils epel-release centos-release-scl && yum clean all && rm -rf /var/cache/yum/*
|
10
|
+
RUN yum install -y <%= scl_ruby %>-ruby sudo which wget @buildsys-build \
|
11
|
+
rpm-build rpmdevtools rpm-sign scl-utils-build && \
|
12
|
+
yum clean all && rm -rf /var/cache/yum/*
|
13
|
+
RUN rm -f /etc/yum.repos.d/CentOS-Vault.repo /etc/yum.repos.d/CentOS-Sources.repo
|
14
|
+
RUN head -n 13 /etc/yum.repos.d/CentOS-SCLo-scl.repo > /etc/yum.repos.d/CentOS-SCLo.repo
|
15
|
+
RUN head -n 13 /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo >> /etc/yum.repos.d/CentOS-SCLo.repo
|
16
|
+
RUN rm -f /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo /etc/yum.repos.d/CentOS-SCLo-scl.repo
|
17
|
+
<% elsif dnf? -%>
|
18
|
+
RUN dnf update -y && dnf clean all && rm -rf /var/cache/dnf/*
|
19
|
+
RUN dnf install -y dnf-utils epel-release langpacks-en glibc-all-langpacks && dnf clean all && rm -rf /var/cache/dnf/*
|
20
|
+
RUN dnf config-manager --set-enabled powertools && dnf clean all && rm -rf /var/cache/dnf/*
|
21
|
+
RUN dnf module enable -y ruby:<%= ruby_version %> nodejs:<%= nodejs_version %> && dnf clean all && rm -rf /var/cache/dnf/*
|
22
|
+
RUN dnf install -y systemd ruby nodejs sudo which wget \
|
23
|
+
gcc-c++ gcc make patch \
|
24
|
+
rpm-build rpmdevtools rpm-sign scl-utils-build && \
|
25
|
+
dnf clean all && rm -rf /var/cache/dnf/*
|
26
|
+
<% elsif deb? -%>
|
27
|
+
ENV DEBIAN_FRONTEND=noninteractive
|
28
|
+
RUN apt update -y && apt upgrade -y && apt clean all -y
|
29
|
+
RUN apt update -y && apt install -y locales && locale-gen $LANG && \
|
30
|
+
apt clean all -y
|
31
|
+
RUN apt update -y && apt install -y apt-transport-https ca-certificates \
|
32
|
+
init debhelper devscripts dh-make build-essential apt-cudf lintian equivs \
|
33
|
+
sudo rake wget curl ruby bundler && \
|
34
|
+
apt clean all -y
|
35
|
+
RUN echo "deb https://deb.nodesource.com/node_<%= nodejs_version %>.x <%= codename %> main" > /etc/apt/sources.list.d/nodesource.list
|
36
|
+
RUN curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | gpg --dearmor > /etc/apt/trusted.gpg.d/nodesource.gpg
|
37
|
+
<% end -%>
|
38
|
+
COPY . /build
|
39
|
+
RUN /bin/bash /build/install.sh
|
@@ -0,0 +1,30 @@
|
|
1
|
+
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
2
|
+
Version: GnuPG v2.0.22 (GNU/Linux)
|
3
|
+
|
4
|
+
mQENBFqB7y4BCADA2233uSAJC9EG3MM2EmmDjKCDy8Q9w3D1g48/roBUvONLveac
|
5
|
+
sx+rCSbP9Oc6sRJdxkQwppKKxKTwP5zGUGZto3wacaw2hTVfA7xFUfgcfZn3b0Az
|
6
|
+
fSTR2FlTnJ35THO1MkVNv/55D+qBOoEhrAGeUdB7TMGp9y+A6eHRYa0UdxY/rccY
|
7
|
+
xvz2oQOD6BH2s7IzLNUVLOifiu9Nrk213dghKOZjYwWERrpXj/EryuLm7wpKN349
|
8
|
+
pixk6zP4SIKj0L4HTwMqEcTCAxBKfidmUQ+JILvTRlTCItFPTcXJxqSI6jVA6Iu0
|
9
|
+
sZlO3XolEVdeGXL0MVjHVIpNZrV7vnTUFWPrABEBAAG0L09uRGVtYW5kIFJlbGVh
|
10
|
+
c2UgU2lnbmluZyBLZXkgPHBhY2thZ2VzQG9zYy5lZHU+iQE5BBMBAgAjBQJage8u
|
11
|
+
AhsDBwsJCAcDAgEGFQgCCQoLBBYCAwECHgECF4AACgkQS3L+K5LTF1UQzgf5AQ8Q
|
12
|
+
Fy6JhxYaa56FHALiYCKJn+YHSbI4uZE6umpnV/14lU2Timw/xwNiH2ndlnl3a8be
|
13
|
+
NcYPYkX+7T5nWQty7YK3aIEEMeMY/I8Cb0RKaCoJwETbu9u4dKguAy19fj0h0jGC
|
14
|
+
v0lrBHNWfv572pr+TOcdVP2CFyfHybl6MvWFshM5mUxSeMItSa8KDVaWfZiPHzQe
|
15
|
+
YrL4ZcWvqLfBK/m8alvggg9zaOIyDKM30lbil66pY/rbveQyGW7SbpxiUh1rNsV4
|
16
|
+
aQOAVJRQC+uJn44OeTuB9nRR5nFLA70i+MtPbQNd3QiOHxuZN7c4sLkvmQslf1HZ
|
17
|
+
7XoiYp0GlWMoI+YVXrkBDQRage8uAQgAut5ko4fkPkBfldawTCvTxnxnoa14RVwy
|
18
|
+
3PcKxhaPmvHzdSjqquYYktgHIIGs8/UOrsFNPdHU6x02v0psaMwL8JX6JqFypPri
|
19
|
+
YltdXNU/NqlImzfBOkHnAhDiIEI/j34LkEpXhUCmJzeTGAu8wXS3tgx4cHgbfycg
|
20
|
+
MjmX7QBNghDzC3S+3Kt7wG4pNRlwyFd8r46CL5Yc6+UE9oNvnHdCy3W6OwCYCgXd
|
21
|
+
919Bsf2Lpy1jGWV3YEiFgYv+pmF0T56vD1Rz+KbIhDEzQ4f/Q0dBZpcjZzQtSJQR
|
22
|
+
Wh5LX/8JzK0l3PrWOrVmW1GmKQ1DPIkAT2iR35ydgEbi/wuk+izeyQARAQABiQEf
|
23
|
+
BBgBAgAJBQJage8uAhsMAAoJEEty/iuS0xdVPtUH/16Kd1xX3PSGzOFatNJvfOR5
|
24
|
+
5oCuVqMLm4sFXdrp0Spnn2B7Dx58jL0slwtWMh6xdtD/CKH/ihnM/um3h5JT0EvE
|
25
|
+
9XTBfXwOkKgtdxgrHVeoT8gYNaw/0/kIlPavK5QviSNA64qUdFUvtg01FeyKmZ/R
|
26
|
+
jaRKJZUy+orHYZLo41uj7iGA5Op4gL70ydTnnYFcCb/eLOuGKci1yUzchjxY6YAa
|
27
|
+
9/ZHhpAqcKsIqZWpzLimLTTH2E43YYVbRcyP9Csfm7qFG8m7RwjXdbquzfkMkujq
|
28
|
+
weYYi8Av2oajeR3NLoVvCPP2R3yT1YtDCuMRP8Pe4q9gmh7WKwdr38f6/an4VSI=
|
29
|
+
=uztj
|
30
|
+
-----END PGP PUBLIC KEY BLOCK-----
|
@@ -0,0 +1,21 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
# Changes the '<%= ctr_user %>' user's UID and GID to the values specified
|
3
|
+
# in $OOD_UID and $OOD_GID.
|
4
|
+
set -e
|
5
|
+
set -o pipefail
|
6
|
+
if [[ "$DEBUG" == "true" ]]; then
|
7
|
+
set -x
|
8
|
+
fi
|
9
|
+
|
10
|
+
chown -R "$OOD_UID:$OOD_GID" <%= ctr_home %>
|
11
|
+
groupmod -o -g "$OOD_GID" <%= ctr_user %>
|
12
|
+
usermod -o -u "$OOD_UID" -g "$OOD_GID" <%= ctr_user %> 2>/dev/null 1>/dev/null
|
13
|
+
|
14
|
+
set +e
|
15
|
+
SCL_SOURCE="$(command -v scl_source)"
|
16
|
+
[[ "${SCL_SOURCE}" ]] && source "${SCL_SOURCE}" enable "<%= scl_ruby %>" &> /dev/null
|
17
|
+
set -e
|
18
|
+
|
19
|
+
if [[ $# -gt 0 ]]; then
|
20
|
+
exec "$@"
|
21
|
+
fi
|
@@ -0,0 +1,88 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
set -e
|
3
|
+
|
4
|
+
function header()
|
5
|
+
{
|
6
|
+
echo
|
7
|
+
echo "----- $@ -----"
|
8
|
+
}
|
9
|
+
|
10
|
+
function run()
|
11
|
+
{
|
12
|
+
echo "+ $@"
|
13
|
+
"$@"
|
14
|
+
}
|
15
|
+
|
16
|
+
export HOME=/root
|
17
|
+
|
18
|
+
<% if rpm? -%>
|
19
|
+
header "Add OnDemand build repo"
|
20
|
+
cat > /etc/yum.repos.d/ondemand-web.repo <<EOF
|
21
|
+
[ondemand-web]
|
22
|
+
name=Open OnDemand Web Repo
|
23
|
+
baseurl=https://yum.osc.edu/ondemand/build/<%= ondemand_repo_version %>/web/el\$releasever/\$basearch/
|
24
|
+
enabled=1
|
25
|
+
gpgcheck=0
|
26
|
+
EOF
|
27
|
+
run rpm --import /build/RPM-GPG-KEY-ondemand
|
28
|
+
<% end -%>
|
29
|
+
|
30
|
+
header "Creating users"
|
31
|
+
run groupadd <%= ctr_user %>
|
32
|
+
run useradd --home-dir <%= ctr_home %> --create-home --gid <%= ctr_user %> --password '<%= ctr_user %>' <%= ctr_user %>
|
33
|
+
|
34
|
+
header "Add sudo"
|
35
|
+
cat > /etc/sudoers.d/ood <<EOF
|
36
|
+
Defaults:<%= ctr_user %> !requiretty, !authenticate
|
37
|
+
%<%= ctr_user %> ALL=NOPASSWD:ALL
|
38
|
+
EOF
|
39
|
+
run chmod 440 /etc/sudoers.d/ood
|
40
|
+
|
41
|
+
<% if rpm? -%>
|
42
|
+
header "Setup RPM env"
|
43
|
+
sudo -u <%= ctr_user %> -H cat > <%= ctr_rpmmacros %> <<EOF
|
44
|
+
%_topdir /work/<%= dist %>
|
45
|
+
<%- # Workaround to weird issue with debuginfo stripping -%>
|
46
|
+
<% if dist == 'el7' -%>
|
47
|
+
%_builddir %{_topdir}/rpmbuild/BUILD
|
48
|
+
<% end -%>
|
49
|
+
%_signature gpg
|
50
|
+
%_gpg_path <%= ctr_gpg_dir %>
|
51
|
+
%_gpg /usr/bin/gpg
|
52
|
+
%_gpg_name @GPG_NAME@
|
53
|
+
# Modified macro from /usr/lib/rpm/macros to add pinentry-mode and passphrase-file
|
54
|
+
# pinentry-mode only needed on EL8
|
55
|
+
%__gpg_check_password_cmd %{__gpg} \\
|
56
|
+
gpg --batch --no-verbose --passphrase-file <%= gpg_passphrase %> -u "%{_gpg_name}" -so -
|
57
|
+
%__gpg_sign_cmd %{__gpg} \\
|
58
|
+
gpg --no-verbose --no-armor --batch \\
|
59
|
+
<%- if dnf? -%>
|
60
|
+
--pinentry-mode loopback \\
|
61
|
+
<%- end -%>
|
62
|
+
--passphrase-file <%= gpg_passphrase %> \\
|
63
|
+
%{?_gpg_sign_cmd_extra_args:%{_gpg_sign_cmd_extra_args}} \\
|
64
|
+
%{?_gpg_digest_algo:--digest-algo %{_gpg_digest_algo}} \\
|
65
|
+
--no-secmem-warning \\
|
66
|
+
-u \"%{_gpg_name}\" -sbo %{__signature_filename} %{__plaintext_filename}
|
67
|
+
EOF
|
68
|
+
<% end -%>
|
69
|
+
<%- if dnf? -%>
|
70
|
+
run install -d -m 0700 -o ood -g ood <%= ctr_gpg_dir %>
|
71
|
+
echo "allow-loopback-pinentry" >> <%= ctr_gpg_dir %>/gpg-agent.conf
|
72
|
+
<%- end -%>
|
73
|
+
|
74
|
+
header "Install ood_packaging gem"
|
75
|
+
<%- if scl? -%>
|
76
|
+
run scl enable <%= scl_ruby %> -- gem install --no-doc --bindir <%= ctr_scripts_dir %> --install-dir <%= ctr_gems_dir %> /build/*.gem
|
77
|
+
<%- else -%>
|
78
|
+
run gem install --no-doc --bindir <%= ctr_scripts_dir %> --install-dir <%= ctr_gems_dir %> /build/*.gem
|
79
|
+
<%- end -%>
|
80
|
+
|
81
|
+
header "Copy in launch scripts"
|
82
|
+
run mkdir -p <%= ctr_scripts_dir %>
|
83
|
+
run install -m 0755 /build/inituidgid.sh <%= ctr_scripts_dir %>/
|
84
|
+
run install -m 0755 /build/setuser.rb <%= ctr_scripts_dir %>/
|
85
|
+
run install -m 0644 /build/Rakefile <%= ctr_scripts_dir %>/
|
86
|
+
|
87
|
+
header "Cleaning up"
|
88
|
+
run rm -rf /build
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'etc'
|
5
|
+
|
6
|
+
username = ARGV[0]
|
7
|
+
user = Etc.getpwnam(username)
|
8
|
+
|
9
|
+
Process.initgroups(username, user.gid)
|
10
|
+
Process::Sys.setgid(user.gid)
|
11
|
+
Process::Sys.setuid(user.uid)
|
12
|
+
|
13
|
+
ENV['USER'] = user.name
|
14
|
+
ENV['HOME'] = user.dir
|
15
|
+
|
16
|
+
exec(ARGV.drop(1).join(' '))
|