diff --git a/.yarn/cache/@aws-codecatalyst-workflows-sdk-npm-0.1.5-preview.6-d04d7c4d10-acf74c11ca.zip b/.yarn/cache/@aws-codecatalyst-workflows-sdk-npm-0.1.5-preview.6-d04d7c4d10-acf74c11ca.zip new file mode 100644 index 000000000..4b1c0b5f0 Binary files /dev/null and b/.yarn/cache/@aws-codecatalyst-workflows-sdk-npm-0.1.5-preview.6-d04d7c4d10-acf74c11ca.zip differ diff --git a/.yarn/cache/jsonschema-npm-1.4.1-548ecda9d0-1ef02a6cd9.zip b/.yarn/cache/jsonschema-npm-1.4.1-548ecda9d0-1ef02a6cd9.zip new file mode 100644 index 000000000..9904dda98 Binary files /dev/null and b/.yarn/cache/jsonschema-npm-1.4.1-548ecda9d0-1ef02a6cd9.zip differ diff --git a/packages/components/workflows/.projen/deps.json b/packages/components/workflows/.projen/deps.json index 3dfc6512c..f9c763097 100644 --- a/packages/components/workflows/.projen/deps.json +++ b/packages/components/workflows/.projen/deps.json @@ -87,6 +87,10 @@ "name": "projen", "type": "peer" }, + { + "name": "@aws/codecatalyst-workflows-sdk", + "type": "runtime" + }, { "name": "projen", "version": "0.71.112", diff --git a/packages/components/workflows/.projenrc.ts b/packages/components/workflows/.projenrc.ts index df1b89015..293454f1c 100644 --- a/packages/components/workflows/.projenrc.ts +++ b/packages/components/workflows/.projenrc.ts @@ -4,7 +4,7 @@ const project = new ProjenBlueprintComponent({ defaultReleaseBranch: 'main', name: 'codecatalyst-workflows', copyrightOwner: 'Amazon.com', - deps: ['yaml'], + deps: ['yaml', '@aws/codecatalyst-workflows-sdk'], peerDeps: [ 'projen', '@amazon-codecatalyst/blueprint-component.source-repositories', diff --git a/packages/components/workflows/package.json b/packages/components/workflows/package.json index 183ad3db6..09d44baa2 100644 --- a/packages/components/workflows/package.json +++ b/packages/components/workflows/package.json @@ -47,6 +47,7 @@ "projen": "*" }, "dependencies": { + "@aws/codecatalyst-workflows-sdk": "0.1.5-preview.6", "projen": "0.71.112", "yaml": "*" }, diff --git a/packages/components/workflows/src/actions/action-build.ts b/packages/components/workflows/src/actions/action-build.ts index 8cb7bb819..a2412af1b 100644 --- a/packages/components/workflows/src/actions/action-build.ts +++ b/packages/components/workflows/src/actions/action-build.ts @@ -8,7 +8,7 @@ import { OutputDefinition, } from './action'; import { WorkflowEnvironment } from '../environment/workflow-environment'; -import { WorkflowDefinition } from '../workflow/workflow'; +import { WorkflowDefinition } from '../workflow/workflow-definition'; export interface BuildActionConfiguration { ActionRoleArn?: string; diff --git a/packages/components/workflows/src/actions/action-cdk-bootstrap.ts b/packages/components/workflows/src/actions/action-cdk-bootstrap.ts index 98eb1128f..90225dc8b 100644 --- a/packages/components/workflows/src/actions/action-cdk-bootstrap.ts +++ b/packages/components/workflows/src/actions/action-cdk-bootstrap.ts @@ -8,7 +8,7 @@ import { InputsDefinition, } from './action'; import { WorkflowEnvironment } from '../environment/workflow-environment'; -import { WorkflowDefinition } from '../workflow/workflow'; +import { WorkflowDefinition } from '../workflow/workflow-definition'; export interface CdkBootstrapActionConfiguration { Region: string; diff --git a/packages/components/workflows/src/actions/action-cdk-deploy.ts b/packages/components/workflows/src/actions/action-cdk-deploy.ts index d254cbbe6..ae395c227 100644 --- a/packages/components/workflows/src/actions/action-cdk-deploy.ts +++ b/packages/components/workflows/src/actions/action-cdk-deploy.ts @@ -9,7 +9,7 @@ import { convertInputsToJsonString, } from './action'; import { WorkflowEnvironment } from '../environment/workflow-environment'; -import { WorkflowDefinition } from '../workflow/workflow'; +import { WorkflowDefinition } from '../workflow/workflow-definition'; export interface CdkDeployActionConfiguration { StackName: string; diff --git a/packages/components/workflows/src/actions/action-cfn-cleanup.ts b/packages/components/workflows/src/actions/action-cfn-cleanup.ts index 2ca2bee67..58e69e1a4 100644 --- a/packages/components/workflows/src/actions/action-cfn-cleanup.ts +++ b/packages/components/workflows/src/actions/action-cfn-cleanup.ts @@ -1,7 +1,7 @@ import { Blueprint } from '@amazon-codecatalyst/blueprints.blueprint'; import { ActionDefiniton, ActionIdentifierAlias, getDefaultActionIdentifier } from './action'; import { BuildActionParameters } from './action-build'; -import { WorkflowDefinition } from '../workflow/workflow'; +import { WorkflowDefinition } from '../workflow/workflow-definition'; export const DEFAULT_DELETE_RESOURCE_WORKFLOW_NAME = 'DANGER-hard-delete-deployed-resources'; diff --git a/packages/components/workflows/src/actions/action-cfn-deploy.ts b/packages/components/workflows/src/actions/action-cfn-deploy.ts index c814ef3bd..dec0a2c67 100644 --- a/packages/components/workflows/src/actions/action-cfn-deploy.ts +++ b/packages/components/workflows/src/actions/action-cfn-deploy.ts @@ -1,7 +1,7 @@ import { Blueprint } from '@amazon-codecatalyst/blueprints.blueprint'; import { getDefaultActionIdentifier, ActionIdentifierAlias, ActionDefiniton } from './action'; import { WorkflowEnvironment } from '../environment/workflow-environment'; -import { WorkflowDefinition } from '../workflow/workflow'; +import { WorkflowDefinition } from '../workflow/workflow-definition'; export interface DeployInputConfiguration { Artifacts: string[]; diff --git a/packages/components/workflows/src/actions/action-publish-blueprint.ts b/packages/components/workflows/src/actions/action-publish-blueprint.ts index cf323e8a1..dbc6c2eeb 100644 --- a/packages/components/workflows/src/actions/action-publish-blueprint.ts +++ b/packages/components/workflows/src/actions/action-publish-blueprint.ts @@ -1,6 +1,6 @@ import { Blueprint } from '@amazon-codecatalyst/blueprints.blueprint'; import { ActionDefiniton, ActionIdentifierAlias, ComputeConfiguration, InputsDefinition, getDefaultActionIdentifier } from './action'; -import { WorkflowDefinition } from '../workflow/workflow'; +import { WorkflowDefinition } from '../workflow/workflow-definition'; export interface PublishBlueprintActionConfiguration { ArtifactPackagePath: string; diff --git a/packages/components/workflows/src/actions/action-test-reports.ts b/packages/components/workflows/src/actions/action-test-reports.ts index 62a830e08..b91b9f9ed 100644 --- a/packages/components/workflows/src/actions/action-test-reports.ts +++ b/packages/components/workflows/src/actions/action-test-reports.ts @@ -1,6 +1,6 @@ import { Blueprint } from '@amazon-codecatalyst/blueprints.blueprint'; import { getDefaultActionIdentifier, ActionIdentifierAlias, ActionDefiniton } from './action'; -import { WorkflowDefinition } from '../workflow/workflow'; +import { WorkflowDefinition } from '../workflow/workflow-definition'; export interface TestReportActionParameters { steps: Step[]; diff --git a/packages/components/workflows/src/actions/action.ts b/packages/components/workflows/src/actions/action.ts index f6e607f86..275e3e74f 100644 --- a/packages/components/workflows/src/actions/action.ts +++ b/packages/components/workflows/src/actions/action.ts @@ -21,34 +21,57 @@ export enum ActionIdentifierAlias { } const ACTION_IDENTIFIERS: { [key: string]: { default: string; prod: string } } = { - build: { + 'build': { default: 'aws/build-beta@v1', prod: 'aws/build@v1', }, - test: { + 'test': { default: 'aws/managed-test-gamma@v1', prod: 'aws/managed-test@v1', }, - deploy: { + 'deploy': { default: 'aws/cfn-deploy-gamma@v1', prod: 'aws/cfn-deploy@v1', }, - cdkDeploy: { + 'cdkDeploy': { default: 'aws/cdk-deploy-gamma@v1', prod: 'aws/cdk-deploy@v1', }, - cdkBootstrap: { + 'cdkBootstrap': { default: 'aws/cdk-bootstrap-gamma@v1', prod: 'aws/cdk-bootstrap@v1', }, - publishBlueprint: { + 'aws/build@v1': { + default: 'aws/build-beta@v1', + prod: 'aws/build@v1', + }, + 'aws/managed-test@v1': { + default: 'aws/managed-test-gamma@v1', + prod: 'aws/managed-test@v1', + }, + 'aws/cfn-deploy@v1': { + default: 'aws/cfn-deploy-gamma@v1', + prod: 'aws/cfn-deploy@v1', + }, + 'aws/cdk-deploy@v1': { + default: 'aws/cdk-deploy-gamma@v1', + prod: 'aws/cdk-deploy@v1', + }, + 'aws/cdk-bootstrap@v1': { + default: 'aws/cdk-bootstrap-gamma@v1', + prod: 'aws/cdk-bootstrap@v1', + }, + 'publishBlueprint': { default: 'aws/publish-blueprint-action@v1', prod: 'aws/publish-blueprint-action@v1', }, }; -export function getDefaultActionIdentifier(alias: ActionIdentifierAlias, environmentIdentifier: string = 'default'): string | undefined { - return ACTION_IDENTIFIERS[alias]?.[environmentIdentifier] ?? ACTION_IDENTIFIERS[alias]?.default; +export function getDefaultActionIdentifier(identifer: string, environmentIdentifier: string = 'default'): string | undefined { + if (ACTION_IDENTIFIERS[identifer]) { + return ACTION_IDENTIFIERS[identifer]?.[environmentIdentifier] ?? ACTION_IDENTIFIERS[identifer]?.default; + } + return identifer; } type TypeSupportedCompute = ComputeConfiguration; diff --git a/packages/components/workflows/src/generated-sdk/action-group-builder.ts b/packages/components/workflows/src/generated-sdk/action-group-builder.ts new file mode 100644 index 000000000..9e3e44207 --- /dev/null +++ b/packages/components/workflows/src/generated-sdk/action-group-builder.ts @@ -0,0 +1,37 @@ +import { Blueprint } from '@amazon-codecatalyst/blueprints.blueprint'; +import * as sdk from '@aws/codecatalyst-workflows-sdk'; +import { getDefaultActionIdentifier } from '../actions/action'; + +/** + * This wraps the generated codecatalyst workflows sdk [@aws/codecatalyst-workflows-sdk]. + * @experimental + */ +export class ActionGroupDefinitionBuilder { + blueprint: Blueprint; + definition: sdk.ActionGroup; + + constructor( + blueprint: Blueprint, + options: { + starterDefinition?: Partial; + }, + ) { + this.blueprint = blueprint; + this.definition = { + ...options.starterDefinition, + Actions: {}, + }; + } + + setDependsOn(dependsOn: string[]) { + this.definition.DependsOn = dependsOn; + } + + addAction(name: string, action: T, _options?: {} | undefined): void { + this.definition.Actions = this.definition.Actions || {}; + this.definition.Actions[name] = { + ...action, + Identifier: getDefaultActionIdentifier(action.Identifier, this.blueprint.context.environmentId) as any, + }; + } +} diff --git a/packages/components/workflows/src/generated-sdk/workflow-definition-builder.ts b/packages/components/workflows/src/generated-sdk/workflow-definition-builder.ts new file mode 100644 index 000000000..842525768 --- /dev/null +++ b/packages/components/workflows/src/generated-sdk/workflow-definition-builder.ts @@ -0,0 +1,51 @@ +import { Blueprint } from '@amazon-codecatalyst/blueprints.blueprint'; +import * as sdk from '@aws/codecatalyst-workflows-sdk'; +import { getDefaultActionIdentifier } from '../actions/action'; + +/** + * This wraps the generated codecatalyst workflows sdk [@aws/codecatalyst-workflows-sdk]. + * @experimental - there may be backwards breaking model changes via @aws/codecatalyst-workflows-sdk + */ +export class WorkflowDefinitionBuilder { + blueprint: Blueprint; + genericBuilder: sdk.WorkflowDefinition; + + constructor( + blueprint: Blueprint, + options?: { + starterDefinition?: Partial; + }, + ) { + const name = options?.starterDefinition?.Name || 'build-workflow'; + + this.genericBuilder = new sdk.WorkflowDefinition(name, { + workflow: options?.starterDefinition, + }); + this.blueprint = blueprint; + } + + setName(name: string) { + this.genericBuilder.definition.Name = name; + } + + getDefinition(): sdk.Workflow { + return this.genericBuilder.definition; + } + + setDefinition(definition: sdk.Workflow) { + this.genericBuilder.definition = definition; + } + + addAction(name: string, action: T, _options?: {} | undefined): void { + this.genericBuilder.addAction(name, { + ...action, + Identifier: getDefaultActionIdentifier(action.Identifier, this.blueprint.context.environmentId), + }); + } + + addActionGroup(name: string, actionGroup: T, _options?: {} | undefined): void { + this.genericBuilder.addAction(name, { + ...actionGroup, + }); + } +} diff --git a/packages/components/workflows/src/index.ts b/packages/components/workflows/src/index.ts index 806bc704c..89e660407 100644 --- a/packages/components/workflows/src/index.ts +++ b/packages/components/workflows/src/index.ts @@ -1,4 +1,4 @@ -export * from './workflow/workflow'; +export * from './workflow/workflow-definition'; export * from './workflow/workflow-builder'; export * from './workflow/sources'; export * from './workflow/triggers'; @@ -18,3 +18,12 @@ export * from './actions/action-cfn-deploy'; export * from './actions/action-test-reports'; export * from './actions/action-cdk-deploy'; export * from './actions/action-cdk-bootstrap'; + +export * from './workflow'; + +/** + * Experimental sdk generated from schemas + */ +export * as sdk from '@aws/codecatalyst-workflows-sdk'; +export * from './generated-sdk/action-group-builder'; +export * from './generated-sdk/workflow-definition-builder'; diff --git a/packages/components/workflows/src/samples/empty.ts b/packages/components/workflows/src/samples/empty.ts index 3bcf37279..65271d715 100644 --- a/packages/components/workflows/src/samples/empty.ts +++ b/packages/components/workflows/src/samples/empty.ts @@ -1,5 +1,5 @@ import { ComputeType, ComputeFleet } from '../workflow/compute'; -import { WorkflowDefinition } from '../workflow/workflow'; +import { WorkflowDefinition } from '../workflow/workflow-definition'; export function makeEmptyWorkflow(): WorkflowDefinition { return { diff --git a/packages/components/workflows/src/samples/node.ts b/packages/components/workflows/src/samples/node.ts index 309f9f5b4..228214f76 100644 --- a/packages/components/workflows/src/samples/node.ts +++ b/packages/components/workflows/src/samples/node.ts @@ -1,5 +1,5 @@ import { TriggerType } from '../workflow/triggers'; -import { WorkflowDefinition } from '../workflow/workflow'; +import { WorkflowDefinition } from '../workflow/workflow-definition'; export class NodeWorkflowDefinitionSamples { public static readonly build: WorkflowDefinition = { diff --git a/packages/components/workflows/src/workflow/workflow.ts b/packages/components/workflows/src/workflow.ts similarity index 73% rename from packages/components/workflows/src/workflow/workflow.ts rename to packages/components/workflows/src/workflow.ts index 39368d979..1310faf81 100644 --- a/packages/components/workflows/src/workflow/workflow.ts +++ b/packages/components/workflows/src/workflow.ts @@ -1,29 +1,11 @@ import { SourceFile, SourceRepository } from '@amazon-codecatalyst/blueprint-component.source-repositories'; import { Blueprint } from '@amazon-codecatalyst/blueprints.blueprint'; +import * as sdk from '@aws/codecatalyst-workflows-sdk'; import { Component } from 'projen'; import * as YAML from 'yaml'; -import { ComputeDefintion } from './compute'; -import { SourceDefiniton } from './sources'; -import { TriggerDefiniton } from './triggers'; - -export enum RunModeDefiniton { - PARALLEL = 'PARALLEL', - QUEUED = 'QUEUED', - SUPERSEDED = 'SUPERSEDED', -} - -export interface WorkflowDefinition { - Name: string; - SchemaVersion?: string; - RunMode?: RunModeDefiniton; - Sources?: SourceDefiniton; - Triggers?: TriggerDefiniton[]; - Compute?: ComputeDefintion; - Actions?: { - [id: string]: any; - }; -} +import { WorkflowDefinition } from './workflow/workflow-definition'; +export const workflowLocation = '.codecatalyst/workflows'; export interface WorkflowOptions { /** * Additional comments to be added to the top of the generated .yaml file of the workflow. @@ -42,10 +24,13 @@ export interface WorkflowOptions { YAMLOptions?: YAML.DocumentOptions & YAML.SchemaOptions & YAML.ParseOptions & YAML.CreateNodeOptions & YAML.ToStringOptions; } -export const workflowLocation = '.codecatalyst/workflows'; - export class Workflow extends Component { - constructor(blueprint: Blueprint, sourceRepository: SourceRepository, workflow: WorkflowDefinition | any, options?: WorkflowOptions) { + constructor( + blueprint: Blueprint, + sourceRepository: SourceRepository, + workflow: WorkflowDefinition | sdk.Workflow | any, + options?: WorkflowOptions, + ) { super(blueprint); /** diff --git a/packages/components/workflows/src/workflow/compute.ts b/packages/components/workflows/src/workflow/compute.ts index f7c895d75..82d03fa56 100644 --- a/packages/components/workflows/src/workflow/compute.ts +++ b/packages/components/workflows/src/workflow/compute.ts @@ -1,4 +1,4 @@ -import { WorkflowDefinition } from './workflow'; +import { WorkflowDefinition } from './workflow-definition'; export interface ComputeDefintion { Type: ComputeType; Fleet: ComputeFleet; diff --git a/packages/components/workflows/src/workflow/triggers.ts b/packages/components/workflows/src/workflow/triggers.ts index d655d31de..4ce2f65f8 100644 --- a/packages/components/workflows/src/workflow/triggers.ts +++ b/packages/components/workflows/src/workflow/triggers.ts @@ -1,4 +1,4 @@ -import { WorkflowDefinition } from './workflow'; +import { WorkflowDefinition } from './workflow-definition'; export interface TriggerDefiniton { Type: TriggerType; diff --git a/packages/components/workflows/src/workflow/workflow-builder.ts b/packages/components/workflows/src/workflow/workflow-builder.ts index 073cdca47..7be54a597 100644 --- a/packages/components/workflows/src/workflow/workflow-builder.ts +++ b/packages/components/workflows/src/workflow/workflow-builder.ts @@ -1,6 +1,6 @@ import { Blueprint } from '@amazon-codecatalyst/blueprints.blueprint'; import { addGenericBranchTrigger, addGenericPullRequestTrigger, PullRequestEvent } from './triggers'; -import { WorkflowDefinition } from './workflow'; +import { WorkflowDefinition } from './workflow-definition'; import { ComputeDefintion, TriggerDefiniton } from '..'; import { addGenericBuildAction, BuildActionParameters } from '../actions/action-build'; import { addGenericCdkBootstrapAction, CdkBootstrapActionParameters } from '../actions/action-cdk-bootstrap'; diff --git a/packages/components/workflows/src/workflow/workflow-definition.ts b/packages/components/workflows/src/workflow/workflow-definition.ts new file mode 100644 index 000000000..41b82e583 --- /dev/null +++ b/packages/components/workflows/src/workflow/workflow-definition.ts @@ -0,0 +1,21 @@ +import { ComputeDefintion } from './compute'; +import { SourceDefiniton } from './sources'; +import { TriggerDefiniton } from './triggers'; + +export enum RunModeDefiniton { + PARALLEL = 'PARALLEL', + QUEUED = 'QUEUED', + SUPERSEDED = 'SUPERSEDED', +} + +export interface WorkflowDefinition { + Name: string; + SchemaVersion?: string; + RunMode?: RunModeDefiniton; + Sources?: SourceDefiniton; + Triggers?: TriggerDefiniton[]; + Compute?: ComputeDefintion; + Actions?: { + [id: string]: any; + }; +} diff --git a/yarn.lock b/yarn.lock index 69a6ae490..0b952f595 100644 --- a/yarn.lock +++ b/yarn.lock @@ -104,6 +104,7 @@ __metadata: "@amazon-codecatalyst/blueprint-component.source-repositories": "*" "@amazon-codecatalyst/blueprint-util.projen-blueprint-component": "*" "@amazon-codecatalyst/blueprints.blueprint": "*" + "@aws/codecatalyst-workflows-sdk": 0.1.5-preview.6 "@types/node": ^18 "@typescript-eslint/eslint-plugin": ^5 "@typescript-eslint/parser": ^5 @@ -1127,6 +1128,19 @@ __metadata: languageName: node linkType: hard +"@aws/codecatalyst-workflows-sdk@npm:0.1.5-preview.6": + version: 0.1.5-preview.6 + resolution: "@aws/codecatalyst-workflows-sdk@npm:0.1.5-preview.6" + dependencies: + globule: ^1.3.4 + js-yaml: ^4.1.0 + jsonschema: ^1.4.1 + peerDependencies: + projen: ^0.71.112 + checksum: acf74c11caee1bbb239aafb6d8ebb94349f0278ec2d84395e38b662ce4ff41caefa1d6ef54d7a900361472a276f0bf498e4af48765e5d604e51432ba4a0c0435 + languageName: node + linkType: hard + "@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.22.5": version: 7.22.5 resolution: "@babel/code-frame@npm:7.22.5" @@ -7495,7 +7509,7 @@ __metadata: languageName: node linkType: hard -"globule@npm:*": +"globule@npm:*, globule@npm:^1.3.4": version: 1.3.4 resolution: "globule@npm:1.3.4" dependencies: @@ -9583,6 +9597,13 @@ __metadata: languageName: node linkType: hard +"jsonschema@npm:^1.4.1": + version: 1.4.1 + resolution: "jsonschema@npm:1.4.1" + checksum: 1ef02a6cd9bc32241ec86bbf1300bdbc3b5f2d8df6eb795517cf7d1cd9909e7beba1e54fdf73990fd66be98a182bda9add9607296b0cb00b1348212988e424b2 + languageName: node + linkType: hard + "jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.3": version: 3.3.4 resolution: "jsx-ast-utils@npm:3.3.4"