diff --git a/config/travis.example.yml b/config/travis.example.yml index 7499ea241..d12c050f1 100644 --- a/config/travis.example.yml +++ b/config/travis.example.yml @@ -1,6 +1,6 @@ sentry: &sentry dsn: https://tok:en@app.getsentry.com/app_id - + production: domain: travis-ci.local notifications: @@ -48,3 +48,6 @@ test: billing: url: 'http://localhost:9292' auth_key: 't0Ps3Cr3t' + artifact_manager: + url: 'http://artifact_manager:3000' + auth_key: 't0Ps3Cr3t' diff --git a/lib/travis/addons/handlers.rb b/lib/travis/addons/handlers.rb index 3c91cdad5..5d6792e10 100644 --- a/lib/travis/addons/handlers.rb +++ b/lib/travis/addons/handlers.rb @@ -19,3 +19,4 @@ require 'travis/addons/handlers/intercom' require 'travis/addons/handlers/billing' require 'travis/addons/handlers/job_config' +require 'travis/addons/handlers/artifact_manager' diff --git a/lib/travis/addons/handlers/artifact_manager.rb b/lib/travis/addons/handlers/artifact_manager.rb new file mode 100644 index 000000000..a9e79dc9a --- /dev/null +++ b/lib/travis/addons/handlers/artifact_manager.rb @@ -0,0 +1,96 @@ +require 'travis/addons/handlers/base' +require 'travis/addons/config' + +module Travis + module Addons + module Handlers + class ArtifactManager < Base + EVENTS = ['job:finished', 'job:canceled'].freeze + KEY = :artifact_manager + + MSGS = { + failed: 'Failed to push update to artifact-manager: %s' + } + + def handle? + artifact_manager_url && artifact_manager_auth_key + end + + def handle + publish unless Travis::Hub.context.config.enterprise? + end + + private + + def artifact_manager_url + @artifact_manager_url ||= Travis::Hub.context.config.artifact_manager.url if Travis::Hub.context.config.artifact_manager + end + + def artifact_manager_auth_key + @artifact_manager_auth_key ||= Travis::Hub.context.config.artifact_manager.auth_key if Travis::Hub.context.config.artifact_manager + end + + def publish + send_data if image_creation? && failed? + rescue StandardError => e + logger.error MSGS[:failed] % e.message + end + + def send_data + owner_type = object.repository.owner_type.downcase + owner_id = object.repository.owner_id + reason = object.state.to_sym == :canceled ? 'job cancel' : 'job error' + result = connection.patch("/image/#{owner_type}/#{owner_id}/#{image_name}", { state: 'error' , reason: }) + + logger.error "Artifact manager error: #{result.status} #{result.body}" unless result.success? + end + + def image_name + config.dig('vm', 'create', 'name') + end + + def image_creation? + !image_name.nil? + end + + def failed? + [:failed, :errored, :canceled].include?(object.state.to_sym) + end + + def config + @config ||= begin + cfg = object.config_id ? ::JobConfig.find(object.config_id).config : {} + cfg.is_a?(String) && cfg.length > 0 ? JSON.parse(cfg) : cfg + end + end + + def connection + @connection ||= Faraday.new(url: artifact_manager_url, ssl: { ca_path: '/usr/lib/ssl/certs' }) do |conn| + conn.request :authorization, :basic, '_', artifact_manager_auth_key + conn.headers['Content-Type'] = 'application/json' + conn.headers['X-Travis-User-Id'] = object.build&.sender_id&.to_s + conn.request :json + conn.response :json + conn.adapter :net_http + end + end + + def logger + Addons.logger + end + + def finished? + event != 'job:started' + end + + # EventHandler + class EventHandler < Addons::Instrument + def notify_completed + publish + end + end + EventHandler.attach_to(self) + end + end + end +end diff --git a/lib/travis/hub/config.rb b/lib/travis/hub/config.rb index 30c4aa9e9..80bb2cc50 100644 --- a/lib/travis/hub/config.rb +++ b/lib/travis/hub/config.rb @@ -42,7 +42,8 @@ def jwt_key(type) limit: { resets: { max: 50, after: 6 * 60 * 60 } }, notifications: ['billing'], auth: { jwt_private_key: jwt_key(:private), jwt_public_key: jwt_key(:public), http_basic_auth: }, - billing: { url: ENV['BILLING_URL'] || 'http://localhost:9292', auth_key: ENV['BILLING_AUTH_KEY'] || 't0Ps3Cr3t' } + billing: { url: ENV['BILLING_URL'] || 'http://localhost:9292', auth_key: ENV['BILLING_AUTH_KEY'] || 't0Ps3Cr3t' }, + artifact_manager: { url: ENV['ARTIFACT_MANAGER_URL'] || 'http://artifact_manager:3000', auth_key: ENV['ARTIFACT_MANAGER_AUTH_KEY'] || 't0Ps3Cr3t' } def metrics # TODO: cleanup keychain? diff --git a/lib/travis/hub/context.rb b/lib/travis/hub/context.rb index cb7a032c6..900cc82a6 100644 --- a/lib/travis/hub/context.rb +++ b/lib/travis/hub/context.rb @@ -53,7 +53,7 @@ def addons # TODO: move keen to the keychain? it isn't required on enterprise. # then again, it's not active, unless the keen credentials are # present in the env. - addons = config.notifications.flatten + %w[insights logsearch scheduler keenio metrics] + addons = config.notifications.flatten + %w[insights logsearch scheduler keenio metrics artifact_manager] addons << 'merge' if ENV['NOTIFY_MERGE'] addons end