CI/CD - CodeBuild + CodeDeploy + CodePipeline

This commit is contained in:
Zakaria
2026-10-01 09:18:04 -04:00
parent aa02cdb7f6
commit 7f0d707578
41 changed files with 1817 additions and 78 deletions
+55 -2
View File
@@ -22,7 +22,10 @@ export const apiEndpointKeys = {
create: "clouds.services.resources.create",
update: "clouds.services.resources.update",
delete: "clouds.services.resources.delete",
invoke: "clouds.services.resources.invoke",
invoke: "clouds.services.resources.invoke",
start: "clouds.services.resources.start",
stop: "clouds.services.resources.stop",
reboot: "clouds.services.resources.reboot",
publish: "clouds.services.resources.notifications.publish",
createSnsSubscription: "clouds.services.resources.notifications.subscription.create",
listSnsSubscriptions: "clouds.services.resources.notifications.subscriptions.list",
@@ -60,7 +63,17 @@ export const apiEndpointKeys = {
listWorkflowExecutions: "clouds.services.resources.workflows.executions.list",
describeWorkflowExecution: "clouds.services.resources.workflows.execution.describe",
getWorkflowExecutionHistory: "clouds.services.resources.workflows.execution.history.get",
stopWorkflowExecution: "clouds.services.resources.workflows.execution.stop",
stopWorkflowExecution: "clouds.services.resources.workflows.execution.stop",
startCodeBuild: "clouds.services.resources.codebuild.build.start",
listCodeBuilds: "clouds.services.resources.codebuild.builds.list",
getCodeBuild: "clouds.services.resources.codebuild.build.get",
startCodePipeline: "clouds.services.resources.codepipeline.execution.start",
listCodePipelineExecutions: "clouds.services.resources.codepipeline.executions.list",
getCodePipelineState: "clouds.services.resources.codepipeline.state.get",
startCodeDeployDeployment: "clouds.services.resources.codedeploy.deployment.start",
listCodeDeployDeployments: "clouds.services.resources.codedeploy.deployments.list",
getCodeDeployDeployment: "clouds.services.resources.codedeploy.deployment.get",
stopCodeDeployDeployment: "clouds.services.resources.codedeploy.deployment.stop",
},
storage: {
objects: {
@@ -342,6 +355,18 @@ export const endpointRegistry: EndpointRegistry = new Map([
method: "POST",
},
],
[
apiEndpointKeys.clouds.resources.start,
{ path: "/clouds/:cloud/services/:service/resources/:id/start", method: "POST" },
],
[
apiEndpointKeys.clouds.resources.stop,
{ path: "/clouds/:cloud/services/:service/resources/:id/stop", method: "POST" },
],
[
apiEndpointKeys.clouds.resources.reboot,
{ path: "/clouds/:cloud/services/:service/resources/:id/reboot", method: "POST" },
],
[
apiEndpointKeys.clouds.resources.publish,
{
@@ -542,6 +567,34 @@ export const endpointRegistry: EndpointRegistry = new Map([
apiEndpointKeys.clouds.resources.stopWorkflowExecution,
{ path: "/clouds/:cloud/services/workflows/resources/:id/executions/:executionArn/stop", method: "POST" },
],
[
apiEndpointKeys.clouds.resources.startCodeBuild,
{ path: "/clouds/:cloud/services/codebuild/resources/:id/builds", method: "POST" },
],
[
apiEndpointKeys.clouds.resources.listCodeBuilds,
{ path: "/clouds/:cloud/services/codebuild/resources/:id/builds", method: "GET" },
],
[
apiEndpointKeys.clouds.resources.getCodeBuild,
{ path: "/clouds/:cloud/services/codebuild/resources/:id/builds/:buildId", method: "GET" },
],
[
apiEndpointKeys.clouds.resources.startCodePipeline,
{ path: "/clouds/:cloud/services/codepipeline/resources/:id/executions", method: "POST" },
],
[
apiEndpointKeys.clouds.resources.listCodePipelineExecutions,
{ path: "/clouds/:cloud/services/codepipeline/resources/:id/executions", method: "GET" },
],
[
apiEndpointKeys.clouds.resources.getCodePipelineState,
{ path: "/clouds/:cloud/services/codepipeline/resources/:id/state", method: "GET" },
],
[apiEndpointKeys.clouds.resources.startCodeDeployDeployment, {path: "/clouds/:cloud/services/codedeploy/resources/:id/deployments", method: "POST"}],
[apiEndpointKeys.clouds.resources.listCodeDeployDeployments, {path: "/clouds/:cloud/services/codedeploy/resources/:id/deployments", method: "GET"}],
[apiEndpointKeys.clouds.resources.getCodeDeployDeployment, {path: "/clouds/:cloud/services/codedeploy/deployments/:deploymentId", method: "GET"}],
[apiEndpointKeys.clouds.resources.stopCodeDeployDeployment, {path: "/clouds/:cloud/services/codedeploy/deployments/:deploymentId/stop", method: "POST"}],
[
apiEndpointKeys.clouds.resources.get,
{
@@ -208,6 +208,42 @@ export async function deleteCloudResource(
);
}
export async function startCloudResource(
cloud: CloudProvider,
service: CloudServiceType,
id: string,
): Promise<void> {
await apiClient.call<void>(
apiEndpointKeys.clouds.resources.start,
requestOptions(cloud, service),
{ cloud, service, id },
);
}
export async function stopCloudResource(
cloud: CloudProvider,
service: CloudServiceType,
id: string,
): Promise<void> {
await apiClient.call<void>(
apiEndpointKeys.clouds.resources.stop,
requestOptions(cloud, service),
{ cloud, service, id },
);
}
export async function rebootCloudResource(
cloud: CloudProvider,
service: CloudServiceType,
id: string,
): Promise<void> {
await apiClient.call<void>(
apiEndpointKeys.clouds.resources.reboot,
requestOptions(cloud, service),
{ cloud, service, id },
);
}
export async function clearEmailInbox(
cloud: CloudProvider,
signal?: AbortSignal,
@@ -257,6 +293,47 @@ export interface WorkflowExecutionHistoryPage {
nextToken?: string;
}
export interface CodeBuildEnvironmentVariableOverride {
name: string;
value: string;
type?: "PLAINTEXT" | "PARAMETER_STORE" | "SECRETS_MANAGER";
}
export interface CodeBuildBuild {
id: string;
arn?: string;
projectName: string;
buildNumber?: number;
buildStatus?: string;
currentPhase?: string;
startTime?: string;
endTime?: string;
phases: Array<{phaseType: string; phaseStatus?: string; startTime?: string; endTime?: string; contexts: Array<{statusCode?: string; message?: string}>}>;
logGroupName?: string;
logStreamName?: string;
}
export interface PipelineExecutionSummary {
id: string;
status?: string;
statusSummary?: string;
startTime?: string;
lastUpdateTime?: string;
}
export interface PipelineState {
stages: Array<{
name: string;
status?: string;
lastStatusChange?: string;
actions: Array<{name: string; status?: string; summary?: string; lastStatusChange?: string; externalExecutionId?: string; externalExecutionUrl?: string; entityUrl?: string; revisionUrl?: string; codeBuildProject?: string; codeDeployDeploymentId?: string}>;
}>;
}
export interface CodeDeployDeployment { id: string; applicationName: string; deploymentGroupName: string; status: string | null; creator: string | null; deploymentConfigName: string | null; createTime?: string; completeTime?: string; errorInformation: {code?: string; message?: string} | null; currentVersion: string | null; targetVersion: string | null; trafficPercent: number | null }
export interface StartCodeDeployDeploymentInput { functionName: string; alias: string; currentVersion: string; targetVersion: string; beforeAllowTrafficHook?: string; afterAllowTrafficHook?: string }
export interface CodeDeployDependencies { lambdaFunctions: Array<{name: string; aliases: string[]; versions: string[]}> }
export interface CreateApiGatewayLambdaRouteInput {
path: string;
parentResourceId?: string;
@@ -883,6 +960,42 @@ export async function stopWorkflowExecution(stateMachineArn: string, executionAr
);
}
export async function startCodeBuild(projectName: string, input: {environmentVariablesOverride?: CodeBuildEnvironmentVariableOverride[]}): Promise<CodeBuildBuild> {
const res = await apiClient.call<CodeBuildBuild, typeof input>(apiEndpointKeys.clouds.resources.startCodeBuild, requestOptions("aws", "codebuild", {body: input}), {cloud: "aws", id: projectName});
return res.data;
}
export async function listCodeBuilds(projectName: string, signal?: AbortSignal): Promise<CodeBuildBuild[]> {
const res = await apiClient.call<CodeBuildBuild[]>(apiEndpointKeys.clouds.resources.listCodeBuilds, requestOptions("aws", "codebuild", {signal}), {cloud: "aws", id: projectName});
return res.data;
}
export async function getCodeBuild(projectName: string, buildId: string, signal?: AbortSignal): Promise<CodeBuildBuild> {
const res = await apiClient.call<CodeBuildBuild>(apiEndpointKeys.clouds.resources.getCodeBuild, requestOptions("aws", "codebuild", {signal}), {cloud: "aws", id: projectName, buildId});
return res.data;
}
export async function startCodePipeline(name: string): Promise<{id: string}> {
const res = await apiClient.call<{id: string}>(apiEndpointKeys.clouds.resources.startCodePipeline, requestOptions('aws', 'codepipeline'), {cloud: 'aws', id: name});
return res.data;
}
export async function listCodePipelineExecutions(name: string, signal?: AbortSignal): Promise<PipelineExecutionSummary[]> {
const res = await apiClient.call<PipelineExecutionSummary[]>(apiEndpointKeys.clouds.resources.listCodePipelineExecutions, requestOptions('aws', 'codepipeline', {signal}), {cloud: 'aws', id: name});
return res.data;
}
export async function getCodePipelineState(name: string, signal?: AbortSignal): Promise<PipelineState> {
const res = await apiClient.call<PipelineState>(apiEndpointKeys.clouds.resources.getCodePipelineState, requestOptions('aws', 'codepipeline', {signal}), {cloud: 'aws', id: name});
return res.data;
}
export async function getCodeDeployDependencies(signal?: AbortSignal): Promise<CodeDeployDependencies> { const res = await apiClient.call<CodeDeployDependencies>(apiEndpointKeys.clouds.dependencies, requestOptions('aws', 'codedeploy', {signal}), {cloud: 'aws', service: 'codedeploy'}); return res.data }
export async function startCodeDeployDeployment(groupId: string, input: StartCodeDeployDeploymentInput): Promise<CodeDeployDeployment> { const res = await apiClient.call<CodeDeployDeployment, StartCodeDeployDeploymentInput>(apiEndpointKeys.clouds.resources.startCodeDeployDeployment, requestOptions('aws', 'codedeploy', {body: input}), {cloud: 'aws', id: groupId}); return res.data }
export async function listCodeDeployDeployments(groupId: string, signal?: AbortSignal): Promise<CodeDeployDeployment[]> { const res = await apiClient.call<CodeDeployDeployment[]>(apiEndpointKeys.clouds.resources.listCodeDeployDeployments, requestOptions('aws', 'codedeploy', {signal}), {cloud: 'aws', id: groupId}); return res.data }
export async function getCodeDeployDeployment(id: string, signal?: AbortSignal): Promise<CodeDeployDeployment> { const res = await apiClient.call<CodeDeployDeployment>(apiEndpointKeys.clouds.resources.getCodeDeployDeployment, requestOptions('aws', 'codedeploy', {signal}), {cloud: 'aws', deploymentId: id}); return res.data }
export async function stopCodeDeployDeployment(id: string, rollback: boolean): Promise<void> { await apiClient.call<void, {rollback: boolean}>(apiEndpointKeys.clouds.resources.stopCodeDeployDeployment, requestOptions('aws', 'codedeploy', {body: {rollback}}), {cloud: 'aws', deploymentId: id}) }
export async function publishNotification(
cloud: CloudProvider,
topicArn: string,