in backend/plugins/jenkins/tasks/build_cicd_convertor.go [45:174]
func ConvertBuildsToCicdTasks(taskCtx plugin.SubTaskContext) (err errors.Error) {
db := taskCtx.GetDal()
data := taskCtx.GetData().(*JenkinsTaskData)
clauses := []dal.Clause{
dal.From("_tool_jenkins_builds"),
}
if data.Options.Class == WORKFLOW_MULTI_BRANCH_PROJECT {
clauses = append(clauses,
dal.Where(`_tool_jenkins_builds.connection_id = ?
and _tool_jenkins_builds.full_name like ?`,
data.Options.ConnectionId, fmt.Sprintf("%s%%", data.Options.JobFullName)))
} else {
clauses = append(clauses,
dal.Where(`_tool_jenkins_builds.connection_id = ?
and _tool_jenkins_builds.job_path = ?
and _tool_jenkins_builds.job_name = ?`,
data.Options.ConnectionId, data.Options.JobPath, data.Options.JobName))
}
cursor, err := db.Cursor(clauses...)
if err != nil {
return err
}
defer cursor.Close()
buildIdGen := didgen.NewDomainIdGenerator(&models.JenkinsBuild{})
jobIdGen := didgen.NewDomainIdGenerator(&models.JenkinsJob{})
converter, err := api.NewDataConverter(api.DataConverterArgs{
InputRowType: reflect.TypeOf(models.JenkinsBuild{}),
Input: cursor,
RawDataSubTaskArgs: api.RawDataSubTaskArgs{
Params: JenkinsApiParams{
ConnectionId: data.Options.ConnectionId,
FullName: data.Options.JobFullName,
},
Ctx: taskCtx,
Table: RAW_BUILD_TABLE,
},
Convert: func(inputRow interface{}) ([]interface{}, errors.Error) {
jenkinsBuild := inputRow.(*models.JenkinsBuild)
var durationMillis float64
if jenkinsBuild.Duration > 0 {
durationMillis = jenkinsBuild.Duration
} else {
durationMillis = 0
}
durationSec := durationMillis / 1e3
jenkinsPipelineStatus := devops.GetStatusCommon(&devops.StatusRuleCommon[bool]{
InProgress: []bool{true},
Done: []bool{false},
Default: devops.STATUS_OTHER,
}, jenkinsBuild.Building)
jenkinsPipelineResult := devops.RESULT_DEFAULT
if !jenkinsBuild.Building {
jenkinsPipelineResult = devops.GetResult(&devops.ResultRule{
Success: []string{SUCCESS},
Failure: []string{FAILURE, ABORTED},
Default: devops.RESULT_DEFAULT,
}, jenkinsBuild.Result)
}
var jenkinsPipelineFinishedDate *time.Time
results := make([]interface{}, 0)
if jenkinsPipelineStatus == devops.STATUS_DONE {
finishTime := jenkinsBuild.StartTime.Add(time.Duration(int64(durationMillis) * int64(time.Millisecond)))
jenkinsPipelineFinishedDate = &finishTime
}
jenkinsPipeline := &devops.CICDPipeline{
DomainEntity: domainlayer.DomainEntity{
Id: buildIdGen.Generate(jenkinsBuild.ConnectionId, jenkinsBuild.FullName),
},
Name: jenkinsBuild.FullName,
Result: jenkinsPipelineResult,
Status: jenkinsPipelineStatus,
OriginalResult: jenkinsBuild.Result,
OriginalStatus: cast.ToString(jenkinsBuild.Building),
TaskDatesInfo: devops.TaskDatesInfo{
CreatedDate: jenkinsBuild.StartTime,
StartedDate: &jenkinsBuild.StartTime,
FinishedDate: jenkinsPipelineFinishedDate,
},
DurationSec: durationSec,
CicdScopeId: jobIdGen.Generate(jenkinsBuild.ConnectionId, data.Options.JobFullName),
Type: data.RegexEnricher.ReturnNameIfMatched(devops.DEPLOYMENT, jenkinsBuild.FullName),
Environment: data.RegexEnricher.ReturnNameIfOmittedOrMatched(devops.PRODUCTION, jenkinsBuild.FullName),
}
jenkinsPipeline.RawDataOrigin = jenkinsBuild.RawDataOrigin
results = append(results, jenkinsPipeline)
if !jenkinsBuild.HasStages {
jenkinsTask := &devops.CICDTask{
DomainEntity: domainlayer.DomainEntity{
Id: buildIdGen.Generate(jenkinsBuild.ConnectionId, jenkinsBuild.FullName),
},
Name: data.Options.JobFullName,
Result: jenkinsPipelineResult,
Status: jenkinsPipelineStatus,
OriginalResult: jenkinsBuild.Result,
OriginalStatus: cast.ToString(jenkinsBuild.Building),
DurationSec: durationSec,
TaskDatesInfo: devops.TaskDatesInfo{
CreatedDate: jenkinsBuild.StartTime,
StartedDate: &jenkinsBuild.StartTime,
FinishedDate: jenkinsPipelineFinishedDate,
},
CicdScopeId: jobIdGen.Generate(jenkinsBuild.ConnectionId, data.Options.JobFullName),
Type: data.RegexEnricher.ReturnNameIfMatched(devops.DEPLOYMENT, jenkinsBuild.FullName),
Environment: data.RegexEnricher.ReturnNameIfOmittedOrMatched(devops.PRODUCTION, jenkinsBuild.FullName),
PipelineId: buildIdGen.Generate(jenkinsBuild.ConnectionId, jenkinsBuild.FullName),
}
// if the task is not executed, set the result to default, so that it will not be calculated in the dora
if jenkinsTask.OriginalStatus == "NOT_EXECUTED" {
jenkinsTask.Result = devops.RESULT_DEFAULT
}
results = append(results, jenkinsTask)
}
return results, nil
},
})
if err != nil {
return err
}
return converter.Execute()
}