Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package arkade for openSUSE:Factory checked in at 2025-09-19 15:34:45 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/arkade (Old) and /work/SRC/openSUSE:Factory/.arkade.new.27445 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "arkade" Fri Sep 19 15:34:45 2025 rev:55 rq:1305982 version:0.11.47 Changes: -------- --- /work/SRC/openSUSE:Factory/arkade/arkade.changes 2025-09-02 17:59:56.030562694 +0200 +++ /work/SRC/openSUSE:Factory/.arkade.new.27445/arkade.changes 2025-09-19 15:35:22.052293391 +0200 @@ -1,0 +2,32 @@ +Fri Sep 19 10:53:04 UTC 2025 - Johannes Kastl <[email protected]> + +- Update to version 0.11.47: + * Update example + * Update README + * Break out openfaas-ce app and support values.yaml files + overrides + * fix: pin grafana-alloy at v0.44.2 + * maint: enable arm64 for dive + +------------------------------------------------------------------- +Fri Sep 19 10:48:48 UTC 2025 - Johannes Kastl <[email protected]> + +- Update to version 0.11.46: + * Fix go version for make e2e + * gofmt + * Add ripgrep - work performed by opencode/Grok Code Fast + +------------------------------------------------------------------- +Fri Sep 19 09:20:46 UTC 2025 - Johannes Kastl <[email protected]> + +- Update to version 0.11.45: + * Update README for tools + * Add DevPod CLI + +------------------------------------------------------------------- +Fri Sep 19 09:18:59 UTC 2025 - Johannes Kastl <[email protected]> + +- Update to version 0.11.44: + * Add ssync app + +------------------------------------------------------------------- Old: ---- arkade-0.11.43.obscpio New: ---- arkade-0.11.47.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ arkade.spec ++++++ --- /var/tmp/diff_new_pack.HKnOI0/_old 2025-09-19 15:35:22.864327508 +0200 +++ /var/tmp/diff_new_pack.HKnOI0/_new 2025-09-19 15:35:22.864327508 +0200 @@ -17,7 +17,7 @@ Name: arkade -Version: 0.11.43 +Version: 0.11.47 Release: 0 Summary: Open Source Kubernetes Marketplace License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.HKnOI0/_old 2025-09-19 15:35:22.892328684 +0200 +++ /var/tmp/diff_new_pack.HKnOI0/_new 2025-09-19 15:35:22.896328853 +0200 @@ -3,7 +3,7 @@ <param name="url">https://github.com/alexellis/arkade</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">0.11.43</param> + <param name="revision">0.11.47</param> <param name="versionformat">@PARENT_TAG@</param> <param name="versionrewrite-pattern">v(.*)</param> <param name="changesgenerate">enable</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.HKnOI0/_old 2025-09-19 15:35:22.916329693 +0200 +++ /var/tmp/diff_new_pack.HKnOI0/_new 2025-09-19 15:35:22.920329861 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/alexellis/arkade</param> - <param name="changesrevision">fd5475d0addc38f9ddc9953f4ad3e78e6104563b</param></service></servicedata> + <param name="changesrevision">97b4b07823413f8e82674c5a13c78a249501208e</param></service></servicedata> (No newline at EOF) ++++++ arkade-0.11.43.obscpio -> arkade-0.11.47.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/arkade-0.11.43/README.md new/arkade-0.11.47/README.md --- old/arkade-0.11.43/README.md 2025-09-01 18:46:51.000000000 +0200 +++ new/arkade-0.11.47/README.md 2025-09-17 12:22:00.000000000 +0200 @@ -591,7 +591,7 @@ Examples: arkade install - arkade install openfaas --helm3 --gateways=2 + arkade install openfaas-ce --helm3 --gateways=2 arkade install inlets-operator --token-file $HOME/do-token ``` @@ -737,6 +737,7 @@ | nfs-provisioner | Install nfs subdir external provisioner | | opa-gatekeeper | Install Open Policy Agent (OPA) Gatekeeper | | openfaas | Install openfaas | +| openfaas-ce | Install openfaas-ce | | openfaas-ingress | Install openfaas ingress with TLS | | openfaas-loki | Install Loki-OpenFaaS and Configure Loki logs provider for OpenFaaS | | portainer | Install portainer to visualise and manage containers | @@ -752,7 +753,7 @@ | vault | Install vault | | waypoint | Install Waypoint | -There are 52 apps that you can install on your cluster. +There are 53 apps that you can install on your cluster. > Note to contributors, run `go build && ./arkade install --print-table` to > generate this list @@ -788,6 +789,7 @@ | [croc](https://github.com/schollz/croc) | Easily and securely send things from one computer to another | | [crossplane](https://github.com/crossplane/crossplane) | Simplify some development and administration aspects of Crossplane. | | [dagger](https://github.com/dagger/dagger) | A portable devkit for CI/CD pipelines. | +| [devpod](https://github.com/loft-sh/devpod) | Codespaces but open-source, client-only and unopinionated: Works with any IDE and lets you use any cloud, kubernetes or just localhost docker. | | [devspace](https://github.com/devspace-sh/devspace) | Automate your deployment workflow with DevSpace and develop software directly inside Kubernetes. | | [dive](https://github.com/wagoodman/dive) | A tool for exploring each layer in a docker image | | [docker-compose](https://github.com/docker/compose) | Define and run multi-container applications with Docker. | @@ -897,6 +899,7 @@ | [regctl](https://github.com/regclient/regclient) | Utility for accessing docker registries | | [rekor-cli](https://github.com/sigstore/rekor) | Secure Supply Chain - Transparency Log | | [replicated](https://github.com/replicatedhq/replicated) | CLI for interacting with the Replicated Vendor API | +| [rg](https://github.com/BurntSushi/ripgrep) | ripgrep recursively searches directories for a regex pattern while respecting your gitignore | | [rosa](https://github.com/openshift/rosa) | Red Hat OpenShift on AWS (ROSA) command line tool | | [rpk](https://github.com/redpanda-data/redpanda) | Kafka compatible streaming platform for mission critical workloads. | | [run-job](https://github.com/alexellis/run-job) | Run a Kubernetes Job and get the logs when it's done. | @@ -905,6 +908,7 @@ | [skupper](https://github.com/skupperproject/skupper) | Skupper is an implementation of a Virtual Application Network, enabling rich hybrid cloud communication | | [snowmachine](https://github.com/rgee0/snowmachine) | Festive cheer for your terminal. | | [sops](https://github.com/getsops/sops) | Simple and flexible tool for managing secrets | +| [ssync](https://github.com/alexellis/ssync) | Sync files from one machine to another. | | [stern](https://github.com/stern/stern) | Multi pod and container log tailing for Kubernetes. | | [syft](https://github.com/anchore/syft) | CLI tool and library for generating a Software Bill of Materials from container images and filesystems | | [talosctl](https://github.com/siderolabs/talos) | The command-line tool for managing Talos Linux OS. | @@ -929,6 +933,6 @@ | [waypoint](https://github.com/hashicorp/waypoint) | Easy application deployment for Kubernetes and Amazon ECS | | [yq](https://github.com/mikefarah/yq) | Portable command-line YAML processor. | | [yt-dlp](https://github.com/yt-dlp/yt-dlp) | Fork of youtube-dl with additional features and fixes | -There are 169 tools, use `arkade get NAME` to download one. +There are 172 tools, use `arkade get NAME` to download one. > Note to contributors, run `go build && ./arkade get --format markdown` to > generate this list diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/arkade-0.11.43/cmd/apps/chart_app.go new/arkade-0.11.47/cmd/apps/chart_app.go --- old/arkade-0.11.43/cmd/apps/chart_app.go 2025-09-01 18:46:51.000000000 +0200 +++ new/arkade-0.11.47/cmd/apps/chart_app.go 2025-09-17 12:22:00.000000000 +0200 @@ -36,7 +36,7 @@ chartCmd.Flags().StringP("namespace", "n", "default", "The namespace to install the chart") chartCmd.Flags().String("repo", "", "The chart repo to install from") - chartCmd.Flags().String("values-file", "", "Give the values.yaml file to use from the upstream chart repo") + chartCmd.Flags().StringArrayP("values", "f", []string{"values.yaml"}, "Give the values.yaml file to use from the upstream chart repo") chartCmd.Flags().String("repo-name", "", "Chart name") chartCmd.Flags().String("repo-url", "", "Chart repo") @@ -119,8 +119,10 @@ } } + valuesFlag, _ := chartCmd.Flags().GetStringArray("values") + err = helm.Helm3Upgrade(chartRepoName, namespace, - "values.yaml", + valuesFlag, defaultVersion, setMap, false) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/arkade-0.11.43/cmd/apps/confluentkafka.go new/arkade-0.11.47/cmd/apps/confluentkafka.go --- old/arkade-0.11.43/cmd/apps/confluentkafka.go 2025-09-01 18:46:51.000000000 +0200 +++ new/arkade-0.11.47/cmd/apps/confluentkafka.go 2025-09-17 12:22:00.000000000 +0200 @@ -112,7 +112,7 @@ appOpts. WithKubeconfigPath(kubeConfigPath). WithOverrides(overrides). - WithValuesFile("values.yaml"). + WithValuesFiles([]string{"values.yaml"}). WithHelmURL("https://confluentinc.github.io/cp-helm-charts/"). WithHelmRepo("confluentinc/cp-helm-charts"). WithHelmUpdateRepo(updateRepo). diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/arkade-0.11.43/cmd/apps/crossplane_app.go new/arkade-0.11.47/cmd/apps/crossplane_app.go --- old/arkade-0.11.43/cmd/apps/crossplane_app.go 2025-09-01 18:46:51.000000000 +0200 +++ new/arkade-0.11.47/cmd/apps/crossplane_app.go 2025-09-17 12:22:00.000000000 +0200 @@ -97,7 +97,7 @@ } err = helm.Helm3Upgrade("crossplane-alpha/crossplane", - namespace, "values.yaml", "", values, wait) + namespace, []string{"values.yaml"}, "", values, wait) if err != nil { return err } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/arkade-0.11.43/cmd/apps/inletsoperator_app.go new/arkade-0.11.47/cmd/apps/inletsoperator_app.go --- old/arkade-0.11.43/cmd/apps/inletsoperator_app.go 2025-09-01 18:46:51.000000000 +0200 +++ new/arkade-0.11.47/cmd/apps/inletsoperator_app.go 2025-09-17 12:22:00.000000000 +0200 @@ -213,7 +213,7 @@ } err = helm.Helm3Upgrade("inlets/inlets-operator", - namespace, "values.yaml", "", overrides, wait) + namespace, []string{"values.yaml"}, "", overrides, wait) if err != nil { return err } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/arkade-0.11.43/cmd/apps/mongodb_app.go new/arkade-0.11.47/cmd/apps/mongodb_app.go --- old/arkade-0.11.43/cmd/apps/mongodb_app.go 2025-09-01 18:46:51.000000000 +0200 +++ new/arkade-0.11.47/cmd/apps/mongodb_app.go 2025-09-17 12:22:00.000000000 +0200 @@ -96,7 +96,7 @@ } err = helm.Helm3Upgrade("bitnami/mongodb", - namespace, "values.yaml", defaultVersion, overrides, wait) + namespace, []string{"values.yaml"}, defaultVersion, overrides, wait) if err != nil { return fmt.Errorf("unable to mongodb chart with helm %s", err) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/arkade-0.11.43/cmd/apps/of_loki.go new/arkade-0.11.47/cmd/apps/of_loki.go --- old/arkade-0.11.43/cmd/apps/of_loki.go 2025-09-01 18:46:51.000000000 +0200 +++ new/arkade-0.11.47/cmd/apps/of_loki.go 2025-09-17 12:22:00.000000000 +0200 @@ -59,7 +59,7 @@ // The default options includes the `values.yaml` file but this is already // implied when using the OCI chart. - lokiOptions.Helm.ValuesFile = "" + lokiOptions.Helm.ValuesFiles = []string{} _, err := apps.MakeInstallChart(lokiOptions) if err != nil { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/arkade-0.11.43/cmd/apps/openfaas_app.go new/arkade-0.11.47/cmd/apps/openfaas_app.go --- old/arkade-0.11.43/cmd/apps/openfaas_app.go 2025-09-01 18:46:51.000000000 +0200 +++ new/arkade-0.11.47/cmd/apps/openfaas_app.go 2025-09-17 12:22:00.000000000 +0200 @@ -42,12 +42,12 @@ openfaas.Flags().String("pull-policy", "IfNotPresent", "Pull policy for OpenFaaS core services") openfaas.Flags().String("function-pull-policy", "Always", "Pull policy for functions") - openfaas.Flags().Bool("operator", false, "Create OpenFaaS Operator") + openfaas.Flags().Bool("operator", true, "Create OpenFaaS Operator") openfaas.Flags().Bool("clusterrole", false, "Create a ClusterRole for OpenFaaS instead of a limited scope Role") openfaas.Flags().Bool("direct-functions", false, "Invoke functions directly from the gateway, or load-balance via endpoint IPs when set to false") - openfaas.Flags().Bool("autoscaler", false, "Deploy OpenFaaS with the autoscaler enabled") - openfaas.Flags().Bool("jetstream", false, "Deploy OpenFaaS with jetstream queue mode") - openfaas.Flags().Bool("dashboard", false, "Deploy OpenFaaS with the dashboard enabled") + openfaas.Flags().Bool("autoscaler", true, "Deploy OpenFaaS with the autoscaler enabled") + openfaas.Flags().String("queue-mode", "static", "Configure the consumer mode for the queue-worker: \"static\" or \"function\"") + openfaas.Flags().Bool("dashboard", true, "Deploy OpenFaaS with the dashboard enabled") openfaas.Flags().Int("queue-workers", 1, "Replicas of queue-worker for HA") openfaas.Flags().Int("max-inflight", 1, "Max tasks for queue-worker to process in parallel") @@ -61,6 +61,8 @@ openfaas.Flags().String("license-file", "", "Path to OpenFaaS Pro license file") + openfaas.Flags().StringArrayP("values", "f", []string{}, "Specify one or more local values.yaml files for overrides.") + openfaas.RunE = func(command *cobra.Command, args []string) error { appOpts := types.DefaultInstallOptions() @@ -77,19 +79,17 @@ clusterRole, _ := command.Flags().GetBool("clusterrole") directFunctions, _ := command.Flags().GetBool("direct-functions") autoscaler, _ := command.Flags().GetBool("autoscaler") - jetstream, _ := command.Flags().GetBool("jetstream") dashboard, _ := command.Flags().GetBool("dashboard") gateways, _ := command.Flags().GetInt("gateways") maxInflight, _ := command.Flags().GetInt("max-inflight") queueWorkers, _ := command.Flags().GetInt("queue-workers") ingressOperator, _ := command.Flags().GetBool("ingress-operator") lb, _ := command.Flags().GetBool("load-balancer") + queueMode, _ := command.Flags().GetString("queue-mode") + valuesFiles, _ := command.Flags().GetStringArray("values") overrides := map[string]string{} - arch := k8s.GetNodeArchitecture() - valuesSuffix := getValuesSuffix(arch) - _, err := k8s.KubectlTask("apply", "-f", "https://raw.githubusercontent.com/openfaas/faas-netes/master/namespaces.yml") @@ -120,17 +120,14 @@ overrides["gateway.logsProviderURL"] = logUrl } - // If license file is sent, then we assume to set the --pro flag and create the secret - if len(licenseFile) != 0 { - overrides["openfaasPro"] = "true" - secretData := []types.SecretsData{ - {Type: types.FromFileSecret, Key: "license", Value: licenseFile}, - } - - proLicense := types.NewGenericSecret("openfaas-license", namespace, secretData) - appOpts.WithSecret(proLicense) + overrides["openfaasPro"] = "true" + secretData := []types.SecretsData{ + {Type: types.FromFileSecret, Key: "license", Value: licenseFile}, } + proLicense := types.NewGenericSecret("openfaas-license", namespace, secretData) + appOpts.WithSecret(proLicense) + if dashboard { privateKey, publicKey, err := generateJWTKeyPair() if err != nil { @@ -146,22 +143,50 @@ appOpts.WithSecret(dashboardJWT) } - overrides["clusterRole"] = strconv.FormatBool(clusterRole) - overrides["gateway.directFunctions"] = strconv.FormatBool(directFunctions) - overrides["operator.create"] = strconv.FormatBool(createOperator) - overrides["openfaasImagePullPolicy"] = pullPolicy - overrides["faasnetes.imagePullPolicy"] = functionPullPolicy - overrides["basicAuthPlugin.replicas"] = "1" - overrides["gateway.replicas"] = fmt.Sprintf("%d", gateways) + overrides["jetstreamQueueWorker.mode"] = queueMode + + if command.Flags().Changed("clusterrole") { + overrides["clusterRole"] = strconv.FormatBool(clusterRole) + } + + if command.Flags().Changed("direct-functions") { + overrides["gateway.directFunctions"] = strconv.FormatBool(directFunctions) + } + + if command.Flags().Changed("operator") { + overrides["operator.create"] = strconv.FormatBool(createOperator) + } + + if command.Flags().Changed("pull-policy") { + overrides["openfaasImagePullPolicy"] = pullPolicy + overrides["faasnetes.imagePullPolicy"] = functionPullPolicy + } + + if command.Flags().Changed("gateways") { + overrides["gateway.replicas"] = fmt.Sprintf("%d", gateways) + } + + if command.Flags().Changed("queue-workers") { + overrides["queueWorker.replicas"] = fmt.Sprintf("%d", queueWorkers) + } + + if command.Flags().Changed("max-inflight") { + overrides["queueWorker.maxInflight"] = fmt.Sprintf("%d", maxInflight) + } + + if command.Flags().Changed("autoscaler") { + overrides["autoscaler.enabled"] = strconv.FormatBool(autoscaler) + } + + if command.Flags().Changed("dashboard") { + overrides["dashboard.enabled"] = strconv.FormatBool(dashboard) + } + overrides["ingressOperator.create"] = strconv.FormatBool(ingressOperator) - overrides["queueWorker.replicas"] = fmt.Sprintf("%d", queueWorkers) - overrides["queueWorker.maxInflight"] = fmt.Sprintf("%d", maxInflight) - overrides["autoscaler.enabled"] = strconv.FormatBool(autoscaler) - overrides["dashboard.enabled"] = strconv.FormatBool(dashboard) - overrides["dashboard.publicURL"] = "http://127.0.0.1:8080" - // the value in the template is "basic_auth" not the more usual basicAuth - overrides["basic_auth"] = strconv.FormatBool(basicAuthEnabled) + if command.Flags().Changed("basic-auth") { + overrides["basic_auth"] = strconv.FormatBool(basicAuthEnabled) + } overrides["serviceType"] = "NodePort" @@ -169,10 +194,6 @@ overrides["serviceType"] = "LoadBalancer" } - if jetstream { - overrides["queueMode"] = "jetstream" - } - customFlags, _ := command.Flags().GetStringArray("set") if err := config.MergeFlags(overrides, customFlags); err != nil { return err @@ -180,8 +201,8 @@ appOpts. WithKubeconfigPath(kubeConfigPath). + WithValuesFiles([]string{`https://raw.githubusercontent.com/openfaas/faas-netes/refs/heads/master/chart/openfaas/values-pro.yaml`}). WithOverrides(overrides). - WithValuesFile(fmt.Sprintf("values%s.yaml", valuesSuffix)). WithHelmURL("https://openfaas.github.io/faas-netes/"). WithHelmRepo("openfaas/openfaas"). WithHelmUpdateRepo(updateRepo). @@ -189,6 +210,10 @@ WithInstallNamespace(false). WithWait(wait) + if len(valuesFiles) > 0 { + appOpts.WithValuesFiles(valuesFiles) + } + if _, err := apps.MakeInstallChart(appOpts); err != nil { return err } @@ -238,11 +263,6 @@ return err } - _, err = cmd.Flags().GetBool("jetstream") - if err != nil { - return err - } - _, err = cmd.Flags().GetBool("dashboard") if err != nil { return err @@ -321,8 +341,14 @@ return privOut.Bytes(), pubOut.Bytes(), nil } -const OpenFaaSInfoMsg = `# Get the faas-cli -curl -SLsf https://cli.openfaas.com | sudo sh +const OpenFaaSInfoMsg = `# You've installed OpenFaaS Pro 👍 +# OpenFaaS Standard or for Enterprises is now running (depending on your license) + +# Read the EULA before continuing: +https://github.com/openfaas/faas/blob/master/pro/EULA.md + +# Get the faas-cli +arkade get faas-cli # Forward the gateway to your machine kubectl rollout status -n openfaas deploy/gateway @@ -332,18 +358,12 @@ PASSWORD=$(kubectl get secret -n openfaas basic-auth -o jsonpath="{.data.basic-auth-password}" | base64 --decode; echo) echo -n $PASSWORD | faas-cli login --username admin --password-stdin -faas-cli store deploy figlet +faas-cli store deploy env faas-cli list - -# For Raspberry Pi -faas-cli store list \ - --platform armhf - -faas-cli store deploy figlet \ - --platform armhf +faas-cli describe env # Find out more at: -# https://github.com/openfaas/faas` +# https://docs.openfaas.com/` const openfaasPostInstallMsg = `======================================================================= = OpenFaaS has been installed. = diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/arkade-0.11.43/cmd/apps/openfaas_ce_app.go new/arkade-0.11.47/cmd/apps/openfaas_ce_app.go --- old/arkade-0.11.43/cmd/apps/openfaas_ce_app.go 1970-01-01 01:00:00.000000000 +0100 +++ new/arkade-0.11.47/cmd/apps/openfaas_ce_app.go 2025-09-17 12:22:00.000000000 +0200 @@ -0,0 +1,184 @@ +// Copyright (c) arkade author(s) 2022. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +package apps + +import ( + "fmt" + "strconv" + + "github.com/alexellis/arkade/pkg/apps" + "github.com/alexellis/arkade/pkg/config" + "github.com/alexellis/arkade/pkg/types" + + "github.com/alexellis/arkade/pkg/k8s" + + "github.com/alexellis/arkade/pkg" + "github.com/sethvargo/go-password/password" + + "github.com/spf13/cobra" +) + +func MakeInstallOpenFaaSCE() *cobra.Command { + var openfaasCE = &cobra.Command{ + Use: "openfaas-ce", + Short: "Install openfaas-ce", + Long: `Install the Community Edition of openfaas`, + Example: ` arkade install openfaas-ce`, + SilenceUsage: true, + } + + openfaasCE.Flags().BoolP("basic-auth", "a", true, "Enable authentication") + openfaasCE.Flags().String("basic-auth-password", "", "Overide the default random basic-auth-password if this is set") + openfaasCE.Flags().BoolP("load-balancer", "l", false, "Add a loadbalancer") + openfaasCE.Flags().StringP("namespace", "n", "openfaas", "The namespace for the core services") + openfaasCE.Flags().Bool("update-repo", true, "Update the helm repo") + + openfaasCE.Flags().Int("queue-workers", 1, "Replicas of queue-worker for HA") + openfaasCE.Flags().Int("max-inflight", 1, "Max tasks for queue-worker to process in parallel") + openfaasCE.Flags().Int("gateways", 1, "Replicas of gateway") + + openfaasCE.Flags().Bool("ingress-operator", false, "Get custom domains and Ingress records via the ingress-operator component") + + openfaasCE.Flags().StringArray("set", []string{}, "Use custom flags or override existing flags \n(example --set gateway.replicas=2)") + + openfaasCE.RunE = func(command *cobra.Command, args []string) error { + appOpts := types.DefaultInstallOptions() + + wait, _ := command.Flags().GetBool("wait") + kubeConfigPath, _ := command.Flags().GetString("kubeconfig") + namespace, _ := command.Flags().GetString("namespace") + basicAuthEnabled, _ := command.Flags().GetBool("basic-auth") + updateRepo, _ := openfaasCE.Flags().GetBool("update-repo") + gateways, _ := command.Flags().GetInt("gateways") + queueWorkers, _ := command.Flags().GetInt("queue-workers") + lb, _ := command.Flags().GetBool("load-balancer") + maxInflight, _ := command.Flags().GetInt("max-inflight") + + overrides := map[string]string{} + + _, err := k8s.KubectlTask("apply", "-f", + "https://raw.githubusercontent.com/openfaas/faas-netes/master/namespaces.yml") + + if err != nil { + return err + } + + if basicAuthEnabled { + pass, _ := command.Flags().GetString("basic-auth-password") + + if len(pass) == 0 { + var err error + pass, err = password.Generate(25, 10, 0, false, true) + if err != nil { + return err + } + } + secretData := []types.SecretsData{ + {Type: types.StringLiteralSecret, Key: "basic-auth-user", Value: "admin"}, + {Type: types.StringLiteralSecret, Key: "basic-auth-password", Value: pass}, + } + + basicAuthSecret := types.NewGenericSecret("basic-auth", namespace, secretData) + appOpts.WithSecret(basicAuthSecret) + } + + overrides["basicAuthPlugin.replicas"] = "1" + overrides["gateway.replicas"] = fmt.Sprintf("%d", gateways) + overrides["queueWorker.replicas"] = fmt.Sprintf("%d", queueWorkers) + overrides["queueWorker.maxInflight"] = fmt.Sprintf("%d", maxInflight) + + // the value in the template is "basic_auth" not the more usual basicAuth + overrides["basic_auth"] = strconv.FormatBool(basicAuthEnabled) + + overrides["serviceType"] = "NodePort" + + if lb { + overrides["serviceType"] = "LoadBalancer" + } + + customFlags, _ := command.Flags().GetStringArray("set") + if err := config.MergeFlags(overrides, customFlags); err != nil { + return err + } + + appOpts. + WithKubeconfigPath(kubeConfigPath). + WithOverrides(overrides). + WithValuesFiles([]string{"values.yaml"}). + WithHelmURL("https://openfaas.github.io/faas-netes/"). + WithHelmRepo("openfaas/openfaas"). + WithHelmUpdateRepo(updateRepo). + WithNamespace(namespace). + WithInstallNamespace(false). + WithWait(wait) + + if _, err := apps.MakeInstallChart(appOpts); err != nil { + return err + } + + fmt.Println(openfaasCEPostInstallMsg) + + if basicAuthEnabled == false { + fmt.Println( + `Warning: It is not recommended to disable authentication for OpenFaaS.`) + } + return nil + } + + openfaasCE.PreRunE = func(cmd *cobra.Command, args []string) error { + _, err := cmd.Flags().GetBool("wait") + if err != nil { + return err + } + + _, err = cmd.Flags().GetBool("basic-auth") + if err != nil { + return err + } + + _, err = openfaasCE.Flags().GetBool("update-repo") + if err != nil { + return err + } + + _, err = cmd.Flags().GetBool("ingress-operator") + if err != nil { + return err + } + + _, err = cmd.Flags().GetBool("load-balancer") + if err != nil { + return err + } + + return nil + } + + return openfaasCE +} + +const OpenFaaSCEInfoMsg = `# OpenFaaS CE is licensed for personal use only, or a single 60 day +# evaluation: https://github.com/openfaas/faas/blob/master/EULA.md + +# Get the faas-cli +arkade get faas-cli + +# Forward the gateway to your machine +kubectl rollout status -n openfaas deploy/gateway +kubectl port-forward -n openfaas svc/gateway 8080:8080 & + +# If basic auth is enabled, you can now log into your gateway: +PASSWORD=$(kubectl get secret -n openfaas basic-auth -o jsonpath="{.data.basic-auth-password}" | base64 --decode; echo) +echo -n $PASSWORD | faas-cli login --username admin --password-stdin + +faas-cli store deploy nodeinfo +faas-cli list + +# Find out more at: +# https://docs.openfaas.com/` + +const openfaasCEPostInstallMsg = `======================================================================= += OpenFaaS CE has been installed. = +=======================================================================` + + "\n\n" + OpenFaaSInfoMsg + "\n\n" + pkg.SupportMessageShort diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/arkade-0.11.43/cmd/apps/registry_app.go new/arkade-0.11.47/cmd/apps/registry_app.go --- old/arkade-0.11.43/cmd/apps/registry_app.go 2025-09-01 18:46:51.000000000 +0200 +++ new/arkade-0.11.47/cmd/apps/registry_app.go 2025-09-17 12:22:00.000000000 +0200 @@ -134,7 +134,7 @@ ns := "default" err = helm.Helm3Upgrade("twuni/docker-registry", ns, - "values.yaml", + []string{"values.yaml"}, defaultVersion, overrides, wait) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/arkade-0.11.43/cmd/apps/traefik2_app.go new/arkade-0.11.47/cmd/apps/traefik2_app.go --- old/arkade-0.11.43/cmd/apps/traefik2_app.go 2025-09-01 18:46:51.000000000 +0200 +++ new/arkade-0.11.47/cmd/apps/traefik2_app.go 2025-09-17 12:22:00.000000000 +0200 @@ -95,7 +95,7 @@ } err = helm.Helm3Upgrade("traefik/traefik", namespace, - "values.yaml", + []string{"values.yaml"}, "", overrides, wait) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/arkade-0.11.43/cmd/install.go new/arkade-0.11.47/cmd/install.go --- old/arkade-0.11.43/cmd/install.go 2025-09-01 18:46:51.000000000 +0200 +++ new/arkade-0.11.47/cmd/install.go 2025-09-17 12:22:00.000000000 +0200 @@ -134,6 +134,7 @@ arkadeApps["nfs-provisioner"] = NewArkadeApp(apps.MakeInstallNfsProvisioner, apps.NfsClientProvisioneriInfoMsg) arkadeApps["opa-gatekeeper"] = NewArkadeApp(apps.MakeInstallOPAGateKeeper, apps.OPAGatekeeperInfoMsg) arkadeApps["openfaas"] = NewArkadeApp(apps.MakeInstallOpenFaaS, apps.OpenFaaSInfoMsg) + arkadeApps["openfaas-ce"] = NewArkadeApp(apps.MakeInstallOpenFaaSCE, apps.OpenFaaSCEInfoMsg) arkadeApps["openfaas-ingress"] = NewArkadeApp(apps.MakeInstallOpenFaaSIngress, apps.OpenfaasIngressInfoMsg) arkadeApps["openfaas-loki"] = NewArkadeApp(apps.MakeInstallOpenFaaSLoki, apps.LokiOFInfoMsg) arkadeApps["portainer"] = NewArkadeApp(apps.MakeInstallPortainer, apps.PortainerInfoMsg) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/arkade-0.11.43/cmd/system/node.go new/arkade-0.11.47/cmd/system/node.go --- old/arkade-0.11.43/cmd/system/node.go 2025-09-01 18:46:51.000000000 +0200 +++ new/arkade-0.11.47/cmd/system/node.go 2025-09-17 12:22:00.000000000 +0200 @@ -69,14 +69,22 @@ command.Flags().StringP("channel", "c", "release", "The channel to install from, can be 'release' or 'nightly',") command.Flags().Bool("progress", true, "Show download progress") command.Flags().String("arch", "", "CPU architecture i.e. amd64") + command.Flags().Bool("quiet", false, "Suppress most output (implies --progress=false unless explicitly set)") command.RunE = func(cmd *cobra.Command, args []string) error { installPath, _ := cmd.Flags().GetString("path") version, _ := cmd.Flags().GetString("version") progress, _ := cmd.Flags().GetBool("progress") channel, _ := cmd.Flags().GetString("channel") + quiet, _ := cmd.Flags().GetBool("quiet") - fmt.Printf("Installing Node.js to: %s\n", installPath) + if quiet && !cmd.Flags().Changed("progress") { + progress = false + } + + if !quiet { + fmt.Printf("Installing Node.js to: %s\n", installPath) + } arch, osVer := env.GetClientArch() @@ -108,17 +116,23 @@ version = "v" + version } - fmt.Printf("Installing version: %s for: %s\n", version, dlArch) + if !quiet { + fmt.Printf("Installing version: %s for: %s\n", version, dlArch) + } filename := fmt.Sprintf("%s/%s.tar.gz", version, fmt.Sprintf("node-%s-linux-%s", version, dlArch)) dlURL := fmt.Sprintf("https://nodejs.org/download/%s/%s", channel, filename) - fmt.Printf("Downloading from: %s\n", dlURL) + if !quiet { + fmt.Printf("Downloading from: %s\n", dlURL) + } outPath, err := get.DownloadFileP(dlURL, progress) if err != nil { return err } defer os.Remove(outPath) - fmt.Printf("Downloaded to: %s\n", outPath) + if !quiet { + fmt.Printf("Downloaded to: %s\n", outPath) + } f, err := os.OpenFile(outPath, os.O_RDONLY, 0644) if err != nil { @@ -131,12 +145,16 @@ return err } defer os.RemoveAll(tempUnpackPath) - fmt.Printf("Unpacking binaries to: %s\n", tempUnpackPath) + if !quiet { + fmt.Printf("Unpacking binaries to: %s\n", tempUnpackPath) + } if err = archive.UntarNested(f, tempUnpackPath, true, false); err != nil { return err } - fmt.Printf("Copying binaries to: %s\n", installPath) + if !quiet { + fmt.Printf("Copying binaries to: %s\n", installPath) + } nodeDir := fmt.Sprintf("%s/%s", tempUnpackPath, fmt.Sprintf("node-%s-linux-%s", version, dlArch)) if err := cp.Copy(nodeDir, installPath); err != nil { return err diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/arkade-0.11.43/pkg/apps/chart_app.go new/arkade-0.11.47/pkg/apps/chart_app.go --- old/arkade-0.11.43/pkg/apps/chart_app.go 2025-09-01 18:46:51.000000000 +0200 +++ new/arkade-0.11.47/pkg/apps/chart_app.go 2025-09-17 12:22:00.000000000 +0200 @@ -67,7 +67,7 @@ if err := installer( name, options.Namespace, - options.Helm.ValuesFile, + options.Helm.ValuesFiles, options.Helm.Repo.Version, options.Helm.Overrides, options.Helm.Wait); err != nil { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/arkade-0.11.43/pkg/get/get_test.go new/arkade-0.11.47/pkg/get/get_test.go --- old/arkade-0.11.43/pkg/get/get_test.go 2025-09-01 18:46:51.000000000 +0200 +++ new/arkade-0.11.47/pkg/get/get_test.go 2025-09-17 12:22:00.000000000 +0200 @@ -32,6 +32,58 @@ return tool } +func Test_DownloadRipgrep(t *testing.T) { + tools := MakeTools() + name := "rg" + + tool := getTool(name, tools) + + const toolVersion = "14.1.1" + + tests := []test{ + { + os: "linux", + arch: arch64bit, + version: toolVersion, + url: "https://github.com/BurntSushi/ripgrep/releases/download/14.1.1/ripgrep-14.1.1-x86_64-unknown-linux-musl.tar.gz", + }, + { + os: "linux", + arch: archARM64, + version: toolVersion, + url: "https://github.com/BurntSushi/ripgrep/releases/download/14.1.1/ripgrep-14.1.1-aarch64-unknown-linux-gnu.tar.gz", + }, + { + os: "darwin", + arch: arch64bit, + version: toolVersion, + url: "https://github.com/BurntSushi/ripgrep/releases/download/14.1.1/ripgrep-14.1.1-x86_64-apple-darwin.tar.gz", + }, + { + os: "darwin", + arch: archDarwinARM64, + version: toolVersion, + url: "https://github.com/BurntSushi/ripgrep/releases/download/14.1.1/ripgrep-14.1.1-aarch64-apple-darwin.tar.gz", + }, + { + os: "ming", + arch: arch64bit, + version: toolVersion, + url: "https://github.com/BurntSushi/ripgrep/releases/download/14.1.1/ripgrep-14.1.1-x86_64-pc-windows-msvc.zip", + }, + } + + for _, tc := range tests { + got, err := tool.GetURL(tc.os, tc.arch, tc.version, false) + if err != nil { + t.Fatal(err) + } + if got != tc.url { + t.Errorf("want: %s, got: %s", tc.url, got) + } + } +} + func TestGetToolVersion(t *testing.T) { testCases := []struct { @@ -3543,7 +3595,7 @@ func Test_DownloadDive(t *testing.T) { tools := MakeTools() name := "dive" - version := "0.10.0" + version := "v0.13.1" tool := getTool(name, tools) @@ -3552,31 +3604,37 @@ os: "darwin", arch: arch64bit, version: version, - url: `https://github.com/wagoodman/dive/releases/download/v0.10.0/dive_0.10.0_darwin_amd64.tar.gz`, + url: `https://github.com/wagoodman/dive/releases/download/v0.13.1/dive_0.13.1_darwin_amd64.tar.gz`, }, { os: "darwin", arch: archARM64, version: version, - url: `https://github.com/wagoodman/dive/releases/download/v0.10.0/dive_0.10.0_darwin_amd64.tar.gz`, + url: `https://github.com/wagoodman/dive/releases/download/v0.13.1/dive_0.13.1_darwin_arm64.tar.gz`, }, { os: "linux", arch: arch64bit, version: version, - url: `https://github.com/wagoodman/dive/releases/download/v0.10.0/dive_0.10.0_linux_amd64.tar.gz`, + url: `https://github.com/wagoodman/dive/releases/download/v0.13.1/dive_0.13.1_linux_amd64.tar.gz`, }, { os: "linux", arch: archARM64, version: version, - url: `https://github.com/wagoodman/dive/releases/download/v0.10.0/dive_0.10.0_linux_amd64.tar.gz`, + url: `https://github.com/wagoodman/dive/releases/download/v0.13.1/dive_0.13.1_linux_arm64.tar.gz`, }, { os: "ming", arch: arch64bit, version: version, - url: `https://github.com/wagoodman/dive/releases/download/v0.10.0/dive_0.10.0_windows_amd64.zip`, + url: `https://github.com/wagoodman/dive/releases/download/v0.13.1/dive_0.13.1_windows_amd64.zip`, + }, + { + os: "ming", + arch: archARM64, + version: version, + url: `https://github.com/wagoodman/dive/releases/download/v0.13.1/dive_0.13.1_windows_arm64.zip`, }, } @@ -3587,7 +3645,7 @@ t.Fatal(err) } if got != tc.url { - t.Errorf("want: %s, got: %s", tc.url, got) + t.Errorf("\nwant: %s\ngot: %s", tc.url, got) } }) } @@ -6282,6 +6340,69 @@ } +func Test_DownloadSsync(t *testing.T) { + tools := MakeTools() + name := "ssync" + + tool := getTool(name, tools) + + tests := []test{ + { + os: "ming", + arch: arch64bit, + version: "0.0.1-rc1", + url: `https://github.com/alexellis/ssync/releases/download/0.0.1-rc1/ssync.exe`, + }, + { + os: "linux", + arch: arch64bit, + version: "0.0.1-rc1", + url: `https://github.com/alexellis/ssync/releases/download/0.0.1-rc1/ssync`, + }, + { + os: "linux", + arch: archARM64, + version: "0.0.1-rc1", + url: `https://github.com/alexellis/ssync/releases/download/0.0.1-rc1/ssync-arm64`, + }, + { + os: "linux", + arch: archARM7, + version: "0.0.1-rc1", + url: `https://github.com/alexellis/ssync/releases/download/0.0.1-rc1/ssync-armhf`, + }, + { + os: "linux", + arch: "armv6l", + version: "0.0.1-rc1", + url: `https://github.com/alexellis/ssync/releases/download/0.0.1-rc1/ssync-armhf`, + }, + { + os: "darwin", + arch: arch64bit, + version: "0.0.1-rc1", + url: `https://github.com/alexellis/ssync/releases/download/0.0.1-rc1/ssync-darwin`, + }, + { + os: "darwin", + arch: archDarwinARM64, + version: "0.0.1-rc1", + url: `https://github.com/alexellis/ssync/releases/download/0.0.1-rc1/ssync-darwin-arm64`, + }, + } + + for _, tc := range tests { + got, err := tool.GetURL(tc.os, tc.arch, tc.version, false) + if err != nil { + t.Fatal(err) + } + if got != tc.url { + t.Errorf("want: %s, got: %s", tc.url, got) + } + } + +} + func Test_DownloadYt(t *testing.T) { tools := MakeTools() name := "yt-dlp" @@ -7213,6 +7334,58 @@ } } +func Test_DownloadDevpod(t *testing.T) { + tools := MakeTools() + name := "devpod" + + tool := getTool(name, tools) + + const toolVersion = "v0.7.0-alpha.34" + + tests := []test{ + { + os: "mingw64_nt-10.0-18362", + arch: arch64bit, + version: toolVersion, + url: "https://github.com/loft-sh/devpod/releases/download/v0.7.0-alpha.34/devpod-windows-amd64.exe", + }, + { + os: "darwin", + arch: arch64bit, + version: toolVersion, + url: "https://github.com/loft-sh/devpod/releases/download/v0.7.0-alpha.34/devpod-darwin-amd64", + }, + { + os: "darwin", + arch: archDarwinARM64, + version: toolVersion, + url: "https://github.com/loft-sh/devpod/releases/download/v0.7.0-alpha.34/devpod-darwin-arm64", + }, + { + os: "linux", + arch: arch64bit, + version: toolVersion, + url: "https://github.com/loft-sh/devpod/releases/download/v0.7.0-alpha.34/devpod-linux-amd64", + }, + { + os: "linux", + arch: archARM64, + version: toolVersion, + url: "https://github.com/loft-sh/devpod/releases/download/v0.7.0-alpha.34/devpod-linux-arm64", + }, + } + + for _, tc := range tests { + got, err := tool.GetURL(tc.os, tc.arch, tc.version, false) + if err != nil { + t.Fatal(err) + } + if got != tc.url { + t.Errorf("want: %s, got: %s", tc.url, got) + } + } +} + func Test_DownloadKwokctl(t *testing.T) { var ( tools = MakeTools() @@ -8546,7 +8719,7 @@ t.Fatal(err) } if got != tc.url { - t.Errorf("want: %s, got: %s", tc.url, got) + t.Errorf("\nwant: %s\ngot: %s", tc.url, got) } } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/arkade-0.11.43/pkg/get/tools.go new/arkade-0.11.47/pkg/get/tools.go --- old/arkade-0.11.43/pkg/get/tools.go 2025-09-01 18:46:51.000000000 +0200 +++ new/arkade-0.11.47/pkg/get/tools.go 2025-09-17 12:22:00.000000000 +0200 @@ -333,6 +333,28 @@ tools = append(tools, Tool{ + Owner: "loft-sh", + Repo: "devpod", + Name: "devpod", + Version: "v0.7.0-alpha.34", + Description: "Codespaces but open-source, client-only and unopinionated: Works with any IDE and lets you use any cloud, kubernetes or just localhost docker.", + BinaryTemplate: `{{ if HasPrefix .OS "ming" -}} +{{.Name}}-windows-amd64.exe +{{- else if eq .OS "darwin" -}} + {{- if or (eq .Arch "arm64") (eq .Arch "aarch64") -}} +{{.Name}}-darwin-arm64 + {{- else -}} +{{.Name}}-darwin-amd64 + {{- end -}} +{{- else if or (eq .Arch "aarch64") (eq .Arch "arm64") -}} +{{.Name}}-linux-arm64 +{{- else -}} +{{.Name}}-linux-amd64 +{{- end -}}`, + }) + + tools = append(tools, + Tool{ Owner: "tilt-dev", Repo: "tilt", Name: "tilt", @@ -2173,28 +2195,28 @@ tools = append(tools, Tool{ - Owner: "wagoodman", - Repo: "dive", - Name: "dive", - Version: "0.10.0", - Description: "A tool for exploring each layer in a docker image", - URLTemplate: `{{$osStr := ""}} - {{- if HasPrefix .OS "ming" -}} - {{$osStr = "windows"}} - {{- else if eq .OS "linux" -}} - {{$osStr = "linux"}} - {{- else if eq .OS "darwin" -}} - {{$osStr = "darwin"}} - {{- end -}} - - {{$archiveStr := ""}} - {{- if HasPrefix .OS "ming" -}} - {{$archiveStr = ".zip"}} - {{- else -}} - {{$archiveStr = ".tar.gz"}} - {{- end -}} + Owner: "wagoodman", + Repo: "dive", + Name: "dive", + VersionStrategy: GitHubVersionStrategy, + Description: "A tool for exploring each layer in a docker image", + BinaryTemplate: ` + {{$os := .OS}} + {{$arch := .Arch}} + {{$ext := ".tar.gz"}} + + {{- if HasPrefix .OS "ming" -}} + {{$os = "windows"}} + {{$ext = ".zip"}} + {{- end -}} + + {{- if eq .Arch "x86_64" -}} + {{$arch = "amd64"}} + {{- else if (or (eq .Arch "aarch64") (eq .Arch "arm64")) -}} + {{$arch = "arm64"}} + {{- end -}} - https://github.com/{{.Owner}}/{{.Name}}/releases/download/v{{.Version}}/{{.Name}}_{{.Version}}_{{$osStr}}_amd64{{$archiveStr}}`, + {{.Name}}_{{.VersionNumber}}_{{$os}}_{{$arch}}{{$ext}}`, }, ) @@ -3311,6 +3333,7 @@ Owner: "grafana", Repo: "agent", Name: "grafana-agent", + Version: "v0.44.2", Description: "Grafana Agent is a telemetry collector for sending metrics, logs, and trace data to the opinionated Grafana observability stack.", URLTemplate: ` {{$os := .OS}} @@ -3547,6 +3570,35 @@ {{ else if HasPrefix .OS "ming" -}} {{$ext = ".exe"}} {{- end -}} + + {{.Name}}{{$os}}{{$arch}}{{$ext}}`, + }) + + tools = append(tools, + Tool{ + Owner: "alexellis", + Repo: "ssync", + Name: "ssync", + Description: "Sync files from one machine to another.", + BinaryTemplate: ` + {{$arch := ""}} + {{$os := ""}} + {{$ext := ""}} + + {{- if eq .Arch "aarch64" -}} + {{$arch = "-arm64"}} + {{- else if eq .Arch "arm64" -}} + {{$arch = "-arm64"}} + {{- else if (or (eq .Arch "armv6l") (eq .Arch "armv7l")) -}} + {{$arch = "-armhf"}} + {{- end -}} + + {{ if eq .OS "darwin" -}} + {{$os = "-darwin"}} + {{ else if HasPrefix .OS "ming" -}} + {{$ext = ".exe"}} + {{- end -}} + {{.Name}}{{$os}}{{$arch}}{{$ext}}`, }) @@ -4673,5 +4725,39 @@ {{.Name}}-{{.Version}}-{{$os}}-{{$arch}}.{{$ext}} `, }) + + tools = append(tools, + Tool{ + Owner: "BurntSushi", + Repo: "ripgrep", + Name: "rg", + Description: "ripgrep recursively searches directories for a regex pattern while respecting your gitignore", + BinaryTemplate: `rg`, + URLTemplate: ` +{{$target := ""}} +{{$ext := "tar.gz"}} +{{- if eq .OS "linux" -}} + {{- if eq .Arch "x86_64" -}} + {{$target = "x86_64-unknown-linux-musl"}} + {{ else if eq .Arch "aarch64" -}} + {{$target = "aarch64-unknown-linux-gnu"}} + {{ else if eq .Arch "armv7l" -}} + {{$target = "armv7-unknown-linux-musleabihf"}} + {{- end -}} +{{- else if eq .OS "darwin" -}} + {{- if eq .Arch "x86_64" -}} + {{$target = "x86_64-apple-darwin"}} + {{ else if eq .Arch "arm64" -}} + {{$target = "aarch64-apple-darwin"}} + {{- end -}} +{{- else if HasPrefix .OS "ming" -}} + {{$ext = "zip"}} + {{- if eq .Arch "x86_64" -}} + {{$target = "x86_64-pc-windows-msvc"}} + {{- end -}} +{{- end -}} +https://github.com/BurntSushi/ripgrep/releases/download/{{.Version}}/ripgrep-{{.Version}}-{{$target}}.{{$ext}}`, + }) + return tools } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/arkade-0.11.43/pkg/helm/helm.go new/arkade-0.11.47/pkg/helm/helm.go --- old/arkade-0.11.43/pkg/helm/helm.go 2025-09-01 18:46:51.000000000 +0200 +++ new/arkade-0.11.47/pkg/helm/helm.go 2025-09-17 12:22:00.000000000 +0200 @@ -179,7 +179,7 @@ return strings.HasPrefix(chart, "oci://") } -func Helm3Upgrade(chart, namespace, values, version string, overrides map[string]string, wait bool) error { +func Helm3Upgrade(chart, namespace string, valuesFile []string, version string, overrides map[string]string, wait bool) error { chartName := chart if index := strings.Index(chartName, "/"); index > -1 { @@ -197,13 +197,13 @@ args = append(args, "--wait") } - fmt.Println("VALUES", values) - if len(values) > 0 { + fmt.Println("VALUES", valuesFile) + for _, valueFile := range valuesFile { args = append(args, "--values") - if !strings.HasPrefix(values, "/") { - args = append(args, path.Join(basePath, values)) + if !strings.HasPrefix(valueFile, "/") { + args = append(args, path.Join(basePath, valueFile)) } else { - args = append(args, values) + args = append(args, valueFile) } } @@ -238,7 +238,7 @@ return nil } -func Helm3OCIUpgrade(chart, namespace, values, version string, overrides map[string]string, wait bool) error { +func Helm3OCIUpgrade(chart, namespace string, valuesFiles []string, version string, overrides map[string]string, wait bool) error { if !IsOCI(chart) { return fmt.Errorf("chart %s is not an OCI chart URL", chart) @@ -259,9 +259,9 @@ args = append(args, "--wait") } - fmt.Println("VALUES", values) - if len(values) > 0 { - args = append(args, "--values", values) + fmt.Println("VALUES", valuesFiles) + for _, valueFile := range valuesFiles { + args = append(args, "--values", valueFile) } for k, v := range overrides { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/arkade-0.11.43/pkg/types/types.go new/arkade-0.11.47/pkg/types/types.go --- old/arkade-0.11.43/pkg/types/types.go 2025-09-01 18:46:51.000000000 +0200 +++ new/arkade-0.11.47/pkg/types/types.go 2025-09-17 12:22:00.000000000 +0200 @@ -1,6 +1,10 @@ package types -import "github.com/alexellis/arkade/pkg/config" +import ( + "slices" + + "github.com/alexellis/arkade/pkg/config" +) type InstallerOptions struct { Namespace string @@ -26,13 +30,13 @@ } type HelmConfig struct { - Repo *HelmRepo - Helm3 bool - HelmPath string - Overrides map[string]string - UpdateRepo bool - Wait bool - ValuesFile string + Repo *HelmRepo + Helm3 bool + HelmPath string + Overrides map[string]string + UpdateRepo bool + Wait bool + ValuesFiles []string } type HelmRepo struct { @@ -84,8 +88,14 @@ return o } -func (o *InstallerOptions) WithValuesFile(filename string) *InstallerOptions { - o.Helm.ValuesFile = filename +func (o *InstallerOptions) WithValuesFiles(filenames []string) *InstallerOptions { + + for _, filename := range filenames { + if !slices.Contains(o.Helm.ValuesFiles, filename) { + o.Helm.ValuesFiles = append(o.Helm.ValuesFiles, filename) + } + } + return o } @@ -109,9 +119,9 @@ Repo: &HelmRepo{ Version: "", }, - ValuesFile: "values.yaml", - Helm3: true, - Wait: false, + ValuesFiles: []string{"values.yaml"}, + Helm3: true, + Wait: false, }, Verbose: false, } ++++++ arkade.obsinfo ++++++ --- /var/tmp/diff_new_pack.HKnOI0/_old 2025-09-19 15:35:23.532355569 +0200 +++ /var/tmp/diff_new_pack.HKnOI0/_new 2025-09-19 15:35:23.536355738 +0200 @@ -1,5 +1,5 @@ name: arkade -version: 0.11.43 -mtime: 1756745211 -commit: fd5475d0addc38f9ddc9953f4ad3e78e6104563b +version: 0.11.47 +mtime: 1758104520 +commit: 97b4b07823413f8e82674c5a13c78a249501208e ++++++ vendor.tar.gz ++++++
