I finally have a need for being able to use plugins in-place [1], so my itch is strong enough for me to scratch it. I was about to just go ahead but David asked a question or two on SVN that made me realise I have not thought this through properly. So, here is a proposal for a plugin development/release cycle.

(I'm going to hack a solution locally to scratch my itch, but I want to create a more robust solution for committing)


The Problem
-----------

There are a number of problems with the current plugin life cycle:

- a network connection is required on the first site build

- if one has the src downloading the plugins is a waste of bandwidth

- plugins need to be locally-deployed for testing if one is developing plugins it adds an overhead to the development cycle

- the forrestbot is not able to deploy the necessary plugins, so if using forrestbot-trunk we will not be using the trunk of the plugins (actually there is a mechanism in the scripts David wrote for the zone that can be used to deploy plugins, this is a partial solution to this problem)

- when developing a third party plugin, it may not be deployed to a server. We can use the file: protocol to retrieve from the local file system, but that still requires a dev to package the plugin after *every* change

- with the current deploy mechanism we have no means for testing in development plugins within our continuous integration testing mechanisms (forrestbot on the zone) without potentially breaking installations that are using unversioned plugins. That is, developers are forced to do full testing before deploying the plugin - we've been stung a couple of times recently by this.

Proposed Development/Release Cycle for Plugins
==============================================

Development
-----------

Development is carried out using the local source versions of the plugins (duh!)

No local deploy is necessary, the plugins are used in-place

No restart of Forrest is needed (i.e. it is not sufficient to copy the src into the plugins during startup)

Unit Testing
------------

The existing local testing mechanisms are sufficient, i.e. "build.sh test" since plugin src is used in place.

Continuous Integration Testing
------------------------------

forrestbot-trunk uses SVN trunk, as such it checks out the latest version of the plugin in SVN (i.e. no further changes are needed)

User Testing
------------

Bleeding edge users can use the latest *released* development version by omitting a version number. Note they do *not* use the trunk version unless Forrest is able to find the trunk source locally, in which case it will use that version.

To move a plugin into the user testing phase we will need to deploy the plugin as a dev version.

Release
-------

After a suitable period of user testing we release the plugin, making it available as a new version number. The "careful" users can then choose to upgrade their version numbers or not.

Life Cycle Summary
==================

I propose that each plugin will have up to three versions at any one time:

- dev version (src code local to installation)
- testing version (deployed, but unversioned copy)
- released version(s) (deployed and versioned copy)

How?
====

I *think* all that needs to be done is to enable plugins to be used in-place [1] and document this.

Any thoughts/comments?

Ross

[1] http://issues.apache.org/jira/browse/FOR-388