module ShopifyCli class Packager PACKAGING_DIR = File.join(ShopifyCli::ROOT, "packaging") BUILDS_DIR = File.join(PACKAGING_DIR, "builds", ShopifyCli::VERSION) def initialize FileUtils.mkdir_p(BUILDS_DIR) end def build_debian ensure_program_installed("dpkg-deb", "brew install dpkg") root_dir = File.join(PACKAGING_DIR, "debian") debian_dir = File.join(root_dir, "shopify-cli", "DEBIAN") FileUtils.mkdir_p(debian_dir) puts "\nBuilding Debian package" puts "Generating metadata files..." Dir.glob("#{debian_dir}/*").each { |file| File.delete(file) } metadata_files = %w(control preinst prerm) metadata_files.each do |file| file_path = File.join(debian_dir, file) file_contents = File.read(File.join(root_dir, "#{file}.base")) file_contents = file_contents.gsub("SHOPIFY_CLI_VERSION", ShopifyCli::VERSION) File.open(file_path, "w", 0775) { |f| f.write(file_contents) } end puts "Building package..." Dir.chdir(root_dir) raise "Failed to build package" unless system("dpkg-deb", "-b", "shopify-cli") output_path = File.join(root_dir, "shopify-cli.deb") final_path = File.join(BUILDS_DIR, "shopify-cli-#{ShopifyCli::VERSION}.deb") puts "Moving generated package: \n From: #{output_path}\n To: #{final_path}\n\n" FileUtils.mv(output_path, final_path) end def build_rpm ensure_program_installed("rpmbuild", "brew install rpm") root_dir = File.join(PACKAGING_DIR, "rpm") rpm_build_dir = File.join(root_dir, "build") FileUtils.mkdir_p(rpm_build_dir) spec_path = File.join(root_dir, "shopify-cli.spec") puts "\nBuilding RPM package" puts "Generating spec file..." File.delete(spec_path) if File.exist?(spec_path) spec_contents = File.read(File.join(root_dir, "shopify-cli.spec.base")) spec_contents = spec_contents.gsub("SHOPIFY_CLI_VERSION", ShopifyCli::VERSION) File.write(spec_path, spec_contents) puts "Building package..." Dir.chdir(root_dir) system("rpmbuild", "-bb", File.basename(spec_path)) output_dir = File.join(root_dir, "build", "noarch") puts "Moving generated packages: \n From: #{output_dir}\n To: #{BUILDS_DIR}\n\n" FileUtils.mv(Dir.glob("#{output_dir}/*.rpm"), BUILDS_DIR) end def build_homebrew root_dir = File.join(PACKAGING_DIR, "homebrew") build_path = File.join(BUILDS_DIR, "shopify-cli.rb") puts "\nBuilding Homebrew package" puts "Generating formula..." File.delete(build_path) if File.exist?(build_path) spec_contents = File.read(File.join(root_dir, "shopify-cli.base.rb")) spec_contents = spec_contents.gsub("SHOPIFY_CLI_VERSION", ShopifyCli::VERSION) puts "Grabbing sha256 checksum from Rubygems.org" require "digest/sha2" require "open-uri" gem_checksum = open("https://rubygems.org/downloads/shopify-cli-#{ShopifyCli::VERSION}.gem") do |io| Digest::SHA256.new.hexdigest(io.read) end puts "Got sha256 checksum for gem: #{gem_checksum}" spec_contents = spec_contents.gsub("SHOPIFY_CLI_GEM_CHECKSUM", gem_checksum) puts "Writing generated formula\n To: #{build_path}\n\n" File.write(build_path, spec_contents) end private def ensure_program_installed(program, installation_cmd) unless system(program, "--version", out: File::NULL, err: File::NULL) raise <<~MESSAGE Could not find program #{program} which is required to build the package. You can install it by running #{installation_cmd}. MESSAGE end end end end