ood_packaging 0.0.1.rc.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []