mirror of
https://github.com/zhigang1992/probot.git
synced 2026-06-16 02:44:19 +08:00
122 lines
5.5 KiB
Markdown
122 lines
5.5 KiB
Markdown
## Plugins
|
||
|
||
A plugin is just a [node module](https://nodejs.org/api/modules.html) that exports a function:
|
||
|
||
```js
|
||
module.exports = robot => {
|
||
// your code here
|
||
};
|
||
```
|
||
|
||
The `robot` parameter is an instance of [`Robot`](/lib/robot.js) and gives you access to all of the bot goodness.
|
||
|
||
### Receiving GitHub webhooks
|
||
|
||
[GitHub webhooks](https://developer.github.com/webhooks/) are fired for almost every significant action that users take on GitHub, whether it's pushes to code, opening or closing issues, opening or merging pull requests, or commenting on a discussion.
|
||
|
||
Many robots will spend their entire day responding to these actions. `robot.on` will listen for any GitHub webhook events:
|
||
|
||
```js
|
||
module.exports = robot => {
|
||
robot.on('push', event => {
|
||
// Code was pushed to the repo, what should we do with it?
|
||
robot.log(event);
|
||
});
|
||
};
|
||
```
|
||
|
||
The robot can listen to any of the [GitHub webhook events](https://developer.github.com/webhooks/#events). `event` object includes all of the information about the event that was triggered, and `event.payload` has the payload delivered by GitHub.
|
||
|
||
Most events also include an "action". For example, the [`issues`](https://developer.github.com/v3/activity/events/types/#issuesevent) event has actions of `assigned`, `unassigned`, `labeled`, `unlabeled`, `opened`, `edited`, `milestoned`, `demilestoned`, `closed`, and `reopened`. Often, your bot will only care about one type of action, so you can append it to the event name with a `.`:
|
||
|
||
```js
|
||
module.exports = robot => {
|
||
robot.on('issues.opened', event => {
|
||
// An issue was just opened.
|
||
});
|
||
};
|
||
```
|
||
|
||
### Interacting with GitHub
|
||
|
||
Probot uses [GitHub Integrations](https://developer.github.com/early-access/integrations/):
|
||
|
||
> Integrations are a new way to extend GitHub. They can be installed directly on organizations and user accounts and granted access to specific repositories. They come with granular permissions and built-in webhooks. Integrations are first class actors within GitHub.
|
||
>
|
||
> –Documentation on [GitHub Integrations](https://developer.github.com/early-access/integrations/)
|
||
|
||
An integration is a first-class actor on GitHub, like a user (e.g. [@defunkt](https://github/defunkt)) or a organization (e.g. [@github](https://github.com/github)). That means it can be given access to repositories and perform actions through the API like [commenting on an issue](https://developer.github.com/v3/issues/comments/#create-a-comment) or [creating a status](https://developer.github.com/v3/repos/statuses/#create-a-status). The integration is given access to a repository or repositories by being "installed" on a user or organization account.
|
||
|
||
Each event delivered includes an ID of the installation that triggered it, which can be used to authenticate. `robot.auth(id)` will give your plugin an authenticated GitHub client that can be used to make API calls.
|
||
|
||
```js
|
||
module.exports = function(robot) {
|
||
robot.on('issues.opened', event => {
|
||
const github = await robot.auth(event.payload.installation.id);
|
||
// do something useful with the github client
|
||
});
|
||
};
|
||
```
|
||
|
||
> Note: `robot.auth` is asynchronous, so it needs to be prefixed with a [`await`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await) to wait for the magic to happen.
|
||
|
||
The `github` object returned from authenticating is an instance of the [github Node.js module](https://github.com/mikedeboer/node-github), which wraps the [GitHub API](https://developer.github.com/v3/) and allows you to do almost anything programmatically that you can do through a web browser.
|
||
|
||
Here is an example of an autoresponder plugin that comments on opened issues:
|
||
|
||
```js
|
||
module.exports = function(robot) {
|
||
robot.on('issues.opened', async function(event, context) {
|
||
const github = await robot.auth(event.payload.installation.id);
|
||
|
||
// `context` extracts information from the event, which can be passed to
|
||
// GitHub API calls. This will return:
|
||
// {owner: 'yourname', repo: 'yourrepo', number: 123, body: 'Hello World!}
|
||
const params = context.issue({body: 'Hello World!'})
|
||
|
||
// Post a comment on the issue
|
||
return github.issues.createComment(params);
|
||
});
|
||
}
|
||
```
|
||
|
||
See the [full API docs](https://mikedeboer.github.io/node-github/) to see all the ways you can interact with GitHub. Some API endpoints are not available on GitHub Integrations yet, so check [which ones are available](https://developer.github.com/early-access/integrations/available-endpoints/) first.
|
||
|
||
### Running plugins
|
||
|
||
TODO: link to docs on getting running in development
|
||
|
||
```
|
||
$ npm install -g https://github.com/probot/probot
|
||
|
||
$ probot run ./autoresponder.js
|
||
Listening on http://localhost:3000
|
||
```
|
||
|
||
### Distributing
|
||
|
||
Plugins can be published in NPM modules, which can either be deployed as stand-alone bots, or combined with other plugins.
|
||
|
||
Use the [plugin-template](https://github.com/probot/plugin-template) repository to get started building your plugin as a node module.
|
||
|
||
```
|
||
$ curl -L https://github.com/probot/plugin-template/archive/master.tar.gz | tar xvz
|
||
$ mv plugin-template probot-myplugin && cd probot-myplugin
|
||
```
|
||
|
||
### Logging
|
||
|
||
Probot uses [bunyan](https://github.com/trentm/node-bunyan) for logging. You can call it with `robot.log`.
|
||
|
||
```js
|
||
robot.log("This is a debug message");
|
||
robot.log.debug("…so is this");
|
||
robot.log.trace("Now we're talking");
|
||
robot.log.info("I thought you should know…");
|
||
robot.log.warn("Woah there");
|
||
robot.log.error("ETOOMANYLOGS");
|
||
robot.log.fatal("Goodbye, cruel world!");
|
||
```
|
||
|
||
The default log level is `debug`, but you can change it by setting the `LOG_LEVEL` environment variable to `trace`, `info`, `warn`, `error`, or `fatal`.
|