Skip to content

Commit

Permalink
feat(pkgs/skaffold/runner): wrap pipeline builders to run build pre/p…
Browse files Browse the repository at this point in the history
…ost hooks
  • Loading branch information
ar3s3ru committed Aug 27, 2023
1 parent dba877d commit 740d30e
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 2 deletions.
42 changes: 42 additions & 0 deletions pkg/skaffold/runner/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,14 @@ package runner
import (
"context"
"fmt"
"io"

"github.com/GoogleContainerTools/skaffold/v2/pkg/skaffold/build"
"github.com/GoogleContainerTools/skaffold/v2/pkg/skaffold/build/cluster"
"github.com/GoogleContainerTools/skaffold/v2/pkg/skaffold/build/gcb"
"github.com/GoogleContainerTools/skaffold/v2/pkg/skaffold/build/local"
"github.com/GoogleContainerTools/skaffold/v2/pkg/skaffold/graph"
"github.com/GoogleContainerTools/skaffold/v2/pkg/skaffold/hooks"
"github.com/GoogleContainerTools/skaffold/v2/pkg/skaffold/output/log"
"github.com/GoogleContainerTools/skaffold/v2/pkg/skaffold/runner/runcontext"
"github.com/GoogleContainerTools/skaffold/v2/pkg/skaffold/schema/latest"
Expand Down Expand Up @@ -74,3 +76,43 @@ func GetBuilder(ctx context.Context, r *runcontext.RunContext, s build.ArtifactS
return nil, fmt.Errorf("unknown builder for config %+v", p.Build)
}
}

type pipelineBuilderWithHooks struct {
build.PipelineBuilder
hooksRunner hooks.Runner
}

// PreBuild executes any one-time setup required prior to starting any build on this builder,
// followed by any Build pre-hooks set for the pipeline.
func (b pipelineBuilderWithHooks) PreBuild(ctx context.Context, out io.Writer) error {
if err := b.PipelineBuilder.PreBuild(ctx, out); err != nil {
return err
}

if err := b.hooksRunner.RunPreHooks(ctx, out); err != nil {
return fmt.Errorf("running builder pre-hooks: %w", err)
}

return nil
}

// PostBuild executes any one-time teardown required after all builds on this builder are complete,
// followed by any Build post-hooks set for the pipeline.
func (b pipelineBuilderWithHooks) PostBuild(ctx context.Context, out io.Writer) error {
if err := b.PipelineBuilder.PostBuild(ctx, out); err != nil {
return err
}

if err := b.hooksRunner.RunPostHooks(ctx, out); err != nil {
return fmt.Errorf("running builder post-hooks: %w", err)
}

return nil
}

func withPipelineBuildHooks(pb build.PipelineBuilder, buildHooks latest.BuildHooks) build.PipelineBuilder {
return pipelineBuilderWithHooks{
PipelineBuilder: pb,
hooksRunner: hooks.BuildRunner(buildHooks, hooks.BuildEnvOpts{}),
}
}
7 changes: 5 additions & 2 deletions pkg/skaffold/runner/new.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,6 @@ func NewForConfig(ctx context.Context, runCtx *runcontext.RunContext) (*Skaffold
var deployer deploy.Deployer

hydrationDir, err := util.GetHydrationDir(runCtx.Opts, runCtx.WorkingDir, true, isKptRendererOrDeployerUsed(runCtx.Pipelines))

if err != nil {
return nil, fmt.Errorf("getting render output path: %w", err)
}
Expand Down Expand Up @@ -145,7 +144,11 @@ func NewForConfig(ctx context.Context, runCtx *runcontext.RunContext) (*Skaffold
// the Cluster object on the RunContext, which in turn influences whether or not we will push images.
var builder build.Builder
builder, err = build.NewBuilderMux(runCtx, store, artifactCache, func(p latest.Pipeline) (build.PipelineBuilder, error) {
return GetBuilder(ctx, runCtx, store, sourceDependencies, p)
pb, err := GetBuilder(ctx, runCtx, store, sourceDependencies, p)
if err != nil {
return nil, err
}
return withPipelineBuildHooks(pb, p.Build.Hooks), nil
})
if err != nil {
endTrace(instrumentation.TraceEndError(err))
Expand Down

0 comments on commit 740d30e

Please sign in to comment.