Giter Site home page Giter Site logo

firebase / oss-bot Goto Github PK

View Code? Open in Web Editor NEW
36.0 64.0 29.0 4.79 MB

Robot friend for open source repositories

Home Page: https://ossbot.computer

License: Apache License 2.0

JavaScript 3.84% HTML 5.16% TypeScript 86.10% Makefile 0.35% CSS 4.34% Shell 0.20%

oss-bot's Introduction

Firebase OSS Robot

Introduction

A robot to make open source easy for Firebasers. The robot has multiple distinct features which can be enabled individually.

Custom Emails

In shared repos you may only want to receive email notifications for a subset of the events that are fired. The bot allows you to specify a specific email address for each label and then you will only receive emails for issues/PRs with that label:

// In this example, the engineers on the 'foo' team will get emails
// about issues labeled 'foo' and the engineers on the 'bar' team
// will get emails about issues labeled 'bar'
"my-repo": {
  "labels": {
    "foo": {
      "email":"[email protected]"
    },
    "bar":{
      "email":"[email protected]"
    }
  }
}

Issue Labeling

The bot can automatically label incoming issues based on regex matching:

"my-repo": {
  "labels": {
    "foo": {
      "regex":"Component:[\\s]+?[Ff]oo",
      "email": // ...
    },
  }
}

In the example above, an issue that contains "Component: foo" or "Component: Foo" or any variation would automatically get the "foo" label. When combined with the custom emails configuration above, this means the bot can auto-label and then auto-notify the Foo engineering team about new issues or issue events.

If bot can't find a label for an issue, it will add the label needs-triage and then add a comment explaining to the developer that a human will come to help.

Template Matching

If you use issue templates on your GitHub repo, the bot can enforce that new issues match the template.

Issue templates are considered in "sections" where each section is a third-level header, denoted in markdown by ###. For example:

### Are you in the right place?

Are you using FooBar Engineering products?  If not, go away!

### [REQUIRED] Describe your environment

  * FooBar SDK Version: ____
  * Operating System: ____

### [REQUIRED] Describe your problem

  * What are the steps to reproduce?
  * What do the logs say?

The bot does checks at two levels:

  • Template Integrity - did the developer filling out the template leave all the headers in place? If not, we can't easily parse the content.
  • Required Sections - for any section marked with [REQUIRED] did the developer make at least some change to the content of the section?

If the user violates either of the above checks, the bot will leave a comment telling them what they may have done wrong.

If your issue template is located at ISSUE_TEMPLATE.md then the bot will know where to find it without any configuration. If you want to specify a different location for your template, add it to the config:

"my-repo": {
  // ...
  "templates":{
    "issue":".github/ISSUE_TEMPLATE.md"
  }
}

If your repo has multiple templates (like one for bugs and one for features) you must add a markdown comment to the template to let the robot know how to locate it:

<!-- DO NOT DELETE 
validate_template=true
template_path=.github/ISSUE_TEMPLATE/bug.md
-->

### My first section
...

Template validation

You can configure how the required sections of an issue template are validated and whether/which label is added to the issue in case of a violation:

"validation": {
  "templates": {
    ".github/ISSUE_TEMPLATE/bug.md": {
      "validation_failed_label": "need more info",
      "required_section_validation": "relaxed"
    },
    ...
  }
}

There are three different levels of required section validation:

  • strict: Any empty required section is a violation
  • relaxed: As long as one required section is filled, it's ok
  • none: No validation of required sections

Stale Issue Cleanup

The bot can help you clean up issues that have gone "stale", meaning that more information is needed but has not been provided.

The flow is described in this chart:

The names of the labels and the length of certain time periods can be configured in your repo config:

"my-repo": {
  // ...
  "cleanup": {
    "issue": {
      // [REQUIRED] Label manually applied for issues that need more information.
      "label_needs_info": "Needs Info",

      // [OPTIONAL] Label to be applied for issues that need Googler attention.
      // If unspecified, this state will not have a visible label.
      "label_needs_attention": "Needs Attention",
 
      // [REQUIRED] Label to be applied for issues that don't have recent activity
      "label_stale": "Stale",

      // [OPTIONAL] Label(s) that can be applied to issues to exempt them from the stale
      // checker.
      "ignore_labels": ["Feature Request", "Internal"],

      // [REQUIRED] Time, in days, to stay in the needs_info state before becoming stale
      // stale.  These issues transition from label_needs_info to label_stale.
      "needs_info_days": 7,

      // [REQUIRED] Time, in days, to close an issue after the warning message is posted
      // if there is no recent activity.  These issues will transition from
      // label_stale to closed.
      "stale_days": 3,

      // [OPTIONAL] Time, in days, to lock an issue after it has been closed.
      "lock_days": 60
    }
  }
}

Old Issue Locking

The bot can lock issues that have been closed for a while to prevent new discussion. To enable this, add the lock_days key to your "stale issue config" (see above).

Repo Reports

The bot can send you a weekly report of how healthy your repo is. To receive this report, just add a reporting config:

"my-repo": {
  // ...
  "reports": {
    "email": "[email protected]"
  }
}

You will then receive a weekly email with:

  • Change in open issues, stars, and forks.
  • List of which issues were opened in the past week.
  • List of which issues were closed in the past week.

Monitoring

The bot keeps a log of visible actions it takes on GitHub, which you can view on a per-repo basis:

https://ossbot.computer/audit.html?org=ORG_NAME&repo=REPO_NAME

Deployment

Deploy Functions, Configuration, and Cron Jobs

After completing all configuration below, run make deploy.

Customize Configuration

Edit the functions/config/config.json file to have configuration in the following form:

{
  "<ORG_NAME>": {
    "<REPO_NAME>": {
      // .. REPO CONFIGURATION ...
    }
  }
}

See the feature sections above for the different properties that can be added to the repo configuration.

Configure Secrets

GitHub:

Go to the github token page and create a new personal access token for the bot account with the following permissions:

  • public_repo - access public repositories.
  • admin:repo_hook - read and write repository hooks.
firebase functions:config:set github.token="<YOUR_GITHUB_TOKEN>"

Mailgun:

firebase functions:config:set mailgun.key="<YOUR_MAILGUN_KEY>"
firebase functions:config:set mailgun.domain="<YOUR_MAILGUN_DOMAIN>"

Email

In order to use the SendWeeklyEmail endpoint you need to configure the recipient to some public group.

firebase functions:config:set email.recipient="<GROUP_TO_GET_EMAILS>"

Configure GitHub Webhook

In GitHub add a webhook with the following configuration:

  • Payload URL - your cloud functions HTTP URL. Which should be https://<YOURPROJECT>.cloudfunctions.net/githubWebhook.
  • Content type - application/json
  • Secret - N/A
  • Select individual events:
    • Issues
    • Pull request
    • Issue comment

Development

Test

To run basic tests, use make test-functions which runs the mocha tests the functions directory. These tests are mostly a sanity check, used to verify basic behavior without needing an end-to-end deploy.

Formatting

Code is formatted using prettier so no bikeshedding allowed. Run npm run build in the functions directory before committing.

Build Status

Actions Status

oss-bot's People

Contributors

abeisgoat avatar commanderroot avatar dependabot[bot] avatar jhuleatt avatar jsayol avatar kroikie avatar marcbaechinger avatar mikelehen avatar morganchen12 avatar paulb777 avatar samtstern avatar thatfiredev avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

oss-bot's Issues

Relax template validation for headers

It's understandable to me that users want to remove the [REQUIRED] from the template as it's rather jarring (and, once it's filled out, it's unnecessary information). It would be great if the validator could be flexible and not fail the validation if [REQUIRED] was missing but the section was still present.

[bot] Ping stale issues, close if no response

Right now, the bot only closes stale PRs and issues associated to those PRs. We should expand this capability: the bot pings stale issue with a message, something along the lines of "Looks like this issue hasn't had much activity! I'm going to close this in X days if no one responds", setting expectation for the participants in the thread. If no one responds the bot closes the issue after X days.

Requirements for the first ping:

  • a contributor has at some point responded to the issue
  • issue has had no activity in 2 weeks
  • issue does not have a "keep-open" label

Requirements for closing:

  • last response was the bot's warning ping
  • 1 week has passed
  • issue does not have a "keep-open" label (might be implied from the other requirements)

Multiple assignees in BigQuery

GitHub allows for multiple assignees on an issue but our BigQuery dataset has only a single STRING column to represent assignees.

Links in weekly report of ExoPlayer needs the organisation replaced

The links of issues in the email report of non-firebase repositories still use 'firebase' as the organisation and produce a 404.

The URL would need to have 'firebase' replaced with 'google' in the case of the exoplayer repository:

https://github.com/firebase/exoplayer/issues/5568

It seems to me that report.ts can already deal with the org but the org for GetWeeklyEmail is hardcoded to 'firebase':

https://github.com/firebase/oss-bot/blob/master/functions/src/report.ts#L459
https://github.com/firebase/oss-bot/blob/master/functions/src/report.ts#L568

Apply a label when template validation fails.

When the template fails to validate we could apply a label like needs-triage or needs-more-info.

Open questions:

  • Should this label name be configurable per repo? If so, what is the config format?
  • Should this be in addition to the comment or instead of the comment?

[bot] Bot doesn't properly triage various issues

Received an issue today that followed the template but wasn't properly categorized. The body is below:

Webhook POST Body
{
  "action": "opened",
  "issue": {
    "url": "https://api.github.com/repos/firebase/firebase-js-sdk/issues/35",
    "repository_url": "https://api.github.com/repos/firebase/firebase-js-sdk",
    "labels_url": "https://api.github.com/repos/firebase/firebase-js-sdk/issues/35/labels{/name}",
    "comments_url": "https://api.github.com/repos/firebase/firebase-js-sdk/issues/35/comments",
    "events_url": "https://api.github.com/repos/firebase/firebase-js-sdk/issues/35/events",
    "html_url": "https://github.com/firebase/firebase-js-sdk/issues/35",
    "id": 233943662,
    "number": 35,
    "title": "`startAt()` does not respect 2nd parameter when ordering by child",
    "user": {
      "login": "tjwoon",
      "id": 5500559,
      "avatar_url": "https://avatars3.githubusercontent.com/u/5500559?v=3",
      "gravatar_id": "",
      "url": "https://api.github.com/users/tjwoon",
      "html_url": "https://github.com/tjwoon",
      "followers_url": "https://api.github.com/users/tjwoon/followers",
      "following_url": "https://api.github.com/users/tjwoon/following{/other_user}",
      "gists_url": "https://api.github.com/users/tjwoon/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/tjwoon/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/tjwoon/subscriptions",
      "organizations_url": "https://api.github.com/users/tjwoon/orgs",
      "repos_url": "https://api.github.com/users/tjwoon/repos",
      "events_url": "https://api.github.com/users/tjwoon/events{/privacy}",
      "received_events_url": "https://api.github.com/users/tjwoon/received_events",
      "type": "User",
      "site_admin": false
    },
    "labels": [

    ],
    "state": "open",
    "locked": false,
    "assignee": null,
    "assignees": [

    ],
    "milestone": null,
    "comments": 0,
    "created_at": "2017-06-06T16:05:27Z",
    "updated_at": "2017-06-06T16:05:27Z",
    "closed_at": null,
    "body": "### Describe your environment\r\n\r\n  * Operating System version: macOS 10.12.4\r\n  * Firebase SDK version: 4.1.1\r\n  * Firebase Product: database\r\n\r\n### Describe the problem\r\n\r\nUsing a query with `orderByChild()` and `startAt(null, 'some-key')`, I expect the results to be returned starting with the record with key `'some-key'`, however returned results start at the very first item to match any given filter.\r\n\r\n#### Steps to reproduce:\r\n\r\nStart with this data:\r\n\r\n```json\r\n{\r\n  \"products\" : {\r\n    \"-KlsqFgVWwUrA-j0VsZS\" : {\r\n      \"name\" : \"Product 4\",\r\n      \"price\" : 666\r\n    },\r\n    \"-Klst-cLSckuwAuNAJF8\" : {\r\n      \"name\" : \"Product 1\",\r\n      \"price\" : 100\r\n    },\r\n    \"-Klst7IINdt8YeMmauRz\" : {\r\n      \"name\" : \"Product 2\",\r\n      \"price\" : 50\r\n    },\r\n    \"-Klst9KfM2QWp8kXrOlR\" : {\r\n      \"name\" : \"Product 6\",\r\n      \"price\" : 30\r\n    },\r\n    \"-KlstB51ap1L2tcK8cL6\" : {\r\n      \"name\" : \"Product 5\",\r\n      \"price\" : 99\r\n    },\r\n    \"-KlstDR5cCayGH0XKtZ0\" : {\r\n      \"name\" : \"Product 3\",\r\n      \"price\" : 500\r\n    }\r\n  }\r\n}\r\n```\r\n\r\nI retrieve the first three matching records from this list using this code:\r\n\r\n```javascript\r\nfirebase.database().ref('products')\r\n.orderByChild('price')\r\n.limitToFirst(3)\r\n.on('child_added', function (snapshot) {\r\n    var key = snapshot.key;\r\n    var data = snapshot.val();\r\n    console.log(key + ': ' + JSON.stringify(data))\r\n})\r\n```\r\n\r\nUsing the key of the 3rd record, I try to retrieve records number 3-5:\r\n\r\n```javascript\r\nfirebase.database().ref('products')\r\n.orderByChild('price')\r\n.startAt(null, '-KlstB51ap1L2tcK8cL6')   // this is the key of the 3rd matching record.\r\n.limitToFirst(3)\r\n.on('child_added', function (snapshot) {\r\n    var key = snapshot.key;\r\n    var data = snapshot.val();\r\n    console.log(key + ': ' + JSON.stringify(data))\r\n})\r\n```\r\n\r\n\r\nHowever, if I remove the line `.orderByChild('price')`, then I am able to use `.startAt()` to retrieve items starting at the given record, which is very weird, because the default ordering is `.orderByKey()`, which is not supposed to support startAt's 2nd parameter according to [the documentation](https://firebase.google.com/docs/reference/js/firebase.database.Query#startAt), and also according to [the source code](https://github.com/firebase/firebase-js-sdk/blob/v4.1.1/src/database/js-client/api/Query.js#L68)"
  },
  "repository": {
    "id": 89290483,
    "name": "firebase-js-sdk",
    "full_name": "firebase/firebase-js-sdk",
    "owner": {
      "login": "firebase",
      "id": 1335026,
      "avatar_url": "https://avatars1.githubusercontent.com/u/1335026?v=3",
      "gravatar_id": "",
      "url": "https://api.github.com/users/firebase",
      "html_url": "https://github.com/firebase",
      "followers_url": "https://api.github.com/users/firebase/followers",
      "following_url": "https://api.github.com/users/firebase/following{/other_user}",
      "gists_url": "https://api.github.com/users/firebase/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/firebase/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/firebase/subscriptions",
      "organizations_url": "https://api.github.com/users/firebase/orgs",
      "repos_url": "https://api.github.com/users/firebase/repos",
      "events_url": "https://api.github.com/users/firebase/events{/privacy}",
      "received_events_url": "https://api.github.com/users/firebase/received_events",
      "type": "Organization",
      "site_admin": false
    },
    "private": false,
    "html_url": "https://github.com/firebase/firebase-js-sdk",
    "description": "Firebase Javascript SDK",
    "fork": false,
    "url": "https://api.github.com/repos/firebase/firebase-js-sdk",
    "forks_url": "https://api.github.com/repos/firebase/firebase-js-sdk/forks",
    "keys_url": "https://api.github.com/repos/firebase/firebase-js-sdk/keys{/key_id}",
    "collaborators_url": "https://api.github.com/repos/firebase/firebase-js-sdk/collaborators{/collaborator}",
    "teams_url": "https://api.github.com/repos/firebase/firebase-js-sdk/teams",
    "hooks_url": "https://api.github.com/repos/firebase/firebase-js-sdk/hooks",
    "issue_events_url": "https://api.github.com/repos/firebase/firebase-js-sdk/issues/events{/number}",
    "events_url": "https://api.github.com/repos/firebase/firebase-js-sdk/events",
    "assignees_url": "https://api.github.com/repos/firebase/firebase-js-sdk/assignees{/user}",
    "branches_url": "https://api.github.com/repos/firebase/firebase-js-sdk/branches{/branch}",
    "tags_url": "https://api.github.com/repos/firebase/firebase-js-sdk/tags",
    "blobs_url": "https://api.github.com/repos/firebase/firebase-js-sdk/git/blobs{/sha}",
    "git_tags_url": "https://api.github.com/repos/firebase/firebase-js-sdk/git/tags{/sha}",
    "git_refs_url": "https://api.github.com/repos/firebase/firebase-js-sdk/git/refs{/sha}",
    "trees_url": "https://api.github.com/repos/firebase/firebase-js-sdk/git/trees{/sha}",
    "statuses_url": "https://api.github.com/repos/firebase/firebase-js-sdk/statuses/{sha}",
    "languages_url": "https://api.github.com/repos/firebase/firebase-js-sdk/languages",
    "stargazers_url": "https://api.github.com/repos/firebase/firebase-js-sdk/stargazers",
    "contributors_url": "https://api.github.com/repos/firebase/firebase-js-sdk/contributors",
    "subscribers_url": "https://api.github.com/repos/firebase/firebase-js-sdk/subscribers",
    "subscription_url": "https://api.github.com/repos/firebase/firebase-js-sdk/subscription",
    "commits_url": "https://api.github.com/repos/firebase/firebase-js-sdk/commits{/sha}",
    "git_commits_url": "https://api.github.com/repos/firebase/firebase-js-sdk/git/commits{/sha}",
    "comments_url": "https://api.github.com/repos/firebase/firebase-js-sdk/comments{/number}",
    "issue_comment_url": "https://api.github.com/repos/firebase/firebase-js-sdk/issues/comments{/number}",
    "contents_url": "https://api.github.com/repos/firebase/firebase-js-sdk/contents/{+path}",
    "compare_url": "https://api.github.com/repos/firebase/firebase-js-sdk/compare/{base}...{head}",
    "merges_url": "https://api.github.com/repos/firebase/firebase-js-sdk/merges",
    "archive_url": "https://api.github.com/repos/firebase/firebase-js-sdk/{archive_format}{/ref}",
    "downloads_url": "https://api.github.com/repos/firebase/firebase-js-sdk/downloads",
    "issues_url": "https://api.github.com/repos/firebase/firebase-js-sdk/issues{/number}",
    "pulls_url": "https://api.github.com/repos/firebase/firebase-js-sdk/pulls{/number}",
    "milestones_url": "https://api.github.com/repos/firebase/firebase-js-sdk/milestones{/number}",
    "notifications_url": "https://api.github.com/repos/firebase/firebase-js-sdk/notifications{?since,all,participating}",
    "labels_url": "https://api.github.com/repos/firebase/firebase-js-sdk/labels{/name}",
    "releases_url": "https://api.github.com/repos/firebase/firebase-js-sdk/releases{/id}",
    "deployments_url": "https://api.github.com/repos/firebase/firebase-js-sdk/deployments",
    "created_at": "2017-04-24T21:52:11Z",
    "updated_at": "2017-06-06T14:42:37Z",
    "pushed_at": "2017-06-05T20:13:13Z",
    "git_url": "git://github.com/firebase/firebase-js-sdk.git",
    "ssh_url": "[email protected]:firebase/firebase-js-sdk.git",
    "clone_url": "https://github.com/firebase/firebase-js-sdk.git",
    "svn_url": "https://github.com/firebase/firebase-js-sdk",
    "homepage": "https://firebase.google.com/docs/web/setup",
    "size": 10781,
    "stargazers_count": 384,
    "watchers_count": 384,
    "language": "JavaScript",
    "has_issues": true,
    "has_projects": true,
    "has_downloads": true,
    "has_wiki": true,
    "has_pages": false,
    "forks_count": 19,
    "mirror_url": null,
    "open_issues_count": 10,
    "forks": 19,
    "open_issues": 10,
    "watchers": 384,
    "default_branch": "master"
  },
  "organization": {
    "login": "firebase",
    "id": 1335026,
    "url": "https://api.github.com/orgs/firebase",
    "repos_url": "https://api.github.com/orgs/firebase/repos",
    "events_url": "https://api.github.com/orgs/firebase/events",
    "hooks_url": "https://api.github.com/orgs/firebase/hooks",
    "issues_url": "https://api.github.com/orgs/firebase/issues",
    "members_url": "https://api.github.com/orgs/firebase/members{/member}",
    "public_members_url": "https://api.github.com/orgs/firebase/public_members{/member}",
    "avatar_url": "https://avatars1.githubusercontent.com/u/1335026?v=3",
    "description": ""
  },
  "sender": {
    "login": "tjwoon",
    "id": 5500559,
    "avatar_url": "https://avatars3.githubusercontent.com/u/5500559?v=3",
    "gravatar_id": "",
    "url": "https://api.github.com/users/tjwoon",
    "html_url": "https://github.com/tjwoon",
    "followers_url": "https://api.github.com/users/tjwoon/followers",
    "following_url": "https://api.github.com/users/tjwoon/following{/other_user}",
    "gists_url": "https://api.github.com/users/tjwoon/gists{/gist_id}",
    "starred_url": "https://api.github.com/users/tjwoon/starred{/owner}{/repo}",
    "subscriptions_url": "https://api.github.com/users/tjwoon/subscriptions",
    "organizations_url": "https://api.github.com/users/tjwoon/orgs",
    "repos_url": "https://api.github.com/users/tjwoon/repos",
    "events_url": "https://api.github.com/users/tjwoon/events{/privacy}",
    "received_events_url": "https://api.github.com/users/tjwoon/received_events",
    "type": "User",
    "site_admin": false
  }
}

Retry transient errors like network timeout

In the most recent report, quickstart-ios had no snapshot:
screen shot 2019-01-23 at 11 01 10 am

HttpError: network timeout at: https://api.github.com/repos/firebase/quickstart-ios/issues?access_token=a00421fbfda0a8af79cf843955b2d3816ab0f8f7&per_page=100&page=2&state=all
    at mockable.fetch.then.then.catch.error (/srv/node_modules/@octokit/request/lib/request.js:92:13)
    at <anonymous>
    at process._tickDomainCallback (internal/process/next_tick.js:229:7)

We should increase the timeout of the HTTP client and add retrying into GitHub pagination.

cc @morganchen12

Auto-restrict commenting N days after issue close

We often get new comments on super-old issues with users encountering similar problems. They comment on the old thread and either someone happens to notice it or not, and it gets handled or not.

It would be nice as an option of oss-bot to have it automatically restrict comments N days after an issue is closed and post a message something like:

This issue has been marked as closed and is now closed for comments. If you are experiencing a similar issue, please file it as a new report with all relevant details.

FR: Lock issues after they are fixed

@wilhuff proposed a feature for the bot to lock issues when conversation is no longer productive. It would probably involve the bot leaving a comment like:

Hey everyone. It has been {time interval} since this issue was fixed so I am locking the thread. If you're still having problems please open a new issue (link) and we're happy to discuss.

The main to-do here is to determine the criteria for locking. Should we just do closed for {x} time? Should we require a special label? A milestone?

Make email contents clearer

Feature request:

FWIW: I always misread these firebase-oss-bot. The "@mikelehen:" under "New Comment" makes it look like somebody is replying to me, when really this is my own comment. :-) I think it'd be clearer if it read "New Comment from @mikelehen:" instead.

Fix pan-firebase report spottiness

It seems that the new fan-out method sometimes drops a repo, which really messes with our report. For example in last week's:
screen shot 2019-02-15 at 3 34 52 pm

The star drop is a good signal that something is way wrong. Here are the logs:
screen shot 2019-02-15 at 3 34 09 pm

I am pretty sure the ios SDK was dropped completely, as the open issues and PR counts are really close to what exists on that repo (add in some delta for the other repos).

So we need to make sure the fan-out repo stat collector retries on all failures.

[Backlog] Map templates to issue by label

As an alternative for the mapping of multiple templates by md-comments, the template could be mapped by labels. The advantage is mostly that users can’t remove a label but can remove the md.comment. This might not work for all repos though. Please ignore if not a useful.

For instance

label bug => .github/ISSUE_TEMPLATE/template bug.md
label question => .github/ISSUE_TEMPLATE/question.md
...

OMG. These are things I think about before falling a sleep at night. ¯_(ツ)_/¯

Create an "admin" view for bot auditing

Right now we have to dig into the logs to see what happened for a certain issue. We should log the actions the bot takes and WHY it takes them in some easy-to-view interface.

[reports] Move to a fan-out approach

Currently the SaveOrganizationSnapshot function takes about 5 minutes to run. It would be faster if it fanned out to save each repo snapshot separately in the org.

Double check needs-info and needs-attention in the cron job

It seems that once in a while we miss a webhook that would otherwise cause us to flip from the needs-info to needs-attention state. It's not clear where this gets dropped, but it can result in an issue languishing.

For example here is a webhook GH sent and they claim it timed out:
Screen Shot 2020-12-01 at 2 21 59 PM

But there is no record of it in our logs:
Screen Shot 2020-12-01 at 2 19 40 PM

[bot] Optimistic product labeling for FRs

Right now if the issue is a feature request, it does not label the product even if the regex is matched. We should do so, but not add the needs-triage label in the case of no match.

Bot should not add "needs-triage" tag to feature requests

Feature requests don't typically follow the issue template (in my experience that is), because issue templates are typically geared more towards bugs. This makes it hard to predictably parse the issue meaning a lot of duplicate "needs triage" messages.

I'd propose, for feature requests, we don't worry about the auto-assigning beyond classifying it as a feature request. We can then route it or further classify as need be, but feature requests already have to be human triaged so it feels like a duplicate tag.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.