require 'fileutils' require_relative 'helper' module Dply class CodeArchive include Helper attr_reader :name, :branch attr_writer :skip_depcheck def initialize(name, revision:) @name = name @branch = get_branch @revision = revision @dir = "#{Dir.pwd}/tmp/build_artifacts" @skip_depcheck = false validate end def build(empty: false, gnu_tar: false, &block) make_dir create_tar empty, gnu_tar instance_eval(&block) if block add_git_commit_id add_revision add_archive_name end def depcheck! return if @skip_depcheck command = %(ruby -W0 "#{__dir__}/scripts/depcheck.rb" #{tar}) logger.bullet "depcheck #{tar}" env = logger.debug? ? { "LOG_DEBUG" => "true" } : {} cmd command, display: false, env: env end def compress! cmd %(#{gzip} -f -9 "#{tar}") end private def get_branch out = `git rev-parse --abbrev-ref HEAD` out.chomp.tr("/", "_") end def tar @tar ||= "#{@dir}/#{@name}-#{@revision}-#{@branch}.tar" end def make_dir FileUtils.mkdir @dir if not File.directory? @dir end def create_tar(empty, gnu_tar) tmp_dir = "tmp/app_code" return if empty if gnu_tar FileUtils.rm_rf tmp_dir FileUtils.mkdir tmp_dir sh "git archive HEAD | tar xf - -C #{tmp_dir}" cmd "tar cf #{tar} -C #{tmp_dir} ." else cmd "git archive -o #{tar} HEAD" end ensure FileUtils.rm_rf tmp_dir end def add(file, dereference: false) realpath = File.realpath(file) tar_relpath = Pathname.new(tar).relative_path_from(Pathname.new(Dir.pwd)).to_s command = ["tar", "--append", "-f", tar_relpath] command << "-h" if dereference if File.symlink?(file) && File.directory?(realpath) prefix = file.sub(":", '\:') command.concat ["-C", file, "--transform", "s:^./:#{prefix}/:S", "."] else command << file end cmd command end def remove(file) cmd %(tar --delete -f "#{tar}" "#{file}") end def add_git_commit_id commit_id = `git rev-parse HEAD`.chomp! file = "GIT_COMMIT_ID" File.write(file, commit_id) add file end def add_revision file = "REVISION" File.write(file, @revision) add file end def add_archive_name file = "ARCHIVE_NAME" File.write(file, @name) add file end def add_bundle add ".bundle" add "vendor/bundle" end def gzip File.exist?("/usr/bin/pigz") ? "pigz" : "gzip" end def validate [:name, :branch, :revision, :dir].each do |i| ivar = "@#{i}" v = instance_variable_get(ivar) raise Error, "archive param :#{i} is empty" if (!v || v.strip.empty?) end end end end