@@ -22,7 +22,9 @@ import (
22
22
"errors"
23
23
"fmt"
24
24
"github.com/devtron-labs/ci-runner/executor"
25
+ adaptor2 "github.com/devtron-labs/ci-runner/executor/adaptor"
25
26
cicxt "github.com/devtron-labs/ci-runner/executor/context"
27
+ bean2 "github.com/devtron-labs/ci-runner/executor/stage/bean"
26
28
util2 "github.com/devtron-labs/ci-runner/executor/util"
27
29
"github.com/devtron-labs/ci-runner/helper"
28
30
"github.com/devtron-labs/ci-runner/helper/adaptor"
@@ -144,6 +146,7 @@ func (impl *CiStage) HandleCIEvent(ciCdRequest *helper.CiCdTriggerEvent, exitCod
144
146
return
145
147
}
146
148
149
+ // TODO: take as tech debt and break this function into parts for better code readability
147
150
func (impl * CiStage ) runCIStages (ciContext cicxt.CiContext , ciCdRequest * helper.CiCdTriggerEvent ) (artifactUploaded bool , err error ) {
148
151
149
152
metrics := & helper.CIMetrics {}
@@ -281,6 +284,18 @@ func (impl *CiStage) runCIStages(ciContext cicxt.CiContext, ciCdRequest *helper.
281
284
if err != nil {
282
285
return artifactUploaded , err
283
286
}
287
+ if scriptEnvs .RuntimeEnv [bean2 .ExternalCiArtifact ] != "" {
288
+ runtimeImage , runtimeDigest , err := impl .handleRuntimeParametersForCiJob (scriptEnvs .RuntimeEnv , ciCdRequest )
289
+ if err != nil {
290
+ log .Println (util .DEVTRON , "error in handling runtime parameters for ci job and getting runtime image and digest" )
291
+ return artifactUploaded , err
292
+ }
293
+ if len (runtimeImage ) > 0 {
294
+ dest = runtimeImage
295
+ digest = runtimeDigest
296
+ }
297
+ }
298
+
284
299
// scan only if ci scan enabled
285
300
if helper .IsEventTypeEligibleToScanImage (ciCdRequest .Type ) &&
286
301
ciCdRequest .CommonWorkflowRequest .ScanEnabled {
@@ -292,51 +307,7 @@ func (impl *CiStage) runCIStages(ciContext cicxt.CiContext, ciCdRequest *helper.
292
307
293
308
log .Println (util .DEVTRON , " event" )
294
309
metrics .TotalDuration = time .Since (metrics .TotalStartTime ).Seconds ()
295
- // When externalCiArtifact is provided (run time Env at time of build) then this image will be used further in the pipeline
296
- // imageDigest and ciProjectDetails are optional fields
297
- if scriptEnvs .RuntimeEnv ["externalCiArtifact" ] != "" {
298
- log .Println (util .DEVTRON , "external ci artifact found! exiting now with success event" )
299
- dest = scriptEnvs .RuntimeEnv ["externalCiArtifact" ]
300
- digest = scriptEnvs .RuntimeEnv ["imageDigest" ]
301
- if len (digest ) == 0 {
302
- var useAppDockerConfigForPrivateRegistries bool
303
- var err error
304
- useAppDockerConfig , ok := ciCdRequest .CommonWorkflowRequest .RuntimeEnvironmentVariables ["useAppDockerConfig" ]
305
- if ok && len (useAppDockerConfig ) > 0 {
306
- useAppDockerConfigForPrivateRegistries , err = strconv .ParseBool (useAppDockerConfig )
307
- if err != nil {
308
- fmt .Println (fmt .Sprintf ("Error in parsing useAppDockerConfig runtime param to bool from string useAppDockerConfigForPrivateRegistries:- %s, err:" , useAppDockerConfig ), err )
309
- }
310
- }
311
- var dockerAuthConfig * bean.DockerAuthConfig
312
- if useAppDockerConfigForPrivateRegistries {
313
- dockerAuthConfig = impl .dockerHelper .GetDockerAuthConfigForPrivateRegistries (ciCdRequest .CommonWorkflowRequest )
314
- }
315
- startTime := time .Now ()
316
- //user has not provided imageDigest in that case fetch from docker.
317
- imgDigest , err := impl .dockerHelper .ExtractDigestFromImage (dest , ciCdRequest .CommonWorkflowRequest .UseDockerApiToGetDigest , dockerAuthConfig )
318
- if err != nil {
319
- fmt .Println (fmt .Sprintf ("Error in extracting digest from image %s, err:" , dest ), err )
320
- return artifactUploaded , err
321
- }
322
- log .Println (fmt .Sprintf ("time since extract digest from image process:- %s" , time .Since (startTime ).String ()))
323
- digest = imgDigest
324
- }
325
- var tempDetails []* helper.CiProjectDetailsMin
326
- err := json .Unmarshal ([]byte (scriptEnvs .RuntimeEnv ["ciProjectDetails" ]), & tempDetails )
327
- if err != nil {
328
- fmt .Println ("Error unmarshalling ciProjectDetails JSON:" , err )
329
- fmt .Println ("ignoring the error and continuing without saving ciProjectDetails" )
330
- }
331
310
332
- if len (tempDetails ) > 0 && len (ciCdRequest .CommonWorkflowRequest .CiProjectDetails ) > 0 {
333
- detail := tempDetails [0 ]
334
- ciCdRequest .CommonWorkflowRequest .CiProjectDetails [0 ].CommitHash = detail .CommitHash
335
- ciCdRequest .CommonWorkflowRequest .CiProjectDetails [0 ].Message = detail .Message
336
- ciCdRequest .CommonWorkflowRequest .CiProjectDetails [0 ].Author = detail .Author
337
- ciCdRequest .CommonWorkflowRequest .CiProjectDetails [0 ].CommitTime = detail .CommitTime
338
- }
339
- }
340
311
event := adaptor .NewCiCompleteEvent (ciCdRequest .CommonWorkflowRequest ).WithMetrics (* metrics ).
341
312
WithDockerImage (dest ).WithDigest (digest ).WithIsArtifactUploaded (artifactUploaded ).
342
313
WithImageDetailsFromCR (resultsFromPlugin ).WithPluginArtifacts (pluginArtifacts )
@@ -467,18 +438,8 @@ func (impl *CiStage) runPostCiSteps(ciCdRequest *helper.CiCdTriggerEvent, script
467
438
func runImageScanning (dest string , digest string , ciCdRequest * helper.CiCdTriggerEvent , metrics * helper.CIMetrics , artifactUploaded bool ) error {
468
439
imageScanningStage := func () error {
469
440
log .Println ("Image Scanning Started for digest" , digest )
470
- scanEvent := & helper.ScanEvent {
471
- Image : dest ,
472
- ImageDigest : digest ,
473
- PipelineId : ciCdRequest .CommonWorkflowRequest .PipelineId ,
474
- UserId : ciCdRequest .CommonWorkflowRequest .TriggeredBy ,
475
- DockerRegistryId : ciCdRequest .CommonWorkflowRequest .DockerRegistryId ,
476
- DockerConnection : ciCdRequest .CommonWorkflowRequest .DockerConnection ,
477
- DockerCert : ciCdRequest .CommonWorkflowRequest .DockerCert ,
478
- ImageScanMaxRetries : ciCdRequest .CommonWorkflowRequest .ImageScanMaxRetries ,
479
- ImageScanRetryDelay : ciCdRequest .CommonWorkflowRequest .ImageScanRetryDelay ,
480
- }
481
- err := helper .SendEventToClairUtility (scanEvent )
441
+ scanEvent := adaptor2 .GetImageScanEvent (dest , digest , ciCdRequest .CommonWorkflowRequest )
442
+ err := helper .ExecuteImageScanningViaRest (scanEvent )
482
443
if err != nil {
483
444
log .Println ("error in running Image Scan" , "err" , err )
484
445
return helper .NewCiStageError (err ).
@@ -639,3 +600,59 @@ func (impl *CiStage) AddExtraEnvVariableFromRuntimeParamsToCiCdEvent(ciRequest *
639
600
}
640
601
return ciRequest .RuntimeEnvironmentVariables , nil
641
602
}
603
+
604
+ // When externalCiArtifact is provided (run time Env at time of build) then this image will be used further in the pipeline
605
+ // imageDigest and ciProjectDetails are optional fields
606
+ func (impl * CiStage ) handleRuntimeParametersForCiJob (runtimeEnv map [string ]string , ciCdRequest * helper.CiCdTriggerEvent ) (string , string , error ) {
607
+ log .Println (util .DEVTRON , "external ci artifact found! exiting now with success event" )
608
+ dest := runtimeEnv [bean2 .ExternalCiArtifact ]
609
+ digest := runtimeEnv [bean2 .ImageDigest ]
610
+ var err error
611
+ if len (digest ) == 0 {
612
+ digest , err = impl .extractDigestForCiJob (ciCdRequest .CommonWorkflowRequest , dest )
613
+ if err != nil {
614
+ log .Println (util .DEVTRON , " extract digest for ci job error" , "dest" , dest , "err" , err )
615
+ return dest , digest , err
616
+ }
617
+ }
618
+ var tempDetails []* helper.CiProjectDetailsMin
619
+ err = json .Unmarshal ([]byte (runtimeEnv [bean2 .CiProjectDetails ]), & tempDetails )
620
+ if err != nil {
621
+ fmt .Println ("Error unmarshalling ciProjectDetails JSON:" , err )
622
+ fmt .Println ("ignoring the error and continuing without saving ciProjectDetails" )
623
+ }
624
+ if len (tempDetails ) > 0 && len (ciCdRequest .CommonWorkflowRequest .CiProjectDetails ) > 0 {
625
+ detail := tempDetails [0 ]
626
+ ciCdRequest .CommonWorkflowRequest .CiProjectDetails [0 ].CommitHash = detail .CommitHash
627
+ ciCdRequest .CommonWorkflowRequest .CiProjectDetails [0 ].Message = detail .Message
628
+ ciCdRequest .CommonWorkflowRequest .CiProjectDetails [0 ].Author = detail .Author
629
+ ciCdRequest .CommonWorkflowRequest .CiProjectDetails [0 ].CommitTime = detail .CommitTime
630
+ }
631
+ return dest , digest , nil
632
+ }
633
+
634
+ func (impl * CiStage ) extractDigestForCiJob (workflowRequest * helper.CommonWorkflowRequest , image string ) (string , error ) {
635
+ var useAppDockerConfigForPrivateRegistries bool
636
+ var err error
637
+ useAppDockerConfig , ok := workflowRequest .RuntimeEnvironmentVariables [bean2 .UseAppDockerConfig ]
638
+ if ok && len (useAppDockerConfig ) > 0 {
639
+ useAppDockerConfigForPrivateRegistries , err = strconv .ParseBool (useAppDockerConfig )
640
+ if err != nil {
641
+ fmt .Println (fmt .Sprintf ("Error in parsing useAppDockerConfig runtime param to bool from string useAppDockerConfigForPrivateRegistries:- %s, err:" , useAppDockerConfig ), err )
642
+ // would use default val of useAppDockerConfigForPrivateRegistries i.e false in case error arises
643
+ }
644
+ }
645
+ var dockerAuthConfig * bean.DockerAuthConfig
646
+ if useAppDockerConfigForPrivateRegistries {
647
+ dockerAuthConfig = impl .dockerHelper .GetDockerAuthConfigForPrivateRegistries (workflowRequest )
648
+ }
649
+ startTime := time .Now ()
650
+ //user has not provided imageDigest in that case fetch from docker.
651
+ imgDigest , err := impl .dockerHelper .ExtractDigestFromImage (image , workflowRequest .UseDockerApiToGetDigest , dockerAuthConfig )
652
+ if err != nil {
653
+ fmt .Println (fmt .Sprintf ("Error in extracting digest from image %s, err:" , image ), err )
654
+ return "" , err
655
+ }
656
+ log .Println (fmt .Sprintf ("time since extract digest from image process:- %s" , time .Since (startTime ).String ()))
657
+ return imgDigest , nil
658
+ }
0 commit comments