# Contributing

🎉🎊 Thanks for taking the time to contribute! 🎉🎊

There are many ways to contribute, here are some.

## Filing an issue

If there's any issue you encounter or anything that needs to be fixed, feel free to [create a GitHub issue](https://github.com/apache/beam-starter-python/issues).

## Contributing to this starter project

If this is your first time contributing to a GitHub repo,
we recommmend going through the
[GitHub quickstart](https://docs.github.com/en/get-started/quickstart/hello-world).

It's a good idea to discuss your plans with the Beam community through the dev@beam.apache.org mailing list before doing any changes.

Here's a small overview of the process.

1. [Fork the repo](https://docs.github.com/en/get-started/quickstart/fork-a-repo).

1. Clone the repo.

    ```sh
    export GITHUB_USERNAME="my-github-username"

    git clone git@github.com:$GITHUB_USERNAME/beam-starter-python.git
    ```

1. Set the [upstream remote branch](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/configuring-a-remote-for-a-fork).

    ```sh
    cd beam-starter-python
    git remote add upstream git@github.com:apache/beam-starter-python.git
    ```

1. Create and change to a new branch.

    ```sh
    git checkout -B my-branch-name
    ```

1. Modify the code! 😱

1. Run the tests. For steps on how to run them see the [`README.md`](README.md).

1. Commit and push your changes to your branch in `origin`.

    ```sh
    git commit -m "one line description of your changes"
    git push
    ```

1. [Create a Pull Request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request).

1. Add reviewers, and [address review comments](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests).

1. Once it's approved, we can merge the Pull Request.

For more information about proposing changes to a GitHub repository, see the
[Propose changes](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-branches)
page in the GitHub docs.

## Contributing to Apache Beam

For information on how to contribute to
[Apache Beam](https://github.com/apache/beam), see the
[Contribution guide](https://beam.apache.org/contribute/).
