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
 |