Skip to content

Commit a7bf94d

Browse files
Fix: Webhook fixed for External CI (#2491)
* changes made for external ci successfull run case * check added for external ci * checks added for nil data for external ci case * commit time fix for external ci
1 parent 1d654f2 commit a7bf94d

File tree

10 files changed

+107
-88
lines changed

10 files changed

+107
-88
lines changed

api/router/pubsub/CiEventHandler.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,9 @@ package pubsub
2020
import (
2121
"encoding/json"
2222
"fmt"
23-
2423
"github.com/devtron-labs/devtron/client/pubsub"
2524
"github.com/devtron-labs/devtron/internal/sql/repository"
2625
"github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig"
27-
"github.com/devtron-labs/devtron/pkg/bean"
2826
"github.com/devtron-labs/devtron/pkg/pipeline"
2927
"github.com/devtron-labs/devtron/util"
3028
"github.com/nats-io/nats.go"
@@ -122,7 +120,7 @@ func (impl *CiEventHandlerImpl) BuildCiArtifactRequest(event CiCompleteEvent) (*
122120

123121
modification := repository.Modification{
124122
Revision: p.CommitHash,
125-
ModifiedTime: p.CommitTime.Format(bean.LayoutRFC3339),
123+
ModifiedTime: p.CommitTime,
126124
Author: p.Author,
127125
Branch: branch,
128126
Tag: tag,

pkg/pipeline/CdHandler.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -502,7 +502,7 @@ func (impl *CdHandlerImpl) GetRunningWorkflowLogs(environmentId int, pipelineId
502502
func (impl *CdHandlerImpl) getWorkflowLogs(pipelineId int, cdWorkflow *pipelineConfig.CdWorkflowRunner, token string, host string, runStageInEnv bool) (*bufio.Reader, func() error, error) {
503503
cdLogRequest := BuildLogRequest{
504504
PodName: cdWorkflow.PodName,
505-
Namespace: cdWorkflow.Namespace,
505+
Namespace: cdWorkflow.Namespace,
506506
}
507507

508508
logStream, cleanUp, err := impl.ciLogService.FetchRunningWorkflowLogs(cdLogRequest, token, host, runStageInEnv)
@@ -539,7 +539,7 @@ func (impl *CdHandlerImpl) getLogsFromRepository(pipelineId int, cdWorkflow *pip
539539
cdLogRequest := BuildLogRequest{
540540
PipelineId: cdWorkflow.CdWorkflow.PipelineId,
541541
WorkflowId: cdWorkflow.Id,
542-
PodName: cdWorkflow.PodName,
542+
PodName: cdWorkflow.PodName,
543543
LogsFilePath: cdWorkflow.LogLocation, // impl.cdConfig.DefaultBuildLogsKeyPrefix + "/" + cdWorkflow.Name + "/main.log", //TODO - fixme
544544
CloudProvider: impl.ciConfig.CloudProvider,
545545
AzureBlobConfig: &blob_storage.AzureBlobBaseConfig{
@@ -611,10 +611,15 @@ func (impl *CdHandlerImpl) FetchCdWorkflowDetails(appId int, environmentId int,
611611
ciMaterialsArr = append(ciMaterialsArr, res)
612612
}
613613
ciWf, err := impl.ciWorkflowRepository.FindLastTriggeredWorkflowByArtifactId(workflow.CiArtifactId)
614-
if err != nil {
614+
if err != nil && err != pg.ErrNoRows {
615615
impl.Logger.Errorw("error in fetching ci wf", "artifactId", workflow.CiArtifactId, "err", err)
616616
return WorkflowResponse{}, err
617617
}
618+
gitTriggers := make(map[int]pipelineConfig.GitCommit)
619+
if ciWf.GitTriggers != nil {
620+
gitTriggers = ciWf.GitTriggers
621+
}
622+
618623
workflowResponse := WorkflowResponse{
619624
Id: workflow.Id,
620625
Name: workflow.Name,
@@ -629,7 +634,7 @@ func (impl *CdHandlerImpl) FetchCdWorkflowDetails(appId int, environmentId int,
629634
TriggeredByEmail: triggeredByUser.EmailId,
630635
Artifact: workflow.Image,
631636
Stage: workflow.WorkflowType,
632-
GitTriggers: ciWf.GitTriggers,
637+
GitTriggers: gitTriggers,
633638
BlobStorageEnabled: workflow.BlobStorageEnabled,
634639
}
635640
return workflowResponse, nil

pkg/pipeline/CiConfig.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ type CiConfig struct {
5656
WorkflowServiceAccount string `env:"WORKFLOW_SERVICE_ACCOUNT" envDefault:"ci-runner"`
5757
ExternalCiApiSecret string `env:"EXTERNAL_CI_API_SECRET" envDefault:"devtroncd-secret"`
5858
ExternalCiWebhookUrl string `env:"EXTERNAL_CI_WEB_HOOK_URL" envDefault:""`
59-
ExternalCiPayload string `env:"EXTERNAL_CI_PAYLOAD" envDefault:"{\"ciProjectDetails\":[{\"gitRepository\":\"https://github.com/srj92/getting-started-nodejs.git\",\"checkoutPath\":\"./abc\",\"commitHash\":\"239077135f8cdeeccb7857e2851348f558cb53d3\",\"commitTime\":\"2019-10-31T20:55:21+05:30\",\"branch\":\"master\",\"message\":\"Update README.md\",\"author\":\"Suraj Gupta \"}],\"dockerImage\":\"445808685819.dkr.ecr.us-east-2.amazonaws.com/orch:23907713-2\",\"digest\":\"test1\",\"dataSource\":\"ext\",\"materialType\":\"git\"}"`
59+
ExternalCiPayload string `env:"EXTERNAL_CI_PAYLOAD" envDefault:"{\"ciProjectDetails\":[{\"gitRepository\":\"https://github.com/vikram1601/getting-started-nodejs.git\",\"checkoutPath\":\"./abc\",\"commitHash\":\"239077135f8cdeeccb7857e2851348f558cb53d3\",\"commitTime\":\"2019-10-31T20:55:21+05:30\",\"branch\":\"master\",\"message\":\"Update README.md\",\"author\":\"User Name \"}],\"dockerImage\":\"445808685819.dkr.ecr.us-east-2.amazonaws.com/orch:23907713-2\",\"digest\":\"sha256:sha256:1c96\",\"dataSource\":\"EXTERNAL\",\"materialType\":\"git\"}"`
6060
CiArtifactLocationFormat string `env:"CI_ARTIFACT_LOCATION_FORMAT" envDefault:"%d/%d.zip"`
6161
ImageScannerEndpoint string `env:"IMAGE_SCANNER_ENDPOINT" envDefault:"http://image-scanner-new-demo-devtroncd-service.devtroncd:80"`
6262
CloudProvider blob_storage.BlobStorageType `env:"BLOB_STORAGE_PROVIDER" envDefault:"S3"`

pkg/pipeline/CiHandler.go

Lines changed: 73 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"errors"
2525
"fmt"
2626
blob_storage "github.com/devtron-labs/common-lib/blob-storage"
27+
bean2 "github.com/devtron-labs/devtron/api/bean"
2728
"io/ioutil"
2829
"os"
2930
"strconv"
@@ -489,7 +490,7 @@ func (impl *CiHandlerImpl) getWorkflowLogs(pipelineId int, ciWorkflow *pipelineC
489490
}
490491
ciLogRequest := BuildLogRequest{
491492
PodName: ciWorkflow.PodName,
492-
Namespace: ciWorkflow.Namespace,
493+
Namespace: ciWorkflow.Namespace,
493494
}
494495
logStream, cleanUp, err := impl.ciLogService.FetchRunningWorkflowLogs(ciLogRequest, "", "", false)
495496
if logStream == nil || err != nil {
@@ -701,24 +702,25 @@ func (impl *CiHandlerImpl) extractWorkfowStatus(workflowStatus v1alpha1.Workflow
701702
podName := ""
702703
logLocation := ""
703704
for k, v := range workflowStatus.Nodes {
704-
if v.TemplateName == CI_WORKFLOW_NAME {impl.Logger.Infow("extractWorkflowStatus", "workflowName", k, "v", v)
705+
if v.TemplateName == CI_WORKFLOW_NAME {
706+
impl.Logger.Infow("extractWorkflowStatus", "workflowName", k, "v", v)
705707
if v.BoundaryID == "" {
706708
workflowName = k
707709
} else {
708710
workflowName = v.BoundaryID
709711
}
710712
podName = k
711-
podStatus = string(v.Phase)
712-
message = v.Message
713-
if v.Outputs != nil && len(v.Outputs.Artifacts) > 0 {
714-
if v.Outputs.Artifacts[0].S3 != nil {
715-
logLocation = v.Outputs.Artifacts[0].S3.Key
716-
} else if v.Outputs.Artifacts[0].GCS != nil {
717-
logLocation = v.Outputs.Artifacts[0].GCS.Key
713+
podStatus = string(v.Phase)
714+
message = v.Message
715+
if v.Outputs != nil && len(v.Outputs.Artifacts) > 0 {
716+
if v.Outputs.Artifacts[0].S3 != nil {
717+
logLocation = v.Outputs.Artifacts[0].S3.Key
718+
} else if v.Outputs.Artifacts[0].GCS != nil {
719+
logLocation = v.Outputs.Artifacts[0].GCS.Key
720+
}
718721
}
722+
break
719723
}
720-
break
721-
}
722724
}
723725
return workflowName, status, podStatus, message, logLocation, podName
724726
}
@@ -1029,28 +1031,14 @@ func (impl *CiHandlerImpl) FetchMaterialInfoByArtifactId(ciArtifactId int) (*Git
10291031
impl.Logger.Errorw("err", "ciArtifactId", ciArtifactId, "err", err)
10301032
return &GitTriggerInfoResponse{}, err
10311033
}
1032-
var workflow *pipelineConfig.CiWorkflow
1033-
if ciArtifact.ParentCiArtifact > 0 {
1034-
workflow, err = impl.ciWorkflowRepository.FindLastTriggeredWorkflowByArtifactId(ciArtifact.ParentCiArtifact)
1035-
if err != nil {
1036-
impl.Logger.Errorw("err", "ciArtifactId", ciArtifact.ParentCiArtifact, "err", err)
1037-
return &GitTriggerInfoResponse{}, err
1038-
}
1039-
} else {
1040-
workflow, err = impl.ciWorkflowRepository.FindLastTriggeredWorkflowByArtifactId(ciArtifactId)
1041-
if err != nil {
1042-
impl.Logger.Errorw("err", "ciArtifactId", ciArtifactId, "err", err)
1043-
return &GitTriggerInfoResponse{}, err
1044-
}
1045-
}
10461034

1047-
triggeredByUser, err := impl.userService.GetById(workflow.TriggeredBy)
1048-
if err != nil && !util.IsErrNoRows(err) {
1049-
impl.Logger.Errorw("err", "err", err)
1035+
ciPipeline, err := impl.ciPipelineRepository.FindById(ciArtifact.PipelineId)
1036+
if err != nil {
1037+
impl.Logger.Errorw("err", "ciArtifactId", ciArtifactId, "err", err)
10501038
return &GitTriggerInfoResponse{}, err
10511039
}
10521040

1053-
ciMaterials, err := impl.ciPipelineMaterialRepository.GetByPipelineId(workflow.CiPipelineId)
1041+
ciMaterials, err := impl.ciPipelineMaterialRepository.GetByPipelineId(ciPipeline.Id)
10541042
if err != nil {
10551043
impl.Logger.Errorw("err", "err", err)
10561044
return &GitTriggerInfoResponse{}, err
@@ -1062,49 +1050,73 @@ func (impl *CiHandlerImpl) FetchMaterialInfoByArtifactId(ciArtifactId int) (*Git
10621050
return &GitTriggerInfoResponse{}, err
10631051
}
10641052

1065-
var ciMaterialsArr []CiPipelineMaterialResponse
1066-
for _, m := range ciMaterials {
1067-
var history []*gitSensor.GitCommit
1068-
_gitTrigger := workflow.GitTriggers[m.Id]
1069-
1070-
_gitCommit := &gitSensor.GitCommit{
1071-
Message: _gitTrigger.Message,
1072-
Author: _gitTrigger.Author,
1073-
Date: _gitTrigger.Date,
1074-
Changes: _gitTrigger.Changes,
1075-
Commit: _gitTrigger.Commit,
1053+
ciMaterialsArr := make([]CiPipelineMaterialResponse, 0)
1054+
triggeredByUser := &bean2.UserInfo{}
1055+
//check workflow data only for non external builds
1056+
if !ciPipeline.IsExternal {
1057+
var workflow *pipelineConfig.CiWorkflow
1058+
if ciArtifact.ParentCiArtifact > 0 {
1059+
workflow, err = impl.ciWorkflowRepository.FindLastTriggeredWorkflowByArtifactId(ciArtifact.ParentCiArtifact)
1060+
if err != nil {
1061+
impl.Logger.Errorw("err", "ciArtifactId", ciArtifact.ParentCiArtifact, "err", err)
1062+
return &GitTriggerInfoResponse{}, err
1063+
}
1064+
} else {
1065+
workflow, err = impl.ciWorkflowRepository.FindLastTriggeredWorkflowByArtifactId(ciArtifactId)
1066+
if err != nil {
1067+
impl.Logger.Errorw("err", "ciArtifactId", ciArtifactId, "err", err)
1068+
return &GitTriggerInfoResponse{}, err
1069+
}
10761070
}
10771071

1078-
// set webhook data
1079-
_webhookData := _gitTrigger.WebhookData
1080-
if _webhookData.Id > 0 {
1081-
_gitCommit.WebhookData = &gitSensor.WebhookData{
1082-
Id: _webhookData.Id,
1083-
EventActionType: _webhookData.EventActionType,
1084-
Data: _webhookData.Data,
1085-
}
1072+
triggeredByUser, err = impl.userService.GetById(workflow.TriggeredBy)
1073+
if err != nil && !util.IsErrNoRows(err) {
1074+
impl.Logger.Errorw("err", "err", err)
1075+
return &GitTriggerInfoResponse{}, err
10861076
}
10871077

1088-
history = append(history, _gitCommit)
1078+
for _, m := range ciMaterials {
1079+
var history []*gitSensor.GitCommit
1080+
_gitTrigger := workflow.GitTriggers[m.Id]
10891081

1090-
res := CiPipelineMaterialResponse{
1091-
Id: m.Id,
1092-
GitMaterialId: m.GitMaterialId,
1093-
GitMaterialName: m.GitMaterial.Name[strings.Index(m.GitMaterial.Name, "-")+1:],
1094-
Type: string(m.Type),
1095-
Value: m.Value,
1096-
Active: m.Active,
1097-
Url: m.GitMaterial.Url,
1098-
History: history,
1082+
_gitCommit := &gitSensor.GitCommit{
1083+
Message: _gitTrigger.Message,
1084+
Author: _gitTrigger.Author,
1085+
Date: _gitTrigger.Date,
1086+
Changes: _gitTrigger.Changes,
1087+
Commit: _gitTrigger.Commit,
1088+
}
1089+
1090+
// set webhook data
1091+
_webhookData := _gitTrigger.WebhookData
1092+
if _webhookData.Id > 0 {
1093+
_gitCommit.WebhookData = &gitSensor.WebhookData{
1094+
Id: _webhookData.Id,
1095+
EventActionType: _webhookData.EventActionType,
1096+
Data: _webhookData.Data,
1097+
}
1098+
}
1099+
1100+
history = append(history, _gitCommit)
1101+
1102+
res := CiPipelineMaterialResponse{
1103+
Id: m.Id,
1104+
GitMaterialId: m.GitMaterialId,
1105+
GitMaterialName: m.GitMaterial.Name[strings.Index(m.GitMaterial.Name, "-")+1:],
1106+
Type: string(m.Type),
1107+
Value: m.Value,
1108+
Active: m.Active,
1109+
Url: m.GitMaterial.Url,
1110+
History: history,
1111+
}
1112+
ciMaterialsArr = append(ciMaterialsArr, res)
10991113
}
1100-
ciMaterialsArr = append(ciMaterialsArr, res)
11011114
}
1102-
11031115
gitTriggerInfoResponse := &GitTriggerInfoResponse{
11041116
//GitTriggers: workflow.GitTriggers,
11051117
CiMaterials: ciMaterialsArr,
11061118
TriggeredByEmail: triggeredByUser.EmailId,
1107-
AppId: workflow.CiPipeline.AppId,
1119+
AppId: ciPipeline.AppId,
11081120
AppName: deployDetail.AppName,
11091121
EnvironmentId: deployDetail.EnvironmentId,
11101122
EnvironmentName: deployDetail.EnvironmentName,

pkg/pipeline/CiService.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ func (impl *CiServiceImpl) buildWfRequestForCiPipeline(pipeline *pipelineConfig.
296296
GitTag: ciMaterial.GitTag,
297297
Message: commitHashForPipelineId.Message,
298298
Type: string(ciMaterial.Type),
299-
CommitTime: commitHashForPipelineId.Date,
299+
CommitTime: commitHashForPipelineId.Date.Format(bean.LayoutRFC3339),
300300
GitOptions: GitOptions{
301301
UserName: ciMaterial.GitMaterial.GitProvider.UserName,
302302
Password: ciMaterial.GitMaterial.GitProvider.Password,

pkg/pipeline/PipelineBuilder.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package pipeline
1919

2020
import (
2121
"context"
22+
"encoding/base64"
2223
"encoding/json"
2324
"fmt"
2425
client "github.com/devtron-labs/devtron/api/helm-app"
@@ -34,6 +35,7 @@ import (
3435
"net/http"
3536
"net/url"
3637
"sort"
38+
"strconv"
3739
"strings"
3840
"time"
3941

@@ -2370,11 +2372,13 @@ func (impl PipelineBuilderImpl) GetCiPipelineById(pipelineId int) (ciPipeline *b
23702372
}
23712373
}
23722374

2375+
ciPipelineIdByte := []byte(strconv.Itoa(pipeline.Id))
2376+
base64EncodedCiPipelineId := base64.StdEncoding.EncodeToString(ciPipelineIdByte)
23732377
var externalCiConfig bean.ExternalCiConfig
23742378
if pipeline.ExternalCiPipeline != nil {
23752379
externalCiConfig = bean.ExternalCiConfig{
23762380
Id: pipeline.ExternalCiPipeline.Id,
2377-
AccessKey: pipeline.ExternalCiPipeline.AccessToken,
2381+
AccessKey: fmt.Sprintf("%s.%s", base64EncodedCiPipelineId, pipeline.ExternalCiPipeline.AccessToken),
23782382
WebhookUrl: impl.ciConfig.ExternalCiWebhookUrl,
23792383
Payload: impl.ciConfig.ExternalCiPayload,
23802384
}

pkg/pipeline/WebhookService.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -205,9 +205,8 @@ func (impl WebhookServiceImpl) SaveCiArtifactWebhook(ciPipelineId int, request *
205205
}
206206
ciArtifactArr = append(ciArtifactArr, artifact)
207207

208-
go impl.WriteCISuccessEvent(request, pipeline, artifact)
209-
210-
impl.ciHandler.WriteToCreateTestSuites(pipeline.Id, *request.WorkflowId, int(request.UserId))
208+
//go impl.WriteCISuccessEvent(request, pipeline, artifact)
209+
//impl.ciHandler.WriteToCreateTestSuites(pipeline.Id, *request.WorkflowId, int(request.UserId))
211210

212211
isCiManual := true
213212
if request.UserId == 1 {
@@ -225,7 +224,7 @@ func (impl WebhookServiceImpl) SaveCiArtifactWebhook(ciPipelineId int, request *
225224
for _, ciArtifact := range ciArtifactArr {
226225
err = impl.workflowDagExecutor.HandleCiSuccessEvent(ciArtifact, isCiManual, async, request.UserId)
227226
if err != nil {
228-
impl.logger.Errorw("err", "err", err)
227+
impl.logger.Errorw("error on handle ci success event", "err", err)
229228
return 0, err
230229
}
231230
}

pkg/pipeline/WorkflowDagExecutor.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -238,9 +238,13 @@ func (impl *WorkflowDagExecutorImpl) HandleCiSuccessEvent(artifact *repository.C
238238
return err
239239
}
240240
for _, pipeline := range pipelines {
241+
if pipeline.TriggerType == pipelineConfig.TRIGGER_TYPE_MANUAL {
242+
impl.logger.Warnw("skipping deployment for manual trigger for webhook", "pipeline", pipeline)
243+
continue
244+
}
241245
err = impl.triggerStage(nil, pipeline, artifact, applyAuth, async, triggeredBy)
242246
if err != nil {
243-
impl.logger.Debugw("err", "err", err)
247+
impl.logger.Debugw("error on trigger cd pipeline", "err", err)
244248
}
245249
}
246250
return nil
@@ -543,7 +547,7 @@ func (impl *WorkflowDagExecutorImpl) buildWFRequest(runner *pipelineConfig.CdWor
543547
if err != nil {
544548
return nil, err
545549
}
546-
ciProjectDetail.CommitTime = *commitTime
550+
ciProjectDetail.CommitTime = commitTime.Format(bean2.LayoutRFC3339)
547551
} else {
548552
impl.logger.Debugw("devtronbug#1062", ciPipeline.Id, cdPipeline.Id)
549553
return nil, fmt.Errorf("modifications not found for %d", ciPipeline.Id)

pkg/pipeline/WorkflowService.go

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,11 @@ package pipeline
2020
import (
2121
"context"
2222
"encoding/json"
23-
blob_storage "github.com/devtron-labs/common-lib/blob-storage"
24-
"k8s.io/apimachinery/pkg/util/intstr"
25-
"net/url"
26-
"strconv"
27-
"time"
28-
2923
"github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1"
3024
"github.com/argoproj/argo-workflows/v3/pkg/client/clientset/versioned"
3125
v1alpha12 "github.com/argoproj/argo-workflows/v3/pkg/client/clientset/versioned/typed/workflow/v1alpha1"
3226
"github.com/argoproj/argo-workflows/v3/workflow/util"
27+
blob_storage "github.com/devtron-labs/common-lib/blob-storage"
3328
"github.com/devtron-labs/devtron/internal/sql/repository"
3429
"github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig"
3530
"github.com/devtron-labs/devtron/pkg/bean"
@@ -38,7 +33,10 @@ import (
3833
v12 "k8s.io/api/core/v1"
3934
"k8s.io/apimachinery/pkg/api/resource"
4035
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
36+
"k8s.io/apimachinery/pkg/util/intstr"
4137
"k8s.io/client-go/rest"
38+
"net/url"
39+
"strconv"
4240
)
4341

4442
type WorkflowService interface {
@@ -113,7 +111,7 @@ type WorkflowRequest struct {
113111
RefPlugins []*bean2.RefPluginObject `json:"refPlugins"`
114112
AppName string `json:"appName"`
115113
TriggerByAuthor string `json:"triggerByAuthor"`
116-
DockerBuildOptions string `json:"dockerBuildOptions"`
114+
DockerBuildOptions string `json:"dockerBuildOptions"`
117115
}
118116

119117
const (
@@ -157,7 +155,7 @@ type CiProjectDetails struct {
157155
FetchSubmodules bool `json:"fetchSubmodules"`
158156
CommitHash string `json:"commitHash"`
159157
GitTag string `json:"gitTag"`
160-
CommitTime time.Time `json:"commitTime"`
158+
CommitTime string `json:"commitTime"`
161159
//Branch string `json:"branch"`
162160
Type string `json:"type"`
163161
Message string `json:"message"`

0 commit comments

Comments
 (0)