diff --git a/lib/datadog/ci/ext/environment.rb b/lib/datadog/ci/ext/environment.rb index e818a3a2..4d941c87 100644 --- a/lib/datadog/ci/ext/environment.rb +++ b/lib/datadog/ci/ext/environment.rb @@ -25,7 +25,6 @@ module Environment TAG_CI_ENV_VARS = "_dd.ci.env_vars" PROVIDERS = [ - ["GITHUB_SHA", :extract_github_actions], ["GITLAB_CI", :extract_gitlab], ["JENKINS_URL", :extract_jenkins], ["TEAMCITY_VERSION", :extract_teamcity], @@ -81,59 +80,6 @@ def filter_sensitive_info(url) end # CI providers - def extract_circle_ci(env) - { - Git::TAG_BRANCH => env["CIRCLE_BRANCH"], - Git::TAG_COMMIT_SHA => env["CIRCLE_SHA1"], - Git::TAG_REPOSITORY_URL => env["CIRCLE_REPOSITORY_URL"], - Git::TAG_TAG => env["CIRCLE_TAG"], - TAG_PIPELINE_ID => env["CIRCLE_WORKFLOW_ID"], - TAG_PIPELINE_NAME => env["CIRCLE_PROJECT_REPONAME"], - TAG_PIPELINE_URL => "https://app.circleci.com/pipelines/workflows/#{env["CIRCLE_WORKFLOW_ID"]}", - TAG_JOB_NAME => env["CIRCLE_JOB"], - TAG_JOB_URL => env["CIRCLE_BUILD_URL"], - TAG_PROVIDER_NAME => "circleci", - TAG_WORKSPACE_PATH => env["CIRCLE_WORKING_DIRECTORY"], - Git::TAG_COMMIT_AUTHOR_NAME => env["BUILD_REQUESTEDFORID"], - Git::TAG_COMMIT_AUTHOR_EMAIL => env["BUILD_REQUESTEDFOREMAIL"], - Git::TAG_COMMIT_MESSAGE => env["BUILD_SOURCEVERSIONMESSAGE"], - TAG_CI_ENV_VARS => { - "CIRCLE_WORKFLOW_ID" => env["CIRCLE_WORKFLOW_ID"], - "CIRCLE_BUILD_NUM" => env["CIRCLE_BUILD_NUM"] - }.to_json - } - end - - def extract_github_actions(env) - ref = env["GITHUB_HEAD_REF"] - ref = env["GITHUB_REF"] if ref.nil? || ref.empty? - branch, tag = branch_or_tag(ref) - - pipeline_url = "#{env["GITHUB_SERVER_URL"]}/#{env["GITHUB_REPOSITORY"]}/actions/runs/#{env["GITHUB_RUN_ID"]}" - pipeline_url = "#{pipeline_url}/attempts/#{env["GITHUB_RUN_ATTEMPT"]}" if env["GITHUB_RUN_ATTEMPT"] - - { - Git::TAG_BRANCH => branch, - Git::TAG_COMMIT_SHA => env["GITHUB_SHA"], - Git::TAG_REPOSITORY_URL => "#{env["GITHUB_SERVER_URL"]}/#{env["GITHUB_REPOSITORY"]}.git", - Git::TAG_TAG => tag, - TAG_JOB_URL => "#{env["GITHUB_SERVER_URL"]}/#{env["GITHUB_REPOSITORY"]}/commit/#{env["GITHUB_SHA"]}/checks", - TAG_JOB_NAME => env["GITHUB_JOB"], - TAG_PIPELINE_ID => env["GITHUB_RUN_ID"], - TAG_PIPELINE_NAME => env["GITHUB_WORKFLOW"], - TAG_PIPELINE_NUMBER => env["GITHUB_RUN_NUMBER"], - TAG_PIPELINE_URL => pipeline_url, - TAG_PROVIDER_NAME => "github", - TAG_WORKSPACE_PATH => env["GITHUB_WORKSPACE"], - TAG_CI_ENV_VARS => { - "GITHUB_SERVER_URL" => env["GITHUB_SERVER_URL"], - "GITHUB_REPOSITORY" => env["GITHUB_REPOSITORY"], - "GITHUB_RUN_ID" => env["GITHUB_RUN_ID"], - "GITHUB_RUN_ATTEMPT" => env["GITHUB_RUN_ATTEMPT"] - }.reject { |_k, v| v.nil? }.to_json - } - end - def extract_gitlab(env) commit_author_name, commit_author_email = extract_name_email(env["CI_COMMIT_AUTHOR"]) diff --git a/lib/datadog/ci/ext/environment/extractor.rb b/lib/datadog/ci/ext/environment/extractor.rb index 29799efc..8a57f84e 100644 --- a/lib/datadog/ci/ext/environment/extractor.rb +++ b/lib/datadog/ci/ext/environment/extractor.rb @@ -18,6 +18,7 @@ class Extractor require_relative "providers/buddy" require_relative "providers/buildkite" require_relative "providers/circleci" + require_relative "providers/github_actions" PROVIDERS = [ ["APPVEYOR", Providers::Appveyor], @@ -25,7 +26,8 @@ class Extractor ["BITBUCKET_COMMIT", Providers::Bitbucket], ["BUDDY", Providers::Buddy], ["BUILDKITE", Providers::Buildkite], - ["CIRCLECI", Providers::Circleci] + ["CIRCLECI", Providers::Circleci], + ["GITHUB_SHA", Providers::GithubActions] ] def self.for_environment(env) diff --git a/lib/datadog/ci/ext/environment/providers/github_actions.rb b/lib/datadog/ci/ext/environment/providers/github_actions.rb new file mode 100644 index 00000000..730f4635 --- /dev/null +++ b/lib/datadog/ci/ext/environment/providers/github_actions.rb @@ -0,0 +1,99 @@ +# frozen_string_literal: true + +require_relative "../extractor" + +module Datadog + module CI + module Ext + module Environment + module Providers + # Github Actions: https://github.com/features/actions + # Environment variables docs: https://docs.github.com/en/actions/learn-github-actions/variables#default-environment-variables + class GithubActions < Extractor + private + + # overridden methods + def provider_name + "github" + end + + def job_name + env["GITHUB_JOB"] + end + + def job_url + "#{env["GITHUB_SERVER_URL"]}/#{env["GITHUB_REPOSITORY"]}/commit/#{env["GITHUB_SHA"]}/checks" + end + + def pipeline_id + env["GITHUB_RUN_ID"] + end + + def pipeline_name + env["GITHUB_WORKFLOW"] + end + + def pipeline_number + env["GITHUB_RUN_NUMBER"] + end + + def pipeline_url + res = "#{env["GITHUB_SERVER_URL"]}/#{env["GITHUB_REPOSITORY"]}/actions/runs/#{env["GITHUB_RUN_ID"]}" + res = "#{res}/attempts/#{env["GITHUB_RUN_ATTEMPT"]}" if env["GITHUB_RUN_ATTEMPT"] + res + end + + def workspace_path + env["GITHUB_WORKSPACE"] + end + + def git_repository_url + "#{env["GITHUB_SERVER_URL"]}/#{env["GITHUB_REPOSITORY"]}.git" + end + + def git_commit_sha + env["GITHUB_SHA"] + end + + def git_branch + return @branch if defined?(@branch) + + set_branch_and_tag + @branch + end + + def git_tag + return @tag if defined?(@tag) + + set_branch_and_tag + @tag + end + + def ci_env_vars + { + "GITHUB_SERVER_URL" => env["GITHUB_SERVER_URL"], + "GITHUB_REPOSITORY" => env["GITHUB_REPOSITORY"], + "GITHUB_RUN_ID" => env["GITHUB_RUN_ID"], + "GITHUB_RUN_ATTEMPT" => env["GITHUB_RUN_ATTEMPT"] + }.reject { |_, v| v.nil? }.to_json + end + + # github-specific methods + + def ref + return @ref if defined?(@ref) + + @ref = env["GITHUB_HEAD_REF"] + @ref = env["GITHUB_REF"] if @ref.nil? || @ref.empty? + @ref + end + + def set_branch_and_tag + @branch, @tag = branch_or_tag(ref) + end + end + end + end + end + end +end diff --git a/sig/datadog/ci/ext/environment/providers/github_actions.rbs b/sig/datadog/ci/ext/environment/providers/github_actions.rbs new file mode 100644 index 00000000..4303a27a --- /dev/null +++ b/sig/datadog/ci/ext/environment/providers/github_actions.rbs @@ -0,0 +1,44 @@ +module Datadog + module CI + module Ext + module Environment + module Providers + class GithubActions < Extractor + private + @ref: String + + def provider_name: () -> "github" + + def job_name: () -> String? + + def job_url: () -> ::String + + def pipeline_id: () -> String? + + def pipeline_name: () -> String? + + def pipeline_number: () -> String? + + def pipeline_url: () -> String? + + def workspace_path: () -> String? + + def git_repository_url: () -> ::String + + def git_commit_sha: () -> String? + + def git_branch: () -> String? + + def git_tag: () -> String? + + def ci_env_vars: () -> String? + + def ref: () -> String + + def set_branch_and_tag: () -> [String?, String?] + end + end + end + end + end +end