blob: c497a893781d3dd1d7275c2fa24c05af7770f669 [file] [log] [blame] [view]
GitHub plugin
=============
This plugin allows existing GitHub repositories to be integrated
as Gerrit projects.
Why using GitHub and Gerrit together ?
--------------------------------------
Many people see Gerrit and GitHub as opposites: the pull-request
model adopted by GitHub is often used as "easy shortcut" to the
more comprehensive and structured code-review process in Gerrit.
There are many discussion threads on this:
- http://programmers.stackexchange.com/questions/173262/gerrit-code-review-or-githubs-fork-and-pull-model
- http://stackoverflow.com/questions/2451644/gerrit-with-github
- http://julien.danjou.info/blog/2013/rant-about-github-pull-request-workflow-implementation
In reality there are already OpenSource projects that have started
using the two tools together:
- OpenStack (https://wiki.openstack.org/wiki/GerritJenkinsGithub)
- MediaWiki (http://www.mediawiki.org/wiki/Gerrit)
The reason for using GitHub and Gerrit together are:
a) GitHub is widely recognised and accessible by lots of world-wide sites.
b) Using a public GitHub repo allows to "off-load" a lot of git pull traffic.
c) Pull-request allows novice users to start getting involved.
d) Gerrit code-review define the quality gates for avoiding "noise" of unstructured
contributions.
Why a Gerrit plugin ?
---------------------
When using GitHub and Gerrit together, the "master of truth" has to be
Gerrit: this is because it is the place where more control in terms of
security and workflow can be defined.
A Gerrit plugin can help controlling the GitHub replica and importing
the pull requests as Gerrit changes.
Integration points
------------------
### Authentication. (DONE - Change-Id: I7291a90014e51316af3cb07fd03785c1ef33acd0)
Users can login to Gerrit using the same username and credentials
in GitHub. Gerrit login points to GitHub for generating the OAuth token
to be used for the code-review authenticated session.
The initial Gerrit registration page can be customised to import
GitHub SSH Keys directly into Gerrit.
### Push-Pull replication. (DONE - Change-Id: I596b2e80b4d9519668a1ab289d6c950139d6a922)
Existing GitHub repositories are automatically replicated to Gerrit
for the purpose of performing code-review and pushing back changes
once approved. Additionally to the standard Gerrit push replication,
supports as well the ability to pull branches from remote GitHub
repositories.
### Pull-request to Change. (DONE - Change-Id: d669e351a03798cc2ec966d028458f083c232564)
Hooks into the GitHub pull-request mechanism to automatically create
a Change in Gerrit submitted for review.
How to build this plugin
------------------------
### Gerrit 3.3 build
GitHub plugin is designed to work with Gerrit 3.3 (currently in development).
In order to build the GitHub plugin you need to have a working Gerrit 3.3
build in place.
See https://gerrit-review.googlesource.com/Documentation/dev-bazel.html for a
reference on how to build Gerrit using Bazel.
Gerrit 3.3 is distributed for Java 11 only. However, the source code is compatible
with Java 8 assuming you build it from the source repository by yourself.
The GitHub plugin can be built for Java 17 by using the `javaVersion=1.17` Maven
parameter.
Example:
git clone https://gerrit.googlesource.com/plugins/github
cd github
mvn -DjavaVersion=17 install
### singleusergroup plugin
You need to install the singleusergroup plugin for Gerrit
(see https://gerrit-review.googlesource.com/#/admin/projects/plugins/singleusergroup).
This plugin is needed to allow Gerrit to use individual users as Groups for being
used in Gerrit ACLs. As of Gerrit 3.3 singleuserplugin is a core plugin and
included in Gerrit tree (if it was cloned recursively).
Example:
cd gerrit
bazelisk build plugins/singleusergroup
cp bazel-bin/plugins/singleusergroup/singleusergroup.jar $GERRIT_SITE/plugins/.
### Building GitHub integration for Gerrit
Just clone the Git repository (see https://gerrit-review.googlesource.com/#/admin/projects/plugins/github)
and do a `mvn install` from the root directory.
This will create two JARs under github-oauth/target and github-plugin/target: the oauth is a JAR library
to be copied to $GERRIT_SITE/lib whilst the plugin JAR has to be installed as usual under $GERRIT_SITE/plugins.
Example:
git clone https://gerrit.googlesource.com/plugins/github
cd github
mvn install
cp github-oauth/target/github-oauth-*.jar $GERRIT_SITE/lib
cp github-plugin/target/github-plugin-*.jar $GERRIT_SITE/plugins
### Register Gerrit as a Github OAuth application ###
* login to Github
* open the URL: https://github.com/settings/applications/new
* Application name: Gerrit
* Homepage URL: https://review.my-domain.org
* Authorization callback URL: https://review.my-domain.org/oauth
Note: Client ID & Client Secret are generated that used in the next step.
### Running Gerrit init to configure GitHub OAuth
* java -jar bazel-bin/gerrit.war init -d `$GERRIT_SITE`
* User Authentication
* Authentication method []: HTTP
* Get username from custom HTTP header [Y/n]? Y
* Username HTTP header []: GITHUB_USER
* SSO logout URL : /oauth/reset
* GitHub Integration
* GitHub URL: [https://github.com]: <confirm>
* GitHub API URL: [https://api.github.com]: <confirm>
* ClientId []: <provided client id from previous step>
* ClientSecret []: <provided client secret from previous step>
* Gerrit OAuth implementation [http/?]: <http or oauth>
### Receiving Pull Request events to automatically import
* Create a github user account which automatic import operation uses.
* Register the account to your gerrit site by logging into Gerrit with the
account.
* [Create webhook](https://developer.github.com/webhooks/creating/) on your
github repository.
* The payload URL should be something like
http://*your-gerrit-host.example*/plugins/github-plugin-*version*/webhook.
* It is recommended to specify some webhook secret.
* Edit `etc/gerrit.config` and `etc/secure.config` files in your `$gerrit_site`.
* Add the github user account name as `webhookUser` entry in `github` section
of `etc/gerrit.config`
* Add the webhook secret as `webhookSecret` entry in `github` section of
`etc/secure.config`.
### Contributing to the GitHub plugin
The GitHub plugin uses the lombok library, which provides a set of
annotations to reduce the amount of boilerplate code that has to be
written.
To build the plugin in Eclipse, the Lombok Eclipse integration must be
installed.
Download lombok.jar from http://projectlombok.org/ and install:
```
java -jar lombok.jar
```
Follow the instructions to select your Eclipse installation if the
installer cannot detect it automatically.
After the installation, Eclipse must be restarted and compilation
errors should disappear.
### Notes
#### Magic refs
Before importing a repository from github, this plugin checks that its git refs
do not clash with Gerrit magic refs, since importing those refs would prevent
users from creating change requests.
Attempting to import repositories having refs starting with `refs/for/` or
`refs/meta` will fail with an error message.
For example:
```text
Found 2 ref(s): Please remove or rename the following refs and try again:
refs/for/foo, refs/meta/bar
```
More information on Gerrit magic refs can be found [here](https://gerrit-review.googlesource.com/Documentation/intro-user.html#upload-change)