11import { type CiDescriptor , CiType } from "@allurereport/core-api" ;
22
3+ import { resolveRepositoryFromGitUrl , stripRefsHeads } from "../helpers/gitProvider.js" ;
34import { getEnv , getReponameFromRepoUrl } from "../utils.js" ;
45
56const AMAZON_REGEXP = / ^ a r n : a w s : c o d e b u i l d : ( [ ^ : ] + ) : ( [ \d ] + ) : (?: b u i l d | b u i l d - b a t c h ) \/ ( [ ^ : ] + ) : ( [ \d a - f - ] + ) $ / ;
67const PIPELINE_REGEXP = / ^ (?: c o d e p i p e l i n e \/ ) ( .+ ) $ / ;
8+ const REF_PREFIX = "refs/" ;
9+ const BRANCH_REF_PREFIX = "refs/heads/" ;
10+ const TAG_REF_PREFIX = "refs/tags/" ;
11+ const GIT_SHA_REGEXP = / ^ [ \d a - f ] { 40 } $ / i;
712
813export const parseArnValues = ( source : string ) : string [ ] => {
914 if ( ! source ) {
@@ -35,6 +40,103 @@ export const getPipelineName = (): string => {
3540 return initiator . match ( PIPELINE_REGEXP ) ?. [ 1 ] ?? "" ;
3641} ;
3742
43+ const stripCommitSuffix = ( sourceVersion : string ) : string => sourceVersion . replace ( / \^ \{ [ ^ } ] + \} $ / , "" ) ;
44+
45+ const parseBranchFromWebhookTrigger = ( ) : string | undefined => {
46+ const branchTrigger = getEnv ( "CODEBUILD_WEBHOOK_TRIGGER" ) || "" ;
47+
48+ if ( branchTrigger . startsWith ( "branch/" ) ) {
49+ const branch = branchTrigger . slice ( "branch/" . length ) ;
50+
51+ return branch || undefined ;
52+ }
53+
54+ return undefined ;
55+ } ;
56+
57+ const isTagWebhookTrigger = ( ) : boolean => ( getEnv ( "CODEBUILD_WEBHOOK_TRIGGER" ) || "" ) . startsWith ( "tag/" ) ;
58+
59+ const parseBranchFromSourceVersion = ( sourceVersion ?: string ) : string | undefined => {
60+ const normalizedSourceVersion = stripCommitSuffix ( ( sourceVersion ?? "" ) . trim ( ) ) ;
61+
62+ if ( ! normalizedSourceVersion ) {
63+ return undefined ;
64+ }
65+
66+ if ( normalizedSourceVersion . startsWith ( BRANCH_REF_PREFIX ) ) {
67+ const branch = normalizedSourceVersion . slice ( BRANCH_REF_PREFIX . length ) ;
68+
69+ return branch || undefined ;
70+ }
71+
72+ if (
73+ normalizedSourceVersion . startsWith ( TAG_REF_PREFIX ) ||
74+ normalizedSourceVersion . match ( / ^ p r \/ \d + $ / i) ||
75+ normalizedSourceVersion . match ( / ^ r e f s \/ p u l l \/ \d + \/ / i)
76+ ) {
77+ return undefined ;
78+ }
79+
80+ if ( normalizedSourceVersion . startsWith ( REF_PREFIX ) ) {
81+ return undefined ;
82+ }
83+
84+ const triggerBranch = parseBranchFromWebhookTrigger ( ) ;
85+
86+ if ( triggerBranch ) {
87+ return triggerBranch ;
88+ }
89+
90+ if ( isTagWebhookTrigger ( ) || GIT_SHA_REGEXP . test ( normalizedSourceVersion ) ) {
91+ return undefined ;
92+ }
93+
94+ return normalizedSourceVersion ;
95+ } ;
96+
97+ const parseBranchFromWebhookHeadRef = ( headRef ?: string ) : string | undefined => {
98+ const normalizedHeadRef = ( headRef ?? "" ) . trim ( ) ;
99+
100+ if ( ! normalizedHeadRef || normalizedHeadRef . startsWith ( TAG_REF_PREFIX ) || isTagWebhookTrigger ( ) ) {
101+ return undefined ;
102+ }
103+
104+ if ( normalizedHeadRef . startsWith ( BRANCH_REF_PREFIX ) ) {
105+ const branch = normalizedHeadRef . slice ( BRANCH_REF_PREFIX . length ) ;
106+
107+ return branch || undefined ;
108+ }
109+
110+ if ( normalizedHeadRef . startsWith ( REF_PREFIX ) ) {
111+ return undefined ;
112+ }
113+
114+ return normalizedHeadRef ;
115+ } ;
116+
117+ const parsePullRequestFromSourceVersion = ( sourceVersion ?: string ) : string | undefined => {
118+ const normalizedSourceVersion = sourceVersion ?? "" ;
119+ const prPrefixMatch = normalizedSourceVersion . match ( / ^ p r \/ (?< id > \d + ) $ / i) ?. groups ?. id ;
120+
121+ if ( prPrefixMatch ) {
122+ return prPrefixMatch ;
123+ }
124+
125+ return normalizedSourceVersion . match ( / r e f s \/ p u l l \/ (?< id > \d + ) \/ / ) ?. groups ?. id ;
126+ } ;
127+
128+ const parsePullRequestFromWebhookTrigger = ( ) : string | undefined => {
129+ const trigger = getEnv ( "CODEBUILD_WEBHOOK_TRIGGER" ) || "" ;
130+
131+ return trigger . match ( / ^ p r \/ (?< id > \d + ) $ / i) ?. groups ?. id ;
132+ } ;
133+
134+ const getRepository = ( ) => {
135+ const repoUrl = getEnv ( "CODEBUILD_SOURCE_REPO_URL" ) ;
136+
137+ return repoUrl ? resolveRepositoryFromGitUrl ( repoUrl ) : undefined ;
138+ } ;
139+
38140export const amazon : CiDescriptor = {
39141 type : CiType . Amazon ,
40142
@@ -151,9 +253,8 @@ export const amazon: CiDescriptor = {
151253
152254 get jobRunBranch ( ) : string {
153255 const sourceVersion = getEnv ( "CODEBUILD_SOURCE_VERSION" ) ;
154- const { branch } = sourceVersion ?. match ?.( / r e f s \/ h e a d s \/ (?< branch > \S + ) \^ \{ (?< commithash > \S + ) \} / ) ?. groups ?? { } ;
155256
156- return branch ?? "" ;
257+ return parseBranchFromSourceVersion ( sourceVersion ) ?? "" ;
157258 } ,
158259
159260 get pullRequestUrl ( ) : string {
@@ -163,4 +264,45 @@ export const amazon: CiDescriptor = {
163264 get pullRequestName ( ) : string {
164265 return "" ;
165266 } ,
267+
268+ get provider ( ) {
269+ return getRepository ( ) ?. provider ;
270+ } ,
271+
272+ get repository ( ) {
273+ const repository = getRepository ( ) ;
274+
275+ return repository
276+ ? {
277+ slug : repository . slug ,
278+ url : repository . url ,
279+ }
280+ : undefined ;
281+ } ,
282+
283+ get sourceBranch ( ) {
284+ return (
285+ parseBranchFromWebhookHeadRef ( getEnv ( "CODEBUILD_WEBHOOK_HEAD_REF" ) ) ||
286+ parseBranchFromSourceVersion ( getEnv ( "CODEBUILD_SOURCE_VERSION" ) ) ||
287+ this . jobRunBranch ||
288+ undefined
289+ ) ;
290+ } ,
291+
292+ get targetBranch ( ) {
293+ return stripRefsHeads ( getEnv ( "CODEBUILD_WEBHOOK_BASE_REF" ) ) || undefined ;
294+ } ,
295+
296+ get pullRequest ( ) {
297+ const pullRequestId =
298+ parsePullRequestFromWebhookTrigger ( ) || parsePullRequestFromSourceVersion ( getEnv ( "CODEBUILD_SOURCE_VERSION" ) ) ;
299+
300+ return pullRequestId
301+ ? {
302+ id : pullRequestId ,
303+ url : this . pullRequestUrl || undefined ,
304+ title : this . pullRequestName || undefined ,
305+ }
306+ : undefined ;
307+ } ,
166308} ;
0 commit comments