o
    Á¿iqR  ã                   @   sŒ  d Z ddlZddlZddlZddlZddlZddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ dZd	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"e #d¡Z$ee%ƒZ&dee' dee' fdd „Z(d!d"„ Z)dQd#eee'e'f  d$ee' de*e'e'f fd%d&„Z+d#ee'e'f de*e'ee' f fd'd(„Z,d#ee'e'f de*e'ee' f fd)d*„Z-d#ee'e'f de*e'ee' f fd+d,„Z.d#ee'e'f de*e'ee' f fd-d.„Z/d#ee'e'f de*e'ee' f fd/d0„Z0d#ee'e'f de*e'ee' f fd1d2„Z1d#ee'e'f de*e'ee' f fd3d4„Z2d#ee'e'f de*e'ee' f fd5d6„Z3d#ee'e'f de*e'ee' f fd7d8„Z4d#ee'e'f de*e'ee' f fd9d:„Z5d#ee'e'f de*e'ee' f fd;d<„Z6d#ee'e'f de*e'ee' f fd=d>„Z7d#ee'e'f de*e'ee' f fd?d@„Z8d#ee'e'f de*e'ee' f fdAdB„Z9dCe,fdDe-fdEe.fdFe/fdGe0fdHe1fdIe2fdJe3fdKe4fdLe5fdMe6fdNe7fdOe8fdPe9ffZ:dS )Rz
Tags for common CI attributes
é    N)ÚMutableMapping)ÚOptional)Úgit)Úgithub_actions)Ú
get_loggerz
ciapp-testzci.stage.namez	ci.job.idzci.job.namez
ci.job.urlzci.pipeline.idzci.pipeline.namezci.pipeline.numberzci.pipeline.urlzci.provider.namezci.node.namezci.node.labelszci.workspace_pathzos.architecturezos.platformz
os.versionzruntime.namezruntime.versionÚlibrary_versionz_dd.ci.env_varsz(https?://|ssh://)[^/]*@ÚurlÚreturnc                 C   s   | d ur
t  d| ¡S d S )Nz\1)Ú_RE_URLÚsub)r   © r   úK/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/ext/ci/__init__.pyÚ_filter_sensitive_infoT   s   r   c                   C   s,   t t ¡ tt ¡ tt ¡ tt ¡ t	t 
¡ iS )z;Extract configuration facet tags for OS and Python runtime.)ÚOS_ARCHITECTUREÚplatformÚmachineÚOS_PLATFORMÚsystemÚ
OS_VERSIONÚreleaseÚRUNTIME_NAMEÚpython_implementationÚRUNTIME_VERSIONÚpython_versionr   r   r   r   Ú_get_runtime_and_os_metadataX   s   ûr   ÚenvÚcwdc              
      s  | du rt jn| } i ‰ tD ]\}}|| v r|| ƒ‰  nqtj|d}ˆ  tj¡}|r6tj||d}| |¡ z
tj	|d|t
< W n2 tjyO   t d¡ Y n$ tyr } zt tj¡}t|ƒ}	tjd|	|d W Y d}~nd}~ww ˆ  ‡ fdd„| ¡ D ƒ¡ t | ¡}
ˆ  d	d„ |
 ¡ D ƒ¡ |  d
¡rž|  d
¡ˆ t< t ˆ  tj¡¡rËˆ  tj¡sºt ˆ  tj¡¡ˆ tj< nt ˆ  tj¡¡ˆ tj< ˆ tj= nt ˆ  tj¡¡ˆ tj< t ˆ  tj¡¡ˆ tj< tˆ  tj¡ƒˆ tj< ˆ  t
¡}|rýt j |¡ˆ t
< ˆ  tƒ ¡ dd„ ˆ  ¡ D ƒS )zDExtract and set tags from provider environ, as well as git metadata.N)r   )Úhead_commit_shar   z6Git executable not found, cannot extract git metadata.z!Error extracting git metadata: %s)Úexc_infoc                    s    i | ]\}}ˆ   |¡s||“qS r   )Úget©Ú.0ÚkÚv©Útagsr   r   Ú
<dictcomp>‚   s     ztags.<locals>.<dictcomp>c                 S   s   i | ]	\}}|r||“qS r   r   r    r   r   r   r&   ‡   s    ÚJOB_IDc                 S   s   i | ]\}}|d ur||“qS )Nr   r    r   r   r   r&       s    )ÚosÚenvironÚ	PROVIDERSr   Úextract_git_metadatar   ÚCOMMIT_HEAD_SHAÚextract_git_head_metadataÚupdateÚextract_workspace_pathÚWORKSPACE_PATHÚGitNotFoundErrorÚlogÚerrorÚ
ValueErrorÚisEnabledForÚloggingÚDEBUGÚstrÚitemsÚextract_user_git_metadatar'   Úis_ref_a_tagÚBRANCHÚTAGÚnormalize_refr   ÚREPOSITORY_URLÚpathÚ
expanduserr   )r   r   ÚkeyÚextractÚgit_infor   Úgit_head_infoÚeÚ
debug_modeÚstderrÚuser_specified_git_infoÚworkspace_pathr   r$   r   r%   c   sP   þ
€ý



r%   c                 C   s  d  |  d¡|  d¡¡}|  d¡dkr/d  |  d¡¡}|  d¡}|  d|  d	¡¡}|  d
¡}nd } } }}|  d¡}|rK|  d¡}|rK|d| 7 }tdtj|tj|t|  d¡t|  d¡t|  d¡t	|  d¡t
|t|tj|tj|tj|tj|  d¡tj|  d¡iS )z&Extract CI tags from Appveyor environ.z.https://ci.appveyor.com/project/{0}/builds/{1}ÚAPPVEYOR_REPO_NAMEÚAPPVEYOR_BUILD_IDÚAPPVEYOR_REPO_PROVIDERÚgithubúhttps://github.com/{0}.gitÚAPPVEYOR_REPO_COMMITÚ&APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCHÚAPPVEYOR_REPO_BRANCHÚAPPVEYOR_REPO_TAG_NAMENÚAPPVEYOR_REPO_COMMIT_MESSAGEÚ%APPVEYOR_REPO_COMMIT_MESSAGE_EXTENDEDÚ
ÚappveyorÚAPPVEYOR_BUILD_FOLDERÚAPPVEYOR_BUILD_NUMBERÚAPPVEYOR_REPO_COMMIT_AUTHORÚ!APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL)Úformatr   ÚPROVIDER_NAMEr   r?   Ú
COMMIT_SHAr0   ÚPIPELINE_IDÚPIPELINE_NAMEÚPIPELINE_NUMBERÚPIPELINE_URLÚJOB_URLr<   r=   ÚCOMMIT_MESSAGEÚCOMMIT_AUTHOR_NAMEÚCOMMIT_AUTHOR_EMAIL)r   r   Ú
repositoryÚcommitÚbranchÚtagÚcommit_messageÚextendedr   r   r   Úextract_appveyor£   s:   ÿ






òrm   c                 C   sx  |   d¡r0|   d¡r0|   d¡r0d |   d¡|   d¡|   d¡¡}|}|d |   d¡|   d¡¡ }nd }}i td	“t|   d
¡“t|   d¡“t|   d¡“t|   d¡“t|“t|“t	j
|   d¡pa|   d¡“t	j|   d¡pm|   d¡“t	j|   d¡p~|   d¡p~|   d¡“t	j|   d¡“t	j|   d¡“t	j|   d¡“t|   d¡“t|   d¡“t|   d¡“ttj|   d¡|   d¡|   d¡dœdd“S )z-Extract CI tags from Azure pipelines environ.ÚSYSTEM_TEAMFOUNDATIONSERVERURIÚSYSTEM_TEAMPROJECTIDÚBUILD_BUILDIDz!{0}{1}/_build/results?buildId={2}z&view=logs&j={0}&t={1}ÚSYSTEM_JOBIDÚSYSTEM_TASKINSTANCEIDNÚazurepipelinesÚBUILD_SOURCESDIRECTORYÚBUILD_DEFINITIONNAMEÚ&SYSTEM_PULLREQUEST_SOURCEREPOSITORYURIÚBUILD_REPOSITORY_URIÚ!SYSTEM_PULLREQUEST_SOURCECOMMITIDÚBUILD_SOURCEVERSIONÚSYSTEM_PULLREQUEST_SOURCEBRANCHÚBUILD_SOURCEBRANCHÚBUILD_SOURCEBRANCHNAMEÚBUILD_SOURCEVERSIONMESSAGEÚBUILD_REQUESTEDFORIDÚBUILD_REQUESTEDFOREMAILÚSYSTEM_STAGEDISPLAYNAMEÚSYSTEM_JOBDISPLAYNAME)ro   rp   rq   ©ú,ú:©Ú
separators)r   r\   r]   r0   r_   r`   ra   rb   rc   r   r?   r^   r<   rd   re   rf   Ú
STAGE_NAMEr'   ÚJOB_NAMEÚ_CI_ENV_VARSÚjsonÚdumps)r   Úbase_urlÚpipeline_urlÚjob_urlr   r   r   Úextract_azure_pipelinesÈ   sj   ÿÿÿ
þ
ý
ü
ûúùø	÷
ÿôóòñ
ð
ï
îýúír   c                 C   s–   d  |  d¡|  d¡¡}tj|  d¡tj|  d¡tj|  d¡p#|  d¡tj|  d¡t|t|  d	d
¡ 	d¡p6dt
|  d¡t|  d¡t|tdt|  d¡iS )z'Extract CI tags from Bitbucket environ.z<https://bitbucket.org/{0}/addon/pipelines/home#!/results/{1}ÚBITBUCKET_REPO_FULL_NAMEÚBITBUCKET_BUILD_NUMBERÚBITBUCKET_BRANCHÚBITBUCKET_COMMITÚBITBUCKET_GIT_SSH_ORIGINÚBITBUCKET_GIT_HTTP_ORIGINÚBITBUCKET_TAGÚBITBUCKET_PIPELINE_UUIDÚ z{}}NÚ	bitbucketÚBITBUCKET_CLONE_DIR)r\   r   r   r<   r^   r?   r=   rc   r_   Ústripr`   ra   rb   r]   r0   )r   r   r   r   r   Úextract_bitbucketó   s   ÿ


õrœ   c              	   C   sn  g }d}| D ]}|  |¡r#| |d¡ ¡ }|  |¡}| d ||¡¡ qi tj|  d¡“tj|  d¡“tj	|  d¡“tj
|  d¡“t|  d¡“t|  d	¡“t|  d
¡“t|  d¡“t|  d¡“td |  d¡|  d¡¡“td“t|  d¡“tj|  d¡“tj|  d¡“tj|  d¡“tj|  d¡“tj|  d¡“ttj|  d¡|  d¡dœddttj|ddt|  d¡i¥S )z'Extract CI tags from Buildkite environ.ÚBUILDKITE_AGENT_META_DATA_r˜   z{}:{}ÚBUILDKITE_BRANCHÚBUILDKITE_COMMITÚBUILDKITE_REPOÚBUILDKITE_TAGÚBUILDKITE_BUILD_IDÚBUILDKITE_PIPELINE_SLUGÚBUILDKITE_BUILD_NUMBERÚBUILDKITE_BUILD_URLÚBUILDKITE_JOB_IDz{0}#{1}Ú	buildkiteÚBUILDKITE_BUILD_CHECKOUT_PATHÚBUILDKITE_MESSAGEÚBUILDKITE_BUILD_AUTHORÚBUILDKITE_BUILD_AUTHOR_EMAILÚBUILDKITE_BUILD_CREATORÚBUILDKITE_BUILD_CREATOR_EMAIL)r¢   r¦   r‚   r…   ÚBUILDKITE_AGENT_ID)Ú
startswithÚreplaceÚlowerr   Úappendr\   r   r<   r^   r?   r=   r_   r`   ra   rb   r'   rc   r]   r0   rd   re   rf   ÚCOMMIT_COMMITTER_NAMEÚCOMMIT_COMMITTER_EMAILr‰   rŠ   r‹   ÚNODE_LABELSÚ	NODE_NAME)r   Únode_label_listÚ buildkite_agent_meta_data_prefixÚenv_variablerB   Úvaluer   r   r   Úextract_buildkite  sh   

€ÿþýü
û
ú
ù
ø
	÷
öõ
ôóòñðïþû
ær»   c                 C   s¤   t j|  d¡t j|  d¡t j|  d¡t j|  d¡t|  d¡t|  d¡t|  d¡t	d 
|  d¡¡t|  d	¡t|  d
¡tdt|  d¡ttj|  d¡|  d¡dœddiS )z&Extract CI tags from CircleCI environ.ÚCIRCLE_BRANCHÚCIRCLE_SHA1ÚCIRCLE_REPOSITORY_URLÚ
CIRCLE_TAGÚCIRCLE_WORKFLOW_IDÚCIRCLE_PROJECT_REPONAMEÚCIRCLE_BUILD_NUMz0https://app.circleci.com/pipelines/workflows/{0}ÚCIRCLE_BUILD_URLÚ
CIRCLE_JOBÚcircleciÚCIRCLE_WORKING_DIRECTORY)rÀ   rÂ   r‚   r…   )r   r<   r   r^   r?   r=   r_   r`   ra   rb   r\   rc   rˆ   r]   r0   r‰   rŠ   r‹   ©r   r   r   r   Úextract_circle_ci/  s&   





þûórÈ   c                 C   sR   |   d¡}tj|   d¡t|t|   d¡t|   d¡t|   d¡tdtt	j
d|iddiS )	z'Extract CI tags from Codefresh environ.ÚCF_BUILD_IDÚ	CF_BRANCHÚCF_PIPELINE_NAMEÚCF_BUILD_URLÚCF_STEP_NAMEÚ	codefreshr‚   r…   )r   r   r<   r_   r`   rb   rˆ   r]   r‰   rŠ   r‹   )r   Úbuild_idr   r   r   Úextract_codefreshH  s   



þùrÐ   c                 C   s
   t  | ¡S )z0Extract CI tags from Github Actions environment.)r   Úextract_github_actionsrÇ   r   r   r   rÑ   Y  s   
rÑ   c                 C   sF  |   d¡}d}d}|r| d¡ d¡\}}|   d¡}i tj|   d¡“tj|   d¡“tj|   d¡“tj|   d	¡“t|   d
¡“t	|   d¡“t
|   d¡“t|   d¡“t|   d¡“t|   d¡“t|   d¡“t|   d¡“td“t|   d¡“tj|   d¡“tj|“tj|“tj|ttj|   d¡|   d¡|   d¡dœddt|   d¡t|   d¡i¥S )z$Extract CI tags from Gitlab environ.ÚCI_COMMIT_AUTHORNz> z <ÚCI_COMMIT_TIMESTAMPÚCI_COMMIT_REF_NAMEÚCI_COMMIT_SHAÚCI_REPOSITORY_URLÚCI_COMMIT_TAGÚCI_JOB_STAGEÚ	CI_JOB_IDÚCI_JOB_NAMEÚ
CI_JOB_URLÚCI_PIPELINE_IDÚCI_PROJECT_PATHÚCI_PIPELINE_IIDÚCI_PIPELINE_URLÚgitlabÚCI_PROJECT_DIRÚCI_COMMIT_MESSAGEÚCI_PROJECT_URL)rã   rÜ   rÙ   r‚   r…   ÚCI_RUNNER_TAGSÚCI_RUNNER_ID)r   r›   Úsplitr   r<   r^   r?   r=   r‡   r'   rˆ   rc   r_   r`   ra   rb   r]   r0   rd   re   rf   ÚCOMMIT_AUTHOR_DATEr‰   rŠ   r‹   rµ   r¶   )r   ÚauthorÚauthor_nameÚauthor_emailÚcommit_timestampr   r   r   Úextract_gitlab^  sh   

ÿþýü
û
ú
ù
ø
	÷

ö
õ
ôó
òñðïýú

ärì   c                 C   s   |   dd¡}|   d¡}|r|rt d t |¡¡d|¡}|r+d dd„ | d¡D ƒ¡}g }|   d¡}|r8| ¡ }tj|   d¡tj	|   d	¡tj
|   d
|   d¡¡t|   d¡t|t|   d¡t|   d¡tdt|   d¡ttjd|   d¡iddttj|ddt|   d¡iS )z%Extract CI tags from Jenkins environ.Ú
GIT_BRANCHr˜   rˆ   z/{0}ú/c                 s   s     | ]}|rd |vr|V  qdS )ú=Nr   )r!   r#   r   r   r   Ú	<genexpr>Ž  s   € z"extract_jenkins.<locals>.<genexpr>rµ   Ú
GIT_COMMITÚGIT_URLÚ	GIT_URL_1Ú	BUILD_TAGÚBUILD_NUMBERÚ	BUILD_URLÚjenkinsÚ	WORKSPACEÚDD_CUSTOM_TRACE_IDr‚   r…   r¶   )r   Úrer   r\   r   r>   Újoinræ   r<   r^   r?   r_   r`   ra   rb   r]   r0   r‰   rŠ   r‹   rµ   r¶   )r   ri   ÚnameÚnode_labels_listÚnode_labels_envr   r   r   Úextract_jenkins‡  s6   






ÿü
ïrÿ   c                 C   s   t |  d¡t|  d¡tdiS )z&Extract CI tags from Teamcity environ.rö   ÚTEAMCITY_BUILDCONF_NAMEÚteamcity)rc   r   rˆ   r]   rÇ   r   r   r   Úextract_teamcity¨  s   

ýr  c                 C   s   t j|  d¡p|  d¡t j|  d¡t jd |  d¡¡t j|  d¡t|  d¡t|  d¡t	|  d¡t
|  d	¡t|  d
¡tdt|  d¡t j|  d¡iS )z$Extract CI tags from Travis environ.ÚTRAVIS_PULL_REQUEST_BRANCHÚTRAVIS_BRANCHÚTRAVIS_COMMITrO   ÚTRAVIS_REPO_SLUGÚ
TRAVIS_TAGÚTRAVIS_JOB_WEB_URLÚTRAVIS_BUILD_IDÚTRAVIS_BUILD_NUMBERÚTRAVIS_BUILD_WEB_URLÚtravisciÚTRAVIS_BUILD_DIRÚTRAVIS_COMMIT_MESSAGE)r   r<   r   r^   r?   r\   r=   rc   r_   r`   ra   rb   r]   r0   rd   rÇ   r   r   r   Úextract_travis±  s   





ôr  c                  C   s  |   d¡p	|   d¡}|   d¡p|   d¡}|   d¡r|   d¡}n|   d¡s)|   d¡r6d |   d¡|   d¡¡}nd	}td
t|   d¡t|   d¡t|   d¡t|   d¡t|   d¡tj	|   d¡tj
|tj|tj|   d¡tj|tj|   d¡tj|   d¡tj|   d¡tj|   d¡iS )z%Extract CI tags from Bitrise environ.ÚBITRISE_GIT_COMMITÚGIT_CLONE_COMMIT_HASHÚBITRISEIO_GIT_BRANCH_DESTÚBITRISE_GIT_BRANCHÚBITRISE_GIT_MESSAGEÚ GIT_CLONE_COMMIT_MESSAGE_SUBJECTÚGIT_CLONE_COMMIT_MESSAGE_BODYz{0}:
{1}NÚbitriseÚBITRISE_BUILD_SLUGÚBITRISE_TRIGGERED_WORKFLOW_IDÚBITRISE_BUILD_NUMBERÚBITRISE_BUILD_URLÚBITRISE_SOURCE_DIRÚGIT_REPOSITORY_URLÚBITRISE_GIT_TAGÚGIT_CLONE_COMMIT_AUTHOR_NAMEÚGIT_CLONE_COMMIT_AUTHOR_EMAILÚGIT_CLONE_COMMIT_COMMITER_NAME)r   r\   r]   r_   r`   ra   rb   r0   r   r?   r^   r<   r=   rd   re   rf   r³   r´   )r   rh   ri   Úmessager   r   r   Úextract_bitriseÃ  s2   
ÿ




ñr#  c                 C   s’   t dtd |  d¡|  d¡¡t|  d¡t|  d¡t|  d¡tj|  d¡tj	|  d¡tj
|  d	¡tj|  d
¡tj|  d¡tj|  d¡tj|  d¡iS )z#Extract CI tags from Buddy environ.Úbuddyz{0}/{1}ÚBUDDY_PIPELINE_IDÚBUDDY_EXECUTION_IDÚBUDDY_PIPELINE_NAMEÚBUDDY_EXECUTION_URLÚBUDDY_SCM_URLÚBUDDY_EXECUTION_REVISIONÚBUDDY_EXECUTION_BRANCHÚBUDDY_EXECUTION_TAGÚ BUDDY_EXECUTION_REVISION_MESSAGEÚ'BUDDY_EXECUTION_REVISION_COMMITTER_NAMEÚ(BUDDY_EXECUTION_REVISION_COMMITTER_EMAIL)r]   r_   r\   r   r`   ra   rb   r   r?   r^   r<   r=   rd   r³   r´   rÇ   r   r   r   Úextract_buddyã  s   


ôr0  c                 C   sh   i }d| v r2|   d¡}|r2| d¡r2| tdt|   d¡ttj|   d¡|   d¡|   d¡dœdd	i¡ |S )
z,Extract CI tags from codebuild environments.ÚCODEBUILD_INITIATORÚcodepipelineÚawscodepipelineÚDD_PIPELINE_EXECUTION_IDÚCODEBUILD_BUILD_ARNÚDD_ACTION_EXECUTION_ID)r5  r4  r6  r‚   r…   )r   r¯   r.   r]   r_   r‰   rŠ   r‹   )r   r%   Úcodebuild_initiatorr   r   r   Úextract_codebuildõ  s"   

ýúýÿr8  ÚAPPVEYORÚTF_BUILDr“   Ú	BUILDKITEÚCIRCLECIrÉ   Ú
GITHUB_SHAÚ	GITLAB_CIÚJENKINS_URLÚTEAMCITY_VERSIONÚTRAVISr  ÚBUDDYr1  )NN);Ú__doc__rŠ   r6   r(   r   rú   Útypingr   r   Úddtrace.extr   Úddtrace.ext.cir   Úddtrace.internal.loggerr   ÚCI_APP_TEST_ORIGINr‡   r'   rˆ   rc   r_   r`   ra   rb   r]   r¶   rµ   r0   r   r   r   r   r   ÚLIBRARY_VERSIONr‰   Úcompiler
   Ú__name__r2   r8   r   r   Údictr%   rm   r   rœ   r»   rÈ   rÐ   rÑ   rì   rÿ   r  r  r#  r0  r8  r*   r   r   r   r   Ú<module>   s‚    
0&@&%&+&&(&&&&)&!&	&& &ò