Add helmfile-fetch command to downloading and generating charts (#1734)

This commit is contained in:
Quan TRAN 2021-03-30 09:26:31 +02:00 committed by GitHub
parent faa74962e6
commit 53c6d2f988
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 75 additions and 10 deletions

30
main.go
View File

@ -327,6 +327,28 @@ func main() {
return run.Lint(c)
}),
},
{
Name: "fetch",
Usage: "fetch charts from state file",
Flags: []cli.Flag{
cli.IntFlag{
Name: "concurrency",
Value: 0,
Usage: "maximum number of concurrent downloads of release charts",
},
cli.BoolFlag{
Name: "skip-deps",
Usage: `skip running "helm repo update" and "helm dependency build"`,
},
cli.StringFlag{
Name: "output-dir",
Usage: "directory to store charts (default: temporary directory which is deleted when the command terminates)",
},
},
Action: action(func(a *app.App, c configImpl) error {
return a.Fetch(c)
}),
},
{
Name: "sync",
Usage: "sync all resources from state file (repos, releases and chart deps)",
@ -553,6 +575,10 @@ func main() {
Value: "",
Usage: "output releases list as a json string",
},
cli.BoolFlag{
Name: "keep-temp-dir",
Usage: "Keep temporary directory",
},
},
Action: action(func(run *app.App, c configImpl) error {
return run.ListReleases(c)
@ -720,6 +746,10 @@ func (c configImpl) Output() string {
return c.c.String("output")
}
func (c configImpl) KeepTempDir() bool {
return c.c.Bool("keep-temp-dir")
}
// GlobalConfig
func (c configImpl) HelmBinary() string {

View File

@ -291,6 +291,24 @@ func (a *App) Lint(c LintConfigProvider) error {
}, SetFilter(true))
}
func (a *App) Fetch(c FetchConfigProvider) error {
return a.ForEachState(func(run *Run) (ok bool, errs []error) {
prepErr := run.withPreparedCharts("pull", state.ChartPrepareOptions{
ForceDownload: true,
SkipRepos: c.SkipDeps(),
SkipDeps: c.SkipDeps(),
OutputDir: c.OutputDir(),
}, func() {
})
if prepErr != nil {
errs = append(errs, prepErr)
}
return
}, SetFilter(true))
}
func (a *App) Sync(c SyncConfigProvider) error {
return a.ForEachState(func(run *Run) (ok bool, errs []error) {
prepErr := run.withPreparedCharts("sync", state.ChartPrepareOptions{

View File

@ -131,6 +131,13 @@ type LintConfigProvider interface {
concurrencyConfig
}
type FetchConfigProvider interface {
SkipDeps() bool
OutputDir() string
concurrencyConfig
}
type TemplateConfigProvider interface {
Args() string

View File

@ -2,13 +2,14 @@ package app
import (
"fmt"
"github.com/roboll/helmfile/pkg/argparser"
"github.com/roboll/helmfile/pkg/helmexec"
"github.com/roboll/helmfile/pkg/state"
"io/ioutil"
"os"
"sort"
"strings"
"github.com/roboll/helmfile/pkg/argparser"
"github.com/roboll/helmfile/pkg/helmexec"
"github.com/roboll/helmfile/pkg/state"
)
type Run struct {
@ -49,13 +50,20 @@ func (r *Run) withPreparedCharts(helmfileCommand string, opts state.ChartPrepare
}
// Create tmp directory and bail immediately if it fails
dir, err := ioutil.TempDir("", "")
if err != nil {
return err
var dir string
if len(opts.OutputDir) == 0 {
tempDir, err := ioutil.TempDir("", "helmfile*")
if err != nil {
return err
}
defer os.RemoveAll(tempDir)
dir = tempDir
} else {
dir = opts.OutputDir
fmt.Printf("Charts will be downloaded to: %s\n", dir)
}
defer os.RemoveAll(dir)
if _, err = r.state.TriggerGlobalPrepareEvent(helmfileCommand); err != nil {
if _, err := r.state.TriggerGlobalPrepareEvent(helmfileCommand); err != nil {
return err
}
@ -82,7 +90,7 @@ func (r *Run) withPreparedCharts(helmfileCommand string, opts state.ChartPrepare
f()
_, err = r.state.TriggerGlobalCleanupEvent(helmfileCommand)
_, err := r.state.TriggerGlobalCleanupEvent(helmfileCommand)
return err
}

View File

@ -896,6 +896,7 @@ type ChartPrepareOptions struct {
SkipResolve bool
Wait bool
WaitForJobs bool
OutputDir string
}
type chartPrepareResult struct {

View File

@ -1,8 +1,9 @@
package state
import (
"github.com/google/go-cmp/cmp"
"testing"
"github.com/google/go-cmp/cmp"
)
func TestGenerateID(t *testing.T) {