Skip to content

Commit 494ffc4

Browse files
Shivam-nagar23Ashish-devtroniamayushmkartik-579Shubham9t9
authored
feat:Poll Images from ECR Container Repository Plugin (#3971)
* trigger Ci Cron * changes for adding job in devtron apps * port-fix * setting flag in pipeline db * fix ecr repo save condition * fix corrupt data save * adding build context git material id * pg no rows fix * plugin support * plugin support * trigger ci for JOB_Ci * use const * remove only git material from ciMaterial * Logging ci complete event * vendor-update * icon for plugin * get plugin Id from name * revert connection.go port * sorting only latest image * logs and script addition * script number change * update envDefault * docker parameters * docker repo create enable * update envDefault * sent last fetch artifact time * change SourceControllerCronTime env * change type for cron * change query * image update * review comments * review comments * review comments * image plugin change * update down script * pipeline type flag * flag in app group api * script update * comments * script change * app clone handle * fixed ci pod request (#3980) * fixed pipelineOverride id being sent instead of pipelineId (#3984) * chore: added CODEOWNERS (#3966) * added CODEOWNERS file * updated CODEOWNERS file * Update CODEOWNERS * Update CODEOWNERS --------- Co-authored-by: Shubham9t9 <[email protected]> Co-authored-by: Prakarsh <[email protected]> --------- Co-authored-by: Ashish-devtron <[email protected]> Co-authored-by: ayushmaheshwari <[email protected]> Co-authored-by: kartik-579 <[email protected]> Co-authored-by: Shubham Kumar <[email protected]> Co-authored-by: Shubham9t9 <[email protected]> Co-authored-by: Prakarsh <[email protected]>
1 parent b9172b3 commit 494ffc4

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+3916
-20
lines changed

Wire.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -807,6 +807,10 @@ func InitializeApp() (*App, error) {
807807
cron.NewCiStatusUpdateCronImpl,
808808
wire.Bind(new(cron.CiStatusUpdateCron), new(*cron.CiStatusUpdateCronImpl)),
809809

810+
cron.GetCiTriggerCronConfig,
811+
cron.NewCiTriggerCronImpl,
812+
wire.Bind(new(cron.CiTriggerCron), new(*cron.CiTriggerCronImpl)),
813+
810814
restHandler.NewPipelineStatusTimelineRestHandlerImpl,
811815
wire.Bind(new(restHandler.PipelineStatusTimelineRestHandler), new(*restHandler.PipelineStatusTimelineRestHandlerImpl)),
812816

api/restHandler/app/BuildPipelineRestHandler.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,7 @@ func (handler PipelineConfigRestHandlerImpl) PatchCiPipelines(w http.ResponseWri
400400
ciConfigRequest.DockerRegistry = emptyDockerRegistry
401401
ciConfigRequest.AppId = patchRequest.AppId
402402
ciConfigRequest.CiBuildConfig = &bean1.CiBuildConfigBean{}
403-
ciConfigRequest.CiBuildConfig.CiBuildType = "skip-build"
403+
ciConfigRequest.CiBuildConfig.CiBuildType = bean1.SKIP_BUILD_TYPE
404404
ciConfigRequest.UserId = patchRequest.UserId
405405
if patchRequest.CiPipeline == nil || patchRequest.CiPipeline.CiMaterial == nil {
406406
handler.Logger.Errorw("Invalid patch ci-pipeline request", "request", patchRequest, "err", "invalid CiPipeline data")
@@ -419,6 +419,22 @@ func (handler PipelineConfigRestHandlerImpl) PatchCiPipelines(w http.ResponseWri
419419
if app.AppType == helper.Job {
420420
patchRequest.IsJob = true
421421
}
422+
if patchRequest.CiPipeline.PipelineType == bean.CI_JOB {
423+
patchRequest.CiPipeline.IsDockerConfigOverridden = true
424+
patchRequest.CiPipeline.DockerConfigOverride = bean.DockerConfigOverride{
425+
DockerRegistry: ciConf.DockerRegistry,
426+
DockerRepository: ciConf.DockerRepository,
427+
CiBuildConfig: &bean1.CiBuildConfigBean{
428+
Id: 0,
429+
GitMaterialId: patchRequest.CiPipeline.CiMaterial[0].GitMaterialId,
430+
BuildContextGitMaterialId: patchRequest.CiPipeline.CiMaterial[0].GitMaterialId,
431+
UseRootBuildContext: false,
432+
CiBuildType: bean1.SKIP_BUILD_TYPE,
433+
DockerBuildConfig: nil,
434+
BuildPackConfig: nil,
435+
},
436+
}
437+
}
422438
createResp, err := handler.pipelineBuilder.PatchCiPipeline(&patchRequest)
423439
if err != nil {
424440
handler.Logger.Errorw("service err, PatchCiPipelines", "err", err, "PatchCiPipelines", patchRequest)

api/router/pubsub/CiEventHandler.go

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ package pubsub
2020
import (
2121
"encoding/json"
2222
"fmt"
23+
"github.com/aws/aws-sdk-go-v2/service/ecr/types"
2324
"github.com/caarlos0/env/v6"
2425
pubsub "github.com/devtron-labs/common-lib/pubsub-lib"
2526
"github.com/devtron-labs/devtron/internal/sql/repository"
@@ -28,6 +29,7 @@ import (
2829
bean2 "github.com/devtron-labs/devtron/pkg/pipeline/bean"
2930
"github.com/devtron-labs/devtron/util"
3031
"go.uber.org/zap"
32+
"time"
3133
)
3234

3335
type CiEventConfig struct {
@@ -53,6 +55,11 @@ type CiEventHandlerImpl struct {
5355
ciEventConfig *CiEventConfig
5456
}
5557

58+
type ImageDetailsFromCR struct {
59+
ImageDetails []types.ImageDetail `json:"imageDetails"`
60+
Region string `json:"region"`
61+
}
62+
5663
type CiCompleteEvent struct {
5764
CiProjectDetails []bean2.CiProjectDetails `json:"ciProjectDetails"`
5865
DockerImage string `json:"dockerImage" validate:"required,image-validator"`
@@ -67,6 +74,7 @@ type CiCompleteEvent struct {
6774
AppName string `json:"appName"`
6875
IsArtifactUploaded bool `json:"isArtifactUploaded"`
6976
FailureReason string `json:"failureReason"`
77+
ImageDetailsFromCR *ImageDetailsFromCR `json:"imageDetailsFromCR"`
7078
}
7179

7280
func NewCiEventHandlerImpl(logger *zap.SugaredLogger, pubsubClient *pubsub.PubSubClientServiceImpl, webhookService pipeline.WebhookService, ciEventConfig *CiEventConfig) *CiEventHandlerImpl {
@@ -108,10 +116,26 @@ func (impl *CiEventHandlerImpl) Subscribe() error {
108116
ciCompleteEvent.PipelineId, "request: ", req, "error: ", err)
109117
return
110118
}
119+
} else if ciCompleteEvent.ImageDetailsFromCR != nil {
120+
if len(ciCompleteEvent.ImageDetailsFromCR.ImageDetails) > 0 {
121+
detail := util.GetLatestImageAccToImagePushedAt(ciCompleteEvent.ImageDetailsFromCR.ImageDetails)
122+
request, err := impl.BuildCIArtifactRequestForImageFromCR(detail, ciCompleteEvent.ImageDetailsFromCR.Region, ciCompleteEvent)
123+
if err != nil {
124+
impl.logger.Error("Error while creating request for pipelineID", "pipelineId", ciCompleteEvent.PipelineId, "err", err)
125+
return
126+
}
127+
resp, err := impl.webhookService.HandleCiSuccessEvent(ciCompleteEvent.PipelineId, request, detail.ImagePushedAt)
128+
if err != nil {
129+
impl.logger.Error("Error while sending event for CI success for pipelineID", "pipelineId",
130+
ciCompleteEvent.PipelineId, "request", request, "err", err)
131+
return
132+
}
133+
impl.logger.Debug(resp)
134+
}
135+
111136
} else {
112137
util.TriggerCIMetrics(ciCompleteEvent.Metrics, impl.ciEventConfig.ExposeCiMetrics, ciCompleteEvent.PipelineName, ciCompleteEvent.AppName)
113-
114-
resp, err := impl.webhookService.HandleCiSuccessEvent(ciCompleteEvent.PipelineId, req)
138+
resp, err := impl.webhookService.HandleCiSuccessEvent(ciCompleteEvent.PipelineId, req, &time.Time{})
115139
if err != nil {
116140
impl.logger.Error("Error while sending event for CI success for pipelineID: ",
117141
ciCompleteEvent.PipelineId, "request: ", req, "error: ", err)
@@ -195,6 +219,22 @@ func (impl *CiEventHandlerImpl) BuildCiArtifactRequest(event CiCompleteEvent) (*
195219
return request, nil
196220
}
197221

222+
func (impl *CiEventHandlerImpl) BuildCIArtifactRequestForImageFromCR(imageDetails types.ImageDetail, region string, event CiCompleteEvent) (*pipeline.CiArtifactWebhookRequest, error) {
223+
if event.TriggeredBy == 0 {
224+
event.TriggeredBy = 1 // system triggered event
225+
}
226+
request := &pipeline.CiArtifactWebhookRequest{
227+
Image: util.ExtractEcrImage(*imageDetails.RegistryId, region, *imageDetails.RepositoryName, imageDetails.ImageTags[0]),
228+
ImageDigest: *imageDetails.ImageDigest,
229+
DataSource: event.DataSource,
230+
PipelineName: event.PipelineName,
231+
UserId: event.TriggeredBy,
232+
WorkflowId: event.WorkflowId,
233+
IsArtifactUploaded: event.IsArtifactUploaded,
234+
}
235+
return request, nil
236+
}
237+
198238
func (impl *CiEventHandlerImpl) BuildCiArtifactRequestForWebhook(event CiCompleteEvent) (*pipeline.CiArtifactWebhookRequest, error) {
199239
ciMaterialInfos := make([]repository.CiMaterialInfo, 0)
200240
if event.MaterialType == "" {

api/router/router.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ type MuxRouter struct {
121121
appGroupingRouter AppGroupingRouter
122122
rbacRoleRouter user.RbacRoleRouter
123123
scopedVariableRouter ScopedVariableRouter
124+
ciTriggerCron cron.CiTriggerCron
124125
}
125126

126127
func NewMuxRouter(logger *zap.SugaredLogger, HelmRouter PipelineTriggerRouter, PipelineConfigRouter PipelineConfigRouter,
@@ -151,7 +152,8 @@ func NewMuxRouter(logger *zap.SugaredLogger, HelmRouter PipelineTriggerRouter, P
151152
userTerminalAccessRouter terminal2.UserTerminalAccessRouter,
152153
jobRouter JobRouter, ciStatusUpdateCron cron.CiStatusUpdateCron, appGroupingRouter AppGroupingRouter,
153154
rbacRoleRouter user.RbacRoleRouter,
154-
scopedVariableRouter ScopedVariableRouter) *MuxRouter {
155+
scopedVariableRouter ScopedVariableRouter,
156+
ciTriggerCron cron.CiTriggerCron) *MuxRouter {
155157
r := &MuxRouter{
156158
Router: mux.NewRouter(),
157159
HelmRouter: HelmRouter,
@@ -222,6 +224,7 @@ func NewMuxRouter(logger *zap.SugaredLogger, HelmRouter PipelineTriggerRouter, P
222224
appGroupingRouter: appGroupingRouter,
223225
rbacRoleRouter: rbacRoleRouter,
224226
scopedVariableRouter: scopedVariableRouter,
227+
ciTriggerCron: ciTriggerCron,
225228
}
226229
return r
227230
}
2.25 KB
Loading

client/cron/CiTriggerCron.go

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package cron
2+
3+
import (
4+
"fmt"
5+
"github.com/caarlos0/env"
6+
repository2 "github.com/devtron-labs/devtron/internal/sql/repository"
7+
"github.com/devtron-labs/devtron/pkg/bean"
8+
"github.com/devtron-labs/devtron/pkg/pipeline"
9+
bean2 "github.com/devtron-labs/devtron/pkg/pipeline/bean"
10+
"github.com/devtron-labs/devtron/pkg/pipeline/repository"
11+
repository3 "github.com/devtron-labs/devtron/pkg/plugin/repository"
12+
"github.com/robfig/cron/v3"
13+
"go.uber.org/zap"
14+
)
15+
16+
type CiTriggerCron interface {
17+
TriggerCiCron()
18+
}
19+
20+
type CiTriggerCronImpl struct {
21+
logger *zap.SugaredLogger
22+
cron *cron.Cron
23+
cfg *CiTriggerCronConfig
24+
pipelineStageRepository repository.PipelineStageRepository
25+
ciHandler pipeline.CiHandler
26+
ciArtifactRepository repository2.CiArtifactRepository
27+
globalPluginRepository repository3.GlobalPluginRepository
28+
}
29+
30+
func NewCiTriggerCronImpl(logger *zap.SugaredLogger, cfg *CiTriggerCronConfig, pipelineStageRepository repository.PipelineStageRepository,
31+
ciHandler pipeline.CiHandler, ciArtifactRepository repository2.CiArtifactRepository, globalPluginRepository repository3.GlobalPluginRepository) *CiTriggerCronImpl {
32+
cron := cron.New(
33+
cron.WithChain())
34+
cron.Start()
35+
impl := &CiTriggerCronImpl{
36+
logger: logger,
37+
cron: cron,
38+
pipelineStageRepository: pipelineStageRepository,
39+
ciHandler: ciHandler,
40+
cfg: cfg,
41+
ciArtifactRepository: ciArtifactRepository,
42+
globalPluginRepository: globalPluginRepository,
43+
}
44+
45+
_, err := cron.AddFunc(fmt.Sprintf("@every %dm", cfg.SourceControllerCronTime), impl.TriggerCiCron)
46+
if err != nil {
47+
logger.Errorw("error while configure cron job for ci workflow status update", "err", err)
48+
return impl
49+
}
50+
return impl
51+
}
52+
53+
type CiTriggerCronConfig struct {
54+
SourceControllerCronTime int `env:"CI_TRIGGER_CRON_TIME" envDefault:"2"`
55+
PluginName string `env:"PLUGIN_NAME" envDefault:"Pull images from container repository"`
56+
}
57+
58+
func GetCiTriggerCronConfig() (*CiTriggerCronConfig, error) {
59+
cfg := &CiTriggerCronConfig{}
60+
err := env.Parse(cfg)
61+
if err != nil {
62+
fmt.Println("failed to parse ci trigger cron config: " + err.Error())
63+
return nil, err
64+
}
65+
return cfg, nil
66+
}
67+
68+
// UpdateCiWorkflowStatusFailedCron this function will execute periodically
69+
func (impl *CiTriggerCronImpl) TriggerCiCron() {
70+
plugin, err := impl.globalPluginRepository.GetPluginByName(impl.cfg.PluginName)
71+
if err != nil || len(plugin) == 0 {
72+
return
73+
}
74+
75+
ciPipelineIds, err := impl.pipelineStageRepository.GetAllCiPipelineIdsByPluginIdAndStageType(plugin[0].Id, string(repository.PIPELINE_STAGE_TYPE_PRE_CI))
76+
if err != nil {
77+
return
78+
}
79+
for _, ciPipelineId := range ciPipelineIds {
80+
var ciPipelineMaterials []bean.CiPipelineMaterial
81+
ciTriggerRequest := bean.CiTriggerRequest{
82+
PipelineId: ciPipelineId,
83+
CiPipelineMaterial: ciPipelineMaterials,
84+
TriggeredBy: 1,
85+
InvalidateCache: false,
86+
PipelineType: bean2.CI_JOB,
87+
}
88+
_, err = impl.ciHandler.HandleCIManual(ciTriggerRequest)
89+
if err != nil {
90+
return
91+
}
92+
}
93+
return
94+
}

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ require (
88
github.com/argoproj/argo-workflows/v3 v3.4.3
99
github.com/argoproj/gitops-engine v0.7.1-0.20221004132320-98ccd3d43fd9
1010
github.com/aws/aws-sdk-go v1.44.105
11+
github.com/aws/aws-sdk-go-v2/service/ecr v1.20.0
1112
github.com/caarlos0/env v3.5.0+incompatible
1213
github.com/caarlos0/env/v6 v6.7.2
1314
github.com/casbin/casbin v1.9.1
@@ -114,6 +115,7 @@ require (
114115
github.com/apparentlymart/go-textseg v1.0.0 // indirect
115116
github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect
116117
github.com/argoproj/pkg v0.13.6 // indirect
118+
github.com/aws/smithy-go v1.14.2 // indirect
117119
github.com/beorn7/perks v1.0.1 // indirect
118120
github.com/bombsimon/logrusr/v2 v2.0.1 // indirect
119121
github.com/bradleyfalzon/ghinstallation/v2 v2.0.4 // indirect

go.sum

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,13 @@ github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4
178178
github.com/aws/aws-sdk-go v1.44.105 h1:UUwoD1PRKIj3ltrDUYTDQj5fOTK3XsnqolLpRTMmSEM=
179179
github.com/aws/aws-sdk-go v1.44.105/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
180180
github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
181+
github.com/aws/aws-sdk-go-v2 v1.21.0/go.mod h1:/RfNgGmRxI+iFOB1OeJUyxiU+9s88k3pfHvDagGEp0M=
182+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41/go.mod h1:CrObHAuPneJBlfEJ5T3szXOUkLEThaGfvnhTf33buas=
183+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35/go.mod h1:SJC1nEVVva1g3pHAIdCp7QsRIkMmLAgoDquQ9Rr8kYw=
184+
github.com/aws/aws-sdk-go-v2/service/ecr v1.20.0 h1:Qw8H7V55d2P1d/a9+cLgAcdez4GtP6l30KQAeYqx9vY=
185+
github.com/aws/aws-sdk-go-v2/service/ecr v1.20.0/go.mod h1:pGwmNL8hN0jpBfKfTbmu+Rl0bJkDhaGl+9PQLrZ4KLo=
186+
github.com/aws/smithy-go v1.14.2 h1:MJU9hqBGbvWZdApzpvoF2WAIJDbtjK2NDJSiJP7HblQ=
187+
github.com/aws/smithy-go v1.14.2/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA=
181188
github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
182189
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
183190
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
@@ -527,6 +534,7 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
527534
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
528535
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
529536
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
537+
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
530538
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
531539
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
532540
github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY=

internal/sql/repository/CiArtifactRepository.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ package repository
2020
import (
2121
"encoding/json"
2222
"fmt"
23+
"github.com/devtron-labs/devtron/internal/sql/repository/helper"
2324
"github.com/devtron-labs/devtron/pkg/sql"
2425
"strings"
2526
"time"
@@ -59,6 +60,8 @@ type CiArtifactRepository interface {
5960
GetByWfId(wfId int) (artifact *CiArtifact, err error)
6061
GetArtifactsByCDPipeline(cdPipelineId, limit int, parentId int, parentType bean.WorkflowType) ([]*CiArtifact, error)
6162

63+
GetLatestArtifactTimeByCiPipelineIds(ciPipelineIds []int) ([]*CiArtifact, error)
64+
GetLatestArtifactTimeByCiPipelineId(ciPipelineId int) (*CiArtifact, error)
6265
GetArtifactsByCDPipelineV2(cdPipelineId int) ([]CiArtifact, error)
6366
GetArtifactsByCDPipelineAndRunnerType(cdPipelineId int, runnerType bean.WorkflowType) ([]CiArtifact, error)
6467
SaveAll(artifacts []*CiArtifact) error
@@ -236,6 +239,37 @@ func (impl CiArtifactRepositoryImpl) GetArtifactsByCDPipeline(cdPipelineId, limi
236239
return artifactsAll, err
237240
}
238241

242+
func (impl CiArtifactRepositoryImpl) GetLatestArtifactTimeByCiPipelineIds(ciPipelineIds []int) ([]*CiArtifact, error) {
243+
artifacts := make([]*CiArtifact, 0)
244+
query := "select cws.pipeline_id, cws.created_on from " +
245+
"(SELECT pipeline_id, MAX(created_on) created_on " +
246+
"FROM ci_artifact " +
247+
"GROUP BY pipeline_id) cws " +
248+
"where cws.pipeline_id IN (" + helper.GetCommaSepratedString(ciPipelineIds) + "); "
249+
250+
_, err := impl.dbConnection.Query(&artifacts, query)
251+
if err != nil {
252+
return nil, err
253+
}
254+
return artifacts, nil
255+
}
256+
257+
//GetLatestArtifactTimeByCiPipelineId will fetch latest ci artifact time(created) against that ci pipeline
258+
func (impl CiArtifactRepositoryImpl) GetLatestArtifactTimeByCiPipelineId(ciPipelineId int) (*CiArtifact, error) {
259+
artifacts := &CiArtifact{}
260+
query := "select cws.pipeline_id, cws.created_on from " +
261+
"(SELECT pipeline_id, MAX(created_on) created_on " +
262+
"FROM ci_artifact " +
263+
"GROUP BY pipeline_id) cws " +
264+
"where cws.pipeline_id = ? ; "
265+
266+
_, err := impl.dbConnection.Query(artifacts, query, ciPipelineId)
267+
if err != nil {
268+
return nil, err
269+
}
270+
return artifacts, nil
271+
}
272+
239273
func (impl CiArtifactRepositoryImpl) GetArtifactsByCDPipelineAndRunnerType(cdPipelineId int, runnerType bean.WorkflowType) ([]CiArtifact, error) {
240274
var artifactsA []CiArtifact
241275
var artifactsAB []CiArtifact

internal/sql/repository/pipelineConfig/CiPipelineRepository.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ type CiPipeline struct {
4444
ParentCiPipeline int `sql:"parent_ci_pipeline"`
4545
ScanEnabled bool `sql:"scan_enabled,notnull"`
4646
IsDockerConfigOverridden bool `sql:"is_docker_config_overridden, notnull"`
47+
PipelineType string `sql:"ci_pipeline_type"`
4748
sql.AuditLog
4849
CiPipelineMaterials []*CiPipelineMaterial
4950
CiTemplate *CiTemplate

0 commit comments

Comments
 (0)