11

I'm new to both maven and git and wanted to get some help in setting a project.

Is there a way to define a goal in the pom to push/pull from git during linked to a maven phase? For example, can I pull from git during the maven install phase?

If yes, how can that be accomplished? I would appreciate any code examples.

Paŭlo Ebermann
  • 73,284
  • 20
  • 146
  • 210
user786045
  • 2,498
  • 4
  • 22
  • 18
  • Why would you like to push or pull during a build? Sounds like a really bad idea. – Stein G. Strindhaug Jun 15 '11 at 14:32
  • It's not really a build. The project contains automated tests. And the way our test framework is setup we need to pull the latest framework code to run the tests from time to time. – user786045 Jun 15 '11 at 14:41
  • 2
    Assuming the pull will fast-forward (no merge resolution needed), isn't just running "git pull repoName" then "mvn arguments" simple enough? If it may not fast forward, how should maven handle it? – Stein G. Strindhaug Jun 15 '11 at 14:46

3 Answers3

11

Good idea or not, here's how you could do a checkout (pull clone from Github) using Maven. Have your pom.xml look like this:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>
<groupId>br.com.javamagazine</groupId>
<artifactId>engesoft</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>engesoft Maven Webapp</name>
<url>http://maven.apache.org</url>

<scm>
    <connection>scm:git:git://github.com/vitorsouza/EngeSoft.git</connection>
    <developerConnection>scm:git:https://vitorsouza@github.com/vitorsouza/EngeSoft.git</developerConnection>
    <url>https://github.com/vitorsouza/EngeSoft</url>
</scm>
</project>

Then use mvn scm:checkout. When I ran this, it pulled the code to folder target/engesoft. There's probably a way to configure it to place it somewhere else. Check out the following pages:

Vítor E. Silva Souza
  • 1,575
  • 1
  • 18
  • 23
4

Instead of doing this during the Maven build, use a CI server like Jenkins. It will do the git pull before running maven, so the build tool can concentrate on it's main purpose: Building source code.

This also makes it more simple for you to develop since pull's will only happen when you want them. If you pull all the time, another developer can change something and you will get errors that you don't expect.

Aaron Digulla
  • 321,842
  • 108
  • 597
  • 820
2

The scm:checkout goal Vitor is referring to is a clone, not a pull (huge difference in Git).

I had to use the exec goal to do what you're describing. I also didn't want to do an entire clone each time there was a build. Instead, I use git reset --hard and then pull -f origin Release:Release (via exec).

If I find a better way (and there HAS to be one) I'll post it here.

René Höhle
  • 26,716
  • 22
  • 73
  • 82