64 lines
1.8 KiB
Go
64 lines
1.8 KiB
Go
package app
|
|
|
|
import (
|
|
"context"
|
|
"flag"
|
|
"fmt"
|
|
"io"
|
|
|
|
"gitea.maximumdirect.net/eric/narratio/internal/config"
|
|
)
|
|
|
|
// Run executes the pipeline plan and persists manifest state.
|
|
func Run(ctx context.Context, args []string, out io.Writer) error {
|
|
fs := flag.NewFlagSet("run", flag.ContinueOnError)
|
|
fs.SetOutput(io.Discard)
|
|
|
|
var flags commonConfigFlags
|
|
var force bool
|
|
var selectedArtifacts artifactSelectionFlag
|
|
addCommonConfigFlags(fs, &flags)
|
|
fs.BoolVar(&force, "force", false, "force stage execution (reserved for future behavior)")
|
|
fs.Var(&selectedArtifacts, "artifacts", "configured artifact names to execute and publish (comma-separated or repeatable)")
|
|
|
|
if err := parseSessionAwareFlags("run", fs, args, &flags.sessionID); err != nil {
|
|
return err
|
|
}
|
|
if flags.sessionID == "" {
|
|
return fmt.Errorf("run: session_id is required")
|
|
}
|
|
cfg, err := loadCommandConfig(ctx, flags.pipelinePath, flags.campaignPath, flags.campaignFilePath, flags.sessionPath, flags.sessionOptions())
|
|
if err != nil {
|
|
return fmt.Errorf("run: %w", err)
|
|
}
|
|
if err := config.Validate(cfg); err != nil {
|
|
return fmt.Errorf("run: %w", err)
|
|
}
|
|
normalizedArtifacts, err := selectedArtifacts.Normalize()
|
|
if err != nil {
|
|
return fmt.Errorf("run: invalid --artifacts: %w", err)
|
|
}
|
|
if err := validateSelectedArtifacts(cfg, normalizedArtifacts); err != nil {
|
|
return fmt.Errorf("run: %w", err)
|
|
}
|
|
|
|
stages := BuildFullPlan()
|
|
summary, err := executeStagesFn(ctx, cfg, stages, RunOptions{
|
|
Force: force,
|
|
SelectedArtifacts: normalizedArtifacts,
|
|
})
|
|
if err != nil {
|
|
return fmt.Errorf("run: %w", err)
|
|
}
|
|
|
|
_, err = fmt.Fprintf(
|
|
out,
|
|
"narratio run: session %s; executed=%d skipped=%d; manifest=%s\n",
|
|
summary.SessionID,
|
|
len(summary.Executed),
|
|
len(summary.Skipped),
|
|
summary.ManifestPath,
|
|
)
|
|
return err
|
|
}
|