ood_packaging 0.0.1.rc.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.
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Version code for OodPackaging
4
+ module OodPackaging
5
+ VERSION = '0.0.1.rc.3'
6
+ PACKAGE_VERSION = {
7
+ 'ondemand-release' => {
8
+ '(ubuntu|debian)' => '2.1.0',
9
+ 'default' => '2.1'
10
+ },
11
+ 'ondemand-release-latest' => {
12
+ '(ubuntu|debian)' => '1',
13
+ 'default' => '1-6'
14
+ },
15
+ 'ondemand-runtime' => '2.1',
16
+ 'passenger' => '6.0.11',
17
+ 'cjose' => '0.6.1',
18
+ 'mod_auth_openidc' => '2.4.5',
19
+ 'sqlite' => '3.26.0-4',
20
+ 'ondemand_exporter' => '0.9.0',
21
+ 'ondemand-compute' => {
22
+ '(ubuntu|debian)' => '2.1.0',
23
+ 'default' => '2.1'
24
+ },
25
+ 'python-websockify' => '0.8.0',
26
+ 'turbovnc' => '2.2.5'
27
+ }.freeze
28
+
29
+ def self.package_version(package, dist)
30
+ return PACKAGE_VERSION[package] if PACKAGE_VERSION[package].is_a?(String)
31
+
32
+ PACKAGE_VERSION[package].each_pair do |k, v|
33
+ return v if dist =~ /#{k}/
34
+ end
35
+ PACKAGE_VERSION[package]['default']
36
+ end
37
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OodPackaging
4
+ require 'ood_packaging/build'
5
+ require 'ood_packaging/build_box'
6
+ require 'ood_packaging/options'
7
+ require 'ood_packaging/package'
8
+ require 'ood_packaging/string_ext'
9
+ require 'ood_packaging/utils'
10
+ require 'ood_packaging/version'
11
+ end
@@ -0,0 +1,197 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'English'
4
+ require 'erb'
5
+ require 'tempfile'
6
+
7
+ # Package utilities
8
+ module PackageUtils
9
+ def version
10
+ @version ||= if ENV['VERSION']
11
+ ENV['VERSION'].to_s
12
+ else
13
+ tag? ? git_tag : "#{git_tag}-#{git_hash}"
14
+ end
15
+ end
16
+
17
+ def build_timestamp
18
+ @build_timestamp ||= Time.now.strftime('%s')
19
+ end
20
+
21
+ def git_hash
22
+ @git_hash ||= `git rev-parse HEAD`.strip[0..6]
23
+ end
24
+
25
+ def git_tag
26
+ @git_tag ||= `git describe --tags --abbrev=0`.chomp
27
+ end
28
+
29
+ def numeric_tag
30
+ @numeric_tag ||= git_tag.delete_prefix('v')
31
+ end
32
+
33
+ def tag?
34
+ @tag ||= `git describe --exact-match --tags HEAD 2>/dev/null`.to_s != ''
35
+ end
36
+
37
+ def podman_runtime?
38
+ @podman_runtime ||= ENV['CONTAINER_RT'] == 'podman'
39
+ end
40
+
41
+ def docker_runtime?
42
+ !podman_runtime?
43
+ end
44
+
45
+ def container_runtime
46
+ podman_runtime? ? 'podman' : 'docker'
47
+ end
48
+
49
+ def tar
50
+ @tar ||= begin
51
+ `which gtar 1>/dev/null 2>&1`
52
+ $CHILD_STATUS.success? ? 'gtar' : 'tar'
53
+ end
54
+ end
55
+
56
+ def src_dir
57
+ ENV['OOD_SRC_DIR'] || '.'
58
+ end
59
+
60
+ def user
61
+ @user ||= Etc.getpwnam(Etc.getlogin)
62
+ end
63
+
64
+ def build_dir(args)
65
+ @build_dir ||= "#{src_dir}/build/#{build_box_image(args).gsub(':', '-')}".tap { |d| sh "mkdir -p #{d}" }
66
+ end
67
+
68
+ # TODO: continue vendor/ convention? Seems as good as any other name.
69
+ def vendor_src_dir
70
+ 'vendor/ood/src'.tap { |p| sh "mkdir -p #{p}" }
71
+ end
72
+
73
+ def vendor_build_dir
74
+ 'vendor/ood/build'.tap { |p| sh "mkdir -p #{p}" }
75
+ end
76
+
77
+ def dist_dir(args)
78
+ dist = args[:dist].to_s
79
+ version = args[:version].to_s
80
+ "dist/#{dist}#{version}"
81
+ end
82
+
83
+ def known_images
84
+ {
85
+ 'ubuntu-20.04': '1'
86
+ }.freeze
87
+ end
88
+
89
+ def build_box_image(args)
90
+ base_name = "#{args[:dist]}-#{args[:version]}"
91
+ @version_lookup ||= Hash.new('1').merge(known_images)
92
+
93
+ "#{build_box_name}:#{base_name}-#{@version_lookup[base_name.to_sym]}"
94
+ end
95
+
96
+ def build_box_name
97
+ ENV['OOD_BUILD_BOX'] || 'ood-buildbox'
98
+ end
99
+
100
+ def image_exists?(image_name)
101
+ `#{container_runtime} inspect --type image --format exists #{image_name} || true`.chomp.eql?('exists')
102
+ end
103
+
104
+ def build_cmd(file, image)
105
+ args = [container_runtime, 'build', '-t', image, '-f', file]
106
+ args.concat '.' if docker_runtime?
107
+ args.join(' ')
108
+ end
109
+
110
+ def template_file(filename)
111
+ cwd = File.expand_path(__dir__).to_s
112
+ content = File.read("#{cwd}/templates/#{filename}")
113
+ content = ERB.new(content, trim_mode: '-').result(binding)
114
+
115
+ begin
116
+ t = Tempfile.new('ood-docker')
117
+ t.write(content)
118
+ t.path
119
+ ensure
120
+ t.close
121
+ end
122
+ end
123
+
124
+ def ctr_home
125
+ "/home/#{ctr_user}"
126
+ end
127
+
128
+ def ctr_user
129
+ 'ood'
130
+ end
131
+
132
+ def ctr_run_args
133
+ [
134
+ '--rm', '--user', "#{ctr_user}:#{ctr_user}",
135
+ '-e', 'LC_CTYPE=en_US.UTF-8'
136
+ ].concat(rt_specific_flags)
137
+ end
138
+
139
+ def rt_specific_flags
140
+ if podman_runtime?
141
+ # SELinux doesn't like it if you're mounting from $HOME
142
+ ['--security-opt', 'label=disable', '--userns=keep-id']
143
+ else
144
+ []
145
+ end
146
+ end
147
+
148
+ def arch
149
+ 'x86_64'
150
+ end
151
+
152
+ def spec_location
153
+ sf = Dir.glob('packaging/rpm/*.spec').first
154
+ raise StandardError, 'Cannot find spec file in packaging/rpm' if sf.nil?
155
+
156
+ sf
157
+ end
158
+
159
+ def spec_file
160
+ File.basename(spec_location)
161
+ end
162
+
163
+ def rpm_build_args
164
+ [git_tag_define, version_define, '-ba', '--nodeps', '-vv', spec_file]
165
+
166
+ # if git_prerelease_tag.size >= 2
167
+ # git_prerelease_verison = git_prerelease_tag[0]
168
+ # git_prerelease_verison = git_prerelease_verison[1..-1] if git_prerelease_verison.start_with?('v')
169
+ # version_define = "--define 'package_version #{git_prerelease_verison}'"
170
+ # if git_tag.size >= 2
171
+ # prerelease = git_prerelease_tag[1].gsub('-', '.')
172
+ # release_define = "--define 'package_release 0.#{prerelease}'"
173
+ # else
174
+ # release_define = "--define 'package_release 0.#{git_prerelease_tag[1]}.1'"
175
+ # end
176
+ # else
177
+ # version_define = "--define 'package_version #{git_tag_version}'"
178
+ # release_define = if git_tag.size >= 2
179
+ # "--define 'package_release #{git_tag[1]}'"
180
+ # else
181
+ # ''
182
+ # end
183
+ # end
184
+ end
185
+
186
+ def version_define
187
+ git_tag = version.split('-')
188
+ git_tag_version = git_tag[0]
189
+ git_tag_version = git_tag_version[1..] if git_tag_version.start_with?('v')
190
+
191
+ "--define 'package_version #{git_tag_version}'"
192
+ end
193
+
194
+ def git_tag_define
195
+ "--define 'git_tag #{version}'"
196
+ end
197
+ end
@@ -0,0 +1,111 @@
1
+ # frozen_string_literal: true
2
+
3
+ desc 'Package OnDemand'
4
+ namespace :package do
5
+ require_relative 'package_utils'
6
+ include PackageUtils
7
+
8
+ desc 'Tar and zip OnDemand into packaging dir with version name v#<version>'
9
+ task :tar, [:output_dir] do |_task, args|
10
+ version = ENV['VERSION'] || ENV['CI_COMMIT_TAG']
11
+ version = version.gsub(/^v/, '') unless version.nil?
12
+
13
+ chdir src_dir do
14
+ unless version
15
+ latest_commit = `git rev-list --tags --max-count=1`.strip[0..6]
16
+ latest_tag = `git describe --tags #{latest_commit}`.strip[1..]
17
+ datetime = Time.now.strftime('%Y%m%d-%H%M')
18
+ version = "#{latest_tag}-#{datetime}-#{latest_commit}"
19
+ end
20
+
21
+ dir = (args[:output_dir] || 'packaging/rpm').to_s.tap { |p| sh "mkdir -p #{p}" }
22
+ sh "git ls-files | #{tar} -c --transform 's,^,ondemand-#{version}/,' -T - | gzip > #{dir}/v#{version}.tar.gz"
23
+ end
24
+ end
25
+
26
+ # TODO: refactor these 2 tar tasks. Debian and RHEL expect slightly different names and
27
+ # what's worse is the whole v prefixing mess
28
+ task :debian_tar, [:output_dir] do |_task, args|
29
+ dir = (args[:output_dir] || 'packaging').to_s.tap { |p| sh "mkdir -p #{p}" }
30
+ tar_file = "#{dir}/#{ood_package_tar}"
31
+
32
+ sh "rm #{tar_file}" if File.exist?(tar_file)
33
+ sh "git ls-files | #{tar} -c --transform 's,^,#{versioned_ood_package}/,' -T - | gzip > #{tar_file}"
34
+ end
35
+
36
+ task :version do
37
+ puts package_version
38
+ end
39
+
40
+ task :deb, [:dist, :version] => [:build_box] do |_task, args|
41
+ dir = build_dir(args)
42
+ Rake::Task['package:debian_tar'].invoke(dir)
43
+ sh "#{tar} -xzf #{dir}/#{ood_package_tar} -C #{dir}"
44
+
45
+ work_dir = "/build/#{versioned_ood_package}"
46
+
47
+ base_args = ctr_run_args
48
+ base_args.concat ['-v', "#{dir}:/build", '-w', work_dir.to_s]
49
+ base_args.concat ['-e', "DEBUILD_DPKG_BUILDPACKAGE_OPTS='-us -uc -I -i'"]
50
+ base_args.concat ['-e', 'HOME=/home/ood', '-e', 'USER=ood']
51
+ base_args.concat ['-e', "VERSION=#{ENV['VERSION']}"] unless ENV['VERSION'].nil?
52
+ base_args.concat [build_box_image(args)]
53
+ sh "#{container_runtime} run #{base_args.join(' ')} debmake -b':ruby'"
54
+
55
+ debuild_args = ['debuild', '--no-lintian']
56
+ sh "#{container_runtime} run #{base_args.join(' ')} #{debuild_args.join(' ')}"
57
+ end
58
+
59
+ task :bootstrap_rpm, [:dist, :version] => [:verify_args] do |_task, args|
60
+ chdir src_dir do
61
+ build_dir(args).tap do |d|
62
+ src_dir = "#{d}/rpmbuild/SOURCES".tap { |s| sh "mkdir -p #{s}" }
63
+ dist_dir(args).tap { |dd| sh "mkdir -p #{dd}" }
64
+ Rake::Task['package:tar'].invoke(src_dir)
65
+
66
+ FileUtils.cp Dir.glob('packaging/rpm/*.{fc,te,ico,png,tar.gz}'), src_dir
67
+ FileUtils.cp spec_location, d
68
+ end
69
+ end
70
+ end
71
+
72
+ desc 'Build an RPM'
73
+ task :rpm, [:dist, :version] => [:build_box, :bootstrap_rpm] do |_task, args|
74
+ dir = build_dir(args)
75
+ image = build_box_image(args)
76
+
77
+ base_args = ctr_run_args
78
+ base_args.concat ['-v', "#{dir}:#{ctr_home}", '-w', "'#{ctr_home}'"]
79
+ base_args.concat ['-e', "HOME=#{ctr_home}"]
80
+
81
+ chdir src_dir do
82
+ sh "#{container_runtime} run #{base_args.join(' ')} #{image} rpmbuild #{rpm_build_args.join(' ')}"
83
+ FileUtils.cp Dir.glob("#{dir}/rpmbuild/RPMS/#{arch}/*.rpm"), dist_dir(args)
84
+ end
85
+ end
86
+
87
+ namespace :rpm do
88
+ desc 'Build nightly RPM'
89
+ task :nightly, [:dist, :extra_args] do |_task, args|
90
+ version_major, version_minor = git_tag.gsub(/^v/, '').split('.', 3)
91
+ date = Time.now.strftime('%Y%m%d')
92
+ id = ENV['CI_PIPELINE_ID'] || Time.now.strftime('%H%M%S')
93
+ ENV['VERSION'] = "#{version_major}.#{version_minor}.#{date}-#{id}.#{git_hash}.nightly"
94
+ Rake::Task['package:rpm'].invoke(args[:dist], args[:extra_args])
95
+ end
96
+ end
97
+
98
+ task :verify_args, [:dist, :version] do |_task, args|
99
+ raise 'Need to specify :dist and :version' if args[:dist].nil? || args[:version].nil?
100
+ end
101
+
102
+ desc 'Create buildbox for Open OnDemand'
103
+ task :build_box, [:dist, :version] => [:verify_args] do |_task, args|
104
+ cmd = build_cmd(
105
+ template_file("Dockerfile.#{args[:dist]}.erb"),
106
+ build_box_image(args)
107
+ )
108
+
109
+ sh cmd unless image_exists?(build_box_image(args))
110
+ end
111
+ end
@@ -0,0 +1,21 @@
1
+ FROM centos:8
2
+
3
+ # install all the dependencies
4
+ RUN dnf -y update
5
+ RUN dnf install -y dnf-utils
6
+ RUN dnf config-manager --set-enabled powertools
7
+ RUN dnf -y module enable nodejs:12 ruby:2.7
8
+ RUN dnf install -y \
9
+ make gcc gcc-c++ git rsync rpm-build redhat-rpm-config
10
+ RUN dnf install -y libselinux libselinux-devel
11
+ RUN dnf install -y selinux-policy selinux-policy-devel
12
+ RUN dnf install -y scl-utils
13
+
14
+ RUN dnf install -y https://yum.osc.edu/ondemand/latest/ondemand-release-web-latest-1-6.noarch.rpm
15
+ RUN dnf install -y \
16
+ ondemand-runtime ondemand-scldevel ondemand-build ondemand-ruby ondemand-python ondemand-nodejs
17
+
18
+ RUN dnf clean all && rm -rf /var/cache/dnf/*
19
+
20
+ RUN groupadd <%= ctr_user %> && \
21
+ useradd --create-home --gid <%= ctr_user %> <%= ctr_user %>
@@ -0,0 +1,15 @@
1
+ from ubuntu:20.04
2
+
3
+ ENV DEBIAN_FRONTEND=noninteractive
4
+
5
+ RUN apt update && \
6
+ apt install -y \
7
+ ruby=1:2.7+1 ruby-dev=1:2.7+1 \
8
+ nodejs npm \
9
+ make g++ gcc sqlite3 libsqlite3-dev \
10
+ debmake debhelper
11
+
12
+ RUN groupadd <%= ctr_user %> && \
13
+ useradd --create-home --gid <%= ctr_user %> <%= ctr_user %>
14
+
15
+ RUN ln -s /bin/bundle2.7 /bin/bundle
metadata ADDED
@@ -0,0 +1,124 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ood_packaging
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1.rc.3
5
+ platform: ruby
6
+ authors:
7
+ - Trey Dockendorf
8
+ - Jeff Ohrstrom
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2021-12-21 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: 13.0.1
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: 13.0.1
28
+ - !ruby/object:Gem::Dependency
29
+ name: rspec
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rubocop
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rubocop-rspec
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ description: Open OnDemand packaging library provides Rake tasks like package:rpm
71
+ and pacakge:deb
72
+ email:
73
+ - tdockendorf@osc.edu
74
+ - johrstrom@osc.edu
75
+ executables:
76
+ - ood_packaging
77
+ extensions: []
78
+ extra_rdoc_files: []
79
+ files:
80
+ - bin/ood_packaging
81
+ - lib/ood_packaging.rb
82
+ - lib/ood_packaging/build.rb
83
+ - lib/ood_packaging/build_box.rb
84
+ - lib/ood_packaging/build_box/docker-image/Dockerfile.erb
85
+ - lib/ood_packaging/build_box/docker-image/RPM-GPG-KEY-ondemand
86
+ - lib/ood_packaging/build_box/docker-image/Rakefile
87
+ - lib/ood_packaging/build_box/docker-image/inituidgid.sh.erb
88
+ - lib/ood_packaging/build_box/docker-image/install.sh.erb
89
+ - lib/ood_packaging/build_box/docker-image/setuser.rb
90
+ - lib/ood_packaging/options.rb
91
+ - lib/ood_packaging/package.rb
92
+ - lib/ood_packaging/rake_task.rb
93
+ - lib/ood_packaging/string_ext.rb
94
+ - lib/ood_packaging/tasks.rb
95
+ - lib/ood_packaging/utils.rb
96
+ - lib/ood_packaging/version.rb
97
+ - lib/tasks/package_utils.rb
98
+ - lib/tasks/packaging.rb
99
+ - lib/tasks/templates/Dockerfile.el.erb
100
+ - lib/tasks/templates/Dockerfile.ubuntu.erb
101
+ homepage: https://github.com/OSC/ondemand-packaging
102
+ licenses:
103
+ - MIT
104
+ metadata: {}
105
+ post_install_message:
106
+ rdoc_options: []
107
+ require_paths:
108
+ - lib
109
+ required_ruby_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: 2.2.0
114
+ required_rubygems_version: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">"
117
+ - !ruby/object:Gem::Version
118
+ version: 1.3.1
119
+ requirements: []
120
+ rubygems_version: 3.1.2
121
+ signing_key:
122
+ specification_version: 4
123
+ summary: Open OnDemand packaging library
124
+ test_files: []