Skip to content

Commit 897fdd2

Browse files
mcdonaldseanpdonoghuc
authored andcommitted
(PE-36345) Add ruby/openssl to bolt-server main
Includes a ruby and openssl build inside the bolt-server main package. This change paves the way for us to enable legacy chiphers in bolt-server's openssl to ensure ntlm (and by extension the WinRM transport) can still function.
1 parent e869c9e commit 897fdd2

File tree

3 files changed

+240
-2
lines changed

3 files changed

+240
-2
lines changed

Diff for: configs/components/runtime-pe-bolt-server.rb

+22-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# This component exists to install project-wide build dependencies for pe-bolt-server projects
22
component "runtime-pe-bolt-server" do |pkg, settings, platform|
3+
4+
builtin_ruby ||= settings[:builtin_ruby]
5+
36
# PE Bolt Server depends on puppet-agent - it uses the agent's ruby installation to build gems.
47
# Add the enterprise repo for this project's PE version so that puppet-agent can be installed as a build dependency:
58
if platform.name =~ /ubuntu-18\.04/
@@ -19,4 +22,22 @@
1922
end
2023

2124
pkg.build_requires('puppet-agent')
22-
end
25+
if builtin_ruby
26+
pkg.build_requires "libffi"
27+
pkg.build_requires "libyaml"
28+
29+
# PROJECT_SHORTNAME is used in the runtime script to determine the
30+
# libdir where we put all the linked lib files. For bolt-server there's
31+
# a whole path it needs to follow instead of just a name like 'installer'
32+
# or 'bolt'.
33+
pkg.environment "PROJECT_SHORTNAME", "server/apps/bolt-server"
34+
pkg.add_source "file://resources/files/runtime/runtime.sh"
35+
if platform.name =~ /el-[567]|redhatfips-7|sles-(11|12)|ubuntu-18.04-amd64/
36+
libbase = platform.architecture =~ /64/ ? 'lib64' : 'lib'
37+
libdir = "/opt/pl-build-tools/#{libbase}"
38+
pkg.install do
39+
"bash runtime.sh #{libdir}"
40+
end
41+
end
42+
end
43+
end

Diff for: configs/projects/_shared-pe-bolt-server_with_ruby.rb

+213
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,213 @@
1+
# This "project" is a common basis for all pe-bolt-server branches. It should
2+
# not be built on its own. Instead, other project files should load it with
3+
# instance_eval. See configs/projects/pe-bolt-server-runtime-<branchname>.rb
4+
# for branch-specific details.
5+
unless defined?(proj)
6+
warn("'#{File.basename(__FILE__)}' is a set of basic configuration values" \
7+
" shared by all pe-bolt-server projects; It cannot be built as a" \
8+
" standalone project.")
9+
warn("Please choose one of the other pe-bolt-server projects instead.")
10+
exit(1)
11+
end
12+
13+
pe_version = settings[:pe_version]
14+
unless pe_version && !pe_version.empty?
15+
warn("You must set the `pe_version` setting in your pe-bolt-server project" \
16+
" file before instance_eval'ing '#{File.basename(__FILE__)}'. This should" \
17+
" be an x.y version like '2019.1' or similar.")
18+
exit(1)
19+
end
20+
21+
proj.description('The PE Bolt runtime contains third-party components needed for PE Bolt server packaging')
22+
proj.license('See components')
23+
proj.vendor('Puppet, Inc. <[email protected]>')
24+
proj.homepage('https://puppet.com')
25+
proj.identifier('com.puppetlabs')
26+
proj.version_from_git
27+
proj.generate_archives(true)
28+
proj.generate_packages(false)
29+
30+
proj.setting(:artifactory_url, "https://artifactory.delivery.puppetlabs.net/artifactory")
31+
proj.setting(:buildsources_url, "#{proj.artifactory_url}/generic/buildsources")
32+
33+
# This setting can be used sparingly in component configurations to conditionally include dependencies:
34+
proj.setting(:runtime_project, 'pe-bolt-server')
35+
36+
# Ruby + OpenSSL included with bolt-server
37+
# --------------------------------------------
38+
#
39+
# Starting with pe-bolt-server packages installed next to Puppet 8
40+
# pe-bolt-server now vendors its own ruby and openssl installation.
41+
proj.setting(:builtin_ruby, true)
42+
43+
# Set desired versions for gem components that offer multiple versions:
44+
# TODO: Can runtime projects use these updated versions?
45+
proj.setting(:rubygem_deep_merge_version, '1.2.2')
46+
proj.setting(:rubygem_net_ssh_version, '7.0.1')
47+
48+
# (pe-bolt-server does not run on Windows, so only the *nix path is here)
49+
proj.setting(:prefix, '/opt/puppetlabs/server/apps/bolt-server')
50+
proj.setting(:bindir, File.join(proj.prefix, 'bin'))
51+
proj.setting(:libdir, File.join(proj.prefix, 'lib'))
52+
proj.setting(:includedir, File.join(proj.prefix, "include"))
53+
54+
# proj.ruby_dir needs to be set by the individual versions of pe-bolt-server-runtime. Bolt-Server versions running
55+
# alongside puppet 8 and later use their own ruby instead of the agent's.
56+
proj.setting(:ruby_dir, proj.prefix)
57+
proj.setting(:ruby_bindir, File.join(proj.ruby_dir, 'bin'))
58+
proj.setting(:host_ruby, File.join(proj.ruby_bindir, 'ruby'))
59+
proj.setting(:host_gem, File.join(proj.ruby_bindir, 'gem'))
60+
proj.setting(:gem_build, "#{proj.host_gem} build")
61+
62+
# We build bolt server with the ruby installed in the puppet-agent dep. For ruby 2.7 we need to use a --no-document flag
63+
# for gem installs instead of --no-ri --no-rdoc. This setting allows us to use this while we support both ruby 2.5 and 2.7
64+
# Once we are no longer using ruby 2.5 we can update.
65+
if proj.no_doc
66+
proj.setting(:gem_install, "#{proj.host_gem} install --no-document --local --bindir=#{proj.bindir}")
67+
else
68+
proj.setting(:gem_install, "#{proj.host_gem} install --no-rdoc --no-ri --local --bindir=#{proj.bindir}")
69+
end
70+
71+
72+
proj.setting(:datadir, File.join(proj.prefix, "share"))
73+
proj.setting(:mandir, File.join(proj.datadir, "man"))
74+
75+
ruby_base_version = proj.ruby_version.gsub(/(\d+)\.(\d+)\.(\d+)/, '\1.\2.0')
76+
proj.setting(:gem_home, File.join(proj.libdir, 'ruby', 'gems', ruby_base_version))
77+
78+
# Define default CFLAGS and LDFLAGS for most platforms, and then
79+
# tweak or adjust them as needed.
80+
proj.setting(:cppflags, "-I#{proj.includedir} -I/opt/pl-build-tools/include")
81+
proj.setting(:cflags, "#{proj.cppflags}")
82+
proj.setting(:ldflags, "-L#{proj.libdir} -L/opt/pl-build-tools/lib -Wl,-rpath=#{proj.libdir}")
83+
84+
# Platform specific overrides or settings, which may override the defaults
85+
86+
# Harden Linux ELF binaries by compiling with PIE (Position Independent Executables) support,
87+
# stack canary and full RELRO.
88+
# We only do this on platforms that use their default OS toolchain since pl-gcc versions
89+
# are too old to support these flags.
90+
if platform.name =~ /sles-15|el-8|debian-10/ || platform.is_fedora?
91+
proj.setting(:cppflags, "-I#{proj.includedir} -D_FORTIFY_SOURCE=2")
92+
proj.setting(:cflags, '-fstack-protector-strong -fno-plt -O2')
93+
proj.setting(:ldflags, "-L#{proj.libdir} -Wl,-rpath=#{proj.libdir},-z,relro,-z,now")
94+
end
95+
96+
# Required to build ruby
97+
proj.component 'libffi'
98+
proj.component 'libyaml'
99+
100+
# Actually include the openssl/ruby components.
101+
proj.component "openssl-#{proj.openssl_version}"
102+
proj.component "ruby-#{proj.ruby_version}"
103+
104+
# What to build?
105+
# --------------
106+
107+
# This component installs the puppet-agent build dependency:
108+
proj.component('runtime-pe-bolt-server')
109+
110+
# R10k dependencies
111+
proj.component('rubygem-gettext-setup')
112+
113+
# Puppet dependencies
114+
proj.component 'rubygem-deep_merge'
115+
proj.component 'rubygem-text'
116+
proj.component 'rubygem-locale'
117+
proj.component 'rubygem-gettext'
118+
proj.component 'rubygem-fast_gettext'
119+
proj.component 'rubygem-semantic_puppet'
120+
121+
# hiera-eyaml and its dependencies
122+
proj.component('rubygem-highline')
123+
proj.component('rubygem-optimist')
124+
proj.component('rubygem-hiera-eyaml')
125+
126+
# faraday and its dependencies
127+
proj.component('rubygem-faraday')
128+
proj.component('rubygem-faraday-em_http')
129+
proj.component('rubygem-faraday-em_synchrony')
130+
proj.component('rubygem-faraday-excon')
131+
proj.component('rubygem-faraday-httpclient')
132+
proj.component('rubygem-faraday-multipart')
133+
proj.component('rubygem-faraday-net_http')
134+
proj.component('rubygem-faraday-net_http_persistent')
135+
proj.component('rubygem-faraday-patron')
136+
proj.component('rubygem-faraday-rack')
137+
proj.component('rubygem-faraday-retry')
138+
proj.component('rubygem-faraday_middleware')
139+
proj.component('rubygem-ruby2_keywords')
140+
141+
# Core dependencies
142+
proj.component('rubygem-addressable')
143+
proj.component('rubygem-aws-eventstream')
144+
proj.component('rubygem-aws-partitions')
145+
proj.component('rubygem-aws-sdk-core')
146+
proj.component('rubygem-aws-sdk-ec2')
147+
proj.component('rubygem-aws-sigv4')
148+
proj.component('rubygem-bcrypt_pbkdf')
149+
proj.component('rubygem-bindata')
150+
proj.component('rubygem-builder')
151+
proj.component('rubygem-CFPropertyList')
152+
proj.component('rubygem-colored2')
153+
proj.component('rubygem-concurrent-ruby')
154+
proj.component('rubygem-connection_pool')
155+
proj.component('rubygem-cri')
156+
proj.component('rubygem-ed25519')
157+
proj.component('rubygem-erubi')
158+
proj.component('rubygem-facter')
159+
proj.component('rubygem-ffi')
160+
proj.component('rubygem-gssapi')
161+
proj.component('rubygem-gyoku')
162+
proj.component('rubygem-hiera')
163+
proj.component('rubygem-hocon')
164+
proj.component('rubygem-httpclient')
165+
proj.component('rubygem-jmespath')
166+
proj.component('rubygem-jwt')
167+
proj.component('rubygem-little-plugger')
168+
proj.component('rubygem-log4r')
169+
proj.component('rubygem-logging')
170+
proj.component('rubygem-minitar')
171+
proj.component('rubygem-molinillo')
172+
proj.component('rubygem-multi_json')
173+
proj.component('rubygem-multipart-post')
174+
proj.component('rubygem-net-http-persistent')
175+
proj.component('rubygem-net-scp')
176+
proj.component('rubygem-net-ssh')
177+
proj.component('rubygem-net-ssh-krb')
178+
proj.component('rubygem-nori')
179+
proj.component('rubygem-orchestrator_client')
180+
proj.component('rubygem-public_suffix')
181+
proj.component('rubygem-paint')
182+
proj.component('rubygem-puppet')
183+
proj.component('rubygem-puppet_forge')
184+
proj.component('rubygem-puppet-resource_api')
185+
proj.component('rubygem-puppet-strings')
186+
proj.component('rubygem-puppetfile-resolver')
187+
proj.component('rubygem-r10k')
188+
proj.component('rubygem-rgen')
189+
proj.component('rubygem-rubyntlm')
190+
proj.component('rubygem-ruby_smb')
191+
proj.component('rubygem-rubyzip')
192+
proj.component('rubygem-scanf')
193+
proj.component('rubygem-terminal-table')
194+
proj.component('rubygem-thor')
195+
proj.component('rubygem-unicode-display_width')
196+
proj.component('rubygem-webrick')
197+
proj.component('rubygem-yard')
198+
199+
# Core Windows dependencies
200+
proj.component('rubygem-windows_error')
201+
proj.component('rubygem-winrm')
202+
proj.component('rubygem-winrm-fs')
203+
204+
# Export the settings for the current project and platform as yaml during builds
205+
proj.publish_yaml_settings
206+
207+
if platform.name =~ /^el-8-.*/
208+
# Disable build-id generation since it's currently generating conflicts
209+
# with system libgcc and libstdc++
210+
proj.package_override("# Disable build-id generation to avoid conflicts\n%global _build_id_links none")
211+
end
212+
213+
proj.directory(proj.prefix)

Diff for: configs/projects/pe-bolt-server-runtime-main.rb

+5-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@
77
# Once we are no longer using ruby 2.5 we can update.
88
proj.setting(:no_doc, true)
99

10-
instance_eval File.read(File.join(File.dirname(__FILE__), '_shared-pe-bolt-server.rb'))
10+
proj.setting(:ruby_version, '3.2.2')
11+
proj.setting(:openssl_version, '3.0')
12+
13+
instance_eval File.read(File.join(File.dirname(__FILE__), '_shared-pe-bolt-server_with_ruby.rb'))
14+
1115
# TODO: Work around PE-36078 by using forked non-optimal solution
1216
proj.component('rubygem-rubyntlm-fork')
1317
proj.component 'rubygem-prime'

0 commit comments

Comments
 (0)