[jboss-dev] Why Maven sucks (part 1)
Carlo de Wolf
cdewolf at redhat.com
Tue Apr 22 07:17:04 EDT 2008
Adrian Brock wrote:
> On Mon, 2008-04-21 at 13:47 -0500, Paul Gier wrote:
>> Carlo de Wolf wrote:
>>> Paul Gier wrote:
>>>> Carlo de Wolf wrote:
>>>>
>>>>> Now if it was a tool focussed on dependency management (like Ivy) it
>>>>> would have solved the real problem: snapshots. So let's do an example:
>>>>> - as trunk -> ejb3-core-0.1-SNAPSHOT ->
>>>>> ejb3-interceptors-0.13-0-SNAPSHOT -> aop-2.1-SNAPSHOT (for the example)
>>>>> If I happen to deploy a new snapshot of aop, it'll break AS build.
>>>>> Why: ejb3-core is not compatible and Maven blindly loads it up. This
>>>>> is not possible in Ivy, it's snapshot repository looks like:
>>>>> - as trunk -> ejb3-core-0.1-20080421 ->
>>>>> ejb3-interceptors-0.13.0-20080421 -> aop-2.1-20080420.
>>>>> If I happen to deploy a new snapshot of aop you get and I run a
>>>>> nightly build on ejb3 you get:
>>>>> - as trunk -> ejb3-core-0.1-20080421 ->
>>>>> ejb3-interceptors-0.13.0-20080421 -> aop-2.1-20080420
>>>>> - ejb3-interceptors-0.13-0-20080422 -> aop-2.1-20080422
>>>>> Since ejb3-core didn't properly build there is no new snapshot for it
>>>>> and AS build is unaffected.
>>>>> Combine this with unit tests and you got a pretty stable setup.
>>>>>
>>>> We can do this using maven also. If you want to tie the build to a
>>>> specific snapshot, just put the full snapshot version in the
>>>> dependency. So for example, ejb3-interceptors you could put version
>>>> "0.13.0-20080417.210958-18". And maven will keep using that snapshot
>>>> build until you change the dependency. The -SNAPSHOT convention is
>>>> just for convenience if you just want to build with the latest until a
>>>> release comes out.
>>> It must be automated. Whenever someone does a mvn deploy, the pom.xml
>>> should be replaced by one not containing any snapshots, but only full
>>> versions.
>>>
>> Just so it's clear what you are asking for, you want dependencies with
>> (-SNAPSHOT) to be replaced with the specific snapshot version (-timstamp-build)
>> during deployment? I could probably add this as an option to the deploy plugin,
>> but I don't know if this would solve the problem.
>>
>
> It wouldn't. The whole point of getting rid of snapshots is so you can
> reproduce the build with a tagged release.
My mistake, we're mixing two issues here:
- stability of the build
- reproducibility of the build
I completely agree that any real release must be reproducible, but is it
feasible to do release for every little nitbit? I say no.
> People need to stop being lazy and create proper releases.
>
> SNAPSHOTS are only useful when you want to know whether a new release
> will work another project.
>
> e.g. before I release the next version of jboss-vfs, I create a SNAPSHOT
> in my *local* repository and update the jbossas build to use it.
> If it works, I do a proper release (NOT a mvn deploy of the SNAPSHOT)
> for others to use.
That's really bad. So if it works on your machine, it's gold? (We know
it is, but that's not good enough on my machine. ;-) )
We must have a stable integration build on a QA machine before we can
declare something releasable.
Also I can't wait for confirmation of integration because it takes 12+
hours to run the suites necessary. So whenever a component passes it's
unit tests, it's ready for integration and we should push it in the repo.
The real question is how can we get a stable integration build. Suppose
we were to use version ranges:
- as trunk
-> ejb3-core-[1.0,2.0) -> ejb3-interceptor-[1.0,2.0) -> aop-[1.0,2.0)
-> aop-[1.0,2.0)
The repository should be (reproducible):
- ejb3-core-1.0-1 -> ejb3-interceptors-1.0-1 -> aop-1.0-1
Now we get aop-1.1, we (automatically) run integration builds, ejb3-core
fails and we get:
- ejb3-core-1.0-1 -> ejb3-interceptors-1.0-1 -> aop-1.0-1
- ejb3-interceptors-1.0-2 -> aop-1.1-1
Now what should AS trunk build look like. According to Maven:
- as trunk
- ejb3-core-1.0-1 -> ejb3-interceptors-1.0-1 -> aop-1.0-1
- aop-1.1-1
Clearly this will break, because we've spotted regression in ejb3-core.
So it should be:
- as trunk
- ejb3-core-1.0-1 -> ejb3-interceptors-1.0-1 -> aop-1.0-1
- aop-1.0-1
with a nice friendly warning message that aop-1.1-1 has been held back,
because of ejb3-core (or it should fail outright).
Carlo
More information about the jboss-development
mailing list