Uploaded image for project: 'Jenkins'
  1. Jenkins
  2. JENKINS-6468

Ivy plugin cannot handle custom latest strategies and conflict managers

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: Minor Minor
    • ivy-plugin
    • None

      My company uses a different versioning notation, e.g. R1A01 instead of 1.0.1-1. This has resulted in a custom latest strategy which I add to each project as follows:

      <dependencies>
      <dependency org="com.bla.bla" name="ftf" rev="R1A01" conf="test-compile->api;test-runtime->runtime"/>
      <conflict org="com.bla.bla.*" manager="latest-product-revision-conflict-manager"/>
      </dependencies>

      This works fine outside Hudson of course but when running the build in Hudson, I get the following exception:

      ERROR: Failed to parse ivy.xml files
      java.io.IOException: Unable to parse ivy descriptors
      at hudson.ivy.IvyModuleSetBuild$RunnerImpl.parseIvyDescriptorFiles(IvyModuleSetBuild.java:532)
      at hudson.ivy.IvyModuleSetBuild$RunnerImpl.doRun(IvyModuleSetBuild.java:368)
      at hudson.model.AbstractBuild$AbstractRunner.run(AbstractBuild.java:416)
      at hudson.model.Run.run(Run.java:1244)
      at hudson.ivy.IvyModuleSetBuild.run(IvyModuleSetBuild.java:283)
      at hudson.model.ResourceController.execute(ResourceController.java:88)
      at hudson.model.Executor.run(Executor.java:122)
      Caused by: java.lang.NullPointerException
      at org.apache.ivy.core.sort.CollectionOfModulesToSort.addToModulesByModuleId(CollectionOfModulesToSort.java:71)
      at org.apache.ivy.core.sort.CollectionOfModulesToSort.<init>(CollectionOfModulesToSort.java:66)
      at org.apache.ivy.core.sort.ModuleDescriptorSorter.<init>(ModuleDescriptorSorter.java:51)
      at org.apache.ivy.core.sort.SortEngine.sortModuleDescriptors(SortEngine.java:99)
      at org.apache.ivy.Ivy.sortModuleDescriptors(Ivy.java:639)
      at hudson.ivy.IvyModuleSetBuild$IvyXmlParser.call(IvyModuleSetBuild.java:798)
      at hudson.ivy.IvyModuleSetBuild$IvyXmlParser.call(IvyModuleSetBuild.java:744)
      at hudson.remoting.UserRequest.perform(UserRequest.java:114)
      at hudson.remoting.UserRequest.perform(UserRequest.java:48)
      at hudson.remoting.Request$2.run(Request.java:270)
      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
      at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
      at java.util.concurrent.FutureTask.run(FutureTask.java:138)
      at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
      at java.lang.Thread.run(Thread.java:619)

      which is understandable as the embedded Ivy has no notion of our custom conflict manager/latest strategy.

      Is there any way to make the plugin to disregard this configuration line as it has no impact on the plugin itself or make it work in some other way? I have seen that Ivy configurations can be defined on main Hudson configuration page but I do not understand how they can be used from a project/job (Ivy project type).

          [JENKINS-6468] Ivy plugin cannot handle custom latest strategies and conflict managers

          The Ivy configurations in the global config page only apply to the Freestyle project Ivy trigger. The Ivy project support was coded separately and they don't really tie in together.

          I don't think there is any way to just ignore that line since the actual parsing is done by Ivy itself. I think the only solution would be to configure Ivy properly prior to parsing the ivy.xml files (and to do that the project would need to know where your ivy settings xml file is).

          For a particular build, where is your ivy settings xml file usually located? Is it always checked out at some path relative to the workspace? Is that path different for each project? The global config for ivy settings never made much sense to me as we always have our ivysettings.xml file checked out in our workspace, and depending on what slave machine it's run on it could be at a different path.

          The solution I'm leaning towards would be a per-project textfield where you could specify a workspace-relative path to the settings file. The downside is that this would need to be configured in every project.

          What are your thoughts on this?

          Timothy Bingaman added a comment - The Ivy configurations in the global config page only apply to the Freestyle project Ivy trigger. The Ivy project support was coded separately and they don't really tie in together. I don't think there is any way to just ignore that line since the actual parsing is done by Ivy itself. I think the only solution would be to configure Ivy properly prior to parsing the ivy.xml files (and to do that the project would need to know where your ivy settings xml file is). For a particular build, where is your ivy settings xml file usually located? Is it always checked out at some path relative to the workspace? Is that path different for each project? The global config for ivy settings never made much sense to me as we always have our ivysettings.xml file checked out in our workspace, and depending on what slave machine it's run on it could be at a different path. The solution I'm leaning towards would be a per-project textfield where you could specify a workspace-relative path to the settings file. The downside is that this would need to be configured in every project. What are your thoughts on this?

          bloomper added a comment -

          Yes, the ivy settings xml is always checked out and is available through a relative path which could change from project to project as we have a hierarchical project structure, i.e. the number of ..'s required differ. We are using Clearcase for SCM so we do not have the luxury of svn:externals and for some reason, we do not feel adventurous enough for VOB symbolic links.

          For us, it would be perfect with a per-project configuration property. I suppose that you can make it optional? A more advanced setup would be that you can define the ivy settings xml on a global level (similar to what you have today for freestyle projects) but can override it on project level.

          bloomper added a comment - Yes, the ivy settings xml is always checked out and is available through a relative path which could change from project to project as we have a hierarchical project structure, i.e. the number of ..'s required differ. We are using Clearcase for SCM so we do not have the luxury of svn:externals and for some reason, we do not feel adventurous enough for VOB symbolic links. For us, it would be perfect with a per-project configuration property. I suppose that you can make it optional? A more advanced setup would be that you can define the ivy settings xml on a global level (similar to what you have today for freestyle projects) but can override it on project level.

          Cool, I'll try and get it done as soon as I can. With testing and all that and the fact that I work on this alongside my day job I'll hopefully have something out by the end of the week

          Timothy Bingaman added a comment - Cool, I'll try and get it done as soon as I can. With testing and all that and the fact that I work on this alongside my day job I'll hopefully have something out by the end of the week

          bloomper added a comment -

          Thanks! Really appreciate your efforts!

          bloomper added a comment - Thanks! Really appreciate your efforts!

          Code changed in hudson
          User: : tbingaman
          Path:
          trunk/hudson/plugins/ivy/src/main/java/hudson/ivy/IvyModuleSet.java
          trunk/hudson/plugins/ivy/src/main/java/hudson/ivy/IvyModuleSetBuild.java
          trunk/hudson/plugins/ivy/src/main/resources/hudson/ivy/IvyModuleSet/configure-entries.jelly
          trunk/hudson/plugins/ivy/src/main/resources/hudson/ivy/IvyModuleSet/help-ivySettingsFile.html
          trunk/hudson/plugins/ivy/src/main/resources/hudson/ivy/Messages.properties
          http://jenkins-ci.org/commit/30898
          Log:
          [FIXED JENKINS-6468] Added an option to specify an ivy settings file for Ivy Projects

          SCM/JIRA link daemon added a comment - Code changed in hudson User: : tbingaman Path: trunk/hudson/plugins/ivy/src/main/java/hudson/ivy/IvyModuleSet.java trunk/hudson/plugins/ivy/src/main/java/hudson/ivy/IvyModuleSetBuild.java trunk/hudson/plugins/ivy/src/main/resources/hudson/ivy/IvyModuleSet/configure-entries.jelly trunk/hudson/plugins/ivy/src/main/resources/hudson/ivy/IvyModuleSet/help-ivySettingsFile.html trunk/hudson/plugins/ivy/src/main/resources/hudson/ivy/Messages.properties http://jenkins-ci.org/commit/30898 Log: [FIXED JENKINS-6468] Added an option to specify an ivy settings file for Ivy Projects

          Available in version 1.7 (should show up on the update site tomorrow hopefully)

          Timothy Bingaman added a comment - Available in version 1.7 (should show up on the update site tomorrow hopefully)

          bloomper added a comment -

          Sorry for not getting back until now.

          I think I have a problem but have not been able to fully investigate it (our environment is not doing too well at the moment so it has been difficult to test). As we have not only custom latest strategies but also our own implementations, where should I put our JAR file so that the plugin has access to it at build time? We are using slaves if that makes any difference.

          bloomper added a comment - Sorry for not getting back until now. I think I have a problem but have not been able to fully investigate it (our environment is not doing too well at the moment so it has been difficult to test). As we have not only custom latest strategies but also our own implementations, where should I put our JAR file so that the plugin has access to it at build time? We are using slaves if that makes any difference.

          bloomper added a comment -

          Never mind. Once our environment was working again, I just placed our JAR file in <hudson home>/plugins/ivy/WEB-INF/lib and it worked.

          bloomper added a comment - Never mind. Once our environment was working again, I just placed our JAR file in <hudson home>/plugins/ivy/WEB-INF/lib and it worked.

          Sweet, glad to hear it's working. I can't really think of any better way to load up your custom classes than what you've done. You'll just have to remember to replace your jar every time you update the Ivy plugin. Not ideal, but workable I guess.

          Timothy Bingaman added a comment - Sweet, glad to hear it's working. I can't really think of any better way to load up your custom classes than what you've done. You'll just have to remember to replace your jar every time you update the Ivy plugin. Not ideal, but workable I guess.

            tbingaman Timothy Bingaman
            bloomper bloomper
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved: