Your browser was unable to load all of the resources. They may have been blocked by your firewall, proxy or browser configuration.
Press Ctrl+F5 or Ctrl+Shift+R to have your browser try again.

Issue with effectingRepositoriesModified #197

drdt ·
Since upgrading from version 1.2.2 to 1.2.6, I am seeing a new error message when accessing Perforce from a dependent configuration.

I am using dependent builds via a QuickBuild repository and 'latest build'. The Parent configuration triggers a Child configuration, passing it a variable branch_name, which is in turned used to define a Perforce repository to get the source. This way, I can have a single configuration which I copy to multiple servers, and then, by defining different branch names in the Parent configuration on each server, perform different builds.

Parent -> Child -> Perforce

This works as expected, in all test scenarios I can devise. However, my Child configuration also depends on another configuration, the Grandchild. The Child passes to the Grandchild the same branch name as it was passed.

Parent -> Child -> Grandchild -> Perforce

I have found that, when the Grandchild is testing its Build Necessary Condition ('effectingRepositoriesModified') after being triggered by the Child, it does not have access to the branch_name variable passed to it; instead, it is using the default value for branch_name (which I have set to UNDEF) in the build settings of my root configuration. I will attach the error message which illustrates this as a reply to this post.

I do not see this error in the Child, and I do not see this error if the Parent calls the Grandchild directly, or if I trigger the Grandchild by hand. I also do not see this problem when the Grandchild executes; only when testing its Build Necessary Condition.

It is possible that this is not new behavior, as I had not been able to get my dependent configurations to work under 1.2.2 for other reasons. However, I believe that I would have encountered and noticed this situation in my testing had it come up before.
  • replies 17
  • views 6955
  • stars 0
drdt ·
2007-03-26 13:52:52,262 [http-8080-Processor25] INFO - Working directory of current configuration: D:\build\data
2007-03-26 13:52:52,262 [http-8080-Processor25] INFO - Publish directory of current configuration: D:\build\data
2007-03-26 13:52:52,278 [http-8080-Processor25] INFO - Triggering configuration: build.data
2007-03-26 13:52:52,278 [http-8080-Processor25] INFO - Checking build necessary condition...
2007-03-26 13:52:52,340 [http-8080-Processor25] INFO - Setup Perforce client specification...
2007-03-26 13:52:52,340 [http-8080-Processor25] INFO - Modified client spec begin:
Client: QuickBuild.BUILD-TEST.95
Owner: build
Host: BUILD-TEST
Root: D:\build\data\checkouts
Options: clobber rmdir
LineEnd: local
Description:

View:
//dnd/dnd_dev/config/... //QuickBuild.BUILD-TEST.95/dnd/dnd_dev/config/...
-//dnd/dnd_dev/config/installer/... //QuickBuild.BUILD-TEST.95/dnd/dnd_dev/config/installer/...
//dnd/dnd_dev/sdk/... //QuickBuild.BUILD-TEST.95/dnd/dnd_dev/sdk/...
//dnd/dnd_dev/tools/... //QuickBuild.BUILD-TEST.95/dnd/dnd_dev/tools/...
//dnd/dnd_qb/tools/quickbuild/... //QuickBuild.BUILD-TEST.95/dnd/dnd_dev/tools/quickbuild/...

2007-03-26 13:52:52,340 [http-8080-Processor25] INFO - Modified client spec end.
2007-03-26 13:53:14,154 [Thread-755] INFO - Client QuickBuild.BUILD-TEST.95 saved.
2007-03-26 13:53:14,325 [http-8080-Processor25] INFO - Setup Perforce client specification...
2007-03-26 13:53:14,325 [http-8080-Processor25] INFO - Modified client spec begin:
Client: QuickBuild.BUILD-TEST.95
Owner: build
Host: BUILD-TEST
Root: D:\build\data\checkouts
Options: clobber rmdir
LineEnd: local
Description:

View:
//dnd/dnd_dev/data/* //QuickBuild.BUILD-TEST.95/dnd/dnd_dev/data/*
//dnd/dnd_dev/data/engine/... //QuickBuild.BUILD-TEST.95/dnd/dnd_dev/data/engine/...
//dnd/dnd_dev/data/game/... //QuickBuild.BUILD-TEST.95/dnd/dnd_dev/data/game/...
-//dnd/dnd_dev/data/game/weenie/wsl/client*.wlib //QuickBuild.BUILD-TEST.95/dnd/dnd_dev/data/game/weenie/wsl/client*.wlib
-//dnd/dnd_dev/data/game/weenie/wsl/server*.wlib //QuickBuild.BUILD-TEST.95/dnd/dnd_dev/data/game/weenie/wsl/server*.wlib
//dnd/dnd_dev/data/raw/... //QuickBuild.BUILD-TEST.95/dnd/dnd_dev/data/raw/...

2007-03-26 13:53:14,325 [http-8080-Processor25] INFO - Modified client spec end.
2007-03-26 13:53:15,338 [Thread-758] INFO - Client QuickBuild.BUILD-TEST.95 saved.
2007-03-26 13:53:15,493 [http-8080-Processor25] INFO - Checking loop against repository: datasrc
2007-03-26 13:53:16,148 [http-8080-Processor25] ERROR - Failed to trigger configuration.
java.lang.RuntimeException: ognl.OgnlException: effectingRepositoriesModified [com.pmease.quickbuild.QuickBuildRemoteException: java.lang.RuntimeException(Failed to evaluation build necessary condition for configuration: build.source)]
at com.pmease.quickbuild.model.Configuration.evaluateBooleanExpression(Configuration.java:877)
at com.pmease.quickbuild.model.Configuration.trigger(Configuration.java:1044)
at com.pmease.quickbuild.RemoteServiceImpl.triggerDependent(RemoteServiceImpl.java:95)
at sun.reflect.GeneratedMethodAccessor11368.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:287)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:155)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:122)
at com.pmease.quickbuild.interceptor.RemoteExceptionConverter.invoke(RemoteExceptionConverter.java:20)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:174)
at $Proxy2.triggerDependent(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:141)
at com.pmease.quickbuild.web.service.HessianService.service(HessianService.java:43)
at org.apache.tapestry.engine.AbstractEngine.service(AbstractEngine.java:889)
at org.apache.tapestry.ApplicationServlet.doService(ApplicationServlet.java:198)
at org.apache.tapestry.ApplicationServlet.doPost(ApplicationServlet.java:327)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:264)
at org.acegisecurity.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:107)
at org.acegisecurity.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:72)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
at org.acegisecurity.ui.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:110)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
at org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
at org.acegisecurity.ui.rememberme.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:142)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
at org.acegisecurity.ui.basicauth.BasicProcessingFilter.doFilter(BasicProcessingFilter.java:181)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:217)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:191)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
at org.acegisecurity.util.FilterChainProxy.doFilter(FilterChainProxy.java:148)
at org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:90)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at com.pmease.quickbuild.QuickBuildFilter.doFilter(QuickBuildFilter.java:36)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:595)
Caused by: ognl.OgnlException: effectingRepositoriesModified [com.pmease.quickbuild.QuickBuildRemoteException: java.lang.RuntimeException(Failed to evaluation build necessary condition for configuration: build.source)]
at ognl.OgnlRuntime.getMethodValue(OgnlRuntime.java:908)
at ognl.ObjectPropertyAccessor.getPossibleProperty(ObjectPropertyAccessor.java:54)
at ognl.ObjectPropertyAccessor.getProperty(ObjectPropertyAccessor.java:122)
at ognl.OgnlRuntime.getProperty(OgnlRuntime.java:1616)
at ognl.ASTProperty.getValueBody(ASTProperty.java:96)
at ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:170)
at ognl.SimpleNode.getValue(SimpleNode.java:210)
at ognl.Ognl.getValue(Ognl.java:333)
at com.pmease.quickbuild.model.Configuration.evaluateBooleanExpression(Configuration.java:870)
... 70 more
drdt ·
2007-03-26 13:53:15,805 [http-8080-Processor20] INFO - Working directory of current configuration: D:\build\source
2007-03-26 13:53:15,805 [http-8080-Processor20] INFO - Publish directory of current configuration: D:\build\source
2007-03-26 13:53:15,805 [http-8080-Processor20] INFO - Evaluating build necessary condition for configuration: build.source
2007-03-26 13:53:15,805 [http-8080-Processor20] INFO - Checking build necessary condition...
2007-03-26 13:53:15,929 [http-8080-Processor20] INFO - Setup Perforce client specification...
2007-03-26 13:53:15,929 [http-8080-Processor20] INFO - Modified client spec begin:
Client: QuickBuild.BUILD-TEST.94
Owner: build
Host: BUILD-TEST
Root: D:\build\source\checkouts
Options: clobber rmdir
LineEnd: local
Description:

View:
//UNDEF/UNDEF_UNDEF/... //QuickBuild.BUILD-TEST.94/UNDEF/UNDEF_UNDEF/...
//dnd/dnd_qb/tools/quickbuild/... //QuickBuild.BUILD-TEST.94/UNDEF/UNDEF_UNDEF/tools/quickbuild/...

2007-03-26 13:53:15,929 [http-8080-Processor20] INFO - Modified client spec end.
2007-03-26 13:53:16,007 [Thread-760] ERROR - Error in client specification.
2007-03-26 13:53:16,007 [Thread-760] ERROR - Mapping '//UNDEF/UNDEF_UNDEF/...' is not under '//dnd/...'.
2007-03-26 13:53:16,132 [http-8080-Processor20] ERROR - Failed to evaluate build necessary condition.
java.lang.RuntimeException: ognl.OgnlException: effectingRepositoriesModified [java.lang.RuntimeException: ognl.OgnlException: headRevision [Problem exec'ing P4 command: Execution of command failed, returned code: 1]]
at com.pmease.quickbuild.model.Configuration.evaluateBooleanExpression(Configuration.java:877)
at com.pmease.quickbuild.model.Configuration.isBuildNecessary(Configuration.java:1092)
at com.pmease.quickbuild.RemoteServiceImpl.isBuildNecessary(RemoteServiceImpl.java:899)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:287)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:155)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:122)
at com.pmease.quickbuild.interceptor.RemoteExceptionConverter.invoke(RemoteExceptionConverter.java:20)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:174)
at $Proxy2.isBuildNecessary(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:141)
at com.pmease.quickbuild.web.service.HessianService.service(HessianService.java:43)
at org.apache.tapestry.engine.AbstractEngine.service(AbstractEngine.java:889)
at org.apache.tapestry.ApplicationServlet.doService(ApplicationServlet.java:198)
at org.apache.tapestry.ApplicationServlet.doPost(ApplicationServlet.java:327)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:264)
at org.acegisecurity.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:107)
at org.acegisecurity.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:72)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
at org.acegisecurity.ui.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:110)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
at org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
at org.acegisecurity.ui.rememberme.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:142)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
at org.acegisecurity.ui.basicauth.BasicProcessingFilter.doFilter(BasicProcessingFilter.java:181)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:217)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:191)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
at org.acegisecurity.util.FilterChainProxy.doFilter(FilterChainProxy.java:148)
at org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:90)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at com.pmease.quickbuild.QuickBuildFilter.doFilter(QuickBuildFilter.java:36)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:595)
Caused by: ognl.OgnlException: effectingRepositoriesModified [java.lang.RuntimeException: ognl.OgnlException: headRevision [Problem exec'ing P4 command: Execution of command failed, returned code: 1]]
at ognl.OgnlRuntime.getMethodValue(OgnlRuntime.java:908)
at ognl.ObjectPropertyAccessor.getPossibleProperty(ObjectPropertyAccessor.java:54)
at ognl.ObjectPropertyAccessor.getProperty(ObjectPropertyAccessor.java:122)
at ognl.OgnlRuntime.getProperty(OgnlRuntime.java:1616)
at ognl.ASTProperty.getValueBody(ASTProperty.java:96)
at ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:170)
at ognl.SimpleNode.getValue(SimpleNode.java:210)
at ognl.Ognl.getValue(Ognl.java:333)
at com.pmease.quickbuild.model.Configuration.evaluateBooleanExpression(Configuration.java:870)
... 71 more
robinshen ADMIN ·
This bug has been fixed in the newly released 1.2.7 version.

Thanks.
Robin
drdt ·
Thank you, I will try it out.
drdt ·
I downloaded version 1.2.7 and installed it on my test box, keeping the same configuration. Now, my builds are always coming up 'Build necessary condition not satisfied, new build won't be generated.' And no new builds are ever generated, unless I force the build. It won't even build if I specify a changelist number to build from which is different from the most recent changelist built, unless I force the build.

---

I see an additional issue, which is that, if I trigger the parent build, it gives an error which I will attach in the next reply. The error does not occur if I trigger the child, or the grandchild, or if I trigger the parent after dissolving the relationship between the child and the grandchild.

Parent -> Child -> Grandchild ERROR
Child -> Grandchild OK
Grandchild OK
Parent -> Grandchild OK
Parent -> Child OK

This is probably directly related to the fix which you just put in.
drdt ·
2007-03-27 14:17:36,394 [Thread-394] INFO - Working directory of current configuration: D:\build\manual
2007-03-27 14:17:36,394 [Thread-394] INFO - Publish directory of current configuration: D:\build\manual
2007-03-27 14:17:36,409 [Thread-394] INFO - Triggering configuration: build.manual
2007-03-27 14:17:36,409 [Thread-394] INFO - Checking build necessary condition...
2007-03-27 14:17:36,550 [Thread-394] INFO - Setup Perforce client specification...
2007-03-27 14:17:36,550 [Thread-394] INFO - Modified client spec begin:
Client: QuickBuild.re-test-01.103
Owner: build
Host: re-test-01
Root: D:\build\manual\checkouts
Options: clobber rmdir
LineEnd: local
Description:

View:
//dnd/dnd_dev/... //QuickBuild.re-test-01.103/dnd/dnd_dev/...
//dnd/dnd_qb/tools/quickbuild/... //QuickBuild.re-test-01.103/dnd/dnd_dev/tools/quickbuild/...

2007-03-27 14:17:36,550 [Thread-394] INFO - Modified client spec end.
2007-03-27 14:17:37,924 [Thread-397] INFO - Client QuickBuild.re-test-01.103 saved.
2007-03-27 14:17:43,907 [Thread-394] INFO - Setup Perforce client specification...
2007-03-27 14:17:43,923 [Thread-394] INFO - Modified client spec begin:
Client: QuickBuild.re-test-01.103
Owner: build
Host: re-test-01
Root: D:\build\manual\checkouts
Options: clobber rmdir
LineEnd: local
Description:

View:
//dnd/dnd_dev/config/... //QuickBuild.re-test-01.103/dnd/dnd_dev/config/...
-//dnd/dnd_dev/config/installer/... //QuickBuild.re-test-01.103/dnd/dnd_dev/config/installer/...
//dnd/dnd_dev/sdk/... //QuickBuild.re-test-01.103/dnd/dnd_dev/sdk/...
//dnd/dnd_dev/tools/... //QuickBuild.re-test-01.103/dnd/dnd_dev/tools/...
//dnd/dnd_qb/tools/quickbuild/... //QuickBuild.re-test-01.103/dnd/dnd_dev/tools/quickbuild/...

2007-03-27 14:17:43,923 [Thread-394] INFO - Modified client spec end.
2007-03-27 14:17:44,110 [Thread-402] INFO - Client QuickBuild.re-test-01.103 saved.
2007-03-27 14:17:44,297 [Thread-394] INFO - Checking loop against repository: data
2007-03-27 14:17:44,438 [Thread-394] ERROR - Failed to trigger configuration.
java.lang.RuntimeException: ognl.OgnlException: effectingRepositoriesModified [com.pmease.quickbuild.QuickBuildRemoteException: java.lang.RuntimeException(ognl.OgnlException: headRevision [java.lang.NullPointerException])
Cause: ognl.OgnlException(headRevision)
Reason: java.lang.NullPointerException]
at com.pmease.quickbuild.model.Configuration.evaluateBooleanExpression(Configuration.java:877)
at com.pmease.quickbuild.model.Configuration.trigger(Configuration.java:1044)
at com.pmease.quickbuild.triggeringinstance.ManualTriggeringInstance.execute(ManualTriggeringInstance.java:58 )
at com.pmease.quickbuild.model.Queue$BuildRunner.run(Queue.java:222)
at java.lang.Thread.run(Thread.java:595)
Caused by: ognl.OgnlException: effectingRepositoriesModified [com.pmease.quickbuild.QuickBuildRemoteException: java.lang.RuntimeException(ognl.OgnlException: headRevision [java.lang.NullPointerException])
Cause: ognl.OgnlException(headRevision)
Reason: java.lang.NullPointerException]
at ognl.OgnlRuntime.getMethodValue(OgnlRuntime.java:908 )
at ognl.ObjectPropertyAccessor.getPossibleProperty(ObjectPropertyAccessor.java:54)
at ognl.ObjectPropertyAccessor.getProperty(ObjectPropertyAccessor.java:122)
at ognl.OgnlRuntime.getProperty(OgnlRuntime.java:1616)
at ognl.ASTProperty.getValueBody(ASTProperty.java:96)
at ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:170)
at ognl.SimpleNode.getValue(SimpleNode.java:210)
at ognl.ASTOr.getValueBody(ASTOr.java:56)
at ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:170)
at ognl.SimpleNode.getValue(SimpleNode.java:210)
at ognl.Ognl.getValue(Ognl.java:333)
at com.pmease.quickbuild.model.Configuration.evaluateBooleanExpression(Configuration.java:870)
... 4 more
robinshen ADMIN ·
I forgot to mention that 1.2.7 is not compatible with 1.2.6 in case of dependent build. Have you upgraded all parties (parent, child, grandchild) to version 1.2.7?

If all versions are correct, can you backup all involved configurations to XML files and send it to support [AT] pmease.com for diagnostics?

Regards.
Robin
drdt ·
This is not an issue as my dependent builds are all done on a single system. Although I am planning to enable parallel builds on multiple systems, I decided not to confuse matters by adding that just yet.

I will email you my configuration directly.
robinshen ADMIN ·
Thanks for the database, it helped me to find root cause of problems you described here. Now the fixes has come into the new build (1.2.7 build 82).

Also please be noted that:

1. If you specify "p4changelist" to a past change number at the manual side, the dependent configurations will not be built as their "effectingRepositoriesModified" expression only detects repository checkins onward. To solve this problem, you might need to use another variable, say "forcedp4changelist", which will be assigned to a change list at build time, and chained into dependent configurations. At dependent configuration side (data and source), modify the "build necessary condition" to take below value:
var["forcedp4changelist"].value!="UNDEF"?true:effectingRepositoriesModified


And also change the label setting of the dependent configuration's P4 repository to be:
${var["forcedp4changelist"].value!="DEF"?var["forcedp4changelist"]:var["p4usechangelist"]}


In this way, QuickBuild will always build against your specified change number for dependent configurations.

2. As you are using parallel composition steps, please keep in mind that if you checking out codes from more than one Perforce repositories simultaneously in the same configuration, you need to specify client name of the Perforce repository explicitly to avoid naming conflicting (By default they takes the same name if run in the same configuration).

Regards.
Robin
drdt ·
Thanks for the suggestion (and the update). What I -really- want to do with those dependent builds is give them a build necessary condition that evaluates to:

p4changelist != {the value of p4changelist used in the previous build}

Because those dependent builds will *always* be built with p4changelist defined, they don't actually need to track their own head revision; I just need to know if the checkout changelist is different from last time.

For now, I am just going to set it to 'true', since most of the time the changelist will have changed, so most of the time I will want a build.
robinshen ADMIN ·
QuickBuild can not trigger a build just because p4changelist != {the value of p4changelist used in the previous build}, as sometimes even if the head revision has been changed, the module itself may not been changed (the code changes in other modules, and thusly cause the head revision to increase). And it conflicts with QuickBuild's assumption that a repository with a change list specified should been treated as unchanged. So for current stage, you'll need to put some trick inside the "build necessary condition" to make things work. As we are working toward QB2.0 which is a substantial improvement over 1.x, the repository related implementations will be re-designed based on our customers' usage scenario, including yours of course.

Thanks.
Robin
drdt ·
The head revision of the module changing does not necessarily mean that the module must be rebuilt, either. For example, I fetch down the entire source tree even if I am only building a subset of the projects, simply because a subset of the source tree would require twenty or more modules in the repository definition. It is a limitation of Perforce; I would rather the system give me the option and let me decide what rules to use to overcome that limitation.

I look forward to the update. I hope it is available in enough time for me to make use of it before we roll QuickBuild out to production.
robinshen ADMIN ·
Sorry that I can not capture your idea here. Does current version meet your need? If not, can you please use an example to demonstrate why QB can not suffice your needs right now?

Regards.
Robin
drdt ·
Well, my build environment is kind of complicated, but I will try to present a boiled-down version:

A Parent config calls two Child configs via QuickBuild repositories. Each of these children has its own Perforce repository which gathers a subset of the source. The build necessary conditions of all three configs are:
- lastBuild==null or lastBuild.failed or effectingRepositoriesModified

So. when the Parent config is triggered, it will run only if either (or both) of the children's Perforce repositories were modified since the last build. Each child will then run if its individual repository was modified.

However, it can happen that after the build sequence is triggered, there could be a checkin to one of the children's repositories, which we don't want. So, Parent grabs the head revision of a global Perforce repository and passes this to the children, saying 'use this as your head revision'. To avoid using the global repository as a dependency, and therefore triggering a build when neither child has been modified, the Parent's build necessary condition is changed to:
- repository["childa"].modified or repository["childb"].modified

I am expecting that each child, when triggered, will only build if there is a difference in the Perforce repository between the last completed build and the newly-supplied changelist. Of course, the changelist may be different but the contents the same, in which case I do not want the build to run.

The problem is that, since I always pass a changelist to the children to build, their 'effectingRepositoriesModified' is invalidated, and my configs never run once they have had a successful build.
robinshen ADMIN ·
Have you tried with QuickBuild 1.2.7 build 82 with this scenario?

After fixing the NPE error and build not triggering issue you reported in this thread before, it should be able to address the scenario you put here.

The only problem will be that if you specify a past change list (not head change list) at master config side, the child configs will not built automatically using current build necessary conditions. In that case, you need to use an extra variable to hold past change list and put some tricks in build necessary condition of child configs as I've described in this thread before.

Regards.
Robin
drdt ·
I haven't tried this with version 1.2.7. I will continue to investigate and let you know if I get a working scenario.
drdt ·
I have experimented with this scenario, and it seems to work in v1.2.7.