lib/datadog/ci/ext/environment.rb in ddtrace-0.50.0 vs lib/datadog/ci/ext/environment.rb in ddtrace-0.51.0

- old
+ new

@@ -1,55 +1,67 @@ +# frozen_string_literal: true + require 'ddtrace/ext/git' +require 'open3' + module Datadog module CI module Ext # Defines constants for CI tags # rubocop:disable Metrics/ModuleLength: module Environment - TAG_STAGE_NAME = 'ci.stage.name'.freeze - TAG_JOB_NAME = 'ci.job.name'.freeze - TAG_JOB_URL = 'ci.job.url'.freeze - TAG_PIPELINE_ID = 'ci.pipeline.id'.freeze - TAG_PIPELINE_NAME = 'ci.pipeline.name'.freeze - TAG_PIPELINE_NUMBER = 'ci.pipeline.number'.freeze - TAG_PIPELINE_URL = 'ci.pipeline.url'.freeze - TAG_PROVIDER_NAME = 'ci.provider.name'.freeze - TAG_WORKSPACE_PATH = 'ci.workspace_path'.freeze + TAG_JOB_NAME = 'ci.job.name' + TAG_JOB_URL = 'ci.job.url' + TAG_PIPELINE_ID = 'ci.pipeline.id' + TAG_PIPELINE_NAME = 'ci.pipeline.name' + TAG_PIPELINE_NUMBER = 'ci.pipeline.number' + TAG_PIPELINE_URL = 'ci.pipeline.url' + TAG_PROVIDER_NAME = 'ci.provider.name' + TAG_STAGE_NAME = 'ci.stage.name' + TAG_WORKSPACE_PATH = 'ci.workspace_path' PROVIDERS = [ - ['APPVEYOR'.freeze, :extract_appveyor], - ['TF_BUILD'.freeze, :extract_azure_pipelines], - ['BITBUCKET_COMMIT'.freeze, :extract_bitbucket], - ['BUILDKITE'.freeze, :extract_buildkite], - ['CIRCLECI'.freeze, :extract_circle_ci], - ['GITHUB_SHA'.freeze, :extract_github_actions], - ['GITLAB_CI'.freeze, :extract_gitlab], - ['JENKINS_URL'.freeze, :extract_jenkins], - ['TEAMCITY_VERSION'.freeze, :extract_teamcity], - ['TRAVIS'.freeze, :extract_travis], - ['BITRISE_BUILD_SLUG'.freeze, :extract_bitrise] + ['APPVEYOR', :extract_appveyor], + ['TF_BUILD', :extract_azure_pipelines], + ['BITBUCKET_COMMIT', :extract_bitbucket], + ['BUILDKITE', :extract_buildkite], + ['CIRCLECI', :extract_circle_ci], + ['GITHUB_SHA', :extract_github_actions], + ['GITLAB_CI', :extract_gitlab], + ['JENKINS_URL', :extract_jenkins], + ['TEAMCITY_VERSION', :extract_teamcity], + ['TRAVIS', :extract_travis], + ['BITRISE_BUILD_SLUG', :extract_bitrise] ].freeze module_function def tags(env) - provider = PROVIDERS.find { |c| env.key? c[0] } - return {} if provider.nil? + _, extractor = PROVIDERS.find { |provider_env_var, _| env.key?(provider_env_var) } + if extractor + tags = public_send(extractor, env) - tags = send(provider[1], env) + tags[Datadog::Ext::Git::TAG_TAG] = normalize_ref(tags[Datadog::Ext::Git::TAG_TAG]) + tags.delete(Datadog::Ext::Git::TAG_BRANCH) unless tags[Datadog::Ext::Git::TAG_TAG].nil? + tags[Datadog::Ext::Git::TAG_BRANCH] = normalize_ref(tags[Datadog::Ext::Git::TAG_BRANCH]) + tags[Datadog::Ext::Git::TAG_REPOSITORY_URL] = filter_sensitive_info(tags[Datadog::Ext::Git::TAG_REPOSITORY_URL]) - tags[Datadog::Ext::Git::TAG_TAG] = normalize_ref(tags[Datadog::Ext::Git::TAG_TAG]) - tags.delete(Datadog::Ext::Git::TAG_BRANCH) unless tags[Datadog::Ext::Git::TAG_TAG].nil? - tags[Datadog::Ext::Git::TAG_BRANCH] = normalize_ref(tags[Datadog::Ext::Git::TAG_BRANCH]) - tags[Datadog::Ext::Git::TAG_REPOSITORY_URL] = filter_sensitive_info(tags[Datadog::Ext::Git::TAG_REPOSITORY_URL]) + # Expand ~ + workspace_path = tags[TAG_WORKSPACE_PATH] + if !workspace_path.nil? && (workspace_path == '~' || workspace_path.start_with?('~/')) + tags[TAG_WORKSPACE_PATH] = File.expand_path(workspace_path) + end + else + tags = {} + end - # Expand ~ - workspace_path = tags[TAG_WORKSPACE_PATH] - if !workspace_path.nil? && (workspace_path == '~' || workspace_path.start_with?('~/')) - tags[TAG_WORKSPACE_PATH] = File.expand_path(workspace_path) + # Fill out tags from local git as fallback + extract_local_git.each do |key, value| + tags[key] ||= value end + tags.reject { |_, v| v.nil? } end def normalize_ref(name) refs = %r{^refs/(heads/)?} @@ -83,48 +95,49 @@ TAG_PIPELINE_NAME => env['APPVEYOR_REPO_NAME'], TAG_PIPELINE_NUMBER => env['APPVEYOR_BUILD_NUMBER'], TAG_PIPELINE_URL => url, TAG_JOB_URL => url, Datadog::Ext::Git::TAG_BRANCH => branch, - Datadog::Ext::Git::TAG_TAG => tag + Datadog::Ext::Git::TAG_TAG => tag, + Datadog::Ext::Git::TAG_COMMIT_AUTHOR_NAME => env['APPVEYOR_REPO_COMMIT_AUTHOR'], + Datadog::Ext::Git::TAG_COMMIT_AUTHOR_EMAIL => env['APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL'], + Datadog::Ext::Git::TAG_COMMIT_MESSAGE => env['APPVEYOR_REPO_COMMIT_MESSAGE_EXTENDED'] } end def extract_azure_pipelines(env) - if env['SYSTEM_TEAMFOUNDATIONSERVERURI'] && env['SYSTEM_TEAMPROJECTID'] && env['BUILD_BUILDID'] - base_url = "#{env['SYSTEM_TEAMFOUNDATIONSERVERURI']}#{env['SYSTEM_TEAMPROJECTID']}" \ - "/_build/results?buildId=#{env['BUILD_BUILDID']}" - pipeline_url = base_url - job_url = base_url + "&view=logs&j=#{env['SYSTEM_JOBID']}&t=#{env['SYSTEM_TASKINSTANCEID']}" - else - pipeline_url = job_url = nil + build_id = env['BUILD_BUILDID'] + + if build_id && + (team_foundation_server_uri = env['SYSTEM_TEAMFOUNDATIONSERVERURI']) && + (team_project_id = env['SYSTEM_TEAMPROJECTID']) + + pipeline_url = "#{team_foundation_server_uri}#{team_project_id}/_build/results?buildId=#{build_id}" + + job_url = "#{pipeline_url}&view=logs&j=#{env['SYSTEM_JOBID']}&t=#{env['SYSTEM_TASKINSTANCEID']}" end - branch_or_tag = ( - env['SYSTEM_PULLREQUEST_SOURCEBRANCH'] || env['BUILD_SOURCEBRANCH'] || env['BUILD_SOURCEBRANCHNAME'] - ) - if branch_or_tag.include? 'tags/' - branch = nil - tag = branch_or_tag - else - branch = branch_or_tag - tag = nil - end + + branch, tag = branch_or_tag(env['SYSTEM_PULLREQUEST_SOURCEBRANCH'] || + env['BUILD_SOURCEBRANCH'] || + env['BUILD_SOURCEBRANCHNAME']) + { TAG_PROVIDER_NAME => 'azurepipelines', TAG_WORKSPACE_PATH => env['BUILD_SOURCESDIRECTORY'], - TAG_PIPELINE_ID => env['BUILD_BUILDID'], + TAG_PIPELINE_ID => build_id, TAG_PIPELINE_NAME => env['BUILD_DEFINITIONNAME'], - TAG_PIPELINE_NUMBER => env['BUILD_BUILDID'], + TAG_PIPELINE_NUMBER => build_id, TAG_PIPELINE_URL => pipeline_url, TAG_JOB_URL => job_url, - Datadog::Ext::Git::TAG_REPOSITORY_URL => ( - env['SYSTEM_PULLREQUEST_SOURCEREPOSITORYURI'] \ - || env['BUILD_REPOSITORY_URI'] - ), - Datadog::Ext::Git::TAG_COMMIT_SHA => (env['SYSTEM_PULLREQUEST_SOURCECOMMITID'] || env['BUILD_SOURCEVERSION']), + Datadog::Ext::Git::TAG_REPOSITORY_URL => + env['SYSTEM_PULLREQUEST_SOURCEREPOSITORYURI'] || env['BUILD_REPOSITORY_URI'], + Datadog::Ext::Git::TAG_COMMIT_SHA => env['SYSTEM_PULLREQUEST_SOURCECOMMITID'] || env['BUILD_SOURCEVERSION'], Datadog::Ext::Git::TAG_BRANCH => branch, - Datadog::Ext::Git::TAG_TAG => tag + Datadog::Ext::Git::TAG_TAG => tag, + Datadog::Ext::Git::TAG_COMMIT_AUTHOR_NAME => env['BUILD_REQUESTEDFORID'], + Datadog::Ext::Git::TAG_COMMIT_AUTHOR_EMAIL => env['BUILD_REQUESTEDFOREMAIL'], + Datadog::Ext::Git::TAG_COMMIT_MESSAGE => env['BUILD_SOURCEVERSIONMESSAGE'] } end def extract_bitbucket(env) url = "https://bitbucket.org/#{env['BITBUCKET_REPO_FULL_NAME']}/addon/pipelines/home#" \ @@ -133,16 +146,19 @@ Datadog::Ext::Git::TAG_BRANCH => env['BITBUCKET_BRANCH'], Datadog::Ext::Git::TAG_COMMIT_SHA => env['BITBUCKET_COMMIT'], Datadog::Ext::Git::TAG_REPOSITORY_URL => env['BITBUCKET_GIT_SSH_ORIGIN'], Datadog::Ext::Git::TAG_TAG => env['BITBUCKET_TAG'], TAG_JOB_URL => url, - TAG_PIPELINE_ID => env['BITBUCKET_PIPELINE_UUID'] ? env['BITBUCKET_PIPELINE_UUID'].tr('{}', '') : None, + TAG_PIPELINE_ID => env['BITBUCKET_PIPELINE_UUID'] ? env['BITBUCKET_PIPELINE_UUID'].tr('{}', '') : nil, TAG_PIPELINE_NAME => env['BITBUCKET_REPO_FULL_NAME'], TAG_PIPELINE_NUMBER => env['BITBUCKET_BUILD_NUMBER'], TAG_PIPELINE_URL => url, TAG_PROVIDER_NAME => 'bitbucket', - TAG_WORKSPACE_PATH => env['BITBUCKET_CLONE_DIR'] + TAG_WORKSPACE_PATH => env['BITBUCKET_CLONE_DIR'], + Datadog::Ext::Git::TAG_COMMIT_AUTHOR_NAME => env['BUILD_REQUESTEDFORID'], + Datadog::Ext::Git::TAG_COMMIT_AUTHOR_EMAIL => env['BUILD_REQUESTEDFOREMAIL'], + Datadog::Ext::Git::TAG_COMMIT_MESSAGE => env['BUILD_SOURCEVERSIONMESSAGE'] } end def extract_buildkite(env) { @@ -154,11 +170,14 @@ TAG_PIPELINE_NAME => env['BUILDKITE_PIPELINE_SLUG'], TAG_PIPELINE_NUMBER => env['BUILDKITE_BUILD_NUMBER'], TAG_PIPELINE_URL => env['BUILDKITE_BUILD_URL'], TAG_JOB_URL => "#{env['BUILDKITE_BUILD_URL']}##{env['BUILDKITE_JOB_ID']}", TAG_PROVIDER_NAME => 'buildkite', - TAG_WORKSPACE_PATH => env['BUILDKITE_BUILD_CHECKOUT_PATH'] + TAG_WORKSPACE_PATH => env['BUILDKITE_BUILD_CHECKOUT_PATH'], + Datadog::Ext::Git::TAG_COMMIT_AUTHOR_NAME => env['BUILDKITE_BUILD_AUTHOR'], + Datadog::Ext::Git::TAG_COMMIT_AUTHOR_EMAIL => env['BUILDKITE_BUILD_AUTHOR_EMAIL'], + Datadog::Ext::Git::TAG_COMMIT_MESSAGE => env['BUILDKITE_MESSAGE'] } end def extract_circle_ci(env) { @@ -166,27 +185,24 @@ Datadog::Ext::Git::TAG_COMMIT_SHA => env['CIRCLE_SHA1'], Datadog::Ext::Git::TAG_REPOSITORY_URL => env['CIRCLE_REPOSITORY_URL'], Datadog::Ext::Git::TAG_TAG => env['CIRCLE_TAG'], TAG_PIPELINE_ID => env['CIRCLE_WORKFLOW_ID'], TAG_PIPELINE_NAME => env['CIRCLE_PROJECT_REPONAME'], - TAG_PIPELINE_NUMBER => env['CIRCLE_BUILD_NUM'], - TAG_PIPELINE_URL => env['CIRCLE_BUILD_URL'], + 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'] + TAG_WORKSPACE_PATH => env['CIRCLE_WORKING_DIRECTORY'], + Datadog::Ext::Git::TAG_COMMIT_AUTHOR_NAME => env['BUILD_REQUESTEDFORID'], + Datadog::Ext::Git::TAG_COMMIT_AUTHOR_EMAIL => env['BUILD_REQUESTEDFOREMAIL'], + Datadog::Ext::Git::TAG_COMMIT_MESSAGE => env['BUILD_SOURCEVERSIONMESSAGE'] } end def extract_github_actions(env) - branch_or_tag = (env['GITHUB_HEAD_REF'] || env['GITHUB_REF']) - if branch_or_tag.include? 'tags/' - branch = nil - tag = branch_or_tag - else - branch = branch_or_tag - tag = nil - end + branch, tag = branch_or_tag(env['GITHUB_HEAD_REF'] || env['GITHUB_REF']) + { Datadog::Ext::Git::TAG_BRANCH => branch, Datadog::Ext::Git::TAG_COMMIT_SHA => env['GITHUB_SHA'], Datadog::Ext::Git::TAG_REPOSITORY_URL => "https://github.com/#{env['GITHUB_REPOSITORY']}.git", Datadog::Ext::Git::TAG_TAG => tag, @@ -194,17 +210,19 @@ TAG_PIPELINE_ID => env['GITHUB_RUN_ID'], TAG_PIPELINE_NAME => env['GITHUB_WORKFLOW'], TAG_PIPELINE_NUMBER => env['GITHUB_RUN_NUMBER'], TAG_PIPELINE_URL => "https://github.com/#{env['GITHUB_REPOSITORY']}/commit/#{env['GITHUB_SHA']}/checks", TAG_PROVIDER_NAME => 'github', - TAG_WORKSPACE_PATH => env['GITHUB_WORKSPACE'] + TAG_WORKSPACE_PATH => env['GITHUB_WORKSPACE'], + Datadog::Ext::Git::TAG_COMMIT_AUTHOR_NAME => env['BUILD_REQUESTEDFORID'], + Datadog::Ext::Git::TAG_COMMIT_AUTHOR_EMAIL => env['BUILD_REQUESTEDFOREMAIL'], + Datadog::Ext::Git::TAG_COMMIT_MESSAGE => env['BUILD_SOURCEVERSIONMESSAGE'] } end def extract_gitlab(env) url = env['CI_PIPELINE_URL'] - url = url.gsub(%r{/-/pipelines/}, '/pipelines/') unless url.nil? { Datadog::Ext::Git::TAG_BRANCH => env['CI_COMMIT_BRANCH'], Datadog::Ext::Git::TAG_COMMIT_SHA => env['CI_COMMIT_SHA'], Datadog::Ext::Git::TAG_REPOSITORY_URL => env['CI_REPOSITORY_URL'], Datadog::Ext::Git::TAG_TAG => env['CI_COMMIT_TAG'], @@ -212,39 +230,38 @@ TAG_JOB_NAME => env['CI_JOB_NAME'], TAG_JOB_URL => env['CI_JOB_URL'], TAG_PIPELINE_ID => env['CI_PIPELINE_ID'], TAG_PIPELINE_NAME => env['CI_PROJECT_PATH'], TAG_PIPELINE_NUMBER => env['CI_PIPELINE_IID'], - TAG_PIPELINE_URL => url, + TAG_PIPELINE_URL => (url.gsub(%r{/-/pipelines/}, '/pipelines/') if url), TAG_PROVIDER_NAME => 'gitlab', - TAG_WORKSPACE_PATH => env['CI_PROJECT_DIR'] + TAG_WORKSPACE_PATH => env['CI_PROJECT_DIR'], + Datadog::Ext::Git::TAG_COMMIT_MESSAGE => env['CI_COMMIT_MESSAGE'] } end def extract_jenkins(env) - branch_or_tag = env['GIT_BRANCH'] - if branch_or_tag.include? 'tags/' - branch = nil - tag = branch_or_tag - else - branch = branch_or_tag - tag = nil + branch, tag = branch_or_tag(env['GIT_BRANCH']) + + if (name = env['JOB_NAME']) + name = name.gsub("/#{normalize_ref(branch)}", '') if branch + name = name.split('/').reject { |v| v.nil? || v.include?('=') }.join('/') end - name = env['JOB_NAME'] - name = name.gsub("/#{normalize_ref(branch)}", '') unless name.nil? || branch.nil? - name = name.split('/').reject { |v| v.nil? || v.include?('=') }.join('/') unless name.nil? { Datadog::Ext::Git::TAG_BRANCH => branch, Datadog::Ext::Git::TAG_COMMIT_SHA => env['GIT_COMMIT'], Datadog::Ext::Git::TAG_REPOSITORY_URL => env['GIT_URL'], Datadog::Ext::Git::TAG_TAG => tag, TAG_PIPELINE_ID => env['BUILD_TAG'], TAG_PIPELINE_NAME => name, TAG_PIPELINE_NUMBER => env['BUILD_NUMBER'], TAG_PIPELINE_URL => env['BUILD_URL'], TAG_PROVIDER_NAME => 'jenkins', - TAG_WORKSPACE_PATH => env['WORKSPACE'] + TAG_WORKSPACE_PATH => env['WORKSPACE'], + Datadog::Ext::Git::TAG_COMMIT_AUTHOR_NAME => env['BUILD_REQUESTEDFORID'], + Datadog::Ext::Git::TAG_COMMIT_AUTHOR_EMAIL => env['BUILD_REQUESTEDFOREMAIL'], + Datadog::Ext::Git::TAG_COMMIT_MESSAGE => env['BUILD_SOURCEVERSIONMESSAGE'] } end def extract_teamcity(env) { @@ -254,11 +271,14 @@ TAG_WORKSPACE_PATH => env['BUILD_CHECKOUTDIR'], TAG_PIPELINE_ID => env['BUILD_ID'], TAG_PIPELINE_NUMBER => env['BUILD_NUMBER'], TAG_PIPELINE_URL => ( env['SERVER_URL'] && env['BUILD_ID'] ? "#{env['SERVER_URL']}/viewLog.html?buildId=#{env['SERVER_URL']}" : nil - ) + ), + Datadog::Ext::Git::TAG_COMMIT_AUTHOR_NAME => env['BUILD_REQUESTEDFORID'], + Datadog::Ext::Git::TAG_COMMIT_AUTHOR_EMAIL => env['BUILD_REQUESTEDFOREMAIL'], + Datadog::Ext::Git::TAG_COMMIT_MESSAGE => env['BUILD_SOURCEVERSIONMESSAGE'] } end def extract_travis(env) { @@ -270,11 +290,12 @@ TAG_PIPELINE_ID => env['TRAVIS_BUILD_ID'], TAG_PIPELINE_NAME => env['TRAVIS_REPO_SLUG'], TAG_PIPELINE_NUMBER => env['TRAVIS_BUILD_NUMBER'], TAG_PIPELINE_URL => env['TRAVIS_BUILD_WEB_URL'], TAG_PROVIDER_NAME => 'travisci', - TAG_WORKSPACE_PATH => env['TRAVIS_BUILD_DIR'] + TAG_WORKSPACE_PATH => env['TRAVIS_BUILD_DIR'], + Datadog::Ext::Git::TAG_COMMIT_MESSAGE => env['TRAVIS_COMMIT_MESSAGE'] } end def extract_bitrise(env) commit = ( @@ -291,11 +312,125 @@ TAG_PIPELINE_URL => env['BITRISE_BUILD_URL'], TAG_WORKSPACE_PATH => env['BITRISE_SOURCE_DIR'], Datadog::Ext::Git::TAG_REPOSITORY_URL => env['GIT_REPOSITORY_URL'], Datadog::Ext::Git::TAG_COMMIT_SHA => commit, Datadog::Ext::Git::TAG_BRANCH => branch, - Datadog::Ext::Git::TAG_TAG => env['BITRISE_GIT_TAG'] + Datadog::Ext::Git::TAG_TAG => env['BITRISE_GIT_TAG'], + Datadog::Ext::Git::TAG_COMMIT_MESSAGE => env['BITRISE_GIT_MESSAGE'] } + end + + def git_commit_users + # Get committer and author information in one command. + output = exec_git_command("git show -s --format='%an\t%ae\t%at\t%cn\t%ce\t%ct'") + return unless output + + fields = output.split("\t").each(&:strip!) + + { + author_name: fields[0], + author_email: fields[1], + # Because we can't get a reliable UTC time from all recent versions of git + # We have to rely on converting the date to UTC ourselves. + author_date: Time.at(fields[2].to_i).utc.to_datetime.iso8601, + committer_name: fields[3], + committer_email: fields[4], + # Because we can't get a reliable UTC time from all recent versions of git + # We have to rely on converting the date to UTC ourselves. + committer_date: Time.at(fields[5].to_i).utc.to_datetime.iso8601 + } + rescue => e + Datadog.logger.debug("Unable to read git commit users: #{e.message} at #{e.backtrace.first}") + nil + end + + def git_repository_url + exec_git_command('git ls-remote --get-url') + rescue => e + Datadog.logger.debug("Unable to read git repository url: #{e.message} at #{e.backtrace.first}") + nil + end + + def git_commit_message + exec_git_command('git show -s --format=%s') + rescue => e + Datadog.logger.debug("Unable to read git commit message: #{e.message} at #{e.backtrace.first}") + nil + end + + def git_branch + exec_git_command('git rev-parse --abbrev-ref HEAD') + rescue => e + Datadog.logger.debug("Unable to read git branch: #{e.message} at #{e.backtrace.first}") + nil + end + + def git_commit_sha + exec_git_command('git rev-parse HEAD') + rescue => e + Datadog.logger.debug("Unable to read git commit SHA: #{e.message} at #{e.backtrace.first}") + nil + end + + def git_tag + exec_git_command('git tag --points-at HEAD') + rescue => e + Datadog.logger.debug("Unable to read git tag: #{e.message} at #{e.backtrace.first}") + nil + end + + def git_base_directory + exec_git_command('git rev-parse --show-toplevel') + rescue => e + Datadog.logger.debug("Unable to read git base directory: #{e.message} at #{e.backtrace.first}") + nil + end + + def exec_git_command(cmd) + out, status = Open3.capture2e(cmd) + + raise "Failed to run git command #{cmd}: #{out}" unless status.success? + + out.strip! # There's always a "\n" at the end of the command output + + return nil if out.empty? + + out + end + + def extract_local_git + env = { + TAG_WORKSPACE_PATH => git_base_directory, + Datadog::Ext::Git::TAG_REPOSITORY_URL => git_repository_url, + Datadog::Ext::Git::TAG_COMMIT_SHA => git_commit_sha, + Datadog::Ext::Git::TAG_BRANCH => git_branch, + Datadog::Ext::Git::TAG_TAG => git_tag, + Datadog::Ext::Git::TAG_COMMIT_MESSAGE => git_commit_message + } + + if (commit_users = git_commit_users) + env.merge!( + Datadog::Ext::Git::TAG_COMMIT_AUTHOR_NAME => commit_users[:author_name], + Datadog::Ext::Git::TAG_COMMIT_AUTHOR_EMAIL => commit_users[:author_email], + Datadog::Ext::Git::TAG_COMMIT_AUTHOR_DATE => commit_users[:author_date], + Datadog::Ext::Git::TAG_COMMIT_COMMITTER_NAME => commit_users[:committer_name], + Datadog::Ext::Git::TAG_COMMIT_COMMITTER_EMAIL => commit_users[:committer_email], + Datadog::Ext::Git::TAG_COMMIT_COMMITTER_DATE => commit_users[:committer_date] + ) + end + + env + end + + def branch_or_tag(branch_or_tag) + branch = tag = nil + if branch_or_tag.include?('tags/') + tag = branch_or_tag + else + branch = branch_or_tag + end + + [branch, tag] end end # rubocop:enable Metrics/ModuleLength: end end