|
1 | 1 | # frozen_string_literal: true
|
2 | 2 |
|
| 3 | +# Define log color codes |
| 4 | +RED = "\e[31m" |
| 5 | +GREEN = "\e[32m" |
| 6 | +YELLOW = "\e[33m" |
| 7 | +BLUE = "\e[34m" |
| 8 | +MAGENTA = "\e[35m" |
| 9 | +CYAN = "\e[36m" |
| 10 | +RESET = "\e[0m" |
| 11 | +PREFIX = "[PYENV-SETUP]" |
| 12 | + |
| 13 | +Chef::Log.info("#{CYAN}#{PREFIX} π Starting pyenv installation process#{RESET}") |
| 14 | + |
3 | 15 | pyenv_installer_path = ::File.join(
|
4 | 16 | Chef::Config[:file_cache_path], 'pyenv-installer'
|
5 | 17 | )
|
6 | 18 |
|
| 19 | +Chef::Log.info("#{BLUE}#{PREFIX} π₯ Downloading pyenv installer to #{pyenv_installer_path}#{RESET}") |
7 | 20 | remote_file pyenv_installer_path do
|
8 | 21 | source node['travis_python']['pyenv_install_url']
|
9 | 22 | owner node['travis_build_environment']['user']
|
10 | 23 | group node['travis_build_environment']['group']
|
11 | 24 | mode 0o755
|
| 25 | + notifies :run, 'ruby_block[log_pyenv_download]', :immediately |
| 26 | +end |
| 27 | + |
| 28 | +ruby_block 'log_pyenv_download' do |
| 29 | + block do |
| 30 | + Chef::Log.info("#{GREEN}#{PREFIX} β
Pyenv installer downloaded successfully to #{pyenv_installer_path}#{RESET}") |
| 31 | + end |
| 32 | + action :nothing |
12 | 33 | end
|
13 | 34 |
|
| 35 | +Chef::Log.info("#{BLUE}#{PREFIX} π§ Running pyenv installer script#{RESET}") |
14 | 36 | bash 'install_pyenv' do
|
15 | 37 | code pyenv_installer_path.to_s
|
16 | 38 | user node['travis_build_environment']['user']
|
17 | 39 | group node['travis_build_environment']['group']
|
18 | 40 | environment('HOME' => node['travis_build_environment']['home'])
|
19 | 41 | retries 2
|
20 | 42 | retry_delay 30
|
| 43 | + notifies :run, 'ruby_block[log_pyenv_install_result]', :immediately |
21 | 44 | end
|
22 | 45 |
|
| 46 | +ruby_block 'log_pyenv_install_result' do |
| 47 | + block do |
| 48 | + pyenv_path = "#{node['travis_build_environment']['home']}/.pyenv" |
| 49 | + if ::File.directory?(pyenv_path) |
| 50 | + Chef::Log.info("#{GREEN}#{PREFIX} β
Pyenv successfully installed to #{pyenv_path}#{RESET}") |
| 51 | + else |
| 52 | + Chef::Log.error("#{RED}#{PREFIX} β Failed to install pyenv to #{pyenv_path}#{RESET}") |
| 53 | + end |
| 54 | + end |
| 55 | + action :nothing |
| 56 | +end |
| 57 | + |
| 58 | +Chef::Log.info("#{BLUE}#{PREFIX} π Creating symlink to pyenv at /opt/pyenv#{RESET}") |
23 | 59 | link '/opt/pyenv' do
|
24 | 60 | to "#{node['travis_build_environment']['home']}/.pyenv"
|
25 | 61 | owner node['travis_build_environment']['user']
|
26 | 62 | group node['travis_build_environment']['group']
|
27 | 63 | mode 0o755
|
| 64 | + notifies :run, 'ruby_block[log_symlink_result]', :immediately |
| 65 | +end |
| 66 | + |
| 67 | +ruby_block 'log_symlink_result' do |
| 68 | + block do |
| 69 | + if ::File.symlink?('/opt/pyenv') |
| 70 | + Chef::Log.info("#{GREEN}#{PREFIX} β
Symlink to pyenv created successfully#{RESET}") |
| 71 | + else |
| 72 | + Chef::Log.error("#{RED}#{PREFIX} β Failed to create symlink to pyenv#{RESET}") |
| 73 | + end |
| 74 | + end |
| 75 | + action :nothing |
28 | 76 | end
|
29 | 77 |
|
30 | 78 | bash_profile = ::File.join(
|
31 | 79 | node['travis_build_environment']['home'],
|
32 | 80 | '.bash_profile'
|
33 | 81 | )
|
34 | 82 |
|
| 83 | +Chef::Log.info("#{BLUE}#{PREFIX} βοΈ Adding pyenv to PATH in #{bash_profile}#{RESET}") |
35 | 84 | bash 'export_path_to_pyenv' do
|
36 | 85 | code "echo 'export PATH=#{node['travis_build_environment']['home']}/.pyenv/bin:$PATH' >> #{bash_profile}"
|
37 | 86 | user node['travis_build_environment']['user']
|
38 | 87 | group node['travis_build_environment']['group']
|
| 88 | + notifies :run, 'ruby_block[log_path_export]', :immediately |
| 89 | +end |
| 90 | + |
| 91 | +ruby_block 'log_path_export' do |
| 92 | + block do |
| 93 | + Chef::Log.info("#{GREEN}#{PREFIX} β
Pyenv PATH export added to bash profile#{RESET}") |
| 94 | + end |
| 95 | + action :nothing |
39 | 96 | end
|
40 | 97 |
|
| 98 | +Chef::Log.info("#{BLUE}#{PREFIX} βοΈ Adding pyenv init to bash profile#{RESET}") |
41 | 99 | bash 'add_pyenv_init_to_bash_profile' do
|
42 | 100 | code "echo 'eval \"$(pyenv init -)\"' >> #{bash_profile}"
|
43 | 101 | user node['travis_build_environment']['user']
|
44 | 102 | group node['travis_build_environment']['group']
|
| 103 | + notifies :run, 'ruby_block[log_pyenv_init]', :immediately |
| 104 | +end |
| 105 | + |
| 106 | +ruby_block 'log_pyenv_init' do |
| 107 | + block do |
| 108 | + Chef::Log.info("#{GREEN}#{PREFIX} β
Pyenv init added to bash profile#{RESET}") |
| 109 | + end |
| 110 | + action :nothing |
45 | 111 | end
|
46 | 112 |
|
| 113 | +Chef::Log.info("#{BLUE}#{PREFIX} βοΈ Adding virtualenv init to bash profile#{RESET}") |
47 | 114 | bash 'add_virtualenv_init_to_bash_profile' do
|
48 | 115 | code "echo 'eval \"$(pyenv virtualenv-init -)\"' >> #{bash_profile}"
|
49 | 116 | user node['travis_build_environment']['user']
|
50 | 117 | group node['travis_build_environment']['group']
|
| 118 | + notifies :run, 'ruby_block[log_virtualenv_init]', :immediately |
51 | 119 | end
|
52 | 120 |
|
| 121 | +ruby_block 'log_virtualenv_init' do |
| 122 | + block do |
| 123 | + Chef::Log.info("#{GREEN}#{PREFIX} β
Pyenv virtualenv-init added to bash profile#{RESET}") |
| 124 | + end |
| 125 | + action :nothing |
| 126 | +end |
53 | 127 |
|
54 | 128 | pyenv_versions = %w[
|
55 | 129 | 3.7.6
|
|
58 | 132 | 3.10.9
|
59 | 133 | ]
|
60 | 134 |
|
| 135 | +Chef::Log.info("#{MAGENTA}#{PREFIX} π Installing Python versions: #{pyenv_versions.join(', ')}#{RESET}") |
61 | 136 | pyenv_versions.each do |version|
|
| 137 | + Chef::Log.info("#{YELLOW}#{PREFIX} β³ Starting installation of Python #{version}#{RESET}") |
62 | 138 | bash "pyenv_install_#{version}" do
|
63 |
| - code "source #{bash_profile} && pyenv install #{version}" |
| 139 | + code <<-EOH |
| 140 | + source #{bash_profile} |
| 141 | + echo "#{YELLOW}#{PREFIX} β³ Starting installation of Python #{version}#{RESET}" |
| 142 | + pyenv install #{version} |
| 143 | + if pyenv versions | grep #{version}; then |
| 144 | + echo "#{GREEN}#{PREFIX} β
Python #{version} installed successfully#{RESET}" |
| 145 | + else |
| 146 | + echo "#{RED}#{PREFIX} β Failed to install Python #{version}#{RESET}" |
| 147 | + exit 1 |
| 148 | + fi |
| 149 | + EOH |
64 | 150 | user node['travis_build_environment']['user']
|
65 | 151 | group node['travis_build_environment']['group']
|
66 | 152 | environment(
|
67 | 153 | 'HOME' => node['travis_build_environment']['home'],
|
68 | 154 | 'PATH' => ENV.fetch('PATH', nil)
|
69 | 155 | )
|
| 156 | + notifies :run, "ruby_block[log_python_#{version}_install]", :immediately |
| 157 | + end |
| 158 | + |
| 159 | + ruby_block "log_python_#{version}_install" do |
| 160 | + block do |
| 161 | + Chef::Log.info("#{GREEN}#{PREFIX} β
Completed installation attempt of Python #{version}#{RESET}") |
| 162 | + end |
| 163 | + action :nothing |
70 | 164 | end
|
71 | 165 | end
|
72 | 166 |
|
| 167 | +Chef::Log.info("#{BLUE}#{PREFIX} π Setting global Python version to 3.8.1#{RESET}") |
73 | 168 | bash 'pyenv_global_set_to_3.8.1' do
|
74 |
| - code "source #{bash_profile} && pyenv global 3.8.1" |
| 169 | + code <<-EOH |
| 170 | + source #{bash_profile} |
| 171 | + pyenv global 3.8.1 |
| 172 | + echo "#{BLUE}#{PREFIX} π Current Python version: $(python --version)#{RESET}" |
| 173 | + if [[ "$(python --version 2>&1)" == *"3.8.1"* ]]; then |
| 174 | + echo "#{GREEN}#{PREFIX} β
Successfully set global Python version to 3.8.1#{RESET}" |
| 175 | + else |
| 176 | + echo "#{RED}#{PREFIX} β Failed to set global Python version to 3.8.1#{RESET}" |
| 177 | + exit 1 |
| 178 | + fi |
| 179 | + EOH |
75 | 180 | user node['travis_build_environment']['user']
|
76 | 181 | group node['travis_build_environment']['group']
|
77 | 182 | environment(
|
78 | 183 | 'HOME' => node['travis_build_environment']['home'],
|
79 | 184 | 'PATH' => ENV.fetch('PATH', nil)
|
80 | 185 | )
|
| 186 | + notifies :run, 'ruby_block[log_global_python]', :immediately |
81 | 187 | end
|
82 | 188 |
|
| 189 | +ruby_block 'log_global_python' do |
| 190 | + block do |
| 191 | + Chef::Log.info("#{GREEN}#{PREFIX} β
Global Python version set to 3.8.1#{RESET}") |
| 192 | + end |
| 193 | + action :nothing |
| 194 | +end |
| 195 | + |
| 196 | +Chef::Log.info("#{BLUE}#{PREFIX} π¦ Installing virtualenv#{RESET}") |
83 | 197 | bash 'pip_install_virtualenv' do
|
84 |
| - code "source #{bash_profile} && pip install virtualenv==15.1.0" |
| 198 | + code <<-EOH |
| 199 | + source #{bash_profile} |
| 200 | + echo "#{BLUE}#{PREFIX} π¦ Installing virtualenv 15.1.0#{RESET}" |
| 201 | + pip install virtualenv==15.1.0 |
| 202 | + if pip list | grep virtualenv; then |
| 203 | + echo "#{GREEN}#{PREFIX} β
Virtualenv 15.1.0 installed successfully#{RESET}" |
| 204 | + else |
| 205 | + echo "#{RED}#{PREFIX} β Failed to install virtualenv#{RESET}" |
| 206 | + exit 1 |
| 207 | + fi |
| 208 | + EOH |
85 | 209 | user node['travis_build_environment']['user']
|
86 | 210 | group node['travis_build_environment']['group']
|
87 | 211 | environment(
|
88 | 212 | 'HOME' => node['travis_build_environment']['home'],
|
89 | 213 | 'PATH' => ENV.fetch('PATH', nil)
|
90 | 214 | )
|
| 215 | + notifies :run, 'ruby_block[log_virtualenv_install]', :immediately |
| 216 | +end |
| 217 | + |
| 218 | +ruby_block 'log_virtualenv_install' do |
| 219 | + block do |
| 220 | + Chef::Log.info("#{GREEN}#{PREFIX} β
Virtualenv installation completed#{RESET}") |
| 221 | + end |
| 222 | + action :nothing |
| 223 | +end |
| 224 | + |
| 225 | +Chef::Log.info("#{CYAN}#{PREFIX} π Pyenv and Python installation process completed#{RESET}") |
| 226 | + |
| 227 | +ruby_block 'verify_full_installation' do |
| 228 | + block do |
| 229 | + Chef::Log.info("#{MAGENTA}#{PREFIX} π Verifying full installation#{RESET}") |
| 230 | + pyenv_installed = ::File.directory?("#{node['travis_build_environment']['home']}/.pyenv") |
| 231 | + symlink_created = ::File.symlink?('/opt/pyenv') |
| 232 | + |
| 233 | + Chef::Log.info("#{pyenv_installed ? GREEN : RED}#{PREFIX} πΉ Pyenv installed: #{pyenv_installed ? 'β
' : 'β'}#{RESET}") |
| 234 | + Chef::Log.info("#{symlink_created ? GREEN : RED}#{PREFIX} πΉ Symlink created: #{symlink_created ? 'β
' : 'β'}#{RESET}") |
| 235 | + |
| 236 | + if pyenv_installed && symlink_created |
| 237 | + Chef::Log.info("#{GREEN}#{PREFIX} π Installation verification passed#{RESET}") |
| 238 | + else |
| 239 | + Chef::Log.error("#{RED}#{PREFIX} β Installation verification failed#{RESET}") |
| 240 | + end |
| 241 | + end |
| 242 | + action :run |
| 243 | +end |
| 244 | + |
| 245 | +# Final installation report |
| 246 | +ruby_block 'installation_summary' do |
| 247 | + block do |
| 248 | + puts "\n" |
| 249 | + puts "#{MAGENTA}#{PREFIX} =============================================#{RESET}" |
| 250 | + puts "#{MAGENTA}#{PREFIX} π― PYENV INSTALLATION SUMMARY#{RESET}" |
| 251 | + puts "#{MAGENTA}#{PREFIX} =============================================#{RESET}" |
| 252 | + puts "#{BLUE}#{PREFIX} π Pyenv location: #{node['travis_build_environment']['home']}/.pyenv#{RESET}" |
| 253 | + puts "#{BLUE}#{PREFIX} π Symlink: /opt/pyenv#{RESET}" |
| 254 | + puts "#{BLUE}#{PREFIX} π Python versions installed: #{pyenv_versions.join(', ')}#{RESET}" |
| 255 | + puts "#{BLUE}#{PREFIX} π Global Python version: 3.8.1#{RESET}" |
| 256 | + puts "#{BLUE}#{PREFIX} π Bash profile: #{bash_profile}#{RESET}" |
| 257 | + puts "#{MAGENTA}#{PREFIX} =============================================#{RESET}" |
| 258 | + puts "\n" |
| 259 | + end |
| 260 | + action :run |
91 | 261 | end
|
0 commit comments