views:

462

answers:

1

Hey folks,

I'm using ant, ivy and nexus repo manager to build and store my artifacts. I managed to get everything working: dependency resolution and publishing. Until I hit a problem... (of course!).

I was publishing to a 'release' repo in nexus, which is locked to 'disable redeploy' (even if you change the setting to 'allow redeploy' (really lame UI there imo). You can imagine how pissed off I was getting when my changes weren't updating through the repo before I realised that this was happening.

Anyway, I now have to switch everything to use a 'Snapshot' repo in nexus. Problem is that this messes up my publish. I've tried a variety of things, including extensive googling, and haven't got anywhere whatsoever. The error I get is a bad PUT request, error code 400.

Can someone who has got this working please give me a pointer on what I'm missing.

Many thanks,

Alastair

fyi, here's my config:

Note that I have removed any attempts at getting snapshots to work as I didn't know what was actually (potentially) useful and what was complete guff. This is therefore the working release-only setup.

Also, please note that I've added the XXX-API ivy.xml for info only. I can't even get the xxx-common to publish (and that doesn't even have dependencies).

Ant task:

<target name="publish" depends="init-publish">

  <property name="project.generated.ivy.file" value="${project.artifact.dir}/ivy.xml"/>
  <property name="project.pom.file" value="${project.artifact.dir}/${project.handle}.pom"/>

  <echo message="Artifact dir: ${project.artifact.dir}"/>
  <ivy:deliver 
    deliverpattern="${project.generated.ivy.file}" 
    organisation="${project.organisation}" 
    module="${project.artifact}" 
    status="integration" 
    revision="${project.revision}" 
    pubrevision="${project.revision}" /> 

  <ivy:resolve  />

  <ivy:makepom 
    ivyfile="${project.generated.ivy.file}" 
    pomfile="${project.pom.file}"/>

  <ivy:publish 
     resolver="${ivy.omnicache.publisher}" 
     module="${project.artifact}"
     organisation="${project.organisation}"
     revision="${project.revision}"
     pubrevision="${project.revision}"
     pubdate="now" 
     overwrite="true"  
     publishivy="true" 
     status="integration"
     artifactspattern="${project.artifact.dir}/[artifact]-[revision](-[classifier]).[ext]" 
     />


 </target> 

Couple of ivy files to give an idea of internal dependencies:

XXX-Common project:

<ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd"&gt;
    <info
        organisation="com.myorg.xxx"
        module="xxx_common"
        status="integration"
        revision="1.0">
 </info>
 <publications>  
     <artifact name="xxx_common" type="jar" ext="jar"/>  
     <artifact name="xxx_common" type="pom" ext="pom"/>       
 </publications>  
    <dependencies>
    </dependencies>
</ivy-module>

XXX-API project:

<ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd"&gt;
    <info
        organisation="com.myorg.xxx"
        module="xxx_api"
        status="integration"
        revision="1.0">
 </info>
 <publications>  
     <artifact name="xxx_api" type="jar" ext="jar"/>  
     <artifact name="xxx_api" type="pom" ext="pom"/>       
 </publications>  
    <dependencies> 
        <dependency org="com.myorg.xxx" name="xxx_common" rev="1.0" transitive="true" />
    </dependencies>
</ivy-module>

IVY Settings.xml:

<ivysettings>

 <properties file="${ivy.project.dir}/project.properties" />


 <settings
  defaultResolver="chain" 
  defaultConflictManager="all" />

 <credentials host="${ivy.credentials.host}" realm="Sonatype Nexus Repository Manager" username="${ivy.credentials.username}" passwd="${ivy.credentials.passwd}" />  

 <caches>
   <cache name="ivy.cache" basedir="${ivy.cache.dir}" />
 </caches> 

 <resolvers>
  <ibiblio name="xxx_publisher" m2compatible="true" root="${ivy.xxx.publish.url}" />
  <chain name="chain">
   <url name="xxx">  
    <ivy pattern="${ivy.xxx.repo.url}/com/myorg/xxx/[module]/[revision]/ivy-[revision].xml" />  
    <artifact pattern="${ivy.xxx.repo.url}/com/myorg/xxx/[module]/[revision]/[artifact]-[revision].[ext]" /> 
   </url>         
   <ibiblio name="xxx" m2compatible="true" root="${ivy.xxx.repo.url}"/>
   <ibiblio name="public" m2compatible="true" root="${ivy.master.repo.url}" />      
   <url name="com.springsource.repository.bundles.release">  
    <ivy pattern="http://repository.springsource.com/ivy/bundles/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" />  
    <artifact pattern="http://repository.springsource.com/ivy/bundles/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" /> 
   </url> 
   <url name="com.springsource.repository.bundles.external">  
    <ivy pattern="http://repository.springsource.com/ivy/bundles/external/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" />  
    <artifact pattern="http://repository.springsource.com/ivy/bundles/external/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" /> 
   </url> 
  </chain>
 </resolvers>



</ivysettings>
A: 

w00h00t.

(There's something cathartic about asking the world for help. Usually you fix the problem much faster, even without a response).

Anyway, for the interested it came down to a couple of things:

a) the addition of -SNAPSHOT to all revisions. This involved forking a second ivy.xml -> ivy.SNAPSHOT.xml and referencing that explicitly in the ivy ant tasks. b) given that this is a manual addition I had to go through my entire tree of build files and provide parallel paths for release and snapshot flows. This, in my opinion, is lame. But, as I guess we're extremely unlikely to invent any other type of flow, this probably won't bloat, and 2 parallel flows is where it will stay. c) I specified various hints to ivy to check for updates to the snapshots. e.g. checkUpdated="true" and changePattern=".*-SNAPSHOT" on the resolver. And the addition of

<modules org="myorg" name=*" resolveMode="dynamic" />

Still, it'd be nice if there had been automatic integration with snapshot stuff. A bit of (optional) cleverness on the part of ivy. Let's face it, maven repos like nexus ARE really useful and I'm certainly using ivy only to get round maven's crappy build process. I like using nexus.

Anyway. If anyone ever wants to question further on this, feel free.

Uberpuppy

related questions