Skip to content

Commit

Permalink
Added helm dependency update goal
Browse files Browse the repository at this point in the history
Signed-off-by: Carter Cundiff <[email protected]>
  • Loading branch information
carter-cundiff committed Sep 13, 2023
1 parent 0e39534 commit 8748c9b
Show file tree
Hide file tree
Showing 6 changed files with 188 additions and 48 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -293,6 +293,7 @@ Parameter | Type | User Property | Required | Description
`<skipTemplate>` | boolean | helm.template.skip | false | skip template goal. Default value is true due to the dry-run goal
`<skipDryRun>` | boolean | helm.dry-run.skip | false | skip dry-run goal
`<skipDependencyBuild>` | boolean | helm.dependency-build.skip | false | skip dependency-build goal
`<skipDependencyUpdate>` | boolean | helm.dependency-update.skip | false | skip dependency-update goal
`<skipPackage>` | boolean | helm.package.skip | false | skip package goal
`<skipUpload>` | boolean | helm.upload.skip | false | skip upload goal
`<insecure>` | boolean | helm.upload.insecure | false | Skip tls certificate checks for the chart upload.
Expand Down
75 changes: 75 additions & 0 deletions src/main/java/io/kokuwa/maven/helm/AbstractDependencyMojo.java
Original file line number Diff line number Diff line change
@@ -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 <code>true</code>, 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:
* <ul>
* <li>For development: mvn clean install</li>
* <li>For deployment: mvn clean deploy -Dhelm.overwriteLocalDependencies=true</li>
* </ul>
*
* @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 <code>true</code> 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 <code>true</code> 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 <code>true</code>.
*
* @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);
}
}
}
49 changes: 2 additions & 47 deletions src/main/java/io/kokuwa/maven/helm/DependencyBuildMojo.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/**
Expand All @@ -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 <code>true</code> to skip invoking dependency-build goal.
Expand All @@ -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 <code>true</code>, 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:
* <ul>
* <li>For development: mvn clean install</li>
* <li>For deployment: mvn clean deploy -Dhelm.overwriteLocalDependencies=true</li>
* </ul>
*
* @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 <code>true</code> 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 <code>true</code> for this to apply.
*
* @since 6.10.0
*/
@Parameter(property = "helm.overwriteDependencyRepository")
private String overwriteDependencyRepository;

@Override
public void execute() throws MojoExecutionException {

Expand All @@ -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()
Expand Down
48 changes: 48 additions & 0 deletions src/main/java/io/kokuwa/maven/helm/DependencyUpdateMojo.java
Original file line number Diff line number Diff line change
@@ -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 <a href="https://helm.sh/docs/helm/helm_dependency_update/">helm dependency-update</a>
* @since 6.10.2
*/
@Mojo(name = "dependency-update", defaultPhase = LifecyclePhase.PROCESS_RESOURCES, threadSafe = true)
@Setter
public class DependencyUpdateMojo extends AbstractDependencyMojo {

/**
* Set this to <code>true</code> 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");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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"));
Expand Down
61 changes: 61 additions & 0 deletions src/test/java/io/kokuwa/maven/helm/DependencyUpdateMojoTest.java
Original file line number Diff line number Diff line change
@@ -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");
}
}

0 comments on commit 8748c9b

Please sign in to comment.