#!/usr/bin/env ruby require 'json' require 'erb' require 'pry' binaries = { skaffold: { url: "https://storage.googleapis.com/skaffold/releases/<%= version %>/skaffold-linux-amd64", version: "v0.17.0", version_argument: "version", version_match: "<%= version %>" }, kubectl: { url: "https://storage.googleapis.com/kubernetes-release/release/<%= version %>/bin/linux/amd64/kubectl", version: "v1.15.1", version_argument: "version --client", version_match: '^Client Version.*GitVersion:\"(?<%= version %>)\"' }, kustomize: { url: "https://github.com/kubernetes-sigs/kustomize/releases/download/v<%= version %>/kustomize_<%= version %>_linux_amd64", version: "2.0.3", version_argument: "version", version_match: '^Version: {KustomizeVersion:(?<%= version %>) ' }, yq: { url: "https://github.com/mikefarah/yq/releases/download/<%= version %>/yq_linux_amd64", version: "2.1.1", version_argument: "--version", version_match: '^yq version <%= version %>' }, lab: { url: "https://github.com/zaquestion/lab/releases/download/v<%= version %>/lab_<%= version %>_linux_amd64.tar.gz", version: "0.14.0", version_argument: "version", version_match: '^lab version <%= version %>', }, gopass: { url: "https://github.com/gopasspw/gopass/releases/download/v<%= version %>/gopass-<%= version %>-linux-amd64.tar.gz", version: "1.8.6", version_argument: "version", version_match: '^gopass <%= version %> ', extractor: lambda() do Dir.glob("gopass*/gopass") end }, greenclip: { url: "https://github.com/erebe/greenclip/releases/download/<%= version %>/greenclip", version: "3.1", version_argument: "version", version_match: '^greenclip v<%= version %>', }, packer: { url: "https://releases.hashicorp.com/packer/<%= version %>/packer_<%= version %>_linux_amd64.zip", version: "1.3.5", version_argument: "version", version_match: "^Packer v<%= version %>" }, minikube: { url: "https://storage.googleapis.com/minikube/releases/v<%= version %>/minikube-linux-amd64", version: "0.33.1", version_argument: "version", version_match: "^minikube version: v<%= version %>" }, terraform: { url: "https://releases.hashicorp.com/terraform/<%= version %>/terraform_<%= version %>_linux_amd64.zip", version: "0.12.2", version_argument: "version", version_match: "^Terraform v<%= version %>" }, vagrant: { url: "https://releases.hashicorp.com/vagrant/<%= version %>/vagrant_<%= version %>_linux_amd64.zip", version: "2.2.5", version_argument: "version", version_match: "^Vagrant <%= version %>" }, helm: { url: "https://storage.googleapis.com/kubernetes-helm/helm-v<%= version %>-linux-amd64.tar.gz", version: "2.13.0", version_argument: "--version", version_match: "v<%= version %>" }, fzf: { url: "https://github.com/junegunn/fzf-bin/releases/download/<%= version %>/fzf-<%= version %>-linux_amd64.tgz", version: "0.17.5", version_argument: "--version", version_match: "<%= version %>.*" }, bat: { url: "https://github.com/sharkdp/bat/releases/download/v<%= version %>/bat-v<%= version %>-x86_64-unknown-linux-gnu.tar.gz", version: "0.10.0", version_argument: "--version", version_match: "v<%= version %>" }, hcloud: { url: "https://github.com/hetznercloud/cli/releases/download/v<%= version %>/hcloud-linux-amd64-v<%= version %>.tar.gz", version: "1.12.0", version_argument: "version", version_match: "v<%= version %>" }, hugo: { url: "https://github.com/gohugoio/hugo/releases/download/v<%= version %>/hugo_<%= version %>_Linux-64bit.tar.gz", version: "0.55.6", version_argument: "version", version_match: "Hugo Static Site Generator v<%= version %>" }, } tmpdir = Dir.mktmpdir binaries.each do |binary, download| target = File.expand_path("~/bin/#{binary}") version = download[:version] download_url = ERB.new(download[:url]).result(binding) version_match = Regexp.new(ERB.new(download[:version_match]).result(binding)) version_string = "#{target} #{download[:version_argument]}" puts target if File.executable? target and `#{version_string}`.match(version_match) puts "→ Already at #{version}" else puts "→ Installing #{binary} #{download[:version]}" File.unlink target if File.exists? target download_dir = File.join(tmpdir, binary.to_s) Dir.mkdir(download_dir) Dir.chdir(download_dir) do system "curl -s -L -O #{download_url}" downloaded_file = Dir.glob("*").first extraction_command = case File.extname(downloaded_file) when ".tgz", ".tar.gz", ".gz" then "tar xvf" when ".zip" then "unzip" end system("#{extraction_command} #{downloaded_file} > /dev/null") extracted_executables = Dir.glob("**/**").select do |f| `file #{f}`.match(/LSB executable|ELF 64-bit LSB shared object/) end FileUtils.mv(File.realpath(extracted_executables.first), target) end File.chmod(0755, target) end end