Add pre/postuninstall hooks (#1375)

Exmple:

```
releases:
- name: test2
  chart: stable/mysql
  installed: false
  hooks:
  - events:
    - prepare
    - preuninstall
    - postuninstall
    - cleanup
    showlogs: true
    command: "echo"
    args:
    - "event name = {{` {{ .Event.Name `}} }}"
```

Output:

```
helmfile apply
Listing releases matching ^test2$
test2   default         1               2020-07-23 00:51:44.975478 +0900 JST    deployed        mysql-1.6.6     5.7.30

helmfile.yaml: basePath=.

hook[preuninstall] logs | event name =  preuninstall
hook[preuninstall] logs |
Deleting test2
release "test2" uninstalled

helmfile.yaml: basePath=.

hook[postuninstall] logs | event name =  postuninstall
hook[postuninstall] logs |
helmfile.yaml: basePath=.

hook[cleanup] logs | event name =  cleanup
hook[cleanup] logs |

DELETED RELEASES:
NAME
test2
```

Resolves #802
This commit is contained in:
KUOKA Yusuke 2020-07-23 01:09:36 +09:00 committed by GitHub
parent b5830a3011
commit ee8ea507a6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 40 additions and 10 deletions

View File

@ -957,6 +957,8 @@ Currently supported `events` are:
- `prepare`
- `presync`
- `preuninstall`
- `postuninstall`
- `postsync`
- `cleanup`
@ -964,9 +966,15 @@ Hooks associated to `prepare` events are triggered after each release in your he
Hooks associated to `cleanup` events are triggered after each release is processed.
Hooks associated to `presync` events are triggered before each release is applied to the remote cluster. This is the ideal event to execute any commands that may mutate the cluster state as it will not be run for read-only operations like `lint`, `diff` or `template`.
Hooks associated to `presync` events are triggered before each release is applied to the remote cluster.
This is the ideal event to execute any commands that may mutate the cluster state as it will not be run for read-only operations like `lint`, `diff` or `template`.
Hooks associated to `postsync` events are triggered after each release is applied to the remote cluster. This is the ideal event to execute any commands that may mutate the cluster state as it will not be run for read-only operations like `lint`, `diff` or `template`.
`preuninstall` hooks are triggered immediately before a release is uninstalled as part of `helmfile apply`, `helmfile sync`, `helmfile delete`, and `helmfile destroy`.
Hooks associated to `postsync` events are triggered after each release is applied to the remote cluster.
This is the ideal event to execute any commands that may mutate the cluster state as it will not be run for read-only operations like `lint`, `diff` or `template`.
`postuninstall` hooks are triggered immediately after successful uninstall of a release while running `helmfile apply`, `helmfile sync`, `helmfile delete`, `helmfile destroy`.
The following is an example hook that just prints the contextual information provided to hook:

View File

@ -6,7 +6,6 @@ import (
"encoding/hex"
"errors"
"fmt"
"github.com/variantdev/chartify"
"io"
"io/ioutil"
"os"
@ -19,6 +18,8 @@ import (
"sync"
"text/template"
"github.com/variantdev/chartify"
"github.com/roboll/helmfile/pkg/environment"
"github.com/roboll/helmfile/pkg/event"
"github.com/roboll/helmfile/pkg/helmexec"
@ -547,8 +548,13 @@ func (st *HelmState) DeleteReleasesForSync(affectedReleases *AffectedReleases, h
}
deletionFlags := st.appendConnectionFlags(args, release)
m.Lock()
if err := helm.DeleteRelease(context, release.Name, deletionFlags...); err != nil {
if _, err := st.triggerReleaseEvent("preuninstall", nil, release, "sync"); err != nil {
affectedReleases.Failed = append(affectedReleases.Failed, release)
relErr = newReleaseFailedError(release, err)
} else if err := helm.DeleteRelease(context, release.Name, deletionFlags...); err != nil {
affectedReleases.Failed = append(affectedReleases.Failed, release)
relErr = newReleaseFailedError(release, err)
} else if _, err := st.triggerReleaseEvent("postuninstall", nil, release, "sync"); err != nil {
affectedReleases.Failed = append(affectedReleases.Failed, release)
relErr = newReleaseFailedError(release, err)
} else {
@ -652,8 +658,13 @@ func (st *HelmState) SyncReleases(affectedReleases *AffectedReleases, helm helme
}
deletionFlags := st.appendConnectionFlags(args, release)
m.Lock()
if err := helm.DeleteRelease(context, release.Name, deletionFlags...); err != nil {
if _, err := st.triggerReleaseEvent("preuninstall", nil, release, "sync"); err != nil {
affectedReleases.Failed = append(affectedReleases.Failed, release)
relErr = newReleaseFailedError(release, err)
} else if err := helm.DeleteRelease(context, release.Name, deletionFlags...); err != nil {
affectedReleases.Failed = append(affectedReleases.Failed, release)
relErr = newReleaseFailedError(release, err)
} else if _, err := st.triggerReleaseEvent("postuninstall", nil, release, "sync"); err != nil {
affectedReleases.Failed = append(affectedReleases.Failed, release)
relErr = newReleaseFailedError(release, err)
} else {
@ -1309,13 +1320,24 @@ func (st *HelmState) DeleteReleases(affectedReleases *AffectedReleases, helm hel
}
context := st.createHelmContext(&release, workerIndex)
if _, err := st.triggerReleaseEvent("preuninstall", nil, &release, "delete"); err != nil {
affectedReleases.Failed = append(affectedReleases.Failed, &release)
return err
}
if err := helm.DeleteRelease(context, release.Name, flags...); err != nil {
affectedReleases.Failed = append(affectedReleases.Failed, &release)
return err
} else {
affectedReleases.Deleted = append(affectedReleases.Deleted, &release)
return nil
}
if _, err := st.triggerReleaseEvent("postuninstall", nil, &release, "delete"); err != nil {
affectedReleases.Failed = append(affectedReleases.Failed, &release)
return err
}
affectedReleases.Deleted = append(affectedReleases.Deleted, &release)
return nil
})
}