From 8748c9b75ab41fba92090e840bd5148117699386 Mon Sep 17 00:00:00 2001 From: Carter Cundiff Date: Wed, 13 Sep 2023 15:44:49 -0400 Subject: [PATCH] Added helm dependency update goal Signed-off-by: Carter Cundiff --- README.md | 1 + .../maven/helm/AbstractDependencyMojo.java | 75 +++++++++++++++++++ .../maven/helm/DependencyBuildMojo.java | 49 +----------- .../maven/helm/DependencyUpdateMojo.java | 48 ++++++++++++ .../maven/helm/DependencyBuildMojoTest.java | 2 +- .../maven/helm/DependencyUpdateMojoTest.java | 61 +++++++++++++++ 6 files changed, 188 insertions(+), 48 deletions(-) create mode 100644 src/main/java/io/kokuwa/maven/helm/AbstractDependencyMojo.java create mode 100644 src/main/java/io/kokuwa/maven/helm/DependencyUpdateMojo.java create mode 100644 src/test/java/io/kokuwa/maven/helm/DependencyUpdateMojoTest.java diff --git a/README.md b/README.md index 637e6c81..014c4211 100644 --- a/README.md +++ b/README.md @@ -293,6 +293,7 @@ Parameter | Type | User Property | Required | Description `` | boolean | helm.template.skip | false | skip template goal. Default value is true due to the dry-run goal `` | boolean | helm.dry-run.skip | false | skip dry-run goal `` | boolean | helm.dependency-build.skip | false | skip dependency-build goal +`` | boolean | helm.dependency-update.skip | false | skip dependency-update goal `` | boolean | helm.package.skip | false | skip package goal `` | boolean | helm.upload.skip | false | skip upload goal `` | boolean | helm.upload.insecure | false | Skip tls certificate checks for the chart upload. diff --git a/src/main/java/io/kokuwa/maven/helm/AbstractDependencyMojo.java b/src/main/java/io/kokuwa/maven/helm/AbstractDependencyMojo.java new file mode 100644 index 00000000..f599522b --- /dev/null +++ b/src/main/java/io/kokuwa/maven/helm/AbstractDependencyMojo.java @@ -0,0 +1,75 @@ +package io.kokuwa.maven.helm; + +import java.nio.file.Path; + +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugins.annotations.Parameter; + +import io.kokuwa.maven.helm.util.DependencyOverwriter; +import lombok.Setter; + +/** + * Base class for dependency build and update mojos + * + * @since 6.10.2 + */ +@Setter +public abstract class AbstractDependencyMojo extends AbstractHelmMojo { + + /** + * Controls whether a local path chart should be used for a chart dependency. When set to true, chart + * dependencies on a local path chart will be overwritten with the respective properties set by + * "helm.overwriteDependencyVersion" and "helm.overwriteDependencyRepository". This is helpful for deploying charts + * with intra repository dependencies, while still being able to use local path dependencies for development builds. + * + * Example usage: + *
    + *
  • For development: mvn clean install
  • + *
  • For deployment: mvn clean deploy -Dhelm.overwriteLocalDependencies=true
  • + *
+ * + * @since 6.10.0 + */ + @Parameter(property = "helm.overwriteLocalDependencies", defaultValue = "false") + protected boolean overwriteLocalDependencies; + + /** + * Value used to overwrite a local path chart's version within a chart's dependencies. The property + * "helm.overwriteLocalDependencies" must be set to true for this to apply. + * + * @since 6.10.0 + */ + @Parameter(property = "helm.overwriteDependencyVersion") + protected String overwriteDependencyVersion; + + /** + * Value used to overwrite a local path chart's repository within a chart's dependencies. The property + * "helm.overwriteLocalDependencies" must be set to true for this to apply. + * + * @since 6.10.0 + */ + @Parameter(property = "helm.overwriteDependencyRepository") + protected String overwriteDependencyRepository; + + /** + * Overwrites the local path of a chart dependency with the desired repository and version when + * helm.overwriteLocalDependencies is set to true. + * + * @param chartDirectory directory containing a Helm chart + * @throws MojoExecutionException Null value for 'overwriteDependencyRepository' + * + * @since 6.10.2 + */ + protected void doOverwriteLocalDependencies(Path chartDirectory) throws MojoExecutionException { + if (overwriteLocalDependencies) { + if (overwriteDependencyRepository == null) { + throw new MojoExecutionException("Null value for 'overwriteDependencyRepository' is " + + "not allowed when using 'overwriteLocalDependencies'. See the README for more details."); + } + getLog().info("Overwriting dependencies that contain local path charts with " + + overwriteDependencyRepository); + new DependencyOverwriter(overwriteDependencyRepository, overwriteDependencyVersion, getLog()) + .execute(chartDirectory); + } + } +} diff --git a/src/main/java/io/kokuwa/maven/helm/DependencyBuildMojo.java b/src/main/java/io/kokuwa/maven/helm/DependencyBuildMojo.java index e17e4dd4..9beaa585 100644 --- a/src/main/java/io/kokuwa/maven/helm/DependencyBuildMojo.java +++ b/src/main/java/io/kokuwa/maven/helm/DependencyBuildMojo.java @@ -7,7 +7,6 @@ import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; -import io.kokuwa.maven.helm.util.DependencyOverwriter; import lombok.Setter; /** @@ -19,7 +18,7 @@ */ @Mojo(name = "dependency-build", defaultPhase = LifecyclePhase.PROCESS_RESOURCES, threadSafe = true) @Setter -public class DependencyBuildMojo extends AbstractHelmMojo { +public class DependencyBuildMojo extends AbstractDependencyMojo { /** * Set this to true to skip invoking dependency-build goal. @@ -29,41 +28,6 @@ public class DependencyBuildMojo extends AbstractHelmMojo { @Parameter(property = "helm.dependency-build.skip", defaultValue = "false") private boolean skipDependencyBuild; - /** - * Controls whether a local path chart should be used for a chart dependency. When set to true, chart - * dependencies on a local path chart will be overwritten with the respective properties set by - * "helm.overwriteDependencyVersion" and "helm.overwriteDependencyRepository". This is helpful for deploying charts - * with intra repository dependencies, while still being able to use local path dependencies for development builds. - * - * Example usage: - *
    - *
  • For development: mvn clean install
  • - *
  • For deployment: mvn clean deploy -Dhelm.overwriteLocalDependencies=true
  • - *
- * - * @since 6.10.0 - */ - @Parameter(property = "helm.overwriteLocalDependencies", defaultValue = "false") - private boolean overwriteLocalDependencies; - - /** - * Value used to overwrite a local path chart's version within a chart's dependencies. The property - * "helm.overwriteLocalDependencies" must be set to true for this to apply. - * - * @since 6.10.0 - */ - @Parameter(property = "helm.overwriteDependencyVersion") - private String overwriteDependencyVersion; - - /** - * Value used to overwrite a local path chart's repository within a chart's dependencies. The property - * "helm.overwriteLocalDependencies" must be set to true for this to apply. - * - * @since 6.10.0 - */ - @Parameter(property = "helm.overwriteDependencyRepository") - private String overwriteDependencyRepository; - @Override public void execute() throws MojoExecutionException { @@ -74,16 +38,7 @@ public void execute() throws MojoExecutionException { for (Path chartDirectory : getChartDirectories()) { - if (overwriteLocalDependencies) { - if (overwriteDependencyRepository == null) { - throw new MojoExecutionException("Null value for 'overwriteDependencyRepository' is " + - "not allowed when using 'overwriteLocalDependencies'. See the README for more details."); - } - getLog().info("Overwriting dependencies that contain local path charts with " - + overwriteDependencyRepository); - new DependencyOverwriter(overwriteDependencyRepository, overwriteDependencyVersion, getLog()) - .execute(chartDirectory); - } + doOverwriteLocalDependencies(chartDirectory); getLog().info("Build chart dependencies for " + chartDirectory + " ..."); helm() diff --git a/src/main/java/io/kokuwa/maven/helm/DependencyUpdateMojo.java b/src/main/java/io/kokuwa/maven/helm/DependencyUpdateMojo.java new file mode 100644 index 00000000..4a96a99b --- /dev/null +++ b/src/main/java/io/kokuwa/maven/helm/DependencyUpdateMojo.java @@ -0,0 +1,48 @@ +package io.kokuwa.maven.helm; + +import java.nio.file.Path; + +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugins.annotations.LifecyclePhase; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.Parameter; + +import lombok.Setter; + +/** + * Mojo for executing "helm dependency-update". + * + * @see helm dependency-update + * @since 6.10.2 + */ +@Mojo(name = "dependency-update", defaultPhase = LifecyclePhase.PROCESS_RESOURCES, threadSafe = true) +@Setter +public class DependencyUpdateMojo extends AbstractDependencyMojo { + + /** + * Set this to true to skip invoking dependency-update goal. + * + * @since 6.10.2 + */ + @Parameter(property = "helm.dependency-update.skip", defaultValue = "false") + private boolean skipDependencyUpdate; + + @Override + public void execute() throws MojoExecutionException { + + if (skip || skipDependencyUpdate) { + getLog().info("Skip dependency update"); + return; + } + + for (Path chartDirectory : getChartDirectories()) { + + doOverwriteLocalDependencies(chartDirectory); + + getLog().info("Updating chart dependencies for " + chartDirectory + " ..."); + helm() + .arguments("dependency", "update", chartDirectory) + .execute("Failed to resolve dependencies"); + } + } +} diff --git a/src/test/java/io/kokuwa/maven/helm/DependencyBuildMojoTest.java b/src/test/java/io/kokuwa/maven/helm/DependencyBuildMojoTest.java index aefbbc98..c63ed7db 100644 --- a/src/test/java/io/kokuwa/maven/helm/DependencyBuildMojoTest.java +++ b/src/test/java/io/kokuwa/maven/helm/DependencyBuildMojoTest.java @@ -46,7 +46,7 @@ void overwriteLocalDependenciesMisconfig(DependencyBuildMojo mojo) { assertTrue(message.startsWith("Null value for 'overwriteDependencyRepository' "), message); } - @DisplayName("with overwriteLocalDependencies and ") + @DisplayName("with overwriteLocalDependencies and overwriteDependencyRepository") @Test void overwriteLocalDependencies(DependencyBuildMojo mojo) { mojo.setChartDirectory(new File("src/test/resources/dependencies")); diff --git a/src/test/java/io/kokuwa/maven/helm/DependencyUpdateMojoTest.java b/src/test/java/io/kokuwa/maven/helm/DependencyUpdateMojoTest.java new file mode 100644 index 00000000..cee3a149 --- /dev/null +++ b/src/test/java/io/kokuwa/maven/helm/DependencyUpdateMojoTest.java @@ -0,0 +1,61 @@ +package io.kokuwa.maven.helm; + +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.File; + +import org.apache.maven.plugin.MojoExecutionException; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +@DisplayName("helm:dependency-update") +public class DependencyUpdateMojoTest extends AbstractMojoTest { + + @DisplayName("default values") + @Test + void DependencyUpdate(DependencyUpdateMojo mojo) { + assertHelm(mojo, "dependency update src/test/resources/simple"); + } + + @DisplayName("with flag skip") + @Test + void skip(DependencyUpdateMojo mojo) { + assertHelm(mojo.setSkipDependencyUpdate(false).setSkip(true)); + assertHelm(mojo.setSkipDependencyUpdate(true).setSkip(false)); + assertHelm(mojo.setSkipDependencyUpdate(true).setSkip(true)); + } + + @DisplayName("with dependencies") + @Test + void dependencies(DependencyUpdateMojo mojo) { + mojo.setChartDirectory(new File("src/test/resources/dependencies")); + assertHelm(mojo, + "dependency update src/test/resources/dependencies/b", + "dependency update src/test/resources/dependencies/a2", + "dependency update src/test/resources/dependencies/a1", + "dependency update src/test/resources/dependencies"); + } + + @DisplayName("with overwriteLocalDependencies (throws invalid config)") + @Test + void overwriteLocalDependenciesMisconfig(DependencyUpdateMojo mojo) { + mojo.setChartDirectory(new File("src/test/resources/dependencies")); + mojo.setOverwriteLocalDependencies(true); + String message = assertThrows(MojoExecutionException.class, () -> mojo.execute()).getMessage(); + assertTrue(message.startsWith("Null value for 'overwriteDependencyRepository' "), message); + } + + @DisplayName("with overwriteLocalDependencies and overwriteDependencyRepository") + @Test + void overwriteLocalDependencies(DependencyUpdateMojo mojo) { + mojo.setChartDirectory(new File("src/test/resources/dependencies")); + mojo.setOverwriteLocalDependencies(true); + mojo.setOverwriteDependencyRepository("fake.example.org"); + assertHelm(mojo, + "dependency update src/test/resources/dependencies/b", + "dependency update src/test/resources/dependencies/a2", + "dependency update src/test/resources/dependencies/a1", + "dependency update src/test/resources/dependencies"); + } +}