dd-trace
Version:
Datadog APM tracing client for JavaScript
754 lines (694 loc) • 24.6 kB
JavaScript
'use strict'
const { readFileSync } = require('fs')
const {
GIT_BRANCH,
GIT_COMMIT_SHA,
GIT_TAG,
GIT_COMMIT_AUTHOR_EMAIL,
GIT_COMMIT_AUTHOR_NAME,
GIT_COMMIT_MESSAGE,
GIT_COMMIT_AUTHOR_DATE,
GIT_COMMIT_HEAD_SHA,
GIT_PULL_REQUEST_BASE_BRANCH_SHA,
GIT_PULL_REQUEST_BASE_BRANCH,
GIT_REPOSITORY_URL,
CI_PIPELINE_ID,
CI_PIPELINE_NAME,
CI_PIPELINE_NUMBER,
CI_PIPELINE_URL,
CI_PROVIDER_NAME,
CI_WORKSPACE_PATH,
CI_JOB_URL,
CI_JOB_NAME,
CI_STAGE_NAME,
CI_ENV_VARS,
GIT_COMMIT_COMMITTER_NAME,
GIT_COMMIT_COMMITTER_EMAIL,
CI_NODE_LABELS,
CI_NODE_NAME,
PR_NUMBER,
CI_JOB_ID,
GIT_PULL_REQUEST_BASE_BRANCH_HEAD_SHA
} = require('./tags')
const { filterSensitiveInfoFromRepository } = require('./url')
const { getEnvironmentVariable, getEnvironmentVariables } = require('../../config-helper')
// Receives a string with the form 'John Doe <john.doe@gmail.com>'
// and returns { name: 'John Doe', email: 'john.doe@gmail.com' }
function parseEmailAndName (emailAndName) {
if (!emailAndName) {
return { name: '', email: '' }
}
let name = ''
let email = ''
const matchNameAndEmail = emailAndName.match(/(?:"?([^"]*)"?\s)?(?:<?(.+@[^>]+)>?)/)
if (matchNameAndEmail) {
name = matchNameAndEmail[1]
email = matchNameAndEmail[2]
}
return { name, email }
}
function removeEmptyValues (tags) {
return Object.keys(tags).reduce((filteredTags, tag) => {
if (!tags[tag]) {
return filteredTags
}
return {
...filteredTags,
[tag]: tags[tag]
}
}, {})
}
function normalizeTag (targetTags, tagKey, normalize) {
if (targetTags[tagKey]) {
targetTags[tagKey] = normalize(targetTags[tagKey])
}
}
function normalizeRef (ref) {
if (!ref) {
return ref
}
return ref.replaceAll(/origin\/|refs\/heads\/|tags\//gm, '')
}
function resolveTilde (filePath) {
if (!filePath || typeof filePath !== 'string') {
return ''
}
// '~/folder/path' or '~'
if (filePath[0] === '~' && (filePath[1] === '/' || filePath.length === 1)) {
return filePath.replace('~', getEnvironmentVariable('HOME'))
}
return filePath
}
function normalizeNumber (number) {
if (typeof number !== 'number') {
return number
}
return number.toString()
}
function getGitHubEventPayload () {
if (!getEnvironmentVariable('GITHUB_EVENT_PATH')) {
return
}
return JSON.parse(readFileSync(getEnvironmentVariable('GITHUB_EVENT_PATH'), 'utf8'))
}
module.exports = {
normalizeRef,
getCIMetadata () {
const env = getEnvironmentVariables()
let tags = {}
if (env.JENKINS_URL) {
const {
WORKSPACE,
BUILD_TAG,
JOB_NAME,
BUILD_NUMBER,
BUILD_URL,
GIT_BRANCH: JENKINS_GIT_BRANCH,
GIT_COMMIT: JENKINS_GIT_COMMIT,
GIT_URL: JENKINS_GIT_REPOSITORY_URL,
GIT_URL_1: JENKINS_GIT_REPOSITORY_URL_1,
DD_CUSTOM_TRACE_ID,
NODE_NAME,
NODE_LABELS,
CHANGE_ID,
CHANGE_TARGET
} = env
tags = {
[CI_PIPELINE_ID]: BUILD_TAG,
[CI_PIPELINE_NUMBER]: BUILD_NUMBER,
[CI_PIPELINE_URL]: BUILD_URL,
[CI_PROVIDER_NAME]: 'jenkins',
[GIT_COMMIT_SHA]: JENKINS_GIT_COMMIT,
[GIT_REPOSITORY_URL]: JENKINS_GIT_REPOSITORY_URL || JENKINS_GIT_REPOSITORY_URL_1,
[CI_WORKSPACE_PATH]: WORKSPACE,
[CI_ENV_VARS]: JSON.stringify({ DD_CUSTOM_TRACE_ID }),
[CI_NODE_NAME]: NODE_NAME,
[PR_NUMBER]: CHANGE_ID,
[GIT_PULL_REQUEST_BASE_BRANCH]: CHANGE_TARGET
}
if (NODE_LABELS) {
let nodeLabels
try {
nodeLabels = JSON.stringify(NODE_LABELS.split(' '))
tags[CI_NODE_LABELS] = nodeLabels
} catch {
// ignore errors
}
}
const isTag = JENKINS_GIT_BRANCH && JENKINS_GIT_BRANCH.includes('tags/')
const refKey = isTag ? GIT_TAG : GIT_BRANCH
const ref = normalizeRef(JENKINS_GIT_BRANCH)
tags[refKey] = ref
if (JOB_NAME) {
// Job names can contain parameters, e.g. jobName/KEY1=VALUE1,KEY2=VALUE2/branchName
const jobNameAndParams = JOB_NAME.split('/')
const finalPipelineName = jobNameAndParams.length > 1 && jobNameAndParams[1].includes('=')
? jobNameAndParams[0]
: JOB_NAME.replace(`/${ref}`, '')
tags[CI_PIPELINE_NAME] = finalPipelineName
}
}
if (env.GITLAB_CI) {
const {
CI_PIPELINE_ID: GITLAB_PIPELINE_ID,
CI_PROJECT_PATH,
CI_PIPELINE_IID,
CI_PIPELINE_URL: GITLAB_PIPELINE_URL,
CI_PROJECT_DIR,
CI_COMMIT_REF_NAME,
CI_COMMIT_TAG,
CI_COMMIT_SHA,
CI_REPOSITORY_URL,
CI_JOB_URL: GITLAB_CI_JOB_URL,
CI_JOB_STAGE,
CI_JOB_NAME: GITLAB_CI_JOB_NAME,
CI_COMMIT_MESSAGE,
CI_COMMIT_TIMESTAMP,
CI_COMMIT_AUTHOR,
CI_PROJECT_URL: GITLAB_PROJECT_URL,
CI_JOB_ID: GITLAB_CI_JOB_ID,
CI_RUNNER_ID,
CI_RUNNER_TAGS,
CI_MERGE_REQUEST_TARGET_BRANCH_NAME,
CI_MERGE_REQUEST_IID,
CI_MERGE_REQUEST_TARGET_BRANCH_SHA,
CI_MERGE_REQUEST_DIFF_BASE_SHA
} = env
const { name, email } = parseEmailAndName(CI_COMMIT_AUTHOR)
tags = {
[CI_PIPELINE_ID]: GITLAB_PIPELINE_ID,
[CI_PIPELINE_NAME]: CI_PROJECT_PATH,
[CI_PIPELINE_NUMBER]: CI_PIPELINE_IID,
[CI_PROVIDER_NAME]: 'gitlab',
[GIT_COMMIT_SHA]: CI_COMMIT_SHA,
[GIT_REPOSITORY_URL]: CI_REPOSITORY_URL,
[CI_JOB_URL]: GITLAB_CI_JOB_URL,
[GIT_TAG]: CI_COMMIT_TAG,
[GIT_BRANCH]: CI_COMMIT_REF_NAME,
[CI_WORKSPACE_PATH]: CI_PROJECT_DIR,
[CI_PIPELINE_URL]: GITLAB_PIPELINE_URL,
[CI_STAGE_NAME]: CI_JOB_STAGE,
[CI_JOB_NAME]: GITLAB_CI_JOB_NAME,
[GIT_COMMIT_MESSAGE]: CI_COMMIT_MESSAGE,
[GIT_COMMIT_AUTHOR_NAME]: name,
[GIT_COMMIT_AUTHOR_EMAIL]: email,
[GIT_COMMIT_AUTHOR_DATE]: CI_COMMIT_TIMESTAMP,
[CI_ENV_VARS]: JSON.stringify({
CI_PROJECT_URL: GITLAB_PROJECT_URL,
CI_PIPELINE_ID: GITLAB_PIPELINE_ID,
CI_JOB_ID: GITLAB_CI_JOB_ID
}),
[CI_NODE_LABELS]: CI_RUNNER_TAGS,
[CI_NODE_NAME]: CI_RUNNER_ID,
[GIT_PULL_REQUEST_BASE_BRANCH]: CI_MERGE_REQUEST_TARGET_BRANCH_NAME,
[PR_NUMBER]: CI_MERGE_REQUEST_IID,
[CI_JOB_ID]: GITLAB_CI_JOB_ID,
[GIT_PULL_REQUEST_BASE_BRANCH_SHA]: CI_MERGE_REQUEST_DIFF_BASE_SHA,
[GIT_PULL_REQUEST_BASE_BRANCH_HEAD_SHA]: CI_MERGE_REQUEST_TARGET_BRANCH_SHA
}
}
if (env.CIRCLECI) {
const {
CIRCLE_WORKFLOW_ID,
CIRCLE_PROJECT_REPONAME,
CIRCLE_BUILD_URL,
CIRCLE_WORKING_DIRECTORY,
CIRCLE_BRANCH,
CIRCLE_TAG,
CIRCLE_SHA1,
CIRCLE_REPOSITORY_URL,
CIRCLE_JOB,
CIRCLE_BUILD_NUM,
CIRCLE_PR_NUMBER
} = env
const pipelineUrl = `https://app.circleci.com/pipelines/workflows/${CIRCLE_WORKFLOW_ID}`
tags = {
[CI_PIPELINE_ID]: CIRCLE_WORKFLOW_ID,
[CI_PIPELINE_NAME]: CIRCLE_PROJECT_REPONAME,
[CI_PIPELINE_URL]: pipelineUrl,
[CI_JOB_NAME]: CIRCLE_JOB,
[CI_PROVIDER_NAME]: 'circleci',
[GIT_COMMIT_SHA]: CIRCLE_SHA1,
[GIT_REPOSITORY_URL]: CIRCLE_REPOSITORY_URL,
[CI_JOB_URL]: CIRCLE_BUILD_URL,
[CI_WORKSPACE_PATH]: CIRCLE_WORKING_DIRECTORY,
[GIT_TAG]: CIRCLE_TAG,
[GIT_BRANCH]: CIRCLE_BRANCH,
[CI_ENV_VARS]: JSON.stringify({
CIRCLE_WORKFLOW_ID,
CIRCLE_BUILD_NUM,
}),
[PR_NUMBER]: CIRCLE_PR_NUMBER,
[CI_JOB_ID]: CIRCLE_BUILD_NUM
}
}
if (env.GITHUB_ACTIONS || env.GITHUB_ACTION) {
const {
GITHUB_RUN_ID,
GITHUB_WORKFLOW,
GITHUB_RUN_NUMBER,
GITHUB_WORKSPACE,
GITHUB_HEAD_REF,
GITHUB_REF,
GITHUB_SHA,
GITHUB_REPOSITORY,
GITHUB_SERVER_URL,
GITHUB_RUN_ATTEMPT,
GITHUB_JOB,
GITHUB_BASE_REF
} = env
const repositoryURL = `${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}.git`
let pipelineURL = `${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}`
if (GITHUB_RUN_ATTEMPT) {
pipelineURL = `${pipelineURL}/attempts/${GITHUB_RUN_ATTEMPT}`
}
const jobUrl = `${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/commit/${GITHUB_SHA}/checks`
const ref = GITHUB_HEAD_REF || GITHUB_REF || ''
const refKey = ref.includes('tags/') ? GIT_TAG : GIT_BRANCH
// Both pipeline URL and job URL include GITHUB_SERVER_URL, which can include user credentials,
// so we pass them through `filterSensitiveInfoFromRepository`.
tags = {
[CI_PIPELINE_ID]: GITHUB_RUN_ID,
[CI_PIPELINE_NAME]: GITHUB_WORKFLOW,
[CI_PIPELINE_NUMBER]: GITHUB_RUN_NUMBER,
[CI_PIPELINE_URL]: filterSensitiveInfoFromRepository(pipelineURL),
[CI_PROVIDER_NAME]: 'github',
[GIT_COMMIT_SHA]: GITHUB_SHA,
[GIT_REPOSITORY_URL]: repositoryURL,
[CI_JOB_URL]: filterSensitiveInfoFromRepository(jobUrl),
[CI_JOB_NAME]: GITHUB_JOB,
[CI_WORKSPACE_PATH]: GITHUB_WORKSPACE,
[refKey]: ref,
[CI_ENV_VARS]: JSON.stringify({
GITHUB_SERVER_URL: filterSensitiveInfoFromRepository(GITHUB_SERVER_URL),
GITHUB_REPOSITORY,
GITHUB_RUN_ID,
GITHUB_RUN_ATTEMPT
}),
[CI_JOB_ID]: GITHUB_JOB
}
if (GITHUB_BASE_REF) { // `pull_request` or `pull_request_target` event
tags[GIT_PULL_REQUEST_BASE_BRANCH] = GITHUB_BASE_REF
try {
const eventContent = getGitHubEventPayload()
tags[GIT_PULL_REQUEST_BASE_BRANCH_HEAD_SHA] = eventContent.pull_request.base.sha
tags[GIT_COMMIT_HEAD_SHA] = eventContent.pull_request.head.sha
} catch {
// ignore malformed event content
}
}
}
if (env.APPVEYOR) {
const {
APPVEYOR_REPO_NAME,
APPVEYOR_REPO_PROVIDER,
APPVEYOR_BUILD_FOLDER,
APPVEYOR_BUILD_ID,
APPVEYOR_BUILD_NUMBER,
APPVEYOR_REPO_COMMIT,
APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH,
APPVEYOR_REPO_BRANCH,
APPVEYOR_REPO_TAG_NAME,
APPVEYOR_REPO_COMMIT_AUTHOR,
APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL,
APPVEYOR_REPO_COMMIT_MESSAGE,
APPVEYOR_REPO_COMMIT_MESSAGE_EXTENDED,
APPVEYOR_PULL_REQUEST_HEAD_COMMIT,
APPVEYOR_PULL_REQUEST_NUMBER
} = env
const pipelineUrl = `https://ci.appveyor.com/project/${APPVEYOR_REPO_NAME}/builds/${APPVEYOR_BUILD_ID}`
tags = {
[CI_PROVIDER_NAME]: 'appveyor',
[CI_PIPELINE_URL]: pipelineUrl,
[CI_PIPELINE_ID]: APPVEYOR_BUILD_ID,
[CI_PIPELINE_NAME]: APPVEYOR_REPO_NAME,
[CI_PIPELINE_NUMBER]: APPVEYOR_BUILD_NUMBER,
[CI_JOB_URL]: pipelineUrl,
[CI_WORKSPACE_PATH]: APPVEYOR_BUILD_FOLDER,
[GIT_COMMIT_AUTHOR_NAME]: APPVEYOR_REPO_COMMIT_AUTHOR,
[GIT_COMMIT_AUTHOR_EMAIL]: APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL,
[GIT_COMMIT_MESSAGE]: APPVEYOR_REPO_COMMIT_MESSAGE + '\n' + APPVEYOR_REPO_COMMIT_MESSAGE_EXTENDED,
[GIT_COMMIT_HEAD_SHA]: APPVEYOR_PULL_REQUEST_HEAD_COMMIT,
[PR_NUMBER]: APPVEYOR_PULL_REQUEST_NUMBER
}
if (APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH) {
tags[GIT_PULL_REQUEST_BASE_BRANCH] = APPVEYOR_REPO_BRANCH
}
if (APPVEYOR_REPO_PROVIDER === 'github') {
tags = {
...tags,
[GIT_REPOSITORY_URL]: `https://github.com/${APPVEYOR_REPO_NAME}.git`,
[GIT_COMMIT_SHA]: APPVEYOR_REPO_COMMIT,
[GIT_TAG]: APPVEYOR_REPO_TAG_NAME,
[GIT_BRANCH]: APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH || APPVEYOR_REPO_BRANCH
}
}
}
if (env.TF_BUILD) {
const {
BUILD_SOURCESDIRECTORY,
BUILD_BUILDID,
BUILD_DEFINITIONNAME,
SYSTEM_TEAMFOUNDATIONSERVERURI,
SYSTEM_TEAMPROJECTID,
SYSTEM_JOBID,
SYSTEM_TASKINSTANCEID,
SYSTEM_PULLREQUEST_SOURCEBRANCH,
BUILD_SOURCEBRANCH,
BUILD_SOURCEBRANCHNAME,
SYSTEM_PULLREQUEST_SOURCECOMMITID,
SYSTEM_PULLREQUEST_SOURCEREPOSITORYURI,
BUILD_REPOSITORY_URI,
BUILD_SOURCEVERSION,
BUILD_REQUESTEDFORID,
BUILD_REQUESTEDFOREMAIL,
BUILD_SOURCEVERSIONMESSAGE,
SYSTEM_STAGEDISPLAYNAME,
SYSTEM_JOBDISPLAYNAME,
SYSTEM_PULLREQUEST_PULLREQUESTNUMBER,
SYSTEM_PULLREQUEST_TARGETBRANCH
} = env
const ref = SYSTEM_PULLREQUEST_SOURCEBRANCH || BUILD_SOURCEBRANCH || BUILD_SOURCEBRANCHNAME
const refKey = (ref || '').includes('tags/') ? GIT_TAG : GIT_BRANCH
tags = {
[CI_PROVIDER_NAME]: 'azurepipelines',
[CI_PIPELINE_ID]: BUILD_BUILDID,
[CI_PIPELINE_NAME]: BUILD_DEFINITIONNAME,
[CI_PIPELINE_NUMBER]: BUILD_BUILDID,
[GIT_COMMIT_SHA]: SYSTEM_PULLREQUEST_SOURCECOMMITID || BUILD_SOURCEVERSION,
[CI_WORKSPACE_PATH]: BUILD_SOURCESDIRECTORY,
[GIT_REPOSITORY_URL]: SYSTEM_PULLREQUEST_SOURCEREPOSITORYURI || BUILD_REPOSITORY_URI,
[refKey]: ref,
[GIT_COMMIT_AUTHOR_NAME]: BUILD_REQUESTEDFORID,
[GIT_COMMIT_AUTHOR_EMAIL]: BUILD_REQUESTEDFOREMAIL,
[GIT_COMMIT_MESSAGE]: BUILD_SOURCEVERSIONMESSAGE,
[CI_STAGE_NAME]: SYSTEM_STAGEDISPLAYNAME,
[CI_JOB_NAME]: SYSTEM_JOBDISPLAYNAME,
[CI_ENV_VARS]: JSON.stringify({ SYSTEM_TEAMPROJECTID, BUILD_BUILDID, SYSTEM_JOBID }),
[PR_NUMBER]: SYSTEM_PULLREQUEST_PULLREQUESTNUMBER,
[GIT_PULL_REQUEST_BASE_BRANCH]: SYSTEM_PULLREQUEST_TARGETBRANCH,
[CI_JOB_ID]: SYSTEM_JOBID
}
if (SYSTEM_TEAMFOUNDATIONSERVERURI && SYSTEM_TEAMPROJECTID && BUILD_BUILDID) {
const baseUrl =
`${SYSTEM_TEAMFOUNDATIONSERVERURI}${SYSTEM_TEAMPROJECTID}/_build/results?buildId=${BUILD_BUILDID}`
const pipelineUrl = baseUrl
const jobUrl = `${baseUrl}&view=logs&j=${SYSTEM_JOBID}&t=${SYSTEM_TASKINSTANCEID}`
tags = {
...tags,
[CI_PIPELINE_URL]: pipelineUrl,
[CI_JOB_URL]: jobUrl
}
}
}
if (env.BITBUCKET_COMMIT) {
const {
BITBUCKET_REPO_FULL_NAME,
BITBUCKET_BUILD_NUMBER,
BITBUCKET_BRANCH,
BITBUCKET_COMMIT,
BITBUCKET_GIT_SSH_ORIGIN,
BITBUCKET_GIT_HTTP_ORIGIN,
BITBUCKET_TAG,
BITBUCKET_PIPELINE_UUID,
BITBUCKET_CLONE_DIR,
BITBUCKET_PR_DESTINATION_BRANCH,
BITBUCKET_PR_ID
} = env
const url =
`https://bitbucket.org/${BITBUCKET_REPO_FULL_NAME}/addon/pipelines/home#!/results/${BITBUCKET_BUILD_NUMBER}`
tags = {
[CI_PROVIDER_NAME]: 'bitbucket',
[GIT_COMMIT_SHA]: BITBUCKET_COMMIT,
[CI_PIPELINE_NUMBER]: BITBUCKET_BUILD_NUMBER,
[CI_PIPELINE_NAME]: BITBUCKET_REPO_FULL_NAME,
[CI_JOB_URL]: url,
[CI_PIPELINE_URL]: url,
[GIT_BRANCH]: BITBUCKET_BRANCH,
[GIT_TAG]: BITBUCKET_TAG,
[GIT_REPOSITORY_URL]: BITBUCKET_GIT_SSH_ORIGIN || BITBUCKET_GIT_HTTP_ORIGIN,
[CI_WORKSPACE_PATH]: BITBUCKET_CLONE_DIR,
[CI_PIPELINE_ID]: BITBUCKET_PIPELINE_UUID && BITBUCKET_PIPELINE_UUID.replaceAll(/{|}/gm, ''),
[GIT_PULL_REQUEST_BASE_BRANCH]: BITBUCKET_PR_DESTINATION_BRANCH,
[PR_NUMBER]: BITBUCKET_PR_ID
}
}
if (env.BITRISE_BUILD_SLUG) {
const {
BITRISE_GIT_COMMIT,
GIT_CLONE_COMMIT_HASH,
BITRISEIO_GIT_BRANCH_DEST,
BITRISE_GIT_BRANCH,
BITRISE_BUILD_SLUG,
BITRISE_TRIGGERED_WORKFLOW_ID,
BITRISE_BUILD_NUMBER,
BITRISE_BUILD_URL,
BITRISE_SOURCE_DIR,
GIT_REPOSITORY_URL: BITRISE_GIT_REPOSITORY_URL,
BITRISE_GIT_TAG,
BITRISE_GIT_MESSAGE,
BITRISE_PULL_REQUEST
} = env
tags = {
[CI_PROVIDER_NAME]: 'bitrise',
[CI_PIPELINE_ID]: BITRISE_BUILD_SLUG,
[CI_PIPELINE_NAME]: BITRISE_TRIGGERED_WORKFLOW_ID,
[CI_PIPELINE_NUMBER]: BITRISE_BUILD_NUMBER,
[CI_PIPELINE_URL]: BITRISE_BUILD_URL,
[GIT_COMMIT_SHA]: BITRISE_GIT_COMMIT || GIT_CLONE_COMMIT_HASH,
[GIT_REPOSITORY_URL]: BITRISE_GIT_REPOSITORY_URL,
[CI_WORKSPACE_PATH]: BITRISE_SOURCE_DIR,
[GIT_TAG]: BITRISE_GIT_TAG,
[GIT_BRANCH]: BITRISEIO_GIT_BRANCH_DEST || BITRISE_GIT_BRANCH,
[GIT_COMMIT_MESSAGE]: BITRISE_GIT_MESSAGE,
[GIT_PULL_REQUEST_BASE_BRANCH]: BITRISEIO_GIT_BRANCH_DEST,
[PR_NUMBER]: BITRISE_PULL_REQUEST
}
}
if (env.BUILDKITE) {
const {
BUILDKITE_BRANCH,
BUILDKITE_COMMIT,
BUILDKITE_REPO,
BUILDKITE_TAG,
BUILDKITE_BUILD_ID,
BUILDKITE_PIPELINE_SLUG,
BUILDKITE_BUILD_NUMBER,
BUILDKITE_BUILD_URL,
BUILDKITE_JOB_ID,
BUILDKITE_BUILD_CHECKOUT_PATH,
BUILDKITE_BUILD_AUTHOR,
BUILDKITE_BUILD_AUTHOR_EMAIL,
BUILDKITE_MESSAGE,
BUILDKITE_AGENT_ID,
BUILDKITE_PULL_REQUEST,
BUILDKITE_PULL_REQUEST_BASE_BRANCH
} = env
const extraTags = Object.keys(env).filter(envVar =>
envVar.startsWith('BUILDKITE_AGENT_META_DATA_')
).map((metadataKey) => {
const key = metadataKey.replace('BUILDKITE_AGENT_META_DATA_', '').toLowerCase()
return `${key}:${env[metadataKey]}`
})
tags = {
[CI_PROVIDER_NAME]: 'buildkite',
[CI_PIPELINE_ID]: BUILDKITE_BUILD_ID,
[CI_PIPELINE_NAME]: BUILDKITE_PIPELINE_SLUG,
[CI_PIPELINE_NUMBER]: BUILDKITE_BUILD_NUMBER,
[CI_PIPELINE_URL]: BUILDKITE_BUILD_URL,
[CI_JOB_URL]: `${BUILDKITE_BUILD_URL}#${BUILDKITE_JOB_ID}`,
[GIT_COMMIT_SHA]: BUILDKITE_COMMIT,
[CI_WORKSPACE_PATH]: BUILDKITE_BUILD_CHECKOUT_PATH,
[GIT_REPOSITORY_URL]: BUILDKITE_REPO,
[GIT_TAG]: BUILDKITE_TAG,
[GIT_BRANCH]: BUILDKITE_BRANCH,
[GIT_COMMIT_AUTHOR_NAME]: BUILDKITE_BUILD_AUTHOR,
[GIT_COMMIT_AUTHOR_EMAIL]: BUILDKITE_BUILD_AUTHOR_EMAIL,
[GIT_COMMIT_MESSAGE]: BUILDKITE_MESSAGE,
[CI_ENV_VARS]: JSON.stringify({
BUILDKITE_BUILD_ID,
BUILDKITE_JOB_ID
}),
[CI_NODE_NAME]: BUILDKITE_AGENT_ID,
[CI_NODE_LABELS]: JSON.stringify(extraTags),
[PR_NUMBER]: BUILDKITE_PULL_REQUEST,
[CI_JOB_ID]: BUILDKITE_JOB_ID
}
if (BUILDKITE_PULL_REQUEST) {
tags[GIT_PULL_REQUEST_BASE_BRANCH] = BUILDKITE_PULL_REQUEST_BASE_BRANCH
}
}
if (env.TRAVIS) {
const {
TRAVIS_PULL_REQUEST_BRANCH,
TRAVIS_BRANCH,
TRAVIS_COMMIT,
TRAVIS_REPO_SLUG,
TRAVIS_TAG,
TRAVIS_JOB_WEB_URL,
TRAVIS_BUILD_ID,
TRAVIS_BUILD_NUMBER,
TRAVIS_BUILD_WEB_URL,
TRAVIS_BUILD_DIR,
TRAVIS_COMMIT_MESSAGE,
TRAVIS_PULL_REQUEST,
TRAVIS_PULL_REQUEST_SHA
} = env
tags = {
[CI_PROVIDER_NAME]: 'travisci',
[CI_JOB_URL]: TRAVIS_JOB_WEB_URL,
[CI_PIPELINE_ID]: TRAVIS_BUILD_ID,
[CI_PIPELINE_NAME]: TRAVIS_REPO_SLUG,
[CI_PIPELINE_NUMBER]: TRAVIS_BUILD_NUMBER,
[CI_PIPELINE_URL]: TRAVIS_BUILD_WEB_URL,
[GIT_COMMIT_SHA]: TRAVIS_COMMIT,
[GIT_REPOSITORY_URL]: `https://github.com/${TRAVIS_REPO_SLUG}.git`,
[CI_WORKSPACE_PATH]: TRAVIS_BUILD_DIR,
[GIT_TAG]: TRAVIS_TAG,
[GIT_BRANCH]: TRAVIS_PULL_REQUEST_BRANCH || TRAVIS_BRANCH,
[GIT_COMMIT_MESSAGE]: TRAVIS_COMMIT_MESSAGE,
[GIT_COMMIT_HEAD_SHA]: TRAVIS_PULL_REQUEST_SHA,
[GIT_PULL_REQUEST_BASE_BRANCH]: TRAVIS_BRANCH,
[PR_NUMBER]: TRAVIS_PULL_REQUEST
}
}
if (env.BUDDY) {
const {
BUDDY_EXECUTION_BRANCH,
BUDDY_EXECUTION_ID,
BUDDY_EXECUTION_REVISION,
BUDDY_EXECUTION_REVISION_COMMITTER_EMAIL,
BUDDY_EXECUTION_REVISION_COMMITTER_NAME,
BUDDY_EXECUTION_REVISION_MESSAGE,
BUDDY_EXECUTION_TAG,
BUDDY_EXECUTION_URL,
BUDDY_PIPELINE_ID,
BUDDY_PIPELINE_NAME,
BUDDY_SCM_URL,
BUDDY_RUN_PR_BASE_BRANCH,
BUDDY_RUN_PR_NO
} = env
tags = {
[CI_PROVIDER_NAME]: 'buddy',
[CI_PIPELINE_ID]: `${BUDDY_PIPELINE_ID}/${BUDDY_EXECUTION_ID}`,
[CI_PIPELINE_NAME]: BUDDY_PIPELINE_NAME,
[CI_PIPELINE_NUMBER]: BUDDY_EXECUTION_ID,
[CI_PIPELINE_URL]: BUDDY_EXECUTION_URL,
[GIT_COMMIT_SHA]: BUDDY_EXECUTION_REVISION,
[GIT_REPOSITORY_URL]: BUDDY_SCM_URL,
[GIT_BRANCH]: BUDDY_EXECUTION_BRANCH,
[GIT_TAG]: BUDDY_EXECUTION_TAG,
[GIT_COMMIT_MESSAGE]: BUDDY_EXECUTION_REVISION_MESSAGE,
[GIT_COMMIT_COMMITTER_NAME]: BUDDY_EXECUTION_REVISION_COMMITTER_NAME,
[GIT_COMMIT_COMMITTER_EMAIL]: BUDDY_EXECUTION_REVISION_COMMITTER_EMAIL,
[GIT_PULL_REQUEST_BASE_BRANCH]: BUDDY_RUN_PR_BASE_BRANCH,
[PR_NUMBER]: BUDDY_RUN_PR_NO
}
}
if (env.TEAMCITY_VERSION) {
const {
BUILD_URL,
TEAMCITY_BUILDCONF_NAME,
DATADOG_BUILD_ID,
TEAMCITY_PULLREQUEST_NUMBER,
TEAMCITY_PULLREQUEST_TARGET_BRANCH
} = env
tags = {
[CI_PROVIDER_NAME]: 'teamcity',
[CI_JOB_URL]: BUILD_URL,
[CI_JOB_NAME]: TEAMCITY_BUILDCONF_NAME,
[CI_ENV_VARS]: JSON.stringify({
DATADOG_BUILD_ID
}),
[PR_NUMBER]: TEAMCITY_PULLREQUEST_NUMBER,
[GIT_PULL_REQUEST_BASE_BRANCH]: TEAMCITY_PULLREQUEST_TARGET_BRANCH
}
}
if (env.CF_BUILD_ID) {
const {
CF_BUILD_ID,
CF_PIPELINE_NAME,
CF_BUILD_URL,
CF_STEP_NAME,
CF_BRANCH,
CF_PULL_REQUEST_NUMBER,
CF_PULL_REQUEST_TARGET
} = env
tags = {
[CI_PROVIDER_NAME]: 'codefresh',
[CI_PIPELINE_ID]: CF_BUILD_ID,
[CI_PIPELINE_NAME]: CF_PIPELINE_NAME,
[CI_PIPELINE_URL]: CF_BUILD_URL,
[CI_JOB_NAME]: CF_STEP_NAME,
[CI_ENV_VARS]: JSON.stringify({
CF_BUILD_ID
}),
[PR_NUMBER]: CF_PULL_REQUEST_NUMBER,
[GIT_PULL_REQUEST_BASE_BRANCH]: CF_PULL_REQUEST_TARGET
}
const isTag = CF_BRANCH && CF_BRANCH.includes('tags/')
const refKey = isTag ? GIT_TAG : GIT_BRANCH
const ref = normalizeRef(CF_BRANCH)
tags[refKey] = ref
}
if (env.CODEBUILD_INITIATOR?.startsWith('codepipeline/')) {
const {
CODEBUILD_BUILD_ARN,
DD_ACTION_EXECUTION_ID,
DD_PIPELINE_EXECUTION_ID
} = env
tags = {
[CI_PROVIDER_NAME]: 'awscodepipeline',
[CI_PIPELINE_ID]: DD_PIPELINE_EXECUTION_ID,
[CI_ENV_VARS]: JSON.stringify({
CODEBUILD_BUILD_ARN,
DD_PIPELINE_EXECUTION_ID,
DD_ACTION_EXECUTION_ID
}),
[CI_JOB_ID]: DD_ACTION_EXECUTION_ID
}
}
if (env.DRONE && env.CI) {
const {
DRONE_BUILD_NUMBER,
DRONE_BUILD_LINK,
DRONE_STEP_NAME,
DRONE_STAGE_NAME,
DRONE_WORKSPACE,
DRONE_GIT_HTTP_URL,
DRONE_COMMIT_SHA,
DRONE_BRANCH,
DRONE_TAG,
DRONE_COMMIT_AUTHOR_NAME,
DRONE_COMMIT_AUTHOR_EMAIL,
DRONE_COMMIT_MESSAGE,
DRONE_PULL_REQUEST,
DRONE_TARGET_BRANCH
} = env
tags = {
[CI_PROVIDER_NAME]: 'drone',
[CI_PIPELINE_NUMBER]: DRONE_BUILD_NUMBER,
[CI_PIPELINE_URL]: DRONE_BUILD_LINK,
[CI_JOB_NAME]: DRONE_STEP_NAME,
[CI_STAGE_NAME]: DRONE_STAGE_NAME,
[CI_WORKSPACE_PATH]: DRONE_WORKSPACE,
[GIT_REPOSITORY_URL]: DRONE_GIT_HTTP_URL,
[GIT_COMMIT_SHA]: DRONE_COMMIT_SHA,
[GIT_BRANCH]: DRONE_BRANCH,
[GIT_TAG]: DRONE_TAG,
[GIT_COMMIT_AUTHOR_NAME]: DRONE_COMMIT_AUTHOR_NAME,
[GIT_COMMIT_AUTHOR_EMAIL]: DRONE_COMMIT_AUTHOR_EMAIL,
[GIT_COMMIT_MESSAGE]: DRONE_COMMIT_MESSAGE,
[PR_NUMBER]: DRONE_PULL_REQUEST,
[GIT_PULL_REQUEST_BASE_BRANCH]: DRONE_TARGET_BRANCH
}
}
normalizeTag(tags, CI_WORKSPACE_PATH, resolveTilde)
normalizeTag(tags, GIT_REPOSITORY_URL, filterSensitiveInfoFromRepository)
normalizeTag(tags, GIT_BRANCH, normalizeRef)
normalizeTag(tags, GIT_TAG, normalizeRef)
normalizeTag(tags, GIT_PULL_REQUEST_BASE_BRANCH, normalizeRef)
normalizeTag(tags, PR_NUMBER, normalizeNumber)
return removeEmptyValues(tags)
}
}