/* * Copyright 2005-2016 Red Hat, Inc. * * Red Hat licenses this file to you under the Apache License, version * 2.0 (the "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or * implied. See the License for the specific language governing * permissions and limitations under the License. */ package io.fabric8.maven; import io.fabric8.utils.Files; import io.fabric8.utils.Objects; import io.fabric8.utils.Strings; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.project.MavenProject; import org.eclipse.jgit.api.CommitCommand; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.PushCommand; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.storage.file.FileRepositoryBuilder; import java.io.File; import java.util.List; /** * Adds any changes to the Helm charts, commits them to the charts git repository and pushes changes */ @Mojo(name = "helm-push", defaultPhase = LifecyclePhase.PACKAGE) public class HelmPushMojo extends HelmMojo { /** * The commit message for changes to the helm chart repository */ @Parameter(property = "fabric8.helm.commitMessage", defaultValue = "Adding charts for ${project.groupId}/${project.artifactId} version ${project.version}") private String commitMessage; /** * Should we push the git commits to the helm chart repository */ @Parameter(property = "fabric8.helm.push", defaultValue = "true") private boolean pushChanges; /** * The user name used for git commits to the helm chart repository */ @Parameter(property = "fabric8.helm.username") private String userName; /** * The email address used for git commits to the helm chart repository */ @Parameter(property = "fabric8.helm.email") private String emailAddress; @Parameter(defaultValue = "${reactorProjects}", readonly = true, required = true) private List<MavenProject> reactorProjects; @Override public void execute() throws MojoExecutionException, MojoFailureException { if (!isRootReactorBuild()) { getLog().info("Not the root reactor build so not committing changes"); return; } File outputDir = getHelmRepoFolder(); if (!Files.isDirectory(outputDir)) { throw new MojoExecutionException("No helm repository exists for " + outputDir + ". Did you run `mvn fabric8:helm` yet?"); } File gitFolder = new File(outputDir, ".git"); if (!Files.isDirectory(gitFolder)) { throw new MojoExecutionException("No helm git repository exists for " + gitFolder + ". Did you run `mvn fabric8:helm` yet?"); } FileRepositoryBuilder builder = new FileRepositoryBuilder(); Git git = null; try { Repository repository = builder.setGitDir(gitFolder) .readEnvironment() // scan environment GIT_* variables .findGitDir() // scan up the file system tree .build(); git = new Git(repository); git.add().addFilepattern(".").call(); } catch (Exception e) { throw new MojoExecutionException("Failed to add files to the helm git repository: " + e, e); } CommitCommand commit = git.commit().setAll(true).setMessage(commitMessage); PersonIdent author = null; if (Strings.isNotBlank(userName) && Strings.isNotBlank(emailAddress)) { author = new PersonIdent(userName, emailAddress); } if (author != null) { commit = commit.setAuthor(author); } try { RevCommit answer = commit.call(); getLog().info("Committed " + answer.getId() + " " + answer.getFullMessage()); } catch (GitAPIException e) { throw new MojoExecutionException("Failed to commit changes to help repository: " + e, e); } if (pushChanges) { PushCommand push = git.push(); try { push.setRemote(remoteRepoName).call(); getLog().info("Pushed commits upstream to " + getHelmGitUrl()); } catch (GitAPIException e) { throw new MojoExecutionException("Failed to push helm git changes to remote repository " + remoteRepoName + ": " + e, e); } } } protected boolean isRootReactorBuild() { if (reactorProjects == null || reactorProjects.size() <= 1) { return true; } MavenProject project = getProject(); if (project != null) { MavenProject parent = project.getParent(); if (parent != null) { if (!containsProject(reactorProjects, parent)) { return true; } } } return false; } protected static boolean containsProject(List<MavenProject> projects, MavenProject actualProject) { for (MavenProject project : projects) { if (projectsEqual(project, actualProject)) { return true; } } return false; } protected static boolean projectsEqual(MavenProject project1, MavenProject project2) { return Objects.equal(project1.getGroupId(), project2.getGroupId()) && Objects.equal(project1.getArtifactId(), project2.getArtifactId()) && Objects.equal(project1.getVersion(), project2.getVersion()); } }