From aa92c518f0bf70ecaebcd05fce3b566fd5d0a40f Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Fri, 12 Mar 2021 23:00:12 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=20=E5=88=9B=E5=BB=BA?= =?UTF-8?q?CI=20CD=E4=BB=BB=E5=8A=A1=E6=8E=A5=E5=8F=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dtos/create-pipeline-task.input.ts | 1 - src/pipeline-tasks/enums/task-statuses.enum.ts | 7 +++++++ .../models/pipeline-task-logs.model.ts | 5 +++++ src/pipeline-tasks/pipeline-task.consumer.ts | 1 + src/pipeline-tasks/pipeline-task.entity.ts | 10 +++++----- src/pipeline-tasks/pipeline-tasks.module.ts | 7 ++++++- src/pipeline-tasks/pipeline-tasks.resolver.ts | 18 ++++++++++++++++-- src/pipeline-tasks/pipeline-tasks.service.ts | 1 + 8 files changed, 41 insertions(+), 9 deletions(-) diff --git a/src/pipeline-tasks/dtos/create-pipeline-task.input.ts b/src/pipeline-tasks/dtos/create-pipeline-task.input.ts index 3c40445..0119481 100644 --- a/src/pipeline-tasks/dtos/create-pipeline-task.input.ts +++ b/src/pipeline-tasks/dtos/create-pipeline-task.input.ts @@ -7,6 +7,5 @@ export class CreatePipelineTaskInput { commit: string; - @Field(() => PipelineUnits) units: PipelineUnits[]; } diff --git a/src/pipeline-tasks/enums/task-statuses.enum.ts b/src/pipeline-tasks/enums/task-statuses.enum.ts index 1d11115..be408ae 100644 --- a/src/pipeline-tasks/enums/task-statuses.enum.ts +++ b/src/pipeline-tasks/enums/task-statuses.enum.ts @@ -1,6 +1,13 @@ +import { registerEnumType } from '@nestjs/graphql'; + export enum TaskStatuses { success = 'success', failed = 'failed', working = 'working', pending = 'pending', } + +registerEnumType(TaskStatuses, { + name: 'TaskStatuses', + description: '任务状态', +}); diff --git a/src/pipeline-tasks/models/pipeline-task-logs.model.ts b/src/pipeline-tasks/models/pipeline-task-logs.model.ts index 3c7b373..8bd861c 100644 --- a/src/pipeline-tasks/models/pipeline-task-logs.model.ts +++ b/src/pipeline-tasks/models/pipeline-task-logs.model.ts @@ -1,7 +1,12 @@ import { TaskStatuses } from '../enums/task-statuses.enum'; import { PipelineUnits } from '../enums/pipeline-units.enum'; +import { Field, ObjectType } from '@nestjs/graphql'; + +@ObjectType() export class PipelineTaskLogs { + @Field(() => PipelineUnits) unit: PipelineUnits; + @Field(() => PipelineUnits) status: TaskStatuses; startedAt?: Date; endedAt?: Date; diff --git a/src/pipeline-tasks/pipeline-task.consumer.ts b/src/pipeline-tasks/pipeline-task.consumer.ts index 1f2a0d0..61e7611 100644 --- a/src/pipeline-tasks/pipeline-task.consumer.ts +++ b/src/pipeline-tasks/pipeline-task.consumer.ts @@ -68,6 +68,7 @@ export class PipelineTaskConsumer { } finally { unitLog.endedAt = new Date(); task.logs.push(unitLog); + update(task); } } } catch (err) { diff --git a/src/pipeline-tasks/pipeline-task.entity.ts b/src/pipeline-tasks/pipeline-task.entity.ts index ee4cf78..f5f826f 100644 --- a/src/pipeline-tasks/pipeline-task.entity.ts +++ b/src/pipeline-tasks/pipeline-task.entity.ts @@ -1,5 +1,5 @@ import { AppBaseEntity } from './../commons/entities/app-base-entity'; -import { ObjectType } from '@nestjs/graphql'; +import { Field, ObjectType } from '@nestjs/graphql'; import { Column, Entity, ManyToOne } from 'typeorm'; import { Pipeline } from '../pipelines/pipeline.entity'; import { PipelineTaskLogs } from './models/pipeline-task-logs.model'; @@ -26,9 +26,9 @@ export class PipelineTask extends AppBaseEntity { @Column({ type: 'enum', enum: TaskStatuses, default: TaskStatuses.pending }) status: TaskStatuses; - @Column() - startedAt: Date; + @Column({ nullable: true }) + startedAt?: Date; - @Column() - endedAt: Date; + @Column({ nullable: true }) + endedAt?: Date; } diff --git a/src/pipeline-tasks/pipeline-tasks.module.ts b/src/pipeline-tasks/pipeline-tasks.module.ts index 4f99cd9..ffc1f00 100644 --- a/src/pipeline-tasks/pipeline-tasks.module.ts +++ b/src/pipeline-tasks/pipeline-tasks.module.ts @@ -7,6 +7,7 @@ import { Pipeline } from '../pipelines/pipeline.entity'; import { ReposModule } from '../repos/repos.module'; import { RedisModule } from 'nestjs-redis'; import { BullModule } from '@nestjs/bull'; +import { PipelineTaskConsumer } from './pipeline-task.consumer'; import { PIPELINE_TASK_QUEUE, PIPELINE_TASK_LOG_QUEUE, @@ -24,6 +25,10 @@ import { RedisModule, ReposModule, ], - providers: [PipelineTasksService, PipelineTasksResolver], + providers: [ + PipelineTasksService, + PipelineTasksResolver, + PipelineTaskConsumer, + ], }) export class PipelineTasksModule {} diff --git a/src/pipeline-tasks/pipeline-tasks.resolver.ts b/src/pipeline-tasks/pipeline-tasks.resolver.ts index 78286e6..4ad7d9e 100644 --- a/src/pipeline-tasks/pipeline-tasks.resolver.ts +++ b/src/pipeline-tasks/pipeline-tasks.resolver.ts @@ -1,4 +1,18 @@ -import { Resolver } from '@nestjs/graphql'; +import { Resolver, Args, Mutation, Subscription } from '@nestjs/graphql'; +import { PipelineTask } from './pipeline-task.entity'; +import { PipelineTasksService } from './pipeline-tasks.service'; +import { CreatePipelineTaskInput } from './dtos/create-pipeline-task.input'; +import { PipelineTaskLogMessage } from './models/pipeline-task-log-message.module'; +import { PipelineTaskLogArgs } from './dtos/pipeline-task-log.args'; @Resolver() -export class PipelineTasksResolver {} +export class PipelineTasksResolver { + constructor(private readonly service: PipelineTasksService) {} + + @Mutation(() => PipelineTask) + async createPipelineTask(@Args('task') taskDto: CreatePipelineTaskInput) { + return await this.service.addTask(taskDto); + } + + @Subscription(() => PipelineTaskLogMessage) +} diff --git a/src/pipeline-tasks/pipeline-tasks.service.ts b/src/pipeline-tasks/pipeline-tasks.service.ts index 75660d8..f63e26a 100644 --- a/src/pipeline-tasks/pipeline-tasks.service.ts +++ b/src/pipeline-tasks/pipeline-tasks.service.ts @@ -33,6 +33,7 @@ export class PipelineTasksService { const redis = this.redis.getClient(); await redis.lpush(tasksKey, JSON.stringify(task)); await this.doNextTask(pipeline); + return task; } async doNextTask(pipeline: Pipeline) {