====================================
Development Tasks
====================================
Git Branching Strategy
======================
We're using a slightly modified version of Vincent Driessen's `A highly successful
git branching model `_
and the associated `git-flow tool `_ (packaged
in Fedora as ``gitflow``).
Released code is kept in ``master`` and yet-to-be-released code is in ``develop``.
Generally, new code is submitted as feature branches of the form
``feature/tXXX-$FEATURE`` where ``XXX`` is the feature's ticket number in trac
and ``$FEATURE`` is a short human-recognizable phrase to identify the branch
without needing to memorize ticket numbers.
Submitting Code
===============
Code can be submitted in one of two ways: through pushing to a feature branch or
submitting a patch to `our reviewboard instance `_
Either way, the process is similar:
* Create a review request on reviewboard
- Please fill out the relevant fields (description, testing done, bugs fixed etc.)
- Make sure you select the 'blockerbugs' group for the review request - this
will email the ``qa-devel`` list and notify other developers of the review
* Once the review is complete, merge the code into the ``develop`` branch.
- If you do not have write privileges, this will be done for you
Creating a Review Request with post-review
------------------------------------------
An easy method for creating a review request involves using the ``post-review``
tool which is written by the reviewboard developers (Fedora package ``RBTools``).
If you're submitting a review request for the feature branch ``$FEATURE``, you
would use the following command from the repository's root directory to start
a minimal review request **after** pushing your branch to origin::
post-review --tracking-branch=origin/develop --branch origin/feature/$FEATURE
This doesn't fill out all of the required fields and you will need to login to
the reviewboard instance in order to finish the review submission process but this
is at least a start.
Updating a Review Request with post-review
------------------------------------------
We wouldn't have a need for code reviews if the code never changed after initial
review. Many times, an update is needed to code before the review process is
complete.
To update an existing review request ``$ID`` (the id number of the review request
in reviewboard), use the following command **after** pushing your code to origin::
post-review -r $REVIEW --tracking-branch=origin/develop --branch origin/feature/$FEATURE
Release Process
===============
The release process is relatively simple. At release time,
* merge ``origin/develop`` into ``origin/master``, resolving any merge
conflicts or issues.
* Make sure that the version strings in ``blockerbugs.spec`` and ``blockerbugs/__init__.py``
match and are correct. ``blockerbugs.spec`` should have a useful statement
in the changelog corresponding to the changes in this latest release
* Create a git tag on master
* Push the changes in master and the new tag to origin
* Build an SRPM with the new release and submit a scratch build to Koji
* Request that the new build be pulled into infra's repository and deploy on
staging
* After a reasonable amount of testing, deploy to production
Building a Blockerbugs RPM
==========================
Step-by-step process for building an rpm (el6, probably) for devel, stg, production
These instructions are deliberately abstracted for version and branch so that
they can be used for other things than just releases. The relevant variables are:
* ``$VERSION`` - the version as set in both ``__init__.py`` and ``blockerbugs.spec``
* ``$RELEASE`` - the release as set in ``blockerbugs.spec``
* ``$BRANCH`` - the git branch you're working with (master, develop, feature/t123-foobar etc.)
* ``$BASEDIR`` - the base directory for your git checkout
Make sure that all the files you're working on are committed in your git repo and
create a tarball by running this command in ``$BASEDIR``::
git archive --format=tar --prefix=blockerbugs-$VERSION/ $BRANCH | gzip -c > blockerbugs-$VERSION.tar.gz
Create an srpm using mock and copy the result into ``$BASEDIR``::
mock -r epel-6-x86_64 --buildsrpm --spec blockerbugs.spec --sources $BASEDIR
cp /var/lib/mock/epel-6-x86_64/results/blockerbugs*.src.rpm $BASEDIR/.
From here, you can either build the rpm locally using mock or using a koji scratch
build.
Building Locally with Mock
--------------------------
Run this command to build an rpm locally with mock (using ``--no-clean`` will prevent
mock from rebuilding the environment)::
mock -r epel-6-x86_64 --rebuild $BASEDIR/blockerbugs-$VERSION-$RELEASE.src.rpm
cp /var/lib/mock/epel-6-x86_64/results/blockerbugs*.noarch.rpm $BASEDIR/.
Building a Koji Scratch Build
-----------------------------
The blocker tracking app isn't in the main Fedora repos, so we can't do official
builds but we can do scratch builds with this command::
koji build --scratch dist-6E-epel-testing-candidate $BASEDIR/blockerbugs-$VERSION-$RELEASE.el6.src.rpm
Using Alembic
=============
`Alembic `_ is 'a lightweight
lightweight database migration tool for usage with the SQLAlchemy Database
Toolkit for Python.' and used to manage the database schema used with the application.
To install alembic, use (inside the virtualenv)::
pip install alembic
To upgrade database to the most recent revision, use::
alembic upgrade head
To downgrade database back to the beginning, use::
alembic downgrade base
To upgrade database to a specific revision, use::
alembic upgrade 42d71a06dd50
To create a revision, use::
alembic revision -m "Create a table"
This will create a file called, e.g., 42d71a06dd50_create_a_table.py in
alembic/versions. The file contains *upgrade* and *downgrade* methods that need
to be adjusted to reflect desired migration.
In many cases, alembic is able to determine the steps needed for upgrade and
downgrade through the inspection of SQLAlchemy classes. To create an auto-generated
revision, use::
alembic revision --autogenerate -m "Create a table"
Building Project CSS
====================
The CSS used is compiled from `SASS `_ using
`Compass `_. While the rendered CSS is in the git
tree, do not make changes to those files if you expect them to be persistent
because they are only there for convenience.
The `Zurb Foundation `_ front end framework is used
as a base for a grid, among other UI elements. It will also need to be installed
on the development system in order to compile the source SASS files.
Installing Required Tools
-------------------------
The following packages are needed::
sudo yum install rubygem-compass rubygem-sass
Once compass is installed, grab the Zurb Foundation gem::
sudo gem install zurb-foundation
Building CSS
------------
From the root of the git tree, run::
compass compile
You can also have compass watch the scss files for changes and rebuild every
time a change is detected::
compass watch