@@ -85,6 +85,7 @@ export enum BotLabels {
8585}
8686
8787const containsLabel = ( labels : string [ ] , label : BotLabels ) => labels . includes ( label ) ;
88+ const defaultPipelineValidationRetries = 5 ;
8889
8990export const filterBotLabels = ( labels : string [ ] ) => {
9091 const values = Object . values ( BotLabels ) ;
@@ -94,6 +95,7 @@ export const filterBotLabels = (labels: string[]) => {
9495
9596export const acceptMergeRequest = async ( gitlabApi : GitlabApi , mergeRequest : MergeRequest , user : User , options : AcceptMergeRequestOptions ) : Promise < AcceptMergeRequestResult > => {
9697 let mergeRequestInfo ;
98+ let numberOfPipelineValidationRetries = defaultPipelineValidationRetries ;
9799
98100 while ( true ) {
99101 const tasks : Array < Promise < any > > = [ sleep ( options . ciInterval ) ] ;
@@ -156,18 +158,22 @@ export const acceptMergeRequest = async (gitlabApi: GitlabApi, mergeRequest: Mer
156158 await gitlabApi . updateMergeRequest ( mergeRequest . project_id , mergeRequest . iid , {
157159 labels : [ ...filterBotLabels ( mergeRequestInfo . labels ) , BotLabels . Accepting ] . join ( ',' ) ,
158160 } ) ;
161+ numberOfPipelineValidationRetries = defaultPipelineValidationRetries ;
159162 continue ;
160163 }
161164
162- if ( mergeRequestInfo . pipeline === null ) {
163- return {
164- kind : AcceptMergeRequestResultKind . InvalidPipeline ,
165- mergeRequestInfo,
166- pipeline : mergeRequestInfo . pipeline ,
167- } ;
168- }
165+ if ( mergeRequestInfo . pipeline === null || mergeRequestInfo . pipeline . sha !== mergeRequestInfo . sha ) {
166+ const message = mergeRequestInfo . pipeline === null
167+ ? `[MR] Merge request can't be merged. Pipeline does not exist`
168+ : `[MR] Merge request can't be merged. The latest pipeline is not executed on the latest commit` ;
169+ console . log ( message ) ;
170+
171+ if ( numberOfPipelineValidationRetries > 0 ) {
172+ numberOfPipelineValidationRetries -- ;
173+ await Promise . all ( tasks ) ;
174+ continue ;
175+ }
169176
170- if ( mergeRequestInfo . pipeline . sha !== mergeRequestInfo . sha ) {
171177 return {
172178 kind : AcceptMergeRequestResultKind . InvalidPipeline ,
173179 mergeRequestInfo,
@@ -192,6 +198,7 @@ export const acceptMergeRequest = async (gitlabApi: GitlabApi, mergeRequest: Mer
192198 if ( mergeRequestInfo . pipeline . status === PipelineStatus . Canceled ) {
193199 console . log ( `[MR] pipeline is canceled calling retry` ) ;
194200 await gitlabApi . retryPipeline ( mergeRequest . project_id , mergeRequestInfo . pipeline . id ) ;
201+ numberOfPipelineValidationRetries = defaultPipelineValidationRetries ;
195202 continue ;
196203 }
197204
0 commit comments