mirror_dependencies.rb (63 lines of code) (raw):

# frozen_string_literal: true require 'yaml' require 'down' require 'semverly' # semver comparisons require 'digest' # compare checksums of tarballs REQUIREMENTS_URL = ENV['REQUIREMENTS_URL'] || 'https://gitlab.com/gitlab-org/charts/gitlab/-/raw/master/requirements.yaml' def download_requirements Down.download(REQUIREMENTS_URL) end def download_index(repository:) Down.download("#{repository}/index.yaml") end def download_tarball(url:, destination:) tempfile = Down.download(url) FileUtils.move tempfile, destination end def existing_digest(existing:, digest:) sha2 = Digest::SHA2.new File.open(existing) do |f| while (chunk = f.read(1024)) sha2 << chunk end end (digest == sha2.hexdigest) end def fetch_tarball(repository:, tarball_url:, destination_dir: 'mirror/', digest:) download = true url = tarball_url url = "#{repository}/#{tarball_url}" unless tarball_url.start_with? 'https://' basename = File.basename(url) destination = File.expand_path("#{destination_dir}/#{basename}") if File.exist? destination puts "== Package exists @ #{destination}" download = !existing_digest(existing: destination, digest: digest) end return unless download puts "++ Downloading #{url}" download_tarball(url: url, destination: destination) end def fetch_all_dependencies found = [] puts "Fetching requirements '#{REQUIREMENTS_URL}" requirements = YAML.safe_load(download_requirements) remotes = requirements['dependencies'].filter { |i| i['repository'] } remotes.each do |remote| puts "Fetching index from #{remote['repository']}" index = YAML.safe_load(download_index(repository: remote['repository'])) chart = index['entries'][remote['name']] puts "-- Looking up #{remote['name']} @ #{remote['version']}" version = chart.select do |v| chart_verison = SemVer.parse(v['version']) remote_version = SemVer.parse(remote['version']) chart_verison == remote_version end next unless version.length found.append version[0] fetch_tarball( repository: remote['repository'], tarball_url: version[0]['urls'][0], digest: version[0]['digest'] ) end end fetch_all_dependencies