diff --git a/go.sum b/go.sum index f30e358a..2f409b6d 100644 --- a/go.sum +++ b/go.sum @@ -1373,6 +1373,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20220428152302-39d4317da171 h1:TfdoLivD44QwvssI9Sv1xwa5DcL5XQr4au4sZ2F2NV4= +golang.org/x/exp v0.0.0-20220428152302-39d4317da171/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= diff --git a/pkg/app/app.go b/pkg/app/app.go index 5c58717a..dddf0d21 100644 --- a/pkg/app/app.go +++ b/pkg/app/app.go @@ -1323,7 +1323,31 @@ func (a *App) apply(r *Run, c ApplyConfigProvider) (bool, bool, []error) { } } - if releasesToBeDeleted == nil && releasesToBeUpdated == nil { + var releasesWithPreApply []state.ReleaseSpec + for _, r := range toApplyWithNeeds { + release := r + if len(release.Hooks) > 0 { + for _, hook := range release.Hooks { + if slices.Contains(hook.Events, "preapply") { + releasesWithPreApply = append(releasesWithPreApply, release) + } + } + } + } + + if len(releasesWithPreApply) > 0 { + msg := "Releases with preapply hooks: \n" + if infoMsg != nil { + msg = fmt.Sprintf("%s%s", *infoMsg, msg) + } + infoMsg = &msg + } + for _, release := range releasesWithPreApply { + tmp := fmt.Sprintf("%s %s (%s)", *infoMsg, release.Name, release.Chart) + infoMsg = &tmp + } + + if releasesToBeDeleted == nil && releasesToBeUpdated == nil && releasesWithPreApply == nil { if infoMsg != nil { logger := c.Logger() logger.Infof("") @@ -1352,6 +1376,12 @@ Do you really want to apply? if !interactive || interactive && r.askForConfirmation(confMsg) { r.helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state)...) + for _, release := range st.Releases { + if _, err := st.TriggerPreapplyEvent(&release, "apply"); err != nil { + syncErrs = append(syncErrs, err) + } + } + // We deleted releases by traversing the DAG in reverse order if len(releasesToBeDeleted) > 0 { _, deletionErrs := withDAG(st, helm, a.Logger, state.PlanOptions{Reverse: true, SelectedReleases: toDelete, SkipNeeds: true}, a.WrapWithoutSelector(func(subst *state.HelmState, helm helmexec.Interface) []error { diff --git a/pkg/state/state.go b/pkg/state/state.go index 385ab903..c133905c 100644 --- a/pkg/state/state.go +++ b/pkg/state/state.go @@ -2251,6 +2251,10 @@ func (st *HelmState) triggerPostsyncEvent(r *ReleaseSpec, evtErr error, helmfile return st.triggerReleaseEvent("postsync", evtErr, r, helmfileCommand) } +func (st *HelmState) TriggerPreapplyEvent(r *ReleaseSpec, helmfileCommand string) (bool, error) { + return st.triggerReleaseEvent("preapply", nil, r, helmfileCommand) +} + func (st *HelmState) triggerReleaseEvent(evt string, evtErr error, r *ReleaseSpec, helmfileCmd string) (bool, error) { bus := &event.Bus{ Hooks: r.Hooks,