| 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) |