ood_packaging 0.0.1.r2.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.
- 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(' '))
|