Skip to content

Commit

Permalink
Pom doesn't get deployed using Maven Install plugin 3+ (#46)
Browse files Browse the repository at this point in the history
  • Loading branch information
yahavi authored Nov 27, 2022
1 parent 1c5f3dc commit d297c84
Show file tree
Hide file tree
Showing 72 changed files with 1,391 additions and 47 deletions.
65 changes: 20 additions & 45 deletions src/main/java/org/jfrog/buildinfo/deployment/BuildInfoRecorder.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,6 @@
import org.apache.maven.execution.MavenSession;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.artifact.ProjectArtifactMetadata;
import org.apache.maven.repository.legacy.metadata.ArtifactMetadata;
import org.jfrog.build.extractor.BuildInfoExtractor;
import org.jfrog.build.extractor.BuildInfoExtractorUtils;
import org.jfrog.build.extractor.builder.ArtifactBuilder;
Expand Down Expand Up @@ -83,13 +81,13 @@ public void projectSucceeded(ExecutionEvent event) {
"' will not be deployed because 'maven.deploy.skip' property is true.");
} else {
addArtifacts(project);
addArtifactsToCurrentModule(project, moduleBuilder);
}

// Fill currentModuleDependencies
addDependencies(project);

// Build module
addArtifactsToCurrentModule(project, moduleBuilder);
addDependenciesToCurrentModule(moduleBuilder);
buildInfoBuilder.addModule(moduleBuilder.build());

Expand Down Expand Up @@ -237,8 +235,6 @@ private void addArtifactsToCurrentModule(MavenProject project, ModuleBuilder mod
boolean excludeArtifactsFromBuild = conf.publisher.isFilterExcludedArtifactsFromBuild();

boolean pomFileAdded = false;
Artifact nonPomArtifact = null;
String pomFileName = null;

for (Artifact moduleArtifact : artifacts) {
String artifactId = moduleArtifact.getArtifactId();
Expand All @@ -256,32 +252,23 @@ private void addArtifactsToCurrentModule(MavenProject project, ModuleBuilder mod
// project.getFile() returns the project pom file
artifactFile = project.getFile();
}
} else {
boolean pomExist = moduleArtifact.getMetadataList().stream()
.anyMatch(artifactMetadata -> artifactMetadata instanceof ProjectArtifactMetadata);
if (pomExist) {
nonPomArtifact = moduleArtifact;
pomFileName = StringUtils.removeEnd(artifactName, artifactExtension) + "pom";
}
}

org.jfrog.build.extractor.ci.Artifact artifact = new ArtifactBuilder(artifactName).type(type).build();
String groupId = moduleArtifact.getGroupId();
String deploymentPath = getDeploymentPath(groupId, artifactId, artifactVersion, artifactClassifier, artifactExtension);
if (isFile(artifactFile)) {
boolean pathConflicts = PatternMatcher.pathConflicts(deploymentPath, patterns);
addArtifactToBuildInfo(moduleBuilder, artifact, pathConflicts, excludeArtifactsFromBuild);
addDeployableArtifact(moduleBuilder, artifact, artifactFile, pathConflicts, moduleArtifact.getGroupId(),
artifactId, artifactVersion, artifactClassifier, artifactExtension);
if (!isFile(artifactFile)) {
continue;
}
org.jfrog.build.extractor.ci.Artifact artifact = new ArtifactBuilder(artifactName).type(type).build();
String deploymentPath = getDeploymentPath(moduleArtifact.getGroupId(), artifactId, artifactVersion, artifactClassifier, artifactExtension);
boolean pathConflicts = PatternMatcher.pathConflicts(deploymentPath, patterns);
addArtifactToBuildInfo(moduleBuilder, artifact, pathConflicts, excludeArtifactsFromBuild);
addDeployableArtifact(moduleBuilder, artifact, artifactFile, pathConflicts, moduleArtifact.getGroupId(),
artifactId, artifactVersion, artifactClassifier, artifactExtension);
}
/*
* In case of non packaging Pom project module, we need to create the pom file from the ProjectArtifactMetadata on the Artifact
* In case of non packaging Pom project module, we need to create the pom file from the project's Artifact
*/
if (!pomFileAdded && nonPomArtifact != null) {
String deploymentPath = getDeploymentPath(nonPomArtifact.getGroupId(), nonPomArtifact.getArtifactId(),
nonPomArtifact.getVersion(), nonPomArtifact.getClassifier(), "pom");
addPomArtifact(moduleBuilder, nonPomArtifact, patterns, deploymentPath, pomFileName, excludeArtifactsFromBuild);
if (!pomFileAdded) {
addPomArtifact(project, moduleBuilder, patterns, excludeArtifactsFromBuild);
}
}

Expand Down Expand Up @@ -311,29 +298,17 @@ private void addDependenciesToCurrentModule(ModuleBuilder moduleBuilder) {
*
* @param moduleBuilder - The current Maven module
*/
private void addPomArtifact(ModuleBuilder moduleBuilder, Artifact nonPomArtifact, IncludeExcludePatterns patterns,
String deploymentPath, String pomFileName, boolean excludeArtifactsFromBuild) {

ArtifactMetadata artifactMetadata = nonPomArtifact.getMetadataList().stream()
.filter(artifact -> artifact instanceof ProjectArtifactMetadata)
.findFirst().orElse(null);
if (artifactMetadata == null) {
// Couldn't find pom
return;
}

File pomFile = ((ProjectArtifactMetadata) artifactMetadata).getFile();
if (!isFile(pomFile)) {
// Couldn't find pom
return;
}
private void addPomArtifact(MavenProject project, ModuleBuilder moduleBuilder, IncludeExcludePatterns patterns, boolean excludeArtifactsFromBuild) {
File pomFile = project.getFile();
Artifact projectArtifact = project.getArtifact();
String artifactName = getArtifactName(projectArtifact.getArtifactId(), projectArtifact.getBaseVersion(), projectArtifact.getClassifier(), "pom");
org.jfrog.build.extractor.ci.Artifact pomArtifact = new ArtifactBuilder(artifactName).type("pom").build();

ArtifactBuilder artifactBuilder = new ArtifactBuilder(pomFileName).type("pom");
org.jfrog.build.extractor.ci.Artifact pomArtifact = artifactBuilder.build();
String deploymentPath = getDeploymentPath(projectArtifact.getGroupId(), projectArtifact.getArtifactId(), projectArtifact.getVersion(), projectArtifact.getClassifier(), "pom");
boolean pathConflicts = PatternMatcher.pathConflicts(deploymentPath, patterns);
addArtifactToBuildInfo(moduleBuilder, pomArtifact, pathConflicts, excludeArtifactsFromBuild);
addDeployableArtifact(moduleBuilder, pomArtifact, pomFile, pathConflicts, nonPomArtifact.getGroupId(),
nonPomArtifact.getArtifactId(), nonPomArtifact.getVersion(), nonPomArtifact.getClassifier(), "pom");
addDeployableArtifact(moduleBuilder, pomArtifact, pomFile, pathConflicts, projectArtifact.getGroupId(),
projectArtifact.getArtifactId(), projectArtifact.getVersion(), projectArtifact.getClassifier(), "pom");
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,11 +66,21 @@ public class ArtifactoryPluginITest extends TestCase {
"/artifactory/libs-snapshot-local/org/example/maven-archetype-simple/1.0-SNAPSHOT/maven-archetype-simple-1.0-SNAPSHOT.pom"
};

public void testMultiModuleInstallPluginVer2() throws Exception {
// Test module-module project with maven-install-plugin:2.5.2
testMultiModule("multi-module-install-plugin-2");
}

public void testMultiModuleInstallPluginVer3() throws Exception {
// Test module-module project with maven-install-plugin:3.1.0
testMultiModule("multi-module-install-plugin-3");
}

@SuppressWarnings("HttpUrlsUsage")
public void testMultiModule() throws Exception {
private void testMultiModule(String projectName) throws Exception {
try (ClientAndServer mockServer = ClientAndServer.startClientAndServer(8081)) {
initializeMockServer(mockServer);
runProject("artifactory-maven-plugin-example");
runProject(projectName);

// Check deployed artifacts
checkDeployedArtifacts(mockServer, MULTI_MODULE_ARTIFACTS, true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,11 @@
<artifactId>maven-source-plugin</artifactId>
<version>2.1.2</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ref: refs/heads/master
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote "origin"]
url = https://github.com/jfrog/project-examples.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Unnamed repository; edit this file 'description' to name the repository.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#!/bin/sh
#
# An example hook script to check the commit log message taken by
# applypatch from an e-mail message.
#
# The hook should exit with non-zero status after issuing an
# appropriate message if it wants to stop the commit. The hook is
# allowed to edit the commit message file.
#
# To enable this hook, rename this file to "applypatch-msg".

. git-sh-setup
commitmsg="$(git rev-parse --git-path hooks/commit-msg)"
test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"}
:
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#!/bin/sh
#
# An example hook script to check the commit log message.
# Called by "git commit" with one argument, the name of the file
# that has the commit message. The hook should exit with non-zero
# status after issuing an appropriate message if it wants to stop the
# commit. The hook is allowed to edit the commit message file.
#
# To enable this hook, rename this file to "commit-msg".

# Uncomment the below to add a Signed-off-by line to the message.
# Doing this in a hook is a bad idea in general, but the prepare-commit-msg
# hook is more suited to it.
#
# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"

# This example catches duplicate Signed-off-by lines.

test "" = "$(grep '^Signed-off-by: ' "$1" |
sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || {
echo >&2 Duplicate Signed-off-by lines.
exit 1
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
#!/usr/bin/perl

use strict;
use warnings;
use IPC::Open2;

# An example hook script to integrate Watchman
# (https://facebook.github.io/watchman/) with git to speed up detecting
# new and modified files.
#
# The hook is passed a version (currently 2) and last update token
# formatted as a string and outputs to stdout a new update token and
# all files that have been modified since the update token. Paths must
# be relative to the root of the working tree and separated by a single NUL.
#
# To enable this hook, rename this file to "query-watchman" and set
# 'git config core.fsmonitor .git/hooks/query-watchman'
#
my ($version, $last_update_token) = @ARGV;

# Uncomment for debugging
# print STDERR "$0 $version $last_update_token\n";

# Check the hook interface version
if ($version ne 2) {
die "Unsupported query-fsmonitor hook version '$version'.\n" .
"Falling back to scanning...\n";
}

my $git_work_tree = get_working_dir();

my $retry = 1;

my $json_pkg;
eval {
require JSON::XS;
$json_pkg = "JSON::XS";
1;
} or do {
require JSON::PP;
$json_pkg = "JSON::PP";
};

launch_watchman();

sub launch_watchman {
my $o = watchman_query();
if (is_work_tree_watched($o)) {
output_result($o->{clock}, @{$o->{files}});
}
}

sub output_result {
my ($clockid, @files) = @_;

# Uncomment for debugging watchman output
# open (my $fh, ">", ".git/watchman-output.out");
# binmode $fh, ":utf8";
# print $fh "$clockid\n@files\n";
# close $fh;

binmode STDOUT, ":utf8";
print $clockid;
print "\0";
local $, = "\0";
print @files;
}

sub watchman_clock {
my $response = qx/watchman clock "$git_work_tree"/;
die "Failed to get clock id on '$git_work_tree'.\n" .
"Falling back to scanning...\n" if $? != 0;

return $json_pkg->new->utf8->decode($response);
}

sub watchman_query {
my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty')
or die "open2() failed: $!\n" .
"Falling back to scanning...\n";

# In the query expression below we're asking for names of files that
# changed since $last_update_token but not from the .git folder.
#
# To accomplish this, we're using the "since" generator to use the
# recency index to select candidate nodes and "fields" to limit the
# output to file names only. Then we're using the "expression" term to
# further constrain the results.
if (substr($last_update_token, 0, 1) eq "c") {
$last_update_token = "\"$last_update_token\"";
}
my $query = <<" END";
["query", "$git_work_tree", {
"since": $last_update_token,
"fields": ["name"],
"expression": ["not", ["dirname", ".git"]]
}]
END

# Uncomment for debugging the watchman query
# open (my $fh, ">", ".git/watchman-query.json");
# print $fh $query;
# close $fh;

print CHLD_IN $query;
close CHLD_IN;
my $response = do {local $/; <CHLD_OUT>};

# Uncomment for debugging the watch response
# open ($fh, ">", ".git/watchman-response.json");
# print $fh $response;
# close $fh;

die "Watchman: command returned no output.\n" .
"Falling back to scanning...\n" if $response eq "";
die "Watchman: command returned invalid output: $response\n" .
"Falling back to scanning...\n" unless $response =~ /^\{/;

return $json_pkg->new->utf8->decode($response);
}

sub is_work_tree_watched {
my ($output) = @_;
my $error = $output->{error};
if ($retry > 0 and $error and $error =~ m/unable to resolve root .* directory (.*) is not watched/) {
$retry--;
my $response = qx/watchman watch "$git_work_tree"/;
die "Failed to make watchman watch '$git_work_tree'.\n" .
"Falling back to scanning...\n" if $? != 0;
$output = $json_pkg->new->utf8->decode($response);
$error = $output->{error};
die "Watchman: $error.\n" .
"Falling back to scanning...\n" if $error;

# Uncomment for debugging watchman output
# open (my $fh, ">", ".git/watchman-output.out");
# close $fh;

# Watchman will always return all files on the first query so
# return the fast "everything is dirty" flag to git and do the
# Watchman query just to get it over with now so we won't pay
# the cost in git to look up each individual file.
my $o = watchman_clock();
$error = $output->{error};

die "Watchman: $error.\n" .
"Falling back to scanning...\n" if $error;

output_result($o->{clock}, ("/"));
$last_update_token = $o->{clock};

eval { launch_watchman() };
return 0;
}

die "Watchman: $error.\n" .
"Falling back to scanning...\n" if $error;

return 1;
}

sub get_working_dir {
my $working_dir;
if ($^O =~ 'msys' || $^O =~ 'cygwin') {
$working_dir = Win32::GetCwd();
$working_dir =~ tr/\\/\//;
} else {
require Cwd;
$working_dir = Cwd::cwd();
}

return $working_dir;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#!/bin/sh
#
# An example hook script to prepare a packed repository for use over
# dumb transports.
#
# To enable this hook, rename this file to "post-update".

exec git update-server-info
Loading

0 comments on commit d297c84

Please sign in to comment.