in backend/plugins/jenkins/tasks/stage_convertor.go [63:172]
func ConvertStages(taskCtx plugin.SubTaskContext) (err errors.Error) {
db := taskCtx.GetDal()
data := taskCtx.GetData().(*JenkinsTaskData)
clauses := []dal.Clause{
dal.Select(`tjb.connection_id, tjs.build_name, tjs.id, tjs._raw_data_remark, tjs.name,
tjs._raw_data_id, tjs._raw_data_table, tjs._raw_data_params,
tjs.status, tjs.start_time_millis, tjs.duration_millis,
tjs.pause_duration_millis, tjs.type, tjb.result,
tjb.triggered_by, tjb.building`),
dal.From("_tool_jenkins_stages tjs"),
dal.Join("left join _tool_jenkins_builds tjb on tjs.build_name = tjb.full_name"),
}
if data.Options.Class == WORKFLOW_MULTI_BRANCH_PROJECT {
clauses = append(clauses,
dal.Where(`tjb.connection_id = ? and tjb.full_name like ?`,
data.Options.ConnectionId, fmt.Sprintf("%s%%", data.Options.JobFullName)))
} else {
clauses = append(clauses,
dal.Where("tjb.connection_id = ? and tjb.job_path = ? and tjb.job_name = ? ",
data.Options.ConnectionId, data.Options.JobPath, data.Options.JobName))
}
cursor, err := db.Cursor(clauses...)
if err != nil {
return err
}
defer cursor.Close()
stageIdGen := didgen.NewDomainIdGenerator(&models.JenkinsStage{})
buildIdGen := didgen.NewDomainIdGenerator(&models.JenkinsBuild{})
jobIdGen := didgen.NewDomainIdGenerator(&models.JenkinsJob{})
convertor, err := api.NewDataConverter(api.DataConverterArgs{
InputRowType: reflect.TypeOf(JenkinsBuildWithRepoStage{}),
Input: cursor,
RawDataSubTaskArgs: api.RawDataSubTaskArgs{
Params: JenkinsApiParams{
ConnectionId: data.Options.ConnectionId,
FullName: data.Options.JobFullName,
},
Ctx: taskCtx,
Table: RAW_STAGE_TABLE,
},
Convert: func(inputRow interface{}) ([]interface{}, errors.Error) {
body := inputRow.(*JenkinsBuildWithRepoStage)
if body.Name == "" {
return nil, err
}
var durationMillis int64
if body.DurationMillis > 0 {
durationMillis = int64(body.DurationMillis)
} else {
durationMillis = int64(0)
}
durationSec := float64(durationMillis / 1e3)
jenkinsTaskResult := devops.GetResult(&devops.ResultRule{
Success: []string{SUCCESS},
Failure: []string{FAILED, FAILURE, ABORTED},
Default: devops.RESULT_DEFAULT,
}, body.Result)
jenkinsTaskStatus := devops.GetStatus(&devops.StatusRule{
Done: []string{SUCCESS},
InProgress: []string{},
Default: devops.STATUS_OTHER,
}, body.Status)
var jenkinsTaskFinishedDate *time.Time
results := make([]interface{}, 0)
finishedDateMillis := body.StartTimeMillis + durationMillis
finishedDate := time.Unix(finishedDateMillis/1e3, (finishedDateMillis%1e3)*int64(time.Millisecond))
jenkinsTaskFinishedDate = &finishedDate
startedDate := time.Unix(body.StartTimeMillis/1e3, 0)
jenkinsTask := &devops.CICDTask{
DomainEntity: domainlayer.DomainEntity{
Id: stageIdGen.Generate(body.ConnectionId, body.BuildName, body.ID),
},
Name: body.Name,
PipelineId: buildIdGen.Generate(body.ConnectionId, body.BuildName),
Result: jenkinsTaskResult,
Status: jenkinsTaskStatus,
DurationSec: durationSec,
TaskDatesInfo: devops.TaskDatesInfo{
CreatedDate: startedDate,
StartedDate: &startedDate,
FinishedDate: jenkinsTaskFinishedDate,
},
OriginalResult: body.Result,
OriginalStatus: body.Status,
CicdScopeId: jobIdGen.Generate(body.ConnectionId, data.Options.JobFullName),
Type: data.RegexEnricher.ReturnNameIfMatched(devops.DEPLOYMENT, body.Name),
Environment: data.RegexEnricher.ReturnNameIfOmittedOrMatched(devops.PRODUCTION, body.Name),
}
// 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 convertor.Execute()
}