Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

optimize fetch to use local download #848

Open
wants to merge 8 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v1
- uses: actions/checkout@v4
- name: Build gem
uses: scarhand/actions-ruby@master
with:
Expand Down
9 changes: 4 additions & 5 deletions .github/workflows/ruby.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,12 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Set up Ruby 2.7
uses: ruby/setup-ruby@v1
with:
ruby-version: '2.7'
bundler: '2.4.22'
bundler-cache: true
- name: Build and test with Rake
run: |
gem install bundler -v 2.4.22
bundle install --jobs 4 --retry 3
bundle exec rake
run: bundle exec rake
2 changes: 1 addition & 1 deletion .github/workflows/ruby3.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ jobs:
ruby: [ '3.0', '3.1', '3.2']
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Set up Ruby 3.x
uses: ruby/setup-ruby@v1
with:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/security.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: checkout repo content
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
fetch-depth: 1
- name: setup ruby
Expand Down
50 changes: 6 additions & 44 deletions .rubocop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,29 +5,15 @@ require:
- rubocop-rspec

AllCops:
TargetRubyVersion: 2.3
TargetRubyVersion: 2.7
NewCops: enable
Exclude:
- "**/*.erb"
- spec/**/*
- vendor/**/*
- examples/**/*
- lib/vanagon/platform/defaults/*

Capybara/MatchStyle:
Enabled: true

Capybara/NegationMatcher:
Enabled: true

Capybara/SpecificActions:
Enabled: true

Capybara/SpecificFinders:
Enabled: true

Capybara/SpecificMatcher:
Enabled: true

Gemspec/DeprecatedAttributeAssignment:
Enabled: true

Expand Down Expand Up @@ -395,15 +381,6 @@ RSpec/DuplicatedMetadata:
RSpec/ExcessiveDocstringSpacing:
Enabled: true

RSpec/FactoryBot/ConsistentParenthesesStyle:
Enabled: true

RSpec/FactoryBot/FactoryNameStyle:
Enabled: true

RSpec/FactoryBot/SyntaxMethods:
Enabled: true

RSpec/IdenticalEqualityAssertion:
Enabled: true

Expand All @@ -416,21 +393,6 @@ RSpec/NoExpectationExample:
RSpec/PendingWithoutReason:
Enabled: true

RSpec/Rails/AvoidSetupHook:
Enabled: true

RSpec/Rails/HaveHttpStatus:
Enabled: true

RSpec/Rails/InferredSpecType:
Enabled: true

RSpec/Rails/MinitestAssertions:
Enabled: true

RSpec/Rails/TravelAround:
Enabled: true

RSpec/RedundantAround:
Enabled: true

Expand All @@ -446,16 +408,16 @@ RSpec/SubjectDeclaration:
RSpec/VerifiedDoubleReference:
Enabled: true

Rspec/BeforeAfterAll:
RSpec/BeforeAfterAll:
Enabled: false

Rspec/ExampleLength:
RSpec/ExampleLength:
Enabled: false

Rspec/HookArgument:
RSpec/HookArgument:
Enabled: false

Rspec/MultipleMemoizedHelpers:
RSpec/MultipleMemoizedHelpers:
Enabled: false

Security/CompoundHash:
Expand Down
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ This project adheres to [Semantic Versioning](https://semver.org).
This changelog adheres to [Keep a CHANGELOG](https://keepachangelog.com).

## [Unreleased]
- Bump minimum ruby requirement to 2.7

## [0.52.0] - 2024-06-03
### Added
Expand Down
2 changes: 1 addition & 1 deletion lib/vanagon/cli/build.rb
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ def options_translate(docopt_options)
'<platforms>' => :platforms,
'<targets>' => :targets
}
return docopt_options.map { |k, v| [translations[k], v] }.to_h
return docopt_options.transform_keys { |k| translations[k] }
end

def options_validate(options)
Expand Down
2 changes: 1 addition & 1 deletion lib/vanagon/cli/build_host_info.rb
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ def options_translate(docopt_options)
'<platforms>' => :platforms,
'<targets>' => :targets
}
return docopt_options.map { |k, v| [translations[k], v] }.to_h
return docopt_options.transform_keys { |k| translations[k] }
end
end
end
Expand Down
7 changes: 3 additions & 4 deletions lib/vanagon/cli/build_requirements.rb
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,8 @@ def run(options) # rubocop:disable Metrics/AbcSize

components = driver.project.components
component_names = components.map(&:name)
build_requirements = []
components.each do |component|
build_requirements << component.build_requires.reject do |requirement|
build_requirements = components.map do |component|
component.build_requires.reject do |requirement|
# only include external requirements: i.e. those that do not match
# other components in the project
component_names.include?(requirement)
Expand All @@ -61,7 +60,7 @@ def options_translate(docopt_options)
'<project-name>' => :project_name,
'<platform>' => :platform,
}
return docopt_options.map { |k, v| [translations[k], v] }.to_h
return docopt_options.transform_keys { |k| translations[k] }
end
end
end
Expand Down
2 changes: 1 addition & 1 deletion lib/vanagon/cli/completion.rb
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ def options_translate(docopt_options)
translations = {
'--shell' => :shell,
}
return docopt_options.map { |k, v| [translations[k], v] }.to_h
return docopt_options.transform_keys { |k| translations[k] }
end
end
end
Expand Down
12 changes: 5 additions & 7 deletions lib/vanagon/cli/dependencies.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,10 @@ def run(options)

projects.each do |project|
platforms.each do |platform|
begin
artifact = Vanagon::Driver.new(platform, project, options)
artifact.dependencies
rescue RuntimeError => e
failures.push("#{project}, #{platform}: #{e}")
end
artifact = Vanagon::Driver.new(platform, project, options)
artifact.dependencies
rescue RuntimeError => e
failures.push("#{project}, #{platform}: #{e}")
end
end

Expand Down Expand Up @@ -92,7 +90,7 @@ def options_translate(docopt_options)
'<project-name>' => :project_name,
'<platforms>' => :platforms
}
return docopt_options.map { |k, v| [translations[k], v] }.to_h
return docopt_options.transform_keys { |k| translations[k] }
end
end
end
Expand Down
2 changes: 1 addition & 1 deletion lib/vanagon/cli/inspect.rb
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ def options_translate(docopt_options)
'<project-name>' => :project_name,
'<platforms>' => :platforms
}
return docopt_options.map { |k, v| [translations[k], v] }.to_h
return docopt_options.transform_keys { |k| translations[k] }
end

def options_validate(options)
Expand Down
2 changes: 1 addition & 1 deletion lib/vanagon/cli/list.rb
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ def options_translate(docopt_options)
'--projects' => :projects,
'--use-spaces' => :use_spaces,
}
return docopt_options.map { |k, v| [translations[k], v] }.to_h
return docopt_options.transform_keys { |k| translations[k] }
end
end
end
Expand Down
2 changes: 1 addition & 1 deletion lib/vanagon/cli/render.rb
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ def options_translate(docopt_options)
'<project-name>' => :project_name,
'<platforms>' => :platforms,
}
return docopt_options.map { |k, v| [translations[k], v] }.to_h
return docopt_options.transform_keys { |k| translations[k] }
end
end
end
Expand Down
2 changes: 1 addition & 1 deletion lib/vanagon/cli/ship.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ def parse(argv)
def run(_)
ENV['PROJECT_ROOT'] = Dir.pwd

if Dir['output/**/*'].select { |entry| File.file?(entry) }.empty?
if Dir['output/**/*'].none? { |entry| File.file?(entry) }
VanagonLogger.error 'vanagon: Error: No packages to ship in the "output" directory. Maybe build some first?'
exit 1
end
Expand Down
2 changes: 1 addition & 1 deletion lib/vanagon/cli/sign.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def parse(argv)

def run(_)
ENV['PROJECT_ROOT'] = Dir.pwd
if Dir['output/**/*'].select { |entry| File.file?(entry) }.empty?
if Dir['output/**/*'].none? { |entry| File.file?(entry) }
VanagonLogger.error 'sign: Error: No packages to sign in the "output" directory. Maybe build some first?'
exit 1
end
Expand Down
8 changes: 4 additions & 4 deletions lib/vanagon/common/user.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ def initialize(name, group = nil, shell = nil, is_system = false, homedir = nil)
#
# @return [true, false] true if all attributes have equal values. false otherwise.
def ==(other)
other.name == self.name && \
other.group == self.group && \
other.shell == self.shell && \
other.is_system == self.is_system && \
other.name == self.name &&
other.group == self.group &&
other.shell == self.shell &&
other.is_system == self.is_system &&
other.homedir == self.homedir
end
end
Expand Down
40 changes: 19 additions & 21 deletions lib/vanagon/component.rb
Original file line number Diff line number Diff line change
Expand Up @@ -260,27 +260,25 @@ def mirrors # rubocop:disable Lint/DuplicateMethods
# if #fetch is successful.
def fetch_mirrors(options)
mirrors.to_a.shuffle.each do |mirror|
begin
VanagonLogger.info %(Attempting to fetch from mirror URL "#{mirror}")
@source = Vanagon::Component::Source.source(mirror, **options)
return true if source.fetch
rescue Vanagon::InvalidSource
# This means that the URL was not a git repo or a valid downloadable file,
# which means either the URL is incorrect, or we don't have access to that
# resource. Return false, so that the pkg.url value can be used instead.
VanagonLogger.error %(Invalid source "#{mirror}")
rescue SocketError
# SocketError means that there was no DNS/name resolution
# for whatever remote protocol the mirror tried to use.
VanagonLogger.error %(Unable to resolve mirror URL "#{mirror}")
rescue StandardError
# Source retrieval does not consistently return a meaningful
# namespaced error message, which means we're brute-force rescuing
# StandardError. Also, we want to handle other unexpected things when
# we try reaching out to the URL, so that we can gracefully return
# false and fall back to fetching the pkg.url value instead.
VanagonLogger.error %(Unable to retrieve mirror URL "#{mirror}")
end
VanagonLogger.info %(Attempting to fetch from mirror URL "#{mirror}")
@source = Vanagon::Component::Source.source(mirror, **options)
return true if source.fetch
rescue Vanagon::InvalidSource
# This means that the URL was not a git repo or a valid downloadable file,
# which means either the URL is incorrect, or we don't have access to that
# resource. Return false, so that the pkg.url value can be used instead.
VanagonLogger.error %(Invalid source "#{mirror}")
rescue SocketError
# SocketError means that there was no DNS/name resolution
# for whatever remote protocol the mirror tried to use.
VanagonLogger.error %(Unable to resolve mirror URL "#{mirror}")
rescue StandardError
# Source retrieval does not consistently return a meaningful
# namespaced error message, which means we're brute-force rescuing
# StandardError. Also, we want to handle other unexpected things when
# we try reaching out to the URL, so that we can gracefully return
# false and fall back to fetching the pkg.url value instead.
VanagonLogger.error %(Unable to retrieve mirror URL "#{mirror}")
end
false
end
Expand Down
16 changes: 15 additions & 1 deletion lib/vanagon/component/source/http.rb
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,16 @@ def initialize(url, sum:, workdir:, sum_type:, **options)
# Download the source from the url specified. Sets the full path to the
# file as @file and the @extension for the file as a side effect.
def fetch
@file = File.basename(URI.parse(@url).path)
if File.exist?(File.join(workdir, file))
begin
return if verify
rescue RuntimeError, Errno::ENOENT
# ignore invalid "cached" file
end
end
remove_instance_variable(:@file)

@file = download(@url)
end

Expand All @@ -93,9 +103,13 @@ def file
#
# @raise [RuntimeError] an exception is raised if the sum does not match the sum of the file
def verify
return true if @verified

VanagonLogger.info "Verifying file: #{file} against sum: '#{sum}'"
actual = get_sum(File.join(workdir, file), sum_type)
return true if sum == actual

@verified = (sum == actual)
return true if @verified

fail "Unable to verify '#{File.join(workdir, file)}': #{sum_type} mismatch (expected '#{sum}', got '#{actual}')"
end
Expand Down
10 changes: 4 additions & 6 deletions lib/vanagon/engine/docker.rb
Original file line number Diff line number Diff line change
Expand Up @@ -140,12 +140,10 @@ def docker_cp_globs_from(globs, host_path)
# @return [void]
def wait_for_ssh
Vanagon::Utilities.retry_with_timeout(5, 5) do
begin
Vanagon::Utilities.remote_ssh_command("#{@target_user}@#{@target}", 'exit', @target_port)
rescue StandardError => e
sleep(1) # Give SSHD some time to start.
raise e
end
Vanagon::Utilities.remote_ssh_command("#{@target_user}@#{@target}", 'exit', @target_port)
rescue StandardError => e
sleep(1) # Give SSHD some time to start.
raise e
end
rescue StandardError => e
raise Vanagon::Error.wrap(e, "SSH was not up in the container after 5 seconds.")
Expand Down
2 changes: 1 addition & 1 deletion lib/vanagon/logger.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ def self.error(msg)
end

def initialize(output = $stdout)
super(output)
super
self.level = ::Logger::INFO
self.formatter = proc do |severity, datetime, progname, msg|
"#{msg}\n"
Expand Down
2 changes: 1 addition & 1 deletion lib/vanagon/platform/deb.rb
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ def initialize(name)
@num_cores = "/usr/bin/nproc"
@curl = "curl --silent --show-error --fail --location"
@valid_operators = ['<', '>', '<=', '>=', '=', '<<', '>>']
super(name)
super
end
end
end
Expand Down
Loading