GithubHelp home page GithubHelp logo

unbroken-dome / gradle-helm-plugin Goto Github PK

View Code? Open in Web Editor NEW
51.0 51.0 55.0 916 KB

A Gradle plugin for building, publishing and managing Helm charts.

License: MIT License

Kotlin 100.00%
gradle gradle-plugin helm helm-charts kubernetes kubernetes-helm

gradle-helm-plugin's People

Contributors

adferrand avatar alex-lmco avatar bmuschko avatar crazymoonkin avatar dcasavant avatar emilio-pega avatar iconoeugen avatar imanushin avatar luolong avatar marcoferrer avatar marinkobabic avatar mehmetsalgar avatar satellite13 avatar thomasmillergbtw avatar tkrullmann avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

gradle-helm-plugin's Issues

helmPublish task fails

The helmPublish task always fails with the following error:

Could not determine the dependencies of task ':helmPublishMainChartToExpRepo'.
> Expected configuration ':helmMain' to contain exactly one file, however, it contains no files.

What am I doing wrong?

Environment

LMTC-JFARR:repro jfarr1$ ./gradlew --version

------------------------------------------------------------
Gradle 5.1.1
------------------------------------------------------------

Build time:   2019-01-10 23:05:02 UTC
Revision:     3c9abb645fb83932c44e8610642393ad62116807

Kotlin DSL:   1.1.1
Kotlin:       1.3.11
Groovy:       2.5.4
Ant:          Apache Ant(TM) version 1.9.13 compiled on July 10 2018
JVM:          1.8.0_171 (Oracle Corporation 25.171-b11)
OS:           Mac OS X 10.12.6 x86_64

LMTC-JFARR:repro jfarr1$ helm version
Client: &version.Version{SemVer:"v2.12.3", GitCommit:"eecf22f77df5f65c823aacd2dbd30ae6c65f186e", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.12.3", GitCommit:"eecf22f77df5f65c823aacd2dbd30ae6c65f186e", GitTreeState:"clean"}

Repro

repro.zip

I get the same error with or without template files under templates, with or without running helmInitClient helmPackage first.

Error when using a kubeconfig file that references external program

Gradle 6

If the plugin is configured to use a kubeconfig file that references an external program (like one used for AWS authentication), it fails, because the PATH environmental variable is not forwarded to the Worker API

Example kubeconfig using the external aws-iam-authenticator program to validate for AWS

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: <some aws authority>
    server: <some aws server>
  name: <some aws name>
contexts:
- context:
    cluster: <some aws cluster>
    user: <some aws user>
  name: <some aws name>
current-context: <some aws context>
kind: Config
preferences: {}
users:
- name: <some aws user>
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1alpha1
      args:
      - token
      - -i
      - platform-validation-pipeline-cluster-eks
      command: aws-iam-authenticator
      env: null

Error

Error: Kubernetes cluster unreachable: Get <aws cluser>: getting credentials: exec: exec: "aws-iam-authenticator": executable file not found in $PATH

Releases: "active release target" shouldn't cause errors

With the current implementations, all helmInstallXToY tasks get skipped if they don't belong to the active release target (-Phelm.release.target=...). If the active release target is set to a name that doesn't actually exists in helm.releaseTargets, then it causes an error.

It would be better if the active release target is only used for determining the task dependencies of the generic helmInstall and helmUninstall tasks. The user should still be allowed to do something like ./gradlew helmInstallToLocal helmInstallToTest if they wish, without the active release target getting in the way.

helmInstall: Cannot set the value of read-only property 'releaseName'

My release name has a hyphen in it so I tried to override it in the DSL:

helm {
  releases {
    myRelease {
      from charts.myRelease
      releaseName = "my-release"
    }
  }
}

This results in the above error about the name being read only. Can I set the release name without having to define a whole new task deriving from HelmInstall? I would like to use the tasks that the plugin kindly generates for me.

Documentation

Can you please extend the documentation in the Wiki page? There is no documentation for the publishing/release tasks.

publish to ChartMuseum does not working

we came across your plugin and its an excellent plugin to work with i might say it solved a lot of repetitive tasks and automates the entire process. with that being said we understand the plugin is fairly new and we are trying to incorporate in in our project we ran into a coupe of issue we need help with.

project config

plugins {
	id 'war'
	id 'java'
	id 'idea'
	id 'groovy'
	id 'eclipse'
	id 'org.unbroken-dome.helm' version '0.4.0'
	id 'org.unbroken-dome.helm-publish' version '0.4.0'
	id 'org.unbroken-dome.helm-releases' version '0.4.0'
	id 'org.unbroken-dome.helm-commands' version '0.4.0'
}

helm {
	home = file("${project.buildDir}/helm/home")

	filtering {
		// This value will be resolvable in all charts' YAML files as "${springProfile}"
		values.put 'springProfile', 'prod'
	}

	charts {
		web {
			chartName = "${project.name}"
			chartVersion = "${project.version}"
			sourceDir = file('src/main/charts/web')
		}
	}

	repositories {
		company {
			url = uri('https://chartmuseum.example.com/')
			credentials {
				username = 'USERNAME'
				password = 'PASSWORD'
			}
		}
	}

	publishing {
		repositories {
			chartMuseum('company') {
				url = uri('https://chartmuseum.example.com/')
				credentials {
					username = 'USERNAME'
					password = 'PASSWORD'
				}
			}
		}
	}

	releases {
		web {
//			from "company/${project.name}"
//			version = "${project.version}"
			from "charts/${project.name}"

		}
	}
}

Repo Production Environment

we currently are running the repo in a private network which can be access via vpn, and we use SSL

Error message

Error: Looks like "https://chartmuseum.example.com/" is not a valid chart repository or cannot be reached: Get https://chartmuseum.example.com/index.yaml: dial tcp 10.10.3.210:443: connect: operation timed out

Testing

when testing to see if i'm able to push charts to the repo or pull we use the following command

`
helm repo add company https://chartmuseum.example.com --username USERNAME --password 'PASSWORD'

`

and everything works perfect so i know their isn't any issues with the actual repo running in a private network and ssl

would you be able to guide me on what seems to be the issue at hand thanks in advance

Plugin ignores KUBECONFIG environment variable

Most tools respect this variable, but this plugin does not.

I can work around it by setting it myself, but it seems like this should happen by default.

helm {
    System.getenv("KUBECONFIG")?.let { kubeConfig.set(file(it)) }
}

Stack Overflow when trying to add a repository

When trying to add a repository configured like this:

helm {
  repositories {
    example {
      url = new URI('some/url')
      credentials {
        username = "username"
        password = "password"
      }
    }
  }
}

Using the rule helmAddExampleRepository fails with following stack trace:

> Task :helmAddExampleRepository

FAILURE: Build failed with an exception.

* What went wrong:
java.lang.StackOverflowError (no error message)

* Try:
Run with --debug option to get more log output. Run with --scan to get full insights.

* Exception is:
java.lang.StackOverflowError
	at org.gradle.api.internal.provider.DefaultPropertyState.getOrNull(DefaultPropertyState.java:138)
	at org.gradle.api.internal.provider.DefaultPropertyState.getOrNull(DefaultPropertyState.java:139)
	at org.gradle.api.internal.provider.DefaultPropertyState.getOrNull(DefaultPropertyState.java:139)
	at org.gradle.api.internal.provider.DefaultPropertyState.getOrNull(DefaultPropertyState.java:139)
	at org.gradle.api.internal.provider.DefaultPropertyState.getOrNull(DefaultPropertyState.java:139)
	at org.gradle.api.internal.provider.DefaultPropertyState.getOrNull(DefaultPropertyState.java:139)
	at org.gradle.api.internal.provider.DefaultPropertyState.getOrNull(DefaultPropertyState.java:139)
	at org.gradle.api.internal.provider.DefaultPropertyState.getOrNull(DefaultPropertyState.java:139)
	at org.gradle.api.internal.provider.DefaultPropertyState.getOrNull(DefaultPropertyState.java:139)
	at org.gradle.api.internal.provider.DefaultPropertyState.getOrNull(DefaultPropertyState.java:139)
	at org.gradle.api.internal.provider.DefaultPropertyState.getOrNull(DefaultPropertyState.java:139)
	at org.gradle.api.internal.provider.DefaultPropertyState.getOrNull(DefaultPropertyState.java:139)
	at org.gradle.api.internal.provider.DefaultPropertyState.getOrNull(DefaultPropertyState.java:139)
	at org.gradle.api.internal.provider.DefaultPropertyState.getOrNull(DefaultPropertyState.java:139)

Environment:

 gradle --version 

------------------------------------------------------------
Gradle 5.2.1
------------------------------------------------------------

Build time:   2019-02-08 19:00:10 UTC
Revision:     f02764e074c32ee8851a4e1877dd1fea8ffb7183

Kotlin DSL:   1.1.3
Kotlin:       1.3.20
Groovy:       2.5.4
Ant:          Apache Ant(TM) version 1.9.13 compiled on July 10 2018
JVM:          11.0.2 (Oracle Corporation 11.0.2+9-LTS)
OS:           Windows 10 10.0 amd64

Ability to download helm executable

The plugin should have an option to automatically download the helm executable, instead of pointing to a local installation of helm.

This would make builds more portable as they don't have to expect a local helm installation to be present.

YAML Mark parsing wrong when not all characters in endMark

This piece of code makes the assumption that the startMark pointer will always be 0. However, that is not always the case (see below). In some cases the offset/pointer will be non-zero which causes a StringIndexOutOfBounds when parsing.

Caused by: java.lang.StringIndexOutOfBoundsException: offset 1027, count 1031, length 1031
        at org.unbrokendome.gradle.plugins.helm.util.YamlTransformingReaderKt.readFromBuffer(YamlTransformingReader.kt:228)
        at org.unbrokendome.gradle.plugins.helm.util.YamlTransformingReaderKt.access$readFromBuffer(YamlTransformingReader.kt:1)
        at org.unbrokendome.gradle.plugins.helm.util.AbstractYamlTransformingReader$ValueState.handleValueEvent(YamlTransformingReader.kt:108)
        at org.unbrokendome.gradle.plugins.helm.util.AbstractYamlTransformingReader$MappingValueState.handleEvent(YamlTransformingReader.kt:202)
        at org.unbrokendome.gradle.plugins.helm.util.AbstractYamlTransformingReader$delegate$2.invoke(YamlTransformingReader.kt:82)

The referenced piece of code should be changed from:

            // Start with the codepoints from startMark's buffer
            // Note that if startMark.pointer is non-zero this causes an out-of-bounds exception
            // Contructor is: String(buffer, offset into buffer, length from offset)
            val startPart = String(startMark.buffer, startMark.pointer, startMark.buffer.size)

            val codePointsLeft = length - (startMark.buffer.size - startMark.pointer)

To something like:

            // Start with the codepoints from startMark's buffer
            val bufferPresentInStartMark = startMark.buffer.size - startMark.pointer
            val startPart = String(startMark.buffer, startMark.pointer, bufferPresentInStartMark)

            val codePointsLeft = length - bufferPresentInStartMark

Which fixes the above error by not trying to parse past the end of the buffer.

linting not working for me

Not sure what I am doing wrong but basically I just want to lint a chart.

Getting this error for some odd reason

* What went wrong:
A problem was found with the configuration of task 'my-tool:helmLintMy-toolChart'.
> Directory '/Users/*****/.helm
  ' specified for property '$1' does not exist.

I just ran
./gradlew helmLintMy-toolChart

Am trying to do step by step
lint , package, deploy

[ERROR] Chart.yaml: version should be of type string but it's of type float64

I'm getting the following error while trying to execute ./gradlew helmPackage.

> Task :helmLintMainChart FAILED
cmd_run.go:918: WARNING: cannot create user data directory: failed to verify SELinux context of /home/tons/snap: exec: "matchpathcon": executable file not found in $PATH
Error: 1 chart(s) linted, 1 chart(s) failed
==> Linting /home/tons/IdeaProjects/whoami-mn/build/helm/charts/whoami
[ERROR] Chart.yaml: version should be of type string but it's of type float64
[INFO] Chart.yaml: icon is recommended


FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':helmLintMainChart'.
> A failure occurred while executing org.unbrokendome.gradle.plugins.helm.command.HelmExecWorkAction
   > Process 'command 'helm'' finished with non-zero exit value 1

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 2s
4 actionable tasks: 1 executed, 3 up-to-date

The command helm package src/main/helm/ works just fine though.

Any clue what's going wrong? Please let me know if I should post parts of my chart or setup

Task helmPublish<X>ChartTo<Y>Repo fails

I am trying to publish the main chart to multiple artifactory repositories, but the task
helmPublishChartToRepo fails.
StackTrace
stacktrace.txt

My helm publish extension:

helm {
      publishing {
        repositories {
            artifactory('myRepo') {
                url = uri('https://artifactory.intra.company.com/artifactory/helm-dev/testHelm')
                credentials {
                    username = project.properties.get("artifactory.username")
                    password = project.properties.get("artifactory.password")
                }
            }
        }
    }
}

When I run the helmPublish task everything works as expected, but when I run gradle helmPublishMainChartToMyRepoRepo it fails.

Create namespace flag support

With helm 3.2.0 version, it is now possible to create namespace by specifying --create-namespace flag in helm install or upgrade --install command.

Are there any plans to add this flag support?
Maybe possibility to add custom args when releasing (like helm.extraArgs property) would be enough?

Plugin doesn't work with Gradle 5.x

When importing the plugin in a Gradle 5.x project (both 5.0 and 5.1) it throws: java.lang.NoClassDefFoundError: org/unbrokendome/gradle/plugins/helm/util/FixedValueProvider

I rolled my project back to 4.10.x and it is able to configure the plugin. Full stack trace:

An exception occurred applying plugin request [id: 'org.unbroken-dome.helm', version: '0.2.3']
	at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.applyPlugin(DefaultPluginRequestApplicator.java:232)
	at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.applyPlugins(DefaultPluginRequestApplicator.java:148)
	at org.gradle.kotlin.dsl.provider.PluginRequestsHandler.handle(PluginRequestsHandler.kt:49)
	at org.gradle.kotlin.dsl.provider.StandardKotlinScriptEvaluator$InterpreterHost.applyPluginsTo(KotlinScriptEvaluator.kt:190)
	at org.gradle.kotlin.dsl.execution.Interpreter$ProgramHost.applyPluginsTo(Interpreter.kt:362)
	at Program.execute(Unknown Source)
	at org.gradle.kotlin.dsl.execution.Interpreter$ProgramHost.eval(Interpreter.kt:504)
	at org.gradle.kotlin.dsl.execution.Interpreter.eval(Interpreter.kt:182)
	at org.gradle.kotlin.dsl.provider.StandardKotlinScriptEvaluator.evaluate(KotlinScriptEvaluator.kt:114)
	at org.gradle.kotlin.dsl.provider.KotlinScriptPluginFactory$create$1.invoke(KotlinScriptPluginFactory.kt:51)
	at org.gradle.kotlin.dsl.provider.KotlinScriptPluginFactory$create$1.invoke(KotlinScriptPluginFactory.kt:36)
	at org.gradle.kotlin.dsl.provider.KotlinScriptPlugin.apply(KotlinScriptPlugin.kt:34)
	at org.gradle.configuration.BuildOperationScriptPlugin$1$1.run(BuildOperationScriptPlugin.java:69)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:301)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:293)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:175)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:91)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.configuration.BuildOperationScriptPlugin$1.execute(BuildOperationScriptPlugin.java:66)
	at org.gradle.configuration.BuildOperationScriptPlugin$1.execute(BuildOperationScriptPlugin.java:63)
	at org.gradle.configuration.internal.DefaultUserCodeApplicationContext.apply(DefaultUserCodeApplicationContext.java:48)
	at org.gradle.configuration.BuildOperationScriptPlugin.apply(BuildOperationScriptPlugin.java:63)
	at org.gradle.configuration.project.BuildScriptProcessor$1.run(BuildScriptProcessor.java:44)
	at org.gradle.internal.Factories$1.create(Factories.java:25)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.withMutableState(DefaultProjectStateRegistry.java:200)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.withMutableState(DefaultProjectStateRegistry.java:186)
	at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:41)
	at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:26)
	at org.gradle.configuration.project.ConfigureActionsProjectEvaluator.evaluate(ConfigureActionsProjectEvaluator.java:34)
	at org.gradle.configuration.project.LifecycleProjectEvaluator$EvaluateProject$1.run(LifecycleProjectEvaluator.java:106)
	... 102 more
Caused by: org.gradle.api.plugins.InvalidPluginException: An exception occurred applying plugin request [id: 'org.unbroken-dome.helm', version: '0.2.3']
	at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.exceptionOccurred(DefaultPluginRequestApplicator.java:247)
	at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.applyPlugin(DefaultPluginRequestApplicator.java:229)
	... 131 more
Caused by: org.gradle.api.internal.plugins.PluginApplicationException: Failed to apply plugin [class 'org.unbrokendome.gradle.plugins.helm.command.HelmCommandsPlugin']
	at org.gradle.api.internal.plugins.DefaultPluginManager.doApply(DefaultPluginManager.java:163)
	at org.gradle.api.internal.plugins.DefaultPluginManager.addImperativePlugin(DefaultPluginManager.java:88)
	at org.gradle.api.internal.plugins.DefaultPluginManager.addImperativePlugin(DefaultPluginManager.java:94)
	at org.gradle.api.internal.plugins.DefaultPluginContainer.apply(DefaultPluginContainer.java:92)
	at org.unbrokendome.gradle.plugins.helm.HelmPlugin.apply(HelmPlugin.kt:60)
	at org.unbrokendome.gradle.plugins.helm.HelmPlugin.apply(HelmPlugin.kt:48)
	at org.gradle.api.internal.plugins.ImperativeOnlyPluginTarget.applyImperative(ImperativeOnlyPluginTarget.java:42)
	at org.gradle.api.internal.plugins.RuleBasedPluginTarget.applyImperative(RuleBasedPluginTarget.java:50)
	at org.gradle.api.internal.plugins.DefaultPluginManager.addPlugin(DefaultPluginManager.java:177)
	at org.gradle.api.internal.plugins.DefaultPluginManager.access$300(DefaultPluginManager.java:51)
	at org.gradle.api.internal.plugins.DefaultPluginManager$AddPluginBuildOperation.run(DefaultPluginManager.java:267)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:301)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:293)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:175)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:91)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.api.internal.plugins.DefaultPluginManager$2.execute(DefaultPluginManager.java:155)
	at org.gradle.api.internal.plugins.DefaultPluginManager$2.execute(DefaultPluginManager.java:152)
	at org.gradle.configuration.internal.DefaultUserCodeApplicationContext.apply(DefaultUserCodeApplicationContext.java:48)
	at org.gradle.api.internal.plugins.DefaultPluginManager.doApply(DefaultPluginManager.java:152)
	at org.gradle.api.internal.plugins.DefaultPluginManager.apply(DefaultPluginManager.java:133)
	at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator$3.run(DefaultPluginRequestApplicator.java:151)
	at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.applyPlugin(DefaultPluginRequestApplicator.java:225)
	... 131 more
Caused by: org.gradle.api.reflect.ObjectInstantiationException: Could not create an instance of type org.unbrokendome.gradle.plugins.helm.dsl.DefaultHelmExtension.
	at org.gradle.api.internal.DependencyInjectingInstantiator.newInstance(DependencyInjectingInstantiator.java:72)
	at org.gradle.api.internal.model.DefaultObjectFactory.newInstance(DefaultObjectFactory.java:72)
	at org.unbrokendome.gradle.plugins.helm.dsl.HelmExtensionKt.createHelmExtension(HelmExtension.kt:143)
	at org.unbrokendome.gradle.plugins.helm.command.HelmCommandsPlugin.apply(HelmCommandsPlugin.kt:21)
	at org.unbrokendome.gradle.plugins.helm.command.HelmCommandsPlugin.apply(HelmCommandsPlugin.kt:16)
	at org.gradle.api.internal.plugins.ImperativeOnlyPluginTarget.applyImperative(ImperativeOnlyPluginTarget.java:42)
	at org.gradle.api.internal.plugins.RuleBasedPluginTarget.applyImperative(RuleBasedPluginTarget.java:50)
	at org.gradle.api.internal.plugins.DefaultPluginManager.addPlugin(DefaultPluginManager.java:177)
	at org.gradle.api.internal.plugins.DefaultPluginManager.access$300(DefaultPluginManager.java:51)
	at org.gradle.api.internal.plugins.DefaultPluginManager$AddPluginBuildOperation.run(DefaultPluginManager.java:267)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:301)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:293)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:175)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:91)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.api.internal.plugins.DefaultPluginManager$2.execute(DefaultPluginManager.java:155)
	at org.gradle.api.internal.plugins.DefaultPluginManager$2.execute(DefaultPluginManager.java:152)
	at org.gradle.configuration.internal.DefaultUserCodeApplicationContext.apply(DefaultUserCodeApplicationContext.java:48)
	at org.gradle.api.internal.plugins.DefaultPluginManager.doApply(DefaultPluginManager.java:152)
	... 153 more
Caused by: java.lang.NoClassDefFoundError: org/unbrokendome/gradle/plugins/helm/util/FixedValueProvider
	at org.unbrokendome.gradle.plugins.helm.dsl.DefaultHelmExtension.<init>(HelmExtension.kt:145)
	at org.unbrokendome.gradle.plugins.helm.dsl.DefaultHelmExtension_Decorated.<init>(Unknown Source)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at org.gradle.api.internal.DependencyInjectingInstantiator.newInstance(DependencyInjectingInstantiator.java:63)
	... 171 more

Cannot create a HelmTest task

Question: I can't seem to create a HelmTest task
Could not create task of type 'HelmTest'.
> Class org.unbrokendome.gradle.plugins.helm.command.tasks.HelmTest is final.

Is there a way to create a HelmTest task?

Thanks

plugin doesn't merge custom values with external chart

This plugin doesn't merge correctly external chart with custom override values.

This is Chart.yaml I have:

apiVersion: v2
appVersion: "1.0"
description: A Helm chart for Airflow scheduler
name: msmt-airflow
version: 0.1.0
home: https://mylink
maintainers:
  - name: Me
    email: [email protected]
dependencies:
  - name: airflow
    version: "6.10.4"
    repository: "https://kubernetes-charts.storage.googleapis.com/"

This is "helm" section in my build.gradle

helm {
    def dbURL = "${dbType}://${dbUser}:${dbPassword}@${dbHost}:${dbPort}/${dbSchema}"
    namespace = 'ns'
    lint { strict = true }
    downloadClient {
        enabled.set(true)
        version.set("3.3.0")
    }
    filtering {
        values.put 'PG_URL',"${dbURL}"
        values.put 'TO_INIT', "false"
        values.put 'FERNET_KEY', "${fernetKey}"
    }
    charts {
        mychart {
            chartName = "${chart_name}"
            chartVersion ="${chart_version}"
            sourceDir = file("helm/${chart_name}")
        }
    }
    releases {
        def releaseName = "${deployEnv != 'prod' ? System.properties['user.name'] + '-' : ''}${project.name}-$deployEnv"
        "${releaseName}" { from charts."${chart_name}" }
    }
}

Result of running command ./gradlew :<myproject>:helmInstall with this configuration is very different from running command helm3 install mychart stable/airflow --version 6.10.4 --namespace <ns> --values myproject/helm/mychart/values.yaml - custom values from myproject/helm/mychart/values.yaml are definitely not being applied.

I'm using plugin version 1.2.1 and Gradle version 6.6

HelmInit seems to ignore the `wait` property

I am configuring the init task as:

task helmInit(type: HelmInit) {
    dependsOn helmAddRepository

    replicas = 1 // Amount of Tiller instances to run on the cluster.
    skipRefresh = false
    upgrade = true
    wait = true
    debug = true
}

but in gradle's output I can see that the --wait flag is not being passed:
Executing: [helm, init, --debug, --replicas, 1]

Workaround:

I think I can use extraArgs for now and pass --wait directly to helm.

wrong authorization header upon publishing with creds

I'm configuring helm-publish as follows:

helm {
    publishing {
        repositories {
            artifactory {
                url = uri('https://artifactory.example.com/my-helm-repo')
                credentials {
                    username = 'user'
                    password = 'pass'
                }
            }
        }
    }
}

Instead of the plugin writing the Basic Auth header as:

Authorization: Basic <base64-string> it writes
Authorization: Basic Basic <base64-string>

I think this is of prefixing the response of okhttp3 that also contains "Basic" literal with another "Basic" literal:

.addHeader("Authorization", "Basic ${Credentials.basic(username, password ?: "")}")

Helm install support

Hi,

I checked out your plugin, is it possible to execute "helm upgrade" or "helm install" or can I really only publish, manage and build charts?

HelmLint task fails with 'Transformer for this provider returned a null value'

Helm lint tasks fail exceptionally in a fresh project with the following error message: Transformer for this provider returned a null value

Digging through the source it looks like the following snippet is the culprit.

option("--set-file",
options.fileValues.map<String> { m ->
@Suppress("NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS")
m.takeIf { it.isNotEmpty() }
?.entries?.joinToString(separator = ",") { (key, value) ->
val valueRepresentation = when (val resolvedValue = resolveValue(value)) {
is FileCollection -> resolvedValue.singleFile
is TextResource -> resolvedValue.asFile()
else -> resolvedValue
}
"$key=$valueRepresentation"
}
}
)

Specifically options.fileValues.map<String> { resolves to AbstractMinimalProvider.map at runtime and not the kotlin stdlib map.
Turns out that the lambda used for mapping is not allowed to return null which can occur at m.takeIf { it.isNotEmpty() }

Support different lint configurations

Currently we can specify values and value files to pass to the linter, but it would be useful if we could lint a chart in different configurations to cover different control flows.

Most charts contain render some K8s resources conditionally based on the configuration of values. Mostly, with the default values given in values.yaml, a lot of templates are not rendered by default, so that errors in these templates will not be caught by the linter.

Charts should allow multiple "configurations" for the linter, where each of them has a different set of values to pass to the linter. The linting step should then run all of them.

helmInstall: version does not get to the command line

I configured releases section (plugin version 1.1.1, Gradle 6.3, Java 14, Kotlin 1.3.71)

    releases {
        create("lcp-oauth") {
            from("lcp/lcp-oauth")
            version.set("1.0.2")
            dryRun.set(true)
        }
    }

I run ./gradlew helmInstall --info and see in the log

Starting process 'command 'helm''. Working directory: /Users/user/Work/lcp/lcp-oauth Command: helm ls -o json -f ^\Qlcp-oauth\E$
Successfully started process 'command 'helm''
Release "{}" has previously failed. Using 'helm install --replace' to install it.
Executing: [helm, install, --dry-run, lcp-oauth, lcp/lcp-oauth, --replace]
Starting process 'command 'helm''. Working directory: /Users/user/Work/lcp/lcp-oauth Command: helm install --dry-run lcp-oauth lcp/lcp-oauth --replace
Successfully started process 'command 'helm''

helm installed the latest version of the chart from the repo and ignore the version, you can see in the log that the --install option was not formed

How to run gradle build without helm tasks

I'm trying to split project build and only build helm charts when required.
It seems to be easy to build helm charts separately using helmPackage/helmPublish tasks.

But I didn't find easy way to disable helm tasks / build everything but helm charts.

Any advice?

Working example of actually using this plugin

I'm having numerous problems upgrading my build scripts from 0.3.0 version of this plugin, to the current one, everything is broken. Is there any complete working example of using it anywhere? Or forum, or any other help resources where I could ask my questions? Anything?

downloadClient: Cannot cast object 'true' with class 'Boolean' to class 'Property'

I am trying to enable client downloading as per docs:

// build.gradle
helm {
    downloadClient {
        enabled = true
        version = '3.2.0'
    }
}

However, this is what I get on Gradle 6.6:

Caused by: org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'true' with class 'java.lang.Boolean' to class 'org.gradle.api.provider.Property'

However, Kotlin syntax works:

helm {
    downloadClient {
        enabled.set(true)
        version.set("3.2.0")
    }
}

It is strange because it seems other closures don't have this problem:

helm {
    downloadClient {
        enabled.set(true)
        version.set("3.2.0")
    }
    // works as expected
    lint {
        strict = true
    }
}

:helmLintMainChart'. fails

Hi there,

Actually I face the problem that the task ':helmLintMainChart'. fails all the time.
I think it is a bug inside your gradle task definition. Or am I wrong here?

Im using version 0.2.1
See stack trace below

Task :helmLintMainChart FAILED

FAILURE: Build failed with an exception.

  • What went wrong:
    Could not evaluate onlyIf predicate for task ':helmLintMainChart'.

No value has been specified for this provider.

  • Try:
    Run with --info or --debug option to get more log output. Run with --scan to get full insights.

  • Exception is:
    org.gradle.api.GradleException: Could not evaluate onlyIf predicate for task ':helmLintMainChart'.
    at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:44)
    at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
    at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
    at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.run(EventFiringTaskExecuter.java:51)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
    at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
    at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:46)
    at org.gradle.execution.taskgraph.LocalTaskInfoExecutor.execute(LocalTaskInfoExecutor.java:42)
    at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareWorkItemExecutor.execute(DefaultTaskExecutionGraph.java:277)
    at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareWorkItemExecutor.execute(DefaultTaskExecutionGraph.java:262)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:135)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:130)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.execute(DefaultTaskPlanExecutor.java:200)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.executeWithWork(DefaultTaskPlanExecutor.java:191)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.run(DefaultTaskPlanExecutor.java:130)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
    at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
    at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
    Caused by: java.lang.IllegalStateException: No value has been specified for this provider.
    at org.gradle.api.internal.provider.AbstractProvider.get(AbstractProvider.java:31)
    at org.gradle.api.internal.provider.AbstractMappingProvider.get(AbstractMappingProvider.java:45)
    at org.gradle.api.internal.provider.DefaultPropertyState.get(DefaultPropertyState.java:90)
    at org.gradle.api.internal.provider.DefaultPropertyState.get(DefaultPropertyState.java:90)
    at org.unbrokendome.gradle.plugins.helm.rules.LintTaskRule$apply$2$1$1$1.isSatisfiedBy(LintTaskRule.kt:43)
    at org.unbrokendome.gradle.plugins.helm.rules.LintTaskRule$apply$2$1$1$1.isSatisfiedBy(LintTaskRule.kt:13)
    at org.gradle.api.specs.AndSpec.isSatisfiedBy(AndSpec.java:47)
    at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:42)
    ... 20 more

Could not copy file when values contains regexp

My values file contains regular expression similar to this:

prefix: /v1/tenants/\w*/(users|roles).*

When I run taks gradle helmPackage i get following error:

   > Failed to parse template script (your template may contain an error or be trying to use expressions not currently supported): startup failed:
     SimpleTemplateScript38.groovy: 11: unexpected char: '\' @ line 11, column 23.
          prefix: /v1/tenants/\w*/(users|roles).*
                              ^

The only way to fix this is to remove regexp value. Sometimes you want to set some defaults tho and then it's a problem.

Here is another example of value which is causing problem:

^([a-z0-9]+)(\-[a-z0-9]+)?\.api\.eu\.tenant\-service\.commerce\.cloud\.foo\.com$

Result:

   > Failed to parse template script (your template may contain an error or be trying to use expressions not currently supported): startup failed:
     SimpleTemplateScript36.groovy: 9: unexpected char: '\' @ line 9, column 23.
          host: '^([a-z0-9]+)(\-[a-z0-9]+)?\.api\.eu\.tenant\-service\.commerce\.cloud\.foo\.com$'
                              ^

Execution uploadArchives after helmPackage

Greetings!
When I exec my task uploadArchives(need to upload other dependencies), plugin also exec task helmPackageChartChart. It's create build/helm/charts/chart_name_folder.
Then, I get the error:

* What went wrong:
Execution failed for task ':uploadArchives'.
> Could not publish configuration 'archives'
   > Cannot publish a directory (build/helm/charts/chart_name_folder)

Any ideas how to fix this?

helm 3.0 support

For now it fails with an error: Error: unknown flag: --client-only

HelmExec not masked

running tasks that do a helmExec internally e.g helmAddMyRepository -i
produces the following output:
> Task :helmAddMyRepository Caching disabled for task ':helmAddMyRepository' because: Build cache is disabled Task ':helmAddMyRepository' is not up-to-date because: Task.upToDateWhen is false. Executing: [helm, repo, add, --username, myUser, --password, ******, my, https://localhost/artifactory/helm3] Starting process 'command 'helm''. Working directory: C:\myChart Command: helm repo add --username myUser --password myPassword my https://localhost/artifactory/helm3

The helmExec should be masked as well. Currently passwords are printed in cleartext

Add support for publishing to Artifactory

Helm publish task fails with error: org.apache.http.client.HttpResponseException: Method Not Allowed

Pls see some details from the log:

Executing request POST /artifactory/helm/api/charts HTTP/1.1
.....
Execution failed for task ':helmPublishMainChartToHelmArtifactoryRepo'.
[org.gradle.internal.buildevents.BuildExceptionReporter] > org.apache.http.client.HttpResponseException: Method Not Allowed

Support for native helm publishing

Not all helm repos are http(s) based, a good example is the s3 helm plugin. It would be nice to have a publishing plugin that uses the the helm command to publish to leverage helm repository plugins.

Plugin is not compatible with Gradle 6

The following warning is produced:

The ProjectLayout.configurableFiles() method has been deprecated. This is scheduled to be removed in Gradle 6.0. Please use the ObjectFactory.fileCollection() method instead.
	at org.gradle.api.internal.file.DefaultProjectLayout.configurableFiles(DefaultProjectLayout.java:114)
	at org.unbrokendome.gradle.plugins.helm.dsl.DefaultLinting.<init>(Linting.kt:63)
	at org.unbrokendome.gradle.plugins.helm.dsl.DefaultLinting_Decorated.<init>(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at org.gradle.internal.instantiation.AsmBackedClassGenerator.newInstance(AsmBackedClassGenerator.java:179)
	at org.gradle.internal.instantiation.AbstractClassGenerator$GeneratedClassImpl$GeneratedConstructorImpl.newInstance(AbstractClassGenerator.java:395)
	at org.gradle.internal.instantiation.DependencyInjectingInstantiator.newInstance(DependencyInjectingInstantiator.java:49)
	at org.gradle.api.internal.model.DefaultObjectFactory.newInstance(DefaultObjectFactory.java:82)
	at org.unbrokendome.gradle.plugins.helm.dsl.LintingKt.createLinting(Linting.kt:82)
	at org.unbrokendome.gradle.plugins.helm.dsl.LintingKt.createLinting$default(Linting.kt:81)
	at org.unbrokendome.gradle.plugins.helm.command.HelmCommandsPlugin.apply(HelmCommandsPlugin.kt:24)
	at org.unbrokendome.gradle.plugins.helm.command.HelmCommandsPlugin.apply(HelmCommandsPlugin.kt:15)
	at org.gradle.api.internal.plugins.ImperativeOnlyPluginTarget.applyImperative(ImperativeOnlyPluginTarget.java:43)
	at org.gradle.api.internal.plugins.RuleBasedPluginTarget.applyImperative(RuleBasedPluginTarget.java:51)
	at org.gradle.api.internal.plugins.DefaultPluginManager.addPlugin(DefaultPluginManager.java:181)
	at org.gradle.api.internal.plugins.DefaultPluginManager.access$300(DefaultPluginManager.java:51)
	at org.gradle.api.internal.plugins.DefaultPluginManager$AddPluginBuildOperation.run(DefaultPluginManager.java:276)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:402)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:394)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:92)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.api.internal.plugins.DefaultPluginManager$2.execute(DefaultPluginManager.java:159)
	at org.gradle.api.internal.plugins.DefaultPluginManager$2.execute(DefaultPluginManager.java:156)
	at org.gradle.configuration.internal.DefaultUserCodeApplicationContext.apply(DefaultUserCodeApplicationContext.java:49)
	at org.gradle.api.internal.plugins.DefaultPluginManager.doApply(DefaultPluginManager.java:156)
	at org.gradle.api.internal.plugins.DefaultPluginManager.addImperativePlugin(DefaultPluginManager.java:88)
	at org.gradle.api.internal.plugins.DefaultPluginManager.addImperativePlugin(DefaultPluginManager.java:95)
	at org.gradle.api.internal.plugins.DefaultPluginContainer.apply(DefaultPluginContainer.java:94)
	at org.unbrokendome.gradle.plugins.helm.HelmPlugin.apply(HelmPlugin.kt:34)
	at org.unbrokendome.gradle.plugins.helm.HelmPlugin.apply(HelmPlugin.kt:22)
	at org.gradle.api.internal.plugins.ImperativeOnlyPluginTarget.applyImperative(ImperativeOnlyPluginTarget.java:43)
	at org.gradle.api.internal.plugins.RuleBasedPluginTarget.applyImperative(RuleBasedPluginTarget.java:51)
	at org.gradle.api.internal.plugins.DefaultPluginManager.addPlugin(DefaultPluginManager.java:181)
	at org.gradle.api.internal.plugins.DefaultPluginManager.access$300(DefaultPluginManager.java:51)
	at org.gradle.api.internal.plugins.DefaultPluginManager$AddPluginBuildOperation.run(DefaultPluginManager.java:276)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:402)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:394)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:92)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.api.internal.plugins.DefaultPluginManager$2.execute(DefaultPluginManager.java:159)
	at org.gradle.api.internal.plugins.DefaultPluginManager$2.execute(DefaultPluginManager.java:156)
	at org.gradle.configuration.internal.DefaultUserCodeApplicationContext.apply(DefaultUserCodeApplicationContext.java:49)
	at org.gradle.api.internal.plugins.DefaultPluginManager.doApply(DefaultPluginManager.java:156)
	at org.gradle.api.internal.plugins.DefaultPluginManager.apply(DefaultPluginManager.java:136)
	at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator$3.run(DefaultPluginRequestApplicator.java:155)
	at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.applyPlugin(DefaultPluginRequestApplicator.java:231)
	at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.applyPlugins(DefaultPluginRequestApplicator.java:151)
	at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl.apply(DefaultScriptPluginFactory.java:206)
	at org.gradle.configuration.BuildOperationScriptPlugin$1$1.run(BuildOperationScriptPlugin.java:69)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:402)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:394)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:92)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.configuration.BuildOperationScriptPlugin$1.execute(BuildOperationScriptPlugin.java:66)
	at org.gradle.configuration.BuildOperationScriptPlugin$1.execute(BuildOperationScriptPlugin.java:63)
	at org.gradle.configuration.internal.DefaultUserCodeApplicationContext.apply(DefaultUserCodeApplicationContext.java:49)
	at org.gradle.configuration.BuildOperationScriptPlugin.apply(BuildOperationScriptPlugin.java:63)
	at org.gradle.configuration.project.BuildScriptProcessor$1.run(BuildScriptProcessor.java:45)
	at org.gradle.internal.Factories$1.create(Factories.java:26)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.withMutableState(DefaultProjectStateRegistry.java:201)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.withMutableState(DefaultProjectStateRegistry.java:187)
	at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:42)
	at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:26)
	at org.gradle.configuration.project.ConfigureActionsProjectEvaluator.evaluate(ConfigureActionsProjectEvaluator.java:35)
	at org.gradle.configuration.project.LifecycleProjectEvaluator$EvaluateProject$1.run(LifecycleProjectEvaluator.java:107)
	at org.gradle.internal.Factories$1.create(Factories.java:26)
	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:189)
	at org.gradle.internal.work.StopShieldingWorkerLeaseService.withLocks(StopShieldingWorkerLeaseService.java:40)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.withProjectLock(DefaultProjectStateRegistry.java:227)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.withMutableState(DefaultProjectStateRegistry.java:221)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.withMutableState(DefaultProjectStateRegistry.java:187)
	at org.gradle.configuration.project.LifecycleProjectEvaluator$EvaluateProject.run(LifecycleProjectEvaluator.java:96)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:402)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:394)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:92)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:68)
	at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:693)
	at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:141)
	at org.gradle.execution.TaskPathProjectEvaluator.configure(TaskPathProjectEvaluator.java:36)
	at org.gradle.execution.TaskPathProjectEvaluator.configureHierarchy(TaskPathProjectEvaluator.java:62)
	at org.gradle.configuration.DefaultProjectsPreparer.prepareProjects(DefaultProjectsPreparer.java:55)
	at org.gradle.configuration.BuildOperatingFiringProjectsPreparer$ConfigureBuild.run(BuildOperatingFiringProjectsPreparer.java:52)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:402)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:394)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:92)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.configuration.BuildOperatingFiringProjectsPreparer.prepareProjects(BuildOperatingFiringProjectsPreparer.java:40)
	at org.gradle.initialization.DefaultGradleLauncher.prepareProjects(DefaultGradleLauncher.java:198)
	at org.gradle.initialization.DefaultGradleLauncher.doClassicBuildStages(DefaultGradleLauncher.java:138)
	at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:126)
	at org.gradle.initialization.DefaultGradleLauncher.executeTasks(DefaultGradleLauncher.java:106)
	at org.gradle.internal.invocation.GradleBuildController$1.execute(GradleBuildController.java:60)
	at org.gradle.internal.invocation.GradleBuildController$1.execute(GradleBuildController.java:57)
	at org.gradle.internal.invocation.GradleBuildController$3.create(GradleBuildController.java:85)
	at org.gradle.internal.invocation.GradleBuildController$3.create(GradleBuildController.java:78)
	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:189)
	at org.gradle.internal.work.StopShieldingWorkerLeaseService.withLocks(StopShieldingWorkerLeaseService.java:40)
	at org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:78)
	at org.gradle.internal.invocation.GradleBuildController.run(GradleBuildController.java:57)
	at org.gradle.tooling.internal.provider.runner.BuildModelActionRunner.run(BuildModelActionRunner.java:54)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.launcher.exec.BuildOutcomeReportingBuildActionRunner.run(BuildOutcomeReportingBuildActionRunner.java:63)
	at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
	at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run(BuildCompletionNotifyingBuildActionRunner.java:39)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.call(RunAsBuildOperationBuildActionRunner.java:51)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.call(RunAsBuildOperationBuildActionRunner.java:45)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:45)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:50)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:47)
	at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:78)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:47)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:31)
	at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:42)
	at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:28)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:78)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:52)
	at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:59)
	at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:36)
	at org.gradle.tooling.internal.provider.SessionScopeBuildActionExecuter.execute(SessionScopeBuildActionExecuter.java:68)
	at org.gradle.tooling.internal.provider.SessionScopeBuildActionExecuter.execute(SessionScopeBuildActionExecuter.java:38)
	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:37)
	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:26)
	at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:43)
	at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:29)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:60)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:32)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:55)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:41)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:48)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:32)
	at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:68)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:39)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:27)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:35)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:78)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:75)
	at org.gradle.util.Swapper.swap(Swapper.java:38)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:75)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:63)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:82)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:52)
	at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
	at java.lang.Thread.run(Thread.java:748)```

Ability to check release status

It would be great if helm-releases plugin would have possibility to check release status.

Task helmStatus<X> could be added, which checks status of release named X by calling helm status.

Re-establish Gradle 5.2 compatibility

The plugin states to be compatible with Gradle 5.2, which is currently not the case because we're using Provider.orElse() which was only added in 5.6.

Need to backport this to construct a new Provider with a fixed default value or a default value provider.

Task :helmPackageMainChart FAILED

@tkrullmann
After I set helm.lint.enabled=false , there is also another problem.
I'm using the laest version 0.2.2

Task :helmPackageMainChart FAILED

FAILURE: Build failed with an exception.

What went wrong:
Execution failed for task ':helmPackageMainChart'.
No value has been specified for this provider.

Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.

Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':helmPackageMainChart'.
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:49)
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:101)
at org.gradle.api.internal.tasks.execution.FinalizeInputFilePropertiesTaskExecuter.execute(FinalizeInputFilePropertiesTaskExecuter.java:44)
at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:91)
at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:62)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:59)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.run(EventFiringTaskExecuter.java:51)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:317)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:309)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:185)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:97)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:46)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$ExecuteTaskAction.execute(DefaultTaskExecutionGraph.java:262)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$ExecuteTaskAction.execute(DefaultTaskExecutionGraph.java:246)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:136)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:130)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.execute(DefaultTaskPlanExecutor.java:201)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.executeWithTask(DefaultTaskPlanExecutor.java:192)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:130)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: java.lang.IllegalStateException: No value has been specified for this provider.
at org.gradle.api.internal.provider.AbstractProvider.get(AbstractProvider.java:30)
at org.gradle.api.internal.provider.DefaultPropertyState.get(DefaultPropertyState.java:90)
at org.gradle.api.internal.provider.DefaultPropertyState.get(DefaultPropertyState.java:90)
at org.gradle.util.DeferredUtil.unpack(DeferredUtil.java:39)
at org.gradle.api.internal.tasks.StaticValue.validate(StaticValue.java:37)
at org.gradle.api.internal.tasks.DefaultPropertySpecFactory$FileTreeValue.validate(DefaultPropertySpecFactory.java:92)
at org.gradle.api.internal.tasks.DefaultTaskInputFilePropertySpec.validate(DefaultTaskInputFilePropertySpec.java:124)
at org.gradle.api.internal.tasks.execution.DefaultTaskProperties.validate(DefaultTaskProperties.java:193)
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:47)
... 25 more

Get more help at https://help.gradle.org

Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0.
See https://docs.gradle.org/4.8.1/userguide/command_line_interface.html#sec:command_line_warnings

BUILD FAILED in 11s
7 actionable tasks: 1 executed, 6 up-to-date

NoSuchMethodError when using with Java 1.8

Hello! I am trying to use this plugin with a Java 1.8 project, and when I attempt to run the helmPublish task, I get this exception:

java.lang.NoSuchMethodError: java.nio.ByteBuffer.clear()Ljava/nio/ByteBuffer

Apparently this is caused by a change introduced in Java 9. I found a thread from another project that dealt with this issue (see here) and it seems that they were able to resolve it by building their published artifact with JDK 1.8.

I verified that I am able to successfully run this task when I try running it with OpenJDK 9.

Here is the full stack trace:

> Task :helmCollectMainChartDependencies UP-TO-DATE
> Task :helmFilterMainChartSources UP-TO-DATE
> Task :helmCollectMainChartSources UP-TO-DATE
> Task :helmAddRepositories UP-TO-DATE
> Task :helmUpdateRepositories SKIPPED
> Task :helmUpdateMainChartDependencies SKIPPED
> Task :helmLintMainChart SKIPPED
> Task :helmPackageMainChart UP-TO-DATE
> Task :helmPublishMainChartToDefaultRepo FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':helmPublishMainChartToDefaultRepo'.
> java.nio.ByteBuffer.clear()Ljava/nio/ByteBuffer;

* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':helmPublishMainChartToDefaultRepo'.
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.accept(ExecuteActionsTaskExecuter.java:166)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.accept(ExecuteActionsTaskExecuter.java:163)
	at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:191)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:156)
	at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:62)
	at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:108)
	at org.gradle.api.internal.tasks.execution.ResolveBeforeExecutionOutputsTaskExecuter.execute(ResolveBeforeExecutionOutputsTaskExecuter.java:67)
	at org.gradle.api.internal.tasks.execution.StartSnapshotTaskInputsBuildOperationTaskExecuter.execute(StartSnapshotTaskInputsBuildOperationTaskExecuter.java:62)
	at org.gradle.api.internal.tasks.execution.ResolveAfterPreviousExecutionStateTaskExecuter.execute(ResolveAfterPreviousExecutionStateTaskExecuter.java:46)
	at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:94)
	at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
	at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:95)
	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
	at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:43)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:355)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:134)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:129)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:202)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:193)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:129)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
Caused by: java.lang.NoSuchMethodError: java.nio.ByteBuffer.clear()Ljava/nio/ByteBuffer;
	at org.unbrokendome.gradle.plugins.helm.util.DigestUtilsKt.calculateDigest(DigestUtils.kt:33)
	at org.unbrokendome.gradle.plugins.helm.util.DigestUtilsKt.calculateDigest(DigestUtils.kt:62)
	at org.unbrokendome.gradle.plugins.helm.util.DigestUtilsKt.calculateDigestHex(DigestUtils.kt:79)
	at org.unbrokendome.gradle.plugins.helm.util.DigestUtilsKt.calculateDigestHex$default(DigestUtils.kt:77)
	at org.unbrokendome.gradle.plugins.helm.publishing.dsl.DefaultArtifactoryHelmPublishingRepository$Publisher.additionalHeaders(ArtifactoryHelmPublishingRepository.kt:40)
	at org.unbrokendome.gradle.plugins.helm.publishing.publishers.AbstractHttpHelmChartPublisher.publish(AbstractHttpHelmChartPublisher.kt:76)
	at org.unbrokendome.gradle.plugins.helm.publishing.tasks.HelmPublishChart.publish(HelmPublishChart.kt:66)
	at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:103)
	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:49)
	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:42)
	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:28)
	at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:717)
	at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:684)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$5.run(ExecuteActionsTaskExecuter.java:476)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:402)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:394)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:92)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:461)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:444)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$200(ExecuteActionsTaskExecuter.java:93)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:237)
	at org.gradle.internal.execution.steps.ExecuteStep.lambda$execute$1(ExecuteStep.java:33)
	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:33)
	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:26)
	at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:58)
	at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:35)
	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:48)
	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:33)
	at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:39)
	at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:73)
	at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:54)
	at org.gradle.internal.execution.steps.CatchExceptionStep.execute(CatchExceptionStep.java:35)
	at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:51)
	at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:45)
	at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:31)
	at org.gradle.internal.execution.steps.CacheStep.executeWithoutCache(CacheStep.java:208)
	at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:70)
	at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:45)
	at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:49)
	at org.gradle.internal.execution.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:43)
	at org.gradle.internal.execution.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:32)
	at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:38)
	at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:24)
	at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:96)
	at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:89)
	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:54)
	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:38)
	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:76)
	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:37)
	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:36)
	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:26)
	at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:90)
	at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:48)
	at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:69)
	at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:47)
	at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:140)
	... 35 more

org.apache.http.client.HttpResponseException: Not Found

Updated version to 0.4.4 and when running gradle command to publish chart to ChartMuseum throws following error

  • What went wrong:
    Execution failed for task ':bareagent:helmPublishBareagentChartToBlueamberRepo'.

org.apache.http.client.HttpResponseException: Not Found

build.gradle set up

plugins {
	id 'war'
	id 'java'
	id 'idea'
	id 'groovy'
	id 'eclipse'
	id 'com.patdouble.awsecr' version '0.5.2'
	id 'org.unbroken-dome.helm' version '0.4.4'
	id 'org.springframework.boot' version '2.1.7.RELEASE'
 	id 'com.bmuschko.docker-remote-api' version '5.2.0'
	id 'com.bmuschko.docker-spring-boot-application' version '5.2.0'
	id 'org.unbroken-dome.helm-publish' version '0.4.4'
	id 'org.unbroken-dome.helm-releases' version '0.4.4'
	id 'io.spring.dependency-management' version '1.0.8.RELEASE'

}

helm {
	home = file("${project.buildDir}/helm/home")

	filtering {
		// This value will be resolvable in all charts' YAML files as "${springProfile}"
		values.put 'springProfile', 'prod'
		values.put 'internalPort', '8000'
	}

	charts {
		service {
			chartName = "${project.name}"
			chartVersion = "${version}"
			sourceDir = file('src/main/charts/service')
		}
	}

	repositories {
		company {
			url = uri('https://charts.company.com')
			credentials {
				username = 'USERNAME'
				password = 'PASSWORD'
			}
		}
	}

	publishing {
		repositories {
			company {
				url = uri('https://charts.company.com')
				credentials {
					username = 'USERNAME'
					password = 'PASSWORD'
				}
			}
		}
	}

	releases {
		service {
			from chart("${project.name}")
			version = "${version}"
			namespace = "NAMESPACE"
		}
	}
}

Error Message

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':service:helmPublishServiceChartToCompanyRepo'.
> org.apache.http.client.HttpResponseException: Not Found

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

Deprecated Gradle features were used in this build, making it incompatible with Gradle 6.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/5.5.1/userguide/command_line_interface.html#sec:command_line_warnings

BUILD FAILED in 1s
7 actionable tasks: 1 executed, 6 up-to-date
6:46:36 PM: Task execution finished 'helmPublish'.

we followed exactly what the docs says and its failing every single time can you please guide us as to what might the issue

Getting error `Transformer for this provider returned a null value`

I checked out your plugin and using it in one of my application. I am trying to deploy helm chart on remote kubernetes cluster using your plugin. I have implemented following gradle tasks.

helm {
  kubeConfig = file('src/main/resources/helm/kubeconfig')
}

task installApp(type: HelmInstallOrUpgrade) {
    version = "1.1.0"
    releaseName = "appRelease"
    values = [ 'imageRepository': 'dockerRepo/dockerImage', 'imageTag' : "1.1.0"]
    chart = 'src/main/resources/helm/charDir'
}

But getting error Transformer for this provider returned a null value While executing command gradle installApp.

Is error getting due to plugin or my mistake? Can you provide me right direction?

Serialization Issue when using X.509 Client Certificates

Gradle internally is trying to cast a java.io.File into a String when using a x.509 certificate.

Gradle appears to be assuming that all managed immutable values are Strings which, probably, is a bug but an easy work-around for this case is to change java.io.File to a String since they're being passed to helm anyways as Strings. When using them in a build script you're first defining them as files which handles the 'existence' case and should be safe.

The only place they're not is on publishing but that doesn't encounter the issue since the CertificateCredentials object is serializable and it isn't encountering the issue.

Exception is:

> Unable to store input properties for task ':helmAdd<REPO>Repository'. Property 'keyFile' with value '<path/to/keyfile.pem>' cannot be serialized.

* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':helmAdd<REPO>Repository'.
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:38)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:372)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:359)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:352)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:338)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
Caused by: org.gradle.api.UncheckedIOException: Unable to store input properties for task ':helmAdd<REPO>Repository'. Property 'keyFile' with value '<path/to/keyfile.pem>' cannot be serialized.
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.lambda$fingerprintInputProperties$2(CaptureStateBeforeExecutionStep.java:178)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.visitInputProperties(ExecuteActionsTaskExecuter.java:307)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.fingerprintInputProperties(CaptureStateBeforeExecutionStep.java:169)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.captureExecutionState(CaptureStateBeforeExecutionStep.java:149)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.lambda$captureExecutionStateOp$1(CaptureStateBeforeExecutionStep.java:104)
        at org.gradle.internal.execution.steps.BuildOperationStep$1.call(BuildOperationStep.java:40)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
        at org.gradle.internal.execution.steps.BuildOperationStep.operation(BuildOperationStep.java:37)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.captureExecutionStateOp(CaptureStateBeforeExecutionStep.java:103)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.lambda$execute$0(CaptureStateBeforeExecutionStep.java:78)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:78)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:53)
        at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:74)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:78)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:78)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:34)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:39)
        at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:40)
        at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:28)
        at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:192)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:184)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:114)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        ... 23 more
Caused by: java.lang.ClassCastException: class java.io.File cannot be cast to class java.lang.String (java.io.File and java.lang.String are in module java.base of loader 'bootstrap')
        at org.gradle.internal.snapshot.impl.DefaultValueSnapshotter$ValueSnapshotVisitor.managedImmutableValue(DefaultValueSnapshotter.java:287)
        at org.gradle.internal.snapshot.impl.DefaultValueSnapshotter$ValueSnapshotVisitor.managedImmutableValue(DefaultValueSnapshotter.java:228)
        at org.gradle.internal.snapshot.impl.DefaultValueSnapshotter.processValue(DefaultValueSnapshotter.java:152)
        at org.gradle.internal.snapshot.impl.DefaultValueSnapshotter.snapshot(DefaultValueSnapshotter.java:54)
        at org.gradle.internal.snapshot.impl.NullValueSnapshot.snapshot(NullValueSnapshot.java:37)
        at org.gradle.internal.snapshot.impl.DefaultValueSnapshotter.snapshot(DefaultValueSnapshotter.java:59)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.lambda$fingerprintInputProperties$2(CaptureStateBeforeExecutionStep.java:175)
        ... 56 more

Which if you dig into the gradle code you see:

From: https://github.com/gradle/gradle/blob/v6.3.0/subprojects/model-core/src/main/java/org/gradle/internal/snapshot/impl/DefaultValueSnapshotter.java#L287

        @Override
        public ValueSnapshot managedImmutableValue(Managed managed) {
            return new ImmutableManagedValueSnapshot(managed.publicType().getName(), (String) managed.unpackState());
        }

Note the raw string cast without checking for type (esp. if you trace up the stack trace) and compare to line 292 below it which doesn't make the same assumption. The assumption is done because ImmutableManagedValue only takes Strings.

Use Worker API to make better use of parallel builds

Some Helm tasks could make better use of parallel builds when defined in the same project, by injecting the WorkerExecutor service into the task.

Some obvious candidates are HelmPublishChart and HelmInstall etc. which could take a long time but are likely independent from each other if there are multiple charts / releases defined in the same project, so they could run in parallel.

  • for HelmPublish, worker API could also provide classloader isolation for the necessary HTTP client library, so we don't need to have a strong dependency on the HTTP client if publishing is not used
  • for all tasks that map to a Helm CLI invocation, Gradle 6.0 and above allows injecting an ExecOperations into the worker action which finally allows calling exec in a worker action. Pre 6.0 we need to continue using non-parallelizable calls to Project.exec.

Support for publish-if-not-exists

Our artifactory instance implements write-once semantics for final chart versions and will throw an error if you try to publish the same version again. Sometimes we need to re-run a pipeline to resolve an error that came after the chart publication leaving us unable to get past the publication that worked first time.

Currently we work around with an ugly bit of curl in an onlyIf attached to the publish task. It would be great if this logic was encapsulated in the DSL.

Possibility to disable dependency update tasks

Sometimes it is useful to skip dependency update task if requirements.yaml contains dependencies to only local subcharts. Due to the following helm issue it is not possible right now: helm/helm#3742
It would be nice if you could disable dependency update for a specific chart. Here is an example:

helm {
    charts {
        foo {
            chartName = 'foo'
            chartVersion = '1.2.3'
            sourceDir = file('src/helm')
            skipDependencyUpdate = true
        }
    }
}

`publish = false` does not work

Here is my build.gradle.kts:

plugins {
    id("org.unbroken-dome.helm") version "0.4.0"
    id("org.unbroken-dome.helm-publish") version "0.4.0"
}

helm {
  home.set(file("$buildDir/helm/home"))

  publishing {
    repositories {
      artifactory("my-repo") {
        url.set(uri("http://my-repo/helm-dev"))
      }
    }
  }

  charts {
    create("myChart") {
      chartName.set("my-chart")
      sourceDir.set(file("$projectDir/src/my-chart"))
      publish = false
    }
  }
}

Trying to run helmPublish task fails with an error:

Script compilation error:

  Line 21:             publish = false
                       ^ Unresolved reference: publish

Replacing with publish.set(false) does not help either.

Helm package does not read chartVersion

It seems that the value helm.charts.main.chartVersion is not read or used by the helmPackage tasks. It only reads the version from Chart.yaml.

Perhaps because helm package is called without --version here: https://github.com/unbroken-dome/gradle-helm-plugin/blob/master/src/main/kotlin/org/unbrokendome/gradle/plugins/helm/command/tasks/HelmPackage.kt#L142

In my setup, it means that helmPackage creates a tgz with the version from Chart.yaml , but helmPublish then looks for an archive with the version specified by project.version.

Using plugin version 0.4.0.

With helm3: timeoutSeconds property takes only integer but --timeout flag needs integer and timeunit

The timeoutSeconds property accepts integer.
Eg: timeoutSeconds = 1000
Eventually, this property will convert into --timeout flag for the actual command.
Eg: helm xxxxxxxxxxxxxxxxxxxxxxxx --timeout 1000

The actual --timeout flag excepts an integer with time unit(s or m), So we are encountering an error.
Eg: --timeout 1000s or --timeout 1000m

Error: invalid argument "1000" for "--timeout" flag: time: missing unit in duration 1000

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.