Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 60 additions & 0 deletions docs/components/AWS.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import { CardGrid, LinkCard } from "@astrojs/starlight/components";
<LinkCard title="CodeArtifact • Get Package Version" href="#code-artifact-•-get-package-version" description="Describe an AWS CodeArtifact package version" />
<LinkCard title="CodeArtifact • Update Package Versions Status" href="#code-artifact-•-update-package-versions-status" description="Update the status of one or more package versions (Archived, Published, Unlisted)" />
<LinkCard title="CodePipeline • Get Pipeline" href="#code-pipeline-•-get-pipeline" description="Retrieve the definition of an AWS CodePipeline pipeline" />
<LinkCard title="CodePipeline • Get Pipeline Execution" href="#code-pipeline-•-get-pipeline-execution" description="Retrieve the status and details of an AWS CodePipeline execution" />
<LinkCard title="CodePipeline • Run Pipeline" href="#code-pipeline-•-run-pipeline" description="Start an AWS CodePipeline execution and wait for it to complete" />
<LinkCard title="EC2 • Copy Image" href="#ec2-•-copy-image" description="Copy an EC2 AMI image to another region" />
<LinkCard title="EC2 • Create Image" href="#ec2-•-create-image" description="Create a new AMI image from an EC2 instance" />
Expand Down Expand Up @@ -690,6 +691,65 @@ Emits the full pipeline definition including:
}
```

<a id="code-pipeline-•-get-pipeline-execution"></a>

## CodePipeline • Get Pipeline Execution

The Get Pipeline Execution component retrieves the details of a specific AWS CodePipeline execution.

### Use Cases

- **Execution inspection**: Fetch the status, trigger, and artifact revisions of a pipeline run
- **Post-deploy checks**: After a RunPipeline component, fetch details of that execution for logging
- **Workflow branching**: Route workflow based on execution status or trigger type
- **Audit and compliance**: Retrieve execution details for auditing purposes

### Configuration

- **Region**: AWS region where the pipeline exists
- **Pipeline**: Pipeline name
- **Execution ID**: The ID of the specific execution to retrieve

### Output

Emits the full pipeline execution details including:
- Execution ID, status, and status summary
- Pipeline name and version
- Trigger type and detail
- Artifact revisions (source code revisions involved)
- Execution mode and type

### Example Output

```json
{
"data": {
"artifactRevisions": [
{
"name": "SourceArtifact",
"revisionChangeIdentifier": "abc123def456789",
"revisionId": "abc123def456789",
"revisionSummary": "Merge pull request #42 from feature/add-auth",
"revisionUrl": "https://github.com/example/repo/commit/abc123def456789"
}
],
"executionMode": "SUPERSEDED",
"executionType": "STANDARD",
"pipelineExecutionId": "a1b2c3d4-5678-90ab-cdef-111122223333",
"pipelineName": "my-deploy-pipeline",
"pipelineVersion": 3,
"status": "Succeeded",
"statusSummary": "Pipeline completed successfully",
"trigger": {
"triggerDetail": "arn:aws:iam::123456789012:user/developer",
"triggerType": "StartPipelineExecution"
}
},
"timestamp": "2026-02-23T10:00:00.000000000Z",
"type": "aws.codepipeline.pipeline.execution"
}
```

<a id="code-pipeline-•-run-pipeline"></a>

## CodePipeline • Run Pipeline
Expand Down
1 change: 1 addition & 0 deletions pkg/integrations/aws/aws.go
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@ func (a *AWS) Components() []core.Component {
&codeartifact.GetPackageVersion{},
&codeartifact.UpdatePackageVersionsStatus{},
&codepipeline.GetPipeline{},
&codepipeline.GetPipelineExecution{},
&codepipeline.RunPipeline{},
&ecs.CreateService{},
&ecs.DescribeService{},
Expand Down
18 changes: 18 additions & 0 deletions pkg/integrations/aws/codepipeline/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,24 @@ func (c *Client) GetPipelineExecution(pipelineName, executionID string) (*Pipeli
return &response.PipelineExecution, nil
}

type GetPipelineExecutionDetailsResponse struct {
PipelineExecution map[string]any `json:"pipelineExecution"`
}

func (c *Client) GetPipelineExecutionDetails(pipelineName, executionID string) (*GetPipelineExecutionDetailsResponse, error) {
payload := map[string]any{
"pipelineName": pipelineName,
"pipelineExecutionId": executionID,
}

var response GetPipelineExecutionDetailsResponse
if err := c.postJSON("GetPipelineExecution", payload, &response); err != nil {
return nil, err
}

return &response, nil
}

func (c *Client) StopPipelineExecution(pipelineName, executionID, reason string, abandon bool) error {
payload := map[string]any{
"pipelineName": pipelineName,
Expand Down
14 changes: 14 additions & 0 deletions pkg/integrations/aws/codepipeline/example.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,17 @@ func (c *GetPipeline) ExampleOutput() map[string]any {
&exampleOutputGetPipeline,
)
}

//go:embed example_output_get_pipeline_execution.json
var exampleOutputGetPipelineExecutionBytes []byte

var exampleOutputGetPipelineExecutionOnce sync.Once
var exampleOutputGetPipelineExecution map[string]any

func (c *GetPipelineExecution) ExampleOutput() map[string]any {
return utils.UnmarshalEmbeddedJSON(
&exampleOutputGetPipelineExecutionOnce,
exampleOutputGetPipelineExecutionBytes,
&exampleOutputGetPipelineExecution,
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{
"data": {
"pipelineExecutionId": "a1b2c3d4-5678-90ab-cdef-111122223333",
"pipelineName": "my-deploy-pipeline",
"pipelineVersion": 3,
"status": "Succeeded",
"statusSummary": "Pipeline completed successfully",
"artifactRevisions": [
{
"name": "SourceArtifact",
"revisionId": "abc123def456789",
"revisionChangeIdentifier": "abc123def456789",
"revisionSummary": "Merge pull request #42 from feature/add-auth",
"revisionUrl": "https://github.com/example/repo/commit/abc123def456789"
}
],
"trigger": {
"triggerType": "StartPipelineExecution",
"triggerDetail": "arn:aws:iam::123456789012:user/developer"
},
"executionMode": "SUPERSEDED",
"executionType": "STANDARD"
},
"timestamp": "2026-02-23T10:00:00.000000000Z",
"type": "aws.codepipeline.pipeline.execution"
}
191 changes: 191 additions & 0 deletions pkg/integrations/aws/codepipeline/get_pipeline_execution.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,191 @@
package codepipeline

import (
"fmt"
"net/http"
"strings"

"github.com/google/uuid"
"github.com/mitchellh/mapstructure"
"github.com/superplanehq/superplane/pkg/configuration"
"github.com/superplanehq/superplane/pkg/core"
"github.com/superplanehq/superplane/pkg/integrations/aws/common"
)

type GetPipelineExecution struct{}

type GetPipelineExecutionSpec struct {
Region string `json:"region" mapstructure:"region"`
Pipeline string `json:"pipeline" mapstructure:"pipeline"`
ExecutionID string `json:"executionId" mapstructure:"executionId"`
}

func (c *GetPipelineExecution) Name() string {
return "aws.codepipeline.getPipelineExecution"
}

func (c *GetPipelineExecution) Label() string {
return "CodePipeline • Get Pipeline Execution"
}

func (c *GetPipelineExecution) Description() string {
return "Retrieve the status and details of an AWS CodePipeline execution"
}

func (c *GetPipelineExecution) Documentation() string {
return `The Get Pipeline Execution component retrieves the details of a specific AWS CodePipeline execution.

## Use Cases

- **Execution inspection**: Fetch the status, trigger, and artifact revisions of a pipeline run
- **Post-deploy checks**: After a RunPipeline component, fetch details of that execution for logging
- **Workflow branching**: Route workflow based on execution status or trigger type
- **Audit and compliance**: Retrieve execution details for auditing purposes

## Configuration

- **Region**: AWS region where the pipeline exists
- **Pipeline**: Pipeline name
- **Execution ID**: The ID of the specific execution to retrieve

## Output

Emits the full pipeline execution details including:
- Execution ID, status, and status summary
- Pipeline name and version
- Trigger type and detail
- Artifact revisions (source code revisions involved)
- Execution mode and type`
}

func (c *GetPipelineExecution) Icon() string {
return "aws"
}

func (c *GetPipelineExecution) Color() string {
return "orange"
}

func (c *GetPipelineExecution) Configuration() []configuration.Field {
return []configuration.Field{
{
Name: "region",
Label: "Region",
Type: configuration.FieldTypeSelect,
Required: true,
Default: "us-east-1",
TypeOptions: &configuration.TypeOptions{
Select: &configuration.SelectTypeOptions{
Options: common.AllRegions,
},
},
},
{
Name: "pipeline",
Label: "Pipeline",
Type: configuration.FieldTypeIntegrationResource,
Required: true,
Description: "CodePipeline pipeline to query",
TypeOptions: &configuration.TypeOptions{
Resource: &configuration.ResourceTypeOptions{
Type: "codepipeline.pipeline",
Parameters: []configuration.ParameterRef{
{
Name: "region",
ValueFrom: &configuration.ParameterValueFrom{
Field: "region",
},
},
},
},
},
VisibilityConditions: []configuration.VisibilityCondition{
{
Field: "region",
Values: []string{"*"},
},
},
},
{
Name: "executionId",
Label: "Execution ID",
Type: configuration.FieldTypeString,
Required: true,
Description: "Pipeline execution ID to retrieve (supports expressions)",
},
}
}

func (c *GetPipelineExecution) Setup(ctx core.SetupContext) error {
spec := GetPipelineExecutionSpec{}
if err := mapstructure.Decode(ctx.Configuration, &spec); err != nil {
return fmt.Errorf("failed to decode configuration: %w", err)
}

if strings.TrimSpace(spec.Region) == "" {
return fmt.Errorf("region is required")
}

if strings.TrimSpace(spec.Pipeline) == "" {
return fmt.Errorf("pipeline is required")
}

if strings.TrimSpace(spec.ExecutionID) == "" {
return fmt.Errorf("execution ID is required")
}

return nil
}

func (c *GetPipelineExecution) Execute(ctx core.ExecutionContext) error {
spec := GetPipelineExecutionSpec{}
if err := mapstructure.Decode(ctx.Configuration, &spec); err != nil {
return fmt.Errorf("failed to decode configuration: %w", err)
}

credentials, err := common.CredentialsFromInstallation(ctx.Integration)
if err != nil {
return fmt.Errorf("failed to get AWS credentials: %w", err)
}

client := NewClient(ctx.HTTP, credentials, strings.TrimSpace(spec.Region))

response, err := client.GetPipelineExecutionDetails(strings.TrimSpace(spec.Pipeline), strings.TrimSpace(spec.ExecutionID))
if err != nil {
return fmt.Errorf("failed to get pipeline execution: %w", err)
}

return ctx.ExecutionState.Emit(
core.DefaultOutputChannel.Name,
"aws.codepipeline.pipeline.execution",
[]any{response.PipelineExecution},
)
}

func (c *GetPipelineExecution) OutputChannels(configuration any) []core.OutputChannel {
return []core.OutputChannel{core.DefaultOutputChannel}
}

func (c *GetPipelineExecution) ProcessQueueItem(ctx core.ProcessQueueContext) (*uuid.UUID, error) {
return ctx.DefaultProcessing()
}

func (c *GetPipelineExecution) Actions() []core.Action {
return []core.Action{}
}

func (c *GetPipelineExecution) HandleAction(ctx core.ActionContext) error {
return nil
}

func (c *GetPipelineExecution) HandleWebhook(ctx core.WebhookRequestContext) (int, error) {
return http.StatusOK, nil
}

func (c *GetPipelineExecution) Cancel(ctx core.ExecutionContext) error {
return nil
}

func (c *GetPipelineExecution) Cleanup(ctx core.SetupContext) error {
return nil
}
Loading