It's a "PR Gnome", not a "program nome"!
This is a small bot that you can install in your Github organization to prevent you from pressing the nice green "Merge" button before the PR is truly ready.
If a PR is tagged with some variant of "Don't merge", "Work in progress",
"Blocked", or contains fixup!
/squash!
/"tmp" commits then this app will
produce a "Failed" check on your PR.
This makes the "Merge" button gray again until you rebase or remove the tags.
prgnome supports configuration via command line argument, through ENV
variables, and through .env
files.
They will be read in this order (first one wins):
- CLI arguments (like
--github-webhook-secret
) .env
file (likeGITHUB_WEBHOOK_SECRET
)- Normal environment variables (like
GITHUB_WEBHOOK_SECRET
)
A full reference can be found under the --help
output.
- Create a new Github App.
- Name it something you like.
- Determine which hostname you will deploy it under and input it for the
URLs below.
- Webhook URL is
<URL>/webhook
. - User authorization callback URL is unused but still required, so enter
<URL>/auth/callback
.
- Webhook URL is
- If you are using HTTPS, then also enable SSL verification!
- Permissions:
- Checks: Read & Write
- Repository contents: Read-only
- Repository metadata: Read-only
- Pull requests: Read-only
- Commit statuses: Read & Write
- Everything else: No access
- Subscribe to events:
- Pull request
- Download the private key and store the webhook secret somewhere.
- Convert the private key from PEM format into DER format.
- Use
contrib/generate_private_key.sh
from this repo, or manually run the commands inside that script.
- Use
- Deploy. (See below)
- Install the app in your organization
- Click on the "Public Page" of your new application.
- Then click on "Install".
- Select which repos you want it to access.
Deploy mange/prgnome
and set these environment variables:
BIND
(defaults to127.0.0.1:8002
)GITHUB_APP_ID
to the app ID of your newly created appGITHUB_WEBHOOK_SECRET
to the webhook secret you saved when you created the appLOG_LEVEL
to the level you want (error
,warning
,verbose
,debug
)
Also mount your private key (in DER format) as private_key.der
, or set
PRIVATE_KEY_PATH
to point to the mounted key if you use some other path.
Example docker-compose
version: "3.3"
services:
prgnome:
image: mange/prgnome:latest
environment:
BIND: 0.0.0.0:8989
GITHUB_APP_ID: 12345
GITHUB_WEBHOOK_SECRET: REDACTED
volumes:
- "/path/to/private_key.der:private_key.der"
restart_policy:
condition: on-failure
Then place some web server in front to proxy to the $BIND
address and
terminate SSL. If the web server is not running inside Docker, don't forget to
place a ports
configuration there to expose your port on the Docker host.
Use the units under contrib/systemd
as a base and build your own setup. The
default setup if you make no changes is this:
prgnome.service
can be enabled to start automatically on bootprgnome.socket
can be enabled to start the daemon on-demand on first connection- If both are enabled, the daemon will boot when system is ready but sockets will start to get accepted earlier to reduce risks of dropped connections.
- Environment variables will be read from
/etc/xdg/prgnome/settings.env
, which is where you can put things likeLOG_LEVEL
,GITHUB_APP_ID
, andGITHUB_WEBHOOK_SECRET
. - The private key will be read from
/etc/xdg/prgnome/private_key.der
, unless overridden by thesettings.env
file.
You can read more about socket units here: Systemd for Developers I
Run prgnome --help
to see which options are accepted. Process will run in the
foreground, so it is up to you to daemonize it and restart it on crashes.
It is recommended to run in Docker or Systemd if possible.
Install Rust via Rustup. Then run the tests or finished binary using cargo
:
cargo test
or cargo run -- --help
Create an Github App like under the installation instructions, but for
development. Download the private key to the root of this directory and run
./contrib/generate_private_key.sh
.
Copy example.env
into .env
and edit it so it contains the correct details
from your newly created example app.
You can now run ./dev-server.sh
which will watch for code changes, run tests,
and start the server. This dev server will bind to 127.0.0.1:4567
, so you can
easily run something like ngrok http 4567
to proxy this over the internet.
Running ngrok 4567
will give you an URL to use for your app. Edit the Github
app to point to this new hostname, and then install the App in one of your
repositories.
Webhooks triggered on this repo will now be sent to your local process and you should be able to see the debug output that is written as it happens.
Released under the MIT license. See LICENSE
file.
Copyright (c) 2018 Magnus Bergmark