170 lines
5.3 KiB
Ruby
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
|