Recommended guidelines for Development workflow


$ # Pull the latest develop
$ git checkout -B develop origin/develop

$ # Create new feature branch
$ git checkout -b feature/CDAP-xxxx-description
 
$ # Make your changes
 
$ git add <files>
 
$ git commit -m "Clear and concise commit messages"

$ # Rebase on latest changes from develop if needed 
$ git fetch origin 
$ git rebase origin/develop 
 
$ git push origin feature/CDAP-xxxx-description

Checklist before sending pull requests


Continuous Delivery

The idea of Continuous Delivery (CD) is to keep the software always releasable so that we can release as often as possible whenever we wanted.

[From http://www.collab.net/sites/default/files/uploads/CollabNet-S-curve_2.png]

Development Best Practices

In this section, some best practices in design and development to ease CD are discussed.

Develop as libraries / components

Always try to break down the new feature you are working on into self-contain library / components so that abstraction boundary for integration can be defined properly (e.g. interfaces, class, REST endpoints, etc.)

Design for incremental changes

Break down task into multiple deliverables, each accompanied with appropriate unit tests and integration points to the rest of the system.

e.g. Stream on HDFS

  1. Writer and Reader for single stream file and index.
  2. Partition stream writer that knows how to write to multiple stream files based on time partition.
  3. InputFormat for consumed by MapReduce.
  4. StreamConsumer for real time consumption of events, used by Flow
  5. Modify Gateway to write to new stream using the stream writer defined in step 2. Also rewire Flow system to use the new StreamConsumer in step 4.

In this example, all changes made in step 1-4 are safe to merge and release, as no production code would be affected (new code are dead code to the release).

Feature toggle

In some cases, when the set of changes for the new feature is big and touched a lot of existing code, it is tempting to keep working on a branch not merging back to main trunk. However, this is not a good practice and defeated the purpose of CI. In order to be able to merge early, a technique called feature toggle could be used. Basically it uses configuration to turn on/off usage of new feature. The configuration may or may not be stayed after the feature is fully completed, depending on whether need to keep the old behavior or not.

Branch by Abstraction

Basically new abstractions are built (e.g. new interfaces) and have an implementation of the existing behavior. New features can then now be built by implementing the same interfaces, and potentially uses feature toggle to select what implementation to be used.