[rules-users] Continuous deployment of rules/vetoing changesets
Gustaf Cele
gustaf.cele at databyran.se
Wed Jun 27 10:20:47 EDT 2012
Hi Wolfgang!
A staging area sounds like a good idea. Would something as simple as this work?
KnowledgeAgent stagingAgent = connectToGuvnorAndStartPolling();
KnowledgeBase productionKnowledgeBase = ...;
stagingAgent.addEventListener(new DefaultKnowledgeAgentEventListener() {
@Override
public void beforeChangeSetApplied(BeforeChangeSetAppliedEvent event) {
if (allTestsPass()) {
// copy rules from stagingAgent to productionKnowledgeBase, somehow
}
});
... and in that case, how would I go about the copying part? Is it safe to just save the reference from stagingAgent.getKnowledgeBase() if the agent is configured with drools.agent.newInstance=true?
/g
-----Original Message-----
From: Wolfgang Laun [mailto:wolfgang.laun at gmail.com]
Sent: den 27 juni 2012 15:45
To: Rules Users List
Subject: Re: [rules-users] Continuous deployment of rules/vetoing changesets
Have you considered using a "staged" approach?
Rather than forwarding LATEST right into production, have one listener move it into the staging area or not - depending on the tests. The production side listener(s) are directed onto the staging area.
-W
On 27/06/2012, Gustaf Cele <gustaf.cele at databyran.se> wrote:
> Hi,
>
> I have a Guvnor server (5.4.0.Final) which provides rules to a client
> (which itself is an EJB server app) using KnowledgeAgents to get hold
> of rule updates. The knowledge agents are started with changeset XMLs
> on the classpath which point at my Guvnor instance.
>
> The KnowledgeAgents are set up thus:
>
> ResourceFactory.getResourceChangeNotifierService().start();
> ResourceFactory.getResourceChangeScannerService().start();
> KnowledgeAgent knowledgeAgent =
> KnowledgeAgentFactory.newKnowledgeAgent(agentName);
> knowledgeAgent.monitorResourceChangeEvents(true);
> Resource resource =
> ResourceFactory.newClassPathResource(changeSetResourcePath, getClass());
> knowledgeAgent.applyChangeSet(resource);
> ResourceFactory.getResourceChangeNotifierService().start();
> ResourceFactory.getResourceChangeScannerService().start();
>
> And the changesets look like this (xsd stuff removed for brevity):
>
> <change-set>
> <add>
> <resource username="ruleclient" password="hunter2"
> basicAuthentication="enabled"
>
> source="http://guvnorhost/drools-guvnor/org.drools.guvnor.Guvnor/package/my.package/LATEST"
> type="PKG" />
> </add>
> </change-set>
>
> As you can see, we use LATEST because we want continuous deployment of
> our rules. Change a rule, build the package, and have the connected
> KnowledgeAgents updated with the new rule. This works very well - a
> bit too well, unfortunately. We have a comprehensive test suite, and
> every now and then, you'll check in a rule that breaks a test. We want
> to prevent any changes to our rules from being propagated to the
> clients until all the tests succeed, and this is where we're stuck.
>
> We've tried using a KnowledgeAgentEventListener which throws an
> exception when it detects test failures:
>
> public class VetoListener extends DefaultKnowledgeAgentEventListener {
> @Override
> public void beforeChangeSetApplied(BeforeChangeSetAppliedEvent
> event) {
> if (!allTestsPass()) {
> throw new RuntimeException("tests failed, not applying
> change set");
> }
> }
>
> boolean allTestsPass(){
> // Get test results from
> ${guvnor_url}/org.drools.guvnor.Guvnor/package/my.package/LATEST/SCENARIOS
> // and check if there were any failures
> }
> }
> // Usage:
> knowledgeAgent.addEventListener(new VetoListener());
>
> This does prevent the new changeset from being applied, but it also
> seems to kill the thread polling for new changes entirely. Restarting
> the ResourceChange{Scanner,Notifier}Services doesn't help.
>
> I've also tried modifying the event's changeset (I know you
> shouldn't), but it doesn't stop the changes from being applied:
>
> public void beforeChangeSetApplied(BeforeChangeSetAppliedEvent event) {
> if (!allTestsPass()) {
> event.getChangeSet().getResourcesModified().clear();
> // ... and clear all the other collections you can get
> from
> event.getChangeSet()
> }
> }
>
> So, what I wonder is if there is any way of preventing a changeset
> from being applied to a KnowledgeAgent's knowledge base when there are
> failing test scenarios, but which applies updates as soon as all tests
> succeed? More generally, I'm looking for something with fewer manual
> steps than run tests-make snapshot-publish, and in particular I want
> to ensure you never publish a package when there are tests failing,
> and it should preferably not require any changes outside of Guvnor to
> get out new rules to the client app. Any ideas?
>
> Thanks in advance,
>
> /g
>
>
_______________________________________________
rules-users mailing list
rules-users at lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users
More information about the rules-users
mailing list