Skip to content
Merged
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 updater/lib/dependabot/api_client.rb
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ def fetch_job
:vendor_dependencies, :security_updates_only
)

Job.new(job_data.merge(token: job_token))
Job.new(job_data.merge(id: job_id, token: job_token))
end

# TODO: Make `base_commit_sha` part of Dependabot::DependencyChange
Expand Down
27 changes: 7 additions & 20 deletions updater/lib/dependabot/base_command.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
require "dependabot/api_client"
require "dependabot/service"
require "dependabot/logger"
require "dependabot/logger/formats"
require "dependabot/python"
require "dependabot/terraform"
require "dependabot/elm"
Expand Down Expand Up @@ -46,20 +47,22 @@ def base_commit_sha
# This means that exceptions in tests can occasionally be swallowed
# and we must rely on reading RSpec output to detect certain problems.
def run
logger_info("Starting job processing")
Dependabot.logger.formatter = Dependabot::Logger::JobFormatter.new(job_id)
Dependabot.logger.info("Starting job processing")
perform_job
logger_info("Finished job processing")
Dependabot.logger.info("Finished job processing")
rescue StandardError => e
handle_exception(e)
service.mark_job_as_processed(base_commit_sha)
ensure
Dependabot.logger.formatter = Dependabot::Logger::BasicFormatter.new
Dependabot.logger.info(service.summary) unless service.noop?
raise Dependabot::RunFailure if Dependabot::Environment.github_actions? && service.failure?
end

def handle_exception(err)
logger_error(err.message)
err.backtrace.each { |line| logger_error(line) }
Dependabot.logger.error(err.message)
err.backtrace.each { |line| Dependabot.logger.error(line) }

Raven.capture_exception(err, raven_context)

Expand Down Expand Up @@ -88,22 +91,6 @@ def service

private

def logger_info(message)
Dependabot.logger.info(prefixed_log_message(message))
end

def logger_error(message)
Dependabot.logger.error(prefixed_log_message(message))
end

def prefixed_log_message(message)
message.lines.map { |line| [log_prefix, line].join(" ") }.join
end

def log_prefix
"<job_#{job_id}>" if job_id
end

def raven_context
context = { tags: {}, extra: { update_job_id: job_id } }
context[:tags][:package_manager] = job.package_manager if job
Expand Down
21 changes: 17 additions & 4 deletions updater/lib/dependabot/environment.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,16 @@ def self.job_token
@job_token ||= environment_variable("DEPENDABOT_JOB_TOKEN")
end

def self.debug_enabled?
@debug_enabled ||= job_debug_enabled? || environment_debug_enabled?
end

def self.log_level
debug_enabled? ? :debug : :info
end

def self.api_url
default = "http://localhost:3001"
@api_url ||= environment_variable("DEPENDABOT_API_URL", default)
@api_url ||= environment_variable("DEPENDABOT_API_URL", "http://localhost:3001")
end

def self.job_path
Expand All @@ -35,14 +42,20 @@ def self.job_definition
@job_definition ||= JSON.parse(File.read(job_path))
end

def self.environment_variable(variable_name, default = :_undefined)
private_class_method def self.environment_variable(variable_name, default = :_undefined)
return ENV.fetch(variable_name, default) unless default == :_undefined

ENV.fetch(variable_name) do
raise ArgumentError, "Missing environment variable #{variable_name}"
end
end

private_class_method :environment_variable
private_class_method def self.job_debug_enabled?
!!job_definition.dig("job", "debug")
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

!!nil returns false here but this is kind of a weird way to do it?

Copy link
Copy Markdown
Contributor Author

@brrygrdn brrygrdn Mar 9, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, the "double-bang operator" is an idiom in Ruby to force any type into Boolean but I do always feel odd about using it over the present? helper - but that's a Rails-isim we don't have in Core as we don't want to include ActiveSupport anymore.

end

private_class_method def self.environment_debug_enabled?
!!environment_variable("DEPENDABOT_DEBUG", false)
end
end
end
18 changes: 9 additions & 9 deletions updater/lib/dependabot/file_fetcher_command.rb
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,10 @@ def perform_job
@base_commit_sha ||= "unknown"
if Octokit::RATE_LIMITED_ERRORS.include?(e.class)
remaining = rate_limit_error_remaining(e)
logger_error("Repository is rate limited, attempting to retry in " \
"#{remaining}s")
Dependabot.logger.error("Repository is rate limited, attempting to retry in " \
"#{remaining}s")
else
logger_error("Error during file fetching; aborting")
Dependabot.logger.error("Error during file fetching; aborting")
end
handle_file_fetcher_error(e)
service.mark_job_as_processed(@base_commit_sha)
Expand Down Expand Up @@ -94,7 +94,7 @@ def job
:commit_message_options, :security_updates_only
)

@job ||= Job.new(attrs)
@job ||= Job.new(attrs.merge(id: job_id))
end

def file_fetcher
Expand Down Expand Up @@ -167,8 +167,8 @@ def handle_file_fetcher_error(error)
}
}
else
logger_error error.message
error.backtrace.each { |line| logger_error line }
Dependabot.logger.error(error.message)
error.backtrace.each { |line| Dependabot.logger.error line }
Raven.capture_exception(error, raven_context)

{ "error-type": "unknown_error" }
Expand Down Expand Up @@ -196,11 +196,11 @@ def record_error(error_details)
# connectivity through the proxy is established which can take 10-15s on
# the first request in some customer's environments.
def connectivity_check
logger_info("Connectivity check starting")
Dependabot.logger.info("Connectivity check starting")
github_connectivity_client(job).repository(job.source.repo)
logger_info("Connectivity check successful")
Dependabot.logger.info("Connectivity check successful")
rescue StandardError => e
logger_error("Connectivity check failed: #{e.message}")
Dependabot.logger.error("Connectivity check failed: #{e.message}")
end

def github_connectivity_client(job)
Expand Down
7 changes: 4 additions & 3 deletions updater/lib/dependabot/job.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,15 @@ module Dependabot
class Job
TOP_LEVEL_DEPENDENCY_TYPES = %w(direct production development).freeze

attr_reader :token, :dependencies, :package_manager, :ignore_conditions,
attr_reader :id, :token, :dependencies, :package_manager, :ignore_conditions,
:existing_pull_requests, :source, :credentials,
:requirements_update_strategy, :security_advisories,
:allowed_updates, :vendor_dependencies, :security_updates_only

# NOTE: "attributes" are fetched and injected at run time from both
# dependabot-api and dependabot-backend using the UpdateJobPrivateSerializer
# NOTE: "attributes" are fetched and injected at run time from
# dependabot-api using the UpdateJobPrivateSerializer
def initialize(attributes)
@id = attributes.fetch(:id)
@allowed_updates = attributes.fetch(:allowed_updates)
@commit_message_options = attributes.fetch(:commit_message_options, {})
@credentials = attributes.fetch(:credentials, [])
Expand Down
46 changes: 46 additions & 0 deletions updater/lib/dependabot/logger/formats.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# frozen_string_literal: true

require "logger"

# Provides Logger::Formatter classes specific to the Updater project to augment
# the global log helper defined in common/lib/dependabot/logger.rb
module Dependabot
module Logger
class BasicFormatter < ::Logger::Formatter
# Strip out timestamps as these are included in the runner's logger
def call(severity, _datetime, _progname, msg)
"#{severity} #{msg2str(msg)}\n"
end
end

class JobFormatter < ::Logger::Formatter
CLI_ID = "cli"
UNKNOWN_ID = "unknown_id"

def initialize(job_id)
@job_id = job_id
end

def call(severity, _datetime, _progname, msg)
[
severity,
job_prefix,
msg2str(msg)
].compact.join(" ") + "\n"
end

private

def job_prefix
return @job_prefix if defined? @job_prefix
# The dependabot/cli tool uses a placeholder value since it does not
# have an actual Job ID issued by the service.
#
# Let's just omit the prefix if this is the case.
return @job_prefix = nil if @job_id == CLI_ID

@job_prefix = "<job_#{@job_id || UNKNOWN_ID}>"
end
end
end
end
13 changes: 4 additions & 9 deletions updater/lib/dependabot/setup.rb
Original file line number Diff line number Diff line change
Expand Up @@ -30,18 +30,13 @@
config.processors += [ExceptionSanitizer]
end

require "logger"
require "dependabot/logger"

class LoggerFormatter < Logger::Formatter
# Strip out timestamps as these are included in the runner's logger
def call(severity, _datetime, _progname, msg)
"#{severity} #{msg2str(msg)}\n"
end
end
require "dependabot/logger/formats"
require "dependabot/environment"

Dependabot.logger = Logger.new($stdout).tap do |logger|
logger.formatter = LoggerFormatter.new
logger.level = Dependabot::Environment.log_level
logger.formatter = Dependabot::Logger::BasicFormatter.new
end

# We configure `Dependabot::Utils.register_always_clone` for some ecosystems. In
Expand Down
2 changes: 1 addition & 1 deletion updater/lib/dependabot/update_files_command.rb
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ def job
:commit_message_options, :security_updates_only
)

@job ||= Job.new(attrs)
@job ||= Job.new(attrs.merge(id: job_id))
end

def dependency_files
Expand Down
Loading