On Nov 22, 2012, at 11:41 AM, Vincent Massol <[email protected]> wrote:
> > On Nov 22, 2012, at 11:28 AM, Vincent Massol <[email protected]> wrote: > >> >> On Feb 15, 2012, at 4:58 PM, Vincent Massol <[email protected]> wrote: >> >>> >>> On Feb 15, 2012, at 4:10 PM, Vincent Massol wrote: >>> >>>> >>>> On Jan 25, 2012, at 5:02 PM, Vincent Massol wrote: >>>> >>>>> >>>>> On Jan 15, 2012, at 11:27 AM, Vincent Massol wrote: >>>>> >>>>>> Hi devs, >>>>>> >>>>>> I've started an experiment to have colocated functional tests (CFT), >>>>>> which means having the functional tests located where the functional >>>>>> domain sources are located instead of in XE. >>>>>> >>>>>> For example for the linkchecker module we have the following directories: >>>>>> >>>>>> xwiki-platform-linkchecker/ >>>>>> |_ xwiki-platform-linkchecker-refresher (JAR) >>>>>> |_ xwiki-platform-linkchecker-ui (XAR) >>>>>> |_ xwiki-platform-linkchecker-tests (functional tests) >>>>>> >>>>>> The rationale for this was: >>>>>> * Have everything about a functional domain self-contained (source and >>>>>> all tests) >>>>>> * Making it easy to run only tests for a given functional domain >>>>>> * Move page objects to the functional domain too >>>>>> >>>>>> Here are some findings about this experiment: >>>>>> >>>>>> A - It takes about 30 seconds to generate the adhoc packaging and start >>>>>> XWiki. This would be done for each module having functional tests >>>>>> compared to only once if all tests were executed in XE >>>>>> B- The package mojo created to generate a full packaging is quite nice >>>>>> and I plan to reuse it in lots of other places in our build >>>>>> (distributions, database, places where we need XWiki configuration files) >>>>>> C- We will not be able to run platform builds in Maven multithreaded >>>>>> mode since it would mean that several XWiki instance could be started at >>>>>> the same time on the same port >>>>>> D- The colocated functional test module >>>>>> >>>>>> Solutions/ideas: >>>>>> >>>>>> * One idea to overcome A and C would to have the following setup: >>>>>> ** Keep functional test modules colocated but have them generate a test >>>>>> JAR >>>>>> ** Still allow running functional tests from the colocated module (this >>>>>> makes it easy to verify no regression was introduced when making changes >>>>>> to a given domain) >>>>>> ** Have functional tests in XE depend on the colocated functional test >>>>>> module JARs and configure Jenkins to run all functional tests from XE >>>>>> only >>>>>> >>>>>> * Another solution to overcome C is to auto-discover the port to use in >>>>>> our XWiki startup script (and save it in a file so that the stop script >>>>>> can use it). >>>>>> >>>>>> I think the first proposal is the best one and brings the best of the 2 >>>>>> worlds. >>>>> >>>>> Actually there's another one: >>>>> >>>>> * Run functional tests in platform >>>>> * Configure jenkins so that we have one jenkins job per platform top >>>>> module >>>>> >>>>> This would allow several things: >>>>> * Faster feedback to user: for example if a commit is done in a module >>>>> that happens late in the build order the whole platform wouldn't need to >>>>> be rebuilt before noticing the problem) - Note: Jenkins supports a "Local >>>>> subdirectory for repo" feature that would make this possible I think) >>>> >>>> After researching this a bit I don't think it's possible… >>>> >>>> This "Local subdirectory for repo" is something else: "Specify a local >>>> directory (relative to the workspace root) where the Git repository will >>>> be checked out. If left empty, the workspace root itself will be used." >>>> >>>> We could check out the whole Git repo but 1) it'll take space (a lot of >>>> space) but more importantly 2) GitHub will trigger a build on all jobs for >>>> that repo which isn't good. >> >> Regarding space, I've tested it and I've also tested the "shallow clone" >> option of Jenkins. >> >> So for platform: >> * with shallow clone: 281MB >> * without shallow clone (ie full clone): 346MB >> >> We have 91 modules in platform so that's 91*281=25571MB == 25GB >> Even with the full clone that's 31GB >> >> We need to add the target/ dir size, so let's say 1GB more in total, to 26GB >> or 32GB. That's doable! :) >> >> So I guess it's ok and that's not our biggest issue. >> >> There are 2 more issues: >> * Automatic creation of jenkins job. That's doable and almost done: >> http://jira.xwiki.org/jira/browse/XCOMMONS-87 >> * Triggers. This is the hardest since we'll need to create a manual ordering >> of jobs as otherwise they'll all start building at the same time when >> there's a github event coming in… It's not hard to do but it's maintenance >> intensive. Of course this ordering would be defined in the automated jenkins >> job creations but it still needs to be maintained... >> >> In conclusion it's doable and we need to work on >> http://jira.xwiki.org/jira/browse/XCOMMONS-87 first. > > Actually maybe a better thing to do (much simpler) would simply be to use > parallel builds for platform and instead ensure that our functional tests > there use different ports so that they can run in //... > > That's provided the agents are powerful enough to support a large # of > threads. Would be interesting to compute the ideal # of threads based on our > dependency graph :) Yet another solution is to build platform without the -Pintegration-tests profile with parallel builds and then create one job per functional test in platform. -Vincent > > Thanks > -Vincent > >>>> So I think we'll have to drop the idea of having a single job per module. >>>> >>>> See also >>>> http://stackoverflow.com/questions/8922857/jenkins-how-to-build-multiple-top-level-projects-from-a-git-repository >>> >>> hmm actually this is what we already do for functional tests but we don't >>> trigger than on Git Hub notifications, we trigger them on xwiki-enterprise >>> (after it's been built). >>> >>> I guess we could do the same, i.e.: >>> >>> * Only trigger the top level module in a given repo using a GitHub push >>> * Only trigger the other modules on "Build whenever a SNAPSHOT dependency >>> is built" >>> >>> The problem is that it would still use a lot of space. For example my >>> xwiki-platform/ dir takes 1.2GB of disk space (with target/ dirs) >>> So with roughly 230+ modules that's 276 GB just for xwiki-platform… >> >> This computation is wrong, see above. >> >> Thanks >> -Vincent >> >>> Combined with commons, rendering and enterprise that's probably around >>> 500GB easily… >>> >>> In conclusion it doesn't seem like a good idea… >>> >>> Thanks >>> -Vincent >>> >>>> Thanks >>>> -Vincent >>>> >>>>> * Use the full power of our agents by distributing the jobs >>>>> * Since functional tests run at the same time as unit tests if the module >>>>> build works we can be sure it's good >>>>> >>>>> Thus even though packaging and starting XE takes a lot of time (I've >>>>> timed it to roughly 1.5 minutes on my machine) the balancing of jobs on >>>>> multiple agents might overcome this - it would still be great to be able >>>>> to improve the XE start time. >>>>> >>>>> Note that creating jenkins job for so many modules might seem daunting >>>>> but this can be easily automated with http://ci.xwiki.org/api/ or even >>>>> better http://evgeny-goldin.com/wiki/Maven-jenkins-plugin >>>>> >>>>> I'm still hesitating between the previous idea and this one but thought I >>>>> would share my current thoughts with you in case you have some >>>>> idea/preference… :) >>>>> >>>>> Thanks >>>>> -Vincent >>>>> >>>>>> WDYT? >>>>>> >>>>>> Thanks >>>>>> -Vincent >>>>>> >>>>> >>>> >>> >> > _______________________________________________ devs mailing list [email protected] http://lists.xwiki.org/mailman/listinfo/devs

