Thank you for using RabbitMQ and for taking the time to contribute to the project.
This document has two main parts:

 * when and how to file GitHub issues for RabbitMQ projects
 * how to submit pull requests

They intend to save you and RabbitMQ maintainers some time, so please
take a moment to read through them.

## Overview

### GitHub issues

The RabbitMQ team uses GitHub issues for _specific actionable items_ that
engineers can work on. This assumes the following:

* GitHub issues are not used for questions, investigations, root cause
  analysis, discussions of potential issues, etc (as defined by this team)
* Enough information is provided by the reporter for maintainers to work with

The team receives many questions through various venues every single
day. Frequently, these questions do not include the necessary details
the team needs to begin useful work. GitHub issues can very quickly
turn into a something impossible to navigate and make sense
of. Because of this, questions, investigations, root cause analysis,
and discussions of potential features are all considered to be
[mailing list][rmq-users] material. If you are unsure where to begin,
the [RabbitMQ users mailing list][rmq-users] is the right place.

Getting all the details necessary to reproduce an issue, make a
conclusion or even form a hypothesis about what's happening can take a
fair amount of time. Please help others help you by providing a way to
reproduce the behavior you're observing, or at least sharing as much
relevant information as possible on the [RabbitMQ users mailing
list][rmq-users].

Please provide versions of the software used:

 * RabbitMQ server
 * Erlang
 * Operating system version (and distribution, if applicable)
 * All client libraries used
 * RabbitMQ plugins (if applicable)

The following information greatly helps in investigating and reproducing issues:

 * RabbitMQ server logs
 * A code example or terminal transcript that can be used to reproduce
 * Full exception stack traces (a single line message is not enough!)
 * `rabbitmqctl report` and `rabbitmqctl environment` output
 * Other relevant details about the environment and workload, e.g. a traffic capture
 * Feel free to edit out hostnames and other potentially sensitive information.

To make collecting much of this and other environment information, use
the [`rabbitmq-collect-env`][rmq-collect-env] script. It will produce an archive with
server logs, operating system logs, output of certain diagnostics commands and so on.
Please note that **no effort is made to scrub any information that may be sensitive**.

### Pull Requests

RabbitMQ projects use pull requests to discuss, collaborate on and accept code contributions.
Pull requests is the primary place of discussing code changes.

Here's the recommended workflow:

 * [Fork the repository][github-fork] or repositories you plan on contributing to. If multiple
   repositories are involved in addressing the same issue, please use the same branch name
   in each repository
 * Create a branch with a descriptive name in the relevant repositories
 * Make your changes, run tests (usually with `make tests`), commit with a
   [descriptive message][git-commit-msgs], push to your fork
 * Submit pull requests with an explanation what has been changed and **why**
 * Submit a filled out and signed [Contributor Agreement][ca-agreement] if needed (see below)
 * Be patient. We will get to your pull request eventually

If what you are going to work on is a substantial change, please first
ask the core team for their opinion on the [RabbitMQ users mailing list][rmq-users].

## Running Tests

To run a "fast suite" (a subset of tests):

    make ct-fast

To run a "slow suite" (a subset of tests that take much longer to run):

    make ct-slow

To run a particular suite:

    make ct-$suite_name

for example, to run the `backing_queue` suite:

    make ct-backing_queue

Finally,

    make tests

will run all suites.

## Code of Conduct

See [CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md).

## Contributor Agreement

If you want to contribute a non-trivial change, please submit a signed
copy of our [Contributor Agreement][ca-agreement] around the time you
submit your pull request. This will make it much easier (in some
cases, possible) for the RabbitMQ team at Pivotal to merge your
contribution.

## Where to Ask Questions

If something isn't clear, feel free to ask on our [mailing list][rmq-users].

[rmq-collect-env]: https://github.com/rabbitmq/support-tools/blob/master/scripts/rabbitmq-collect-env
[git-commit-msgs]: https://chris.beams.io/posts/git-commit/
[rmq-users]: https://groups.google.com/forum/#!forum/rabbitmq-users
[ca-agreement]: https://cla.pivotal.io/sign/rabbitmq
[github-fork]: https://help.github.com/articles/fork-a-repo/
