# frozen_string_literal: true require_relative '../mixins/github_body' module Onebox module Engine class GithubActionsOnebox include Engine include LayoutSupport include JSON matches_regexp(/^https?:\/\/(?:www\.)?(?:(?:\w)+\.)?github\.com\/(?.+)\/(?.+)\/(actions\/runs\/[[:digit:]]+|pull\/[[:digit:]]*\/checks\?check_run_id=[[:digit:]]+)/) always_https def url if type == :actions_run "https://api.github.com/repos/#{match[:org]}/#{match[:repo]}/actions/runs/#{match[:run_id]}" elsif type == :pr_run "https://api.github.com/repos/#{match[:org]}/#{match[:repo]}/check-runs/#{match[:check_run_id]}" end end def self.priority 90 # overlaps with GithubPullRequestOnebox end private def match_url return if defined?(@match) && defined?(@type) if match = @url.match(/^https?:\/\/(?:www\.)?(?:(?:\w)+\.)?github\.com\/(?.+)\/(?.+)\/actions\/runs\/(?[[:digit:]]+)/) @match = match @type = :actions_run end if match = @url.match(/^https?:\/\/(?:www\.)?(?:(?:\w)+\.)?github\.com\/(?.+)\/(?.+)\/pull\/(?[[:digit:]]*)\/checks\?check_run_id=(?[[:digit:]]+)/) @match = match @type = :pr_run end end def match return @match if defined?(@match) match_url @match end def type return @type if defined?(@type) match_url @type end def data status = "unknown" if raw["status"] == "completed" if raw["conclusion"] == "success" status = "success" elsif raw["conclusion"] == "failure" status = "failure" elsif raw["conclusion"] == "cancelled" end elsif raw["status"] == "in_progress" status = "pending" end title = if type == :actions_run raw["head_commit"]["message"].lines.first elsif type == :pr_run pr_url = "https://api.github.com/repos/#{match[:org]}/#{match[:repo]}/pulls/#{match[:pr_id]}" ::MultiJson.load(URI.open(pr_url, read_timeout: timeout))["title"] end { link: @url, title: title, name: raw["name"], run_number: raw["run_number"], status => true, } end end end end