chef/cookbooks/golang/resources/default.rb

170 lines
5.3 KiB
Ruby

#
# Cookbook:: golang
# Resource:: default
#
# Copyright:: 2020-2021, Sous-chefs
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy
# of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
unified_mode true
# Install golang by compiling from source
property :from_source, [true, false], default: false
# Base directory for go
property :install_dir, String, default: '/usr/local'
property :gopath, String, default: '/opt/go'
property :gobin, String, default: '/opt/go/bin'
# Directory and file attributes
property :owner, String, default: 'root'
property :group, String, default: 'root'
property :directory_mode, String, default: '0755'
# version to install
# ark input binaries and stuff download
# e.g. https://dl.google.com/go/go1.14.4.linux-amd64.tar.gz
# https://dl.google.com/go/go1.14.4/linux-amd64.tar.gz
# https://golang.org/dl/go1.14.6.darwin-amd64.tar.gz
# https://golang.org/dl/go1.14.6.linux-amd64.tar.gz
property :url, String, default: 'https://golang.org/dl/goVERSION.OS-PLATFORM.tar.gz'
property :version, String, default: '1.14.4'
# ark input source
# e.g. https://dl.google.com/go/go1.14.4.src.tar.gz
property :source_url, String, default: 'https://golang.org/dl/goVERSION.src.tar.gz'
property :source_version, String, default: '1.14.4'
# installation script from the source repository
property :source_method, String, default: 'all.bash'
# install SCM packages
property :scm, [true, false], default: true
property :scm_packages, [String, Array], default: %w(git mercurial)
action_class do
def bin_url
return new_resource.url if property_is_set?(:url)
new_resource.url.sub(/PLATFORM/, platform).sub(/OS/, os).sub(/VERSION/, new_resource.version)
end
def source_url
return new_resource.source_url if property_is_set?(:source_url)
new_resource.source_url.sub(/VERSION/, new_resource.source_version)
end
def os
node['os']
end
def platform
node['kernel']['machine'] =~ /i.86/ ? '386' : 'amd64'
end
end
action :install do
directory new_resource.gopath do
recursive true
owner new_resource.owner
group new_resource.group
mode new_resource.directory_mode
end
directory new_resource.gobin do
recursive true
owner new_resource.owner
group new_resource.group
mode new_resource.directory_mode
end
directory new_resource.install_dir do
recursive true
mode new_resource.directory_mode
end
directory ::File.join(Chef::Config[:file_cache_path], 'go') do
recursive true
end
template '/etc/profile.d/golang.sh' do
source 'golang.sh.erb'
mode new_resource.directory_mode
variables gobin: new_resource.gobin,
gopath: new_resource.gopath,
install_dir: new_resource.install_dir
end
if new_resource.scm
apt_update do
only_if { platform_family? 'debian' }
end
package new_resource.scm_packages
end
# pgk to install go binaries, doc, base packages
# ark is not idempotent by itself. Check to see if the go binary is the correct version
url = bin_url
ark 'go' do
url url
version new_resource.version
not_if "/usr/local/go-#{new_resource.version}/bin/go version | grep #{new_resource.version}"
end
##### SOURCE BUILD
if new_resource.from_source
directory ::File.join(new_resource.install_dir, 'go', 'bin') do
recursive true
mode new_resource.directory_mode
end
build_essential
file "#{new_resource.install_dir}/go" do
manage_symlink_source true
action :delete
only_if do
# Create idempotency by not deleting symlink if it points to source build
::File.exist?("#{new_resource.install_dir}/go") &&
::File.ftype("#{new_resource.install_dir}/go") == 'link' &&
::File.readlink("#{new_resource.install_dir}/go") != "#{new_resource.install_dir}/go-source"
end
end
url = source_url
ark 'go' do # resource with the same name, that's an issue. Source install
url url
version 'source'
action :put
release_file '/tmp/ark_release_file'
not_if "test -x #{::File.join(new_resource.install_dir, 'go', 'bin', 'go')} && #{::File.join(new_resource.install_dir, 'go', 'bin', 'go')} version | grep #{new_resource.source_version}"
end
# see if build already done
# converge_by if not done
execute 'build-golang' do
cwd "#{new_resource.install_dir}/go/src"
command "./#{new_resource.source_method}"
environment({
# Use the package-installed Go as the bootstrap version b/c Go is built with Go
GOROOT_BOOTSTRAP: "#{new_resource.install_dir}/go-#{new_resource.version}",
GOROOT: "#{new_resource.install_dir}/go",
GOBIN: "#{new_resource.install_dir}/go/bin",
})
not_if "test -x #{::File.join(new_resource.install_dir, 'go', 'bin', 'go')} && #{::File.join(new_resource.install_dir, 'go', 'bin', 'go')} version | grep #{new_resource.source_version}"
end
end
end