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