{"id":15013678,"url":"https://github.com/quarkusio/quarkus-github-lottery","last_synced_at":"2025-07-14T19:39:38.518Z","repository":{"id":59912134,"uuid":"533327849","full_name":"quarkusio/quarkus-github-lottery","owner":"quarkusio","description":"A Quarkus-powered application that regularly sends short lists of GitHub issues for triagers/maintainers to consider","archived":false,"fork":false,"pushed_at":"2025-07-07T17:40:33.000Z","size":1070,"stargazers_count":7,"open_issues_count":5,"forks_count":4,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-07-14T03:40:50.159Z","etag":null,"topics":["github","quarkus"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/quarkusio.png","metadata":{"files":{"readme":"README.adoc","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-09-06T13:05:45.000Z","updated_at":"2025-07-01T07:34:42.000Z","dependencies_parsed_at":"2023-02-17T07:16:09.278Z","dependency_job_id":"78fdb400-6620-486b-916e-41af64c23027","html_url":"https://github.com/quarkusio/quarkus-github-lottery","commit_stats":{"total_commits":249,"total_committers":5,"mean_commits":49.8,"dds":0.5180722891566265,"last_synced_commit":"b8a636c07dd9c5315293620b2066f735988ed70f"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/quarkusio/quarkus-github-lottery","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/quarkusio%2Fquarkus-github-lottery","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/quarkusio%2Fquarkus-github-lottery/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/quarkusio%2Fquarkus-github-lottery/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/quarkusio%2Fquarkus-github-lottery/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/quarkusio","download_url":"https://codeload.github.com/quarkusio/quarkus-github-lottery/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/quarkusio%2Fquarkus-github-lottery/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265336610,"owners_count":23749193,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["github","quarkus"],"created_at":"2024-09-24T19:44:39.461Z","updated_at":"2025-07-14T19:39:38.480Z","avatar_url":"https://github.com/quarkusio.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"= Quarkus GitHub Lottery\n\n\u003e A Quarkus-powered GitHub App that regularly sends short lists of GitHub issues/PRs for triagers/maintainers/stewards to consider.\n\n[[intro]]\n== Introduction\n\nThis GitHub App is based on the https://github.com/quarkiverse/quarkus-github-app[Quarkus GitHub App framework].\n\nIt periodically extracts GitHub issues/PRs from one \"source\" GitHub repository (e.g. https://github.com/quarkusio/quarkus)\nand notifies maintainers about them by commenting on GitHub issues in another \"notification\" GitHub repository\n(e.g. https://github.com/quarkusio/quarkus-github-lottery-reports).\nThat second \"notification\" repository \u003c\u003cadmins-install,may be private\u003e\u003e,\nas it's only about notifying maintainers.\n\nEach maintainer who participates in the lottery (opt-in)\ngets their own dedicated GitHub issue in the \"reports\" repository,\non which the application will add one comment mentioning the maintainer\neach time its sends a notification.\nThat way, maintainers will get daily (or weekly) reports via email,\nsent by GitHub when the comment is added.\n\nIssues/PRs are randomly assigned among eligible maintainers up to a limit they define themselves,\nso that everyone gets a chance to help according to the time they want to invest.\n\nThere are multiple categories of issues/PRs that one can be notified about;\nsee \u003c\u003cmaintainers\u003e\u003e for more information, but here's what an email notification may look like:\n\nimage::documentation/screenshots/notification.png[Example of an email notification,align=\"center\"]\n\n[[maintainers]]\n== Triagers/Maintainers/Stewards: how to get notifications\n\n[[participants-basics]]\n=== Basics\n\nAs a Quarkus triager, a Quarkus core/extension maintainer, or a Quarkus steward,\nin order to get notifications about Quarkus issues/PRs on GitHub:\n\n* Make sure you have access to the https://github.com/quarkusio/quarkus-github-lottery-reports[\"notification\" repository]\n  if not, request access to an admin of the https://github.com/quarkusio[quarkusio] organization.\n* Send a pull request to the \"watched\" repository (most likely https://github.com/quarkusio/quarkus)\n  to edit file https://github.com/quarkusio/quarkus/blob/main/.github/quarkus-github-lottery.yml[`.github/quarkus-github-lottery.yml`].\n  Add an entry with your username to the `participants` section.\n\nHere is what an entry will look like:\n\n[source,yaml]\n----\n# [...]\nparticipants:\n  - username: \"yrodiere\"\n    timezone: \"Europe/Paris\"\n    triage:\n      days: [\"MONDAY\", \"WEDNESDAY\", \"FRIDAY\"]\n      maxIssues: 3\n    maintenance:\n      labels: [\"area/hibernate-orm\", \"area/hibernate-search\"]\n      days: [\"TUESDAY\"]\n      feedback:\n        needed:\n          maxIssues: 4\n        provided:\n          maxIssues: 2\n      stale:\n        maxIssues: 5\n    stewardship:\n      days: [\"MONDAY\"]\n      maxIssues: 5\n----\n\n`username`::\nYour GitHub username.\n+\nString, mandatory, no default.\n`timezone`::\nYour timezone, to get notifications at the right time on the right day.\n+\n`java.time.ZoneId` as a String, optional, defaults to `UTC`.\n`triage`::\nOptional section for triagers.\n+\nSee \u003c\u003cparticipants-triage\u003e\u003e for details.\n`maintenance`::\nOptional section for maintainers.\n+\nSee \u003c\u003cparticipants-maintenance\u003e\u003e for details.\n`stewardship`::\nOptional section for stewards.\n+\nSee \u003c\u003cparticipants-stewardship\u003e\u003e for details.\n\nThe `triage`, `maintenance` and `stewardship` sections are all optional;\nyou may participate in triage but not maintain an area of Quarkus nor do any stewardship, and vice-versa,\nor do everything.\nSee below for details about each section.\n\n[[participants-triage]]\n=== Triage\n\nIf the `triage` section is present, you will get notified about Issues/PRs that haven't been assigned an area yet.\n\nPlease add an area label, remove the \"needs triage\" (e.g. `triage/needs-triage`) label,\nand ping the relevant maintainers if necessary.\n\nOf course, some more discussion might be necessary before that, and that's fine:\nissues that don't change will reappear in another notification, a few days later.\n\nThe `triage` section will look like this:\n\n[source,yaml]\n----\n# [...]\nparticipants:\n  - username: \"yrodiere\"\n    triage:\n      days: [\"MONDAY\", \"TUESDAY\", \"WEDNESDAY\", \"THURSDAY\", \"FRIDAY\"]\n      maxIssues: 3\n----\n\n`days`::\nOn which days you wish to get notified about triage.\n+\nArray of ``WeekDay``s, mandatory, no default.\n`maxIssues`::\nHow many issues/PRs, at most, you wish to be included in the \"triage\" category\nfor each notification.\n+\nInteger, mandatory, no default.\n\n[[participants-maintenance]]\n=== Maintenance\n\nIf the `maintenance` section is present, you will get notified about issues/PRs\nrelated to a specific area (e.g. `area/hibernate-orm`)\nthat may be stalled and require intervention from maintainers or reporters.\n\nIssues/PRs in \"maintenance\" notifications will be split in several categories:\n\nCreated::\nIssues or PRs that just got created in your area.\n+\nPlease review, ask for reproducer/information, or plan future work.\nFeedback Needed::\nIssues with missing reproducer/information.\n+\nPlease ping the reporter, or close the issue if it's taking too long.\nFeedback Provided::\nIssues with newly provided reproducer/information.\n+\nPlease have a closer look, possibly remove the \"needs feedback\" (e.g. `triage/needs-reproducer`)  label, and plan further work.\nStale::\nIssues or PRs last updated a long time ago.\n+\nPlease have a closer look, re-prioritize, ping someone, label as \"on ice\", close the issue/PR, ...\n\nOf course, in every situation, simply continuing the conversation,\npinging someone, or even doing nothing at all are perfectly acceptable responses:\nit's all up to you, and issues/PRs that don't change will reappear in another notification, a few days later.\n\nThe `maintenance` section will look like this:\n\n[source,yaml]\n----\n# [...]\nparticipants:\n  - username: \"yrodiere\"\n    maintenance:\n      labels: [\"area/hibernate-orm\", \"area/hibernate-search\", \"area/elasticsearch\"]\n      days: [\"MONDAY\", \"TUESDAY\", \"WEDNESDAY\", \"THURSDAY\", \"FRIDAY\"]\n      created:\n        maxIssues: 5\n      feedback:\n        needed:\n          maxIssues: 4\n        provided:\n          maxIssues: 2\n      stale:\n        maxIssues: 5\n----\n\n`labels`::\nThe labels identifying issues/PRs you are interested in, as a maintainer.\nIssues/PRs mentioned in notifications will have at least one of these labels.\n+\nArray of Strings, mandatory, no default.\n`days`::\nOn which days you wish to get notified about maintenance.\n+\nArray of ``WeekDay``s, mandatory, no default.\n`created.maxIssues`::\nHow many issues/PRs, at most, you wish to be included in the \"Created\" category\nfor each notification.\n+\nInteger, mandatory if the `created` section is present, no default.\n`feedback.needed.maxIssues`::\nHow many issues/PRs, at most, you wish to be included in the \"Feedback needed\" category\nfor each notification.\n+\nInteger, mandatory if the `feedback` section is present, no default.\n`feedback.provided.maxIssues`::\nHow many issues/PRs, at most, you wish to be included in the \"Feedback provided\" category\nfor each notification.\n+\nInteger, mandatory if the `feedback` section is present, no default.\n`stale.maxIssues`::\nHow many issues/PRs, at most, you wish to be included in the \"Stale\" category\nfor each notification.\n+\nInteger, mandatory if the `stale` section is present, no default.\n\n[[participants-stewardship]]\n=== Stewardship\n\nIMPORTANT: This section should only be of interest to stewards:\ncore contributors who spend significant time working on GitHub issues/PRs.\nIf you don't already know what this section is about,\nyou probably don't want to use it.\n\nIf the `stewardship` section is present, you will get notified about issues or PRs across all areas last updated a long time ago.\n\nPlease have a closer look, re-prioritize, ping someone, label as \"on ice\", close the issue/PR, ...\n\nNOTE: Notifications to stewards are sent independently of notifications to maintainers,\nso that the work of maintainers won't be affected by the work of stewards.\nIt is entirely possible for a maintainer to be notified about an issue/PR\nat the same time as a steward.\n\nThe `stewardship` section will look like this:\n\n[source,yaml]\n----\n# [...]\nparticipants:\n  - username: \"yrodiere\"\n    stewardship:\n      days: [\"MONDAY\"]\n      maxIssues: 5\n----\n\n`days`::\nOn which days you wish to get notified about stewardship.\n+\nArray of ``WeekDay``s, mandatory, no default.\n`maxIssues`::\nHow many issues/PRs, at most, you wish to be included in the \"stewardship\" category\nfor each notification.\n+\nInteger, mandatory, no default.\n\n[[participants-suspending]]\n=== Suspending notifications\n\nYou can suspend notifications (temporarily or forever) simply by closing the dedicated GitHub issue\ncreated for you in the \"notification\" repository.\n\nSee the footnote in the notifications you receive.\n\n[[admins]]\n== Admins: how to install and initialize configuration\n\n[[admins-install]]\n=== Installing\n\nHere is a link to the application on GitHub: https://github.com/apps/quarkus-github-lottery\n\nThe application needs to be installed on both the \"source\" repository (the one issues/PRs are extracted from)\nand the \"notification\" repository (the one \"notification\" issues are added to).\n\nIMPORTANT: For security reasons,\n**the two GitHub repositories need to be in the same organization** (technically, the same \"installation\").\nFailing that, lottery draws will error out and will not send any notification.\n\n[TIP]\n====\nThe \"notification\" repository should ideally be private:\n\n* This repository is only about notifying maintainers, so it does not provide any useful information to anyone else.\n* Making the \"notification\" repository public would lead to publicly visible references to notifications\nin the history of \"source\" issues/PRs, like this:\n+\nimage::documentation/screenshots/notification-reference.png[Example of references to notifications in the GitHub issue/PR history,align=\"center\"]\n+\nThose add clutter to the history, and might create false hopes in issue/PR submitters\n(\"someone is actively addressing my issue!\").\n====\n\n[[admins-config]]\n=== Configuring\n\nThe configuration file https://github.com/quarkusio/quarkus/blob/main/.github/quarkus-github-lottery.yml[`.github/quarkus-github-lottery.yml`]\nincludes several sections that are common to all participants to the lottery:\n\n[source,yaml]\n----\nnotifications:\n  createIssues:\n    repository: \"quarkusio/quarkus-github-lottery-reports\"\nbuckets:\n  triage:\n    label: \"triage/needs-triage\"\n    delay: PT0S\n    timeout: P3D\n  maintenance:\n    created:\n      delay: PT0S\n      timeout: P1D\n      expiry: P14D\n      ignoreLabels: [\"triage/on-ice\"]\n    feedback:\n      labels: [\"triage/needs-reproducer\"]\n      needed:\n        delay: P21D\n        timeout: P3D\n      provided:\n        delay: P7D\n        timeout: P3D\n    stale:\n      delay: P60D\n      timeout: P14D\n      ignoreLabels: [\"triage/on-ice\"]\n  stewardship:\n    delay: P60D\n    timeout: P14D\n    ignoreLabels: [\"triage/on-ice\"]\n# [...]\n----\n\n`notifications.createIssues.repository`::\nThe full name of the GitHub repository where \"reports\"/\"notification issues\" will be created.\n+\nString, mandatory, no default.\n`buckets.triage.label`::\nThe label identifying GitHub issues/PRs that require triage.\n+\nString, mandatory, no default.\n`buckets.triage.delay`::\nHow much time to wait after the last update on an issue/PR\nbefore including it in the lottery in the \"triage\" bucket.\n+\nString in https://en.wikipedia.org/wiki/ISO_8601#Durations[ISO-8601 duration format], mandatory, no default.\n`buckets.triage.timeout`::\nHow much time to wait after an issue/PR was last notified about\nbefore including it again in the lottery in the \"triage\" bucket.\n+\nString in https://en.wikipedia.org/wiki/ISO_8601#Durations[ISO-8601 duration format], mandatory, no default.\n+\n`buckets.maintenance.created.delay`::\nHow much time to wait after the creation of an issue/PR\nbefore including it in the lottery in the \"created\" bucket.\n+\nString in https://en.wikipedia.org/wiki/ISO_8601#Durations[ISO-8601 duration format], mandatory, no default.\n`buckets.maintenance.created.timeout`::\nHow much time to wait after an issue/PR was last notified about\nbefore including it again in the lottery in the \"created\" bucket.\n+\nString in https://en.wikipedia.org/wiki/ISO_8601#Durations[ISO-8601 duration format], mandatory, no default.\n+\n`buckets.maintenance.created.expiry`::\nHow much time to wait after the creation of an issue/PR\nbefore excluding it from the lottery in the \"created\" bucket.\n+\nString in https://en.wikipedia.org/wiki/ISO_8601#Durations[ISO-8601 duration format], mandatory, no default.\n`buckets.maintenance.created.ignoreLabels`::\nThe labels identifying GitHub issues/PRs that should be ignored for the \"created\" bucket.\nIssues/PRs with one of these labels will never be added to the bucket.\n+\nArray of Strings, optional, defaults to an empty array.\n`buckets.maintenance.feedback.labels`::\nThe labels identifying GitHub issues for which feedback (a reproducer, more information, ...) was requested.\n+\nArray of strings, mandatory, no default.\n`buckets.maintenance.feedback.needed.delay`::\nHow much time to wait after the last update on an issue\nbefore including it in the lottery in the \"feedback needed\" bucket.\n+\nString in https://en.wikipedia.org/wiki/ISO_8601#Durations[ISO-8601 duration format], mandatory, no default.\n`buckets.maintenance.feedback.needed.timeout`::\nHow much time to wait after an issue was last notified about\nbefore including it again in the lottery in the \"feedback needed\" bucket.\n+\nString in https://en.wikipedia.org/wiki/ISO_8601#Durations[ISO-8601 duration format], mandatory, no default.\n`buckets.maintenance.feedback.provided.delay`::\nHow much time to wait after the last update on an issue\nbefore including it in the lottery in the \"feedback provided\" bucket.\n+\nString in https://en.wikipedia.org/wiki/ISO_8601#Durations[ISO-8601 duration format], mandatory, no default.\n`buckets.maintenance.feedback.provided.timeout`::\nHow much time to wait after an issue was last notified about\nbefore including it again in the lottery in the \"feedback provided\" bucket.\n+\nString in https://en.wikipedia.org/wiki/ISO_8601#Durations[ISO-8601 duration format], mandatory, no default.\n`buckets.maintenance.stale.delay`::\nHow much time to wait after the last update on an issue/PR\nbefore including it in the lottery in the \"stale\" bucket.\n+\nString in https://en.wikipedia.org/wiki/ISO_8601#Durations[ISO-8601 duration format], mandatory, no default.\n`buckets.maintenance.stale.ignoreLabels`::\nThe labels identifying GitHub issues/PRs that should be ignored for the \"stale\" bucket.\nIssues/PRs with one of these labels will never be added to the bucket.\n+\nArray of Strings, optional, defaults to an empty array.\n`buckets.maintenance.stale.timeout`::\nHow much time to wait after an issue/PR was last notified about\nbefore including it again in the lottery in the \"stale\" bucket.\n+\nString in https://en.wikipedia.org/wiki/ISO_8601#Durations[ISO-8601 duration format], mandatory, no default.\n`buckets.stewardship.delay`::\nHow much time to wait after the last update on an issue/PR\nbefore including it in the lottery in the \"stewardship\" bucket.\n+\nString in https://en.wikipedia.org/wiki/ISO_8601#Durations[ISO-8601 duration format], mandatory, no default.\n`buckets.stewardship.timeout`::\nHow much time to wait after an issue/PR was last notified about\nbefore including it again in the lottery in the \"stewardship\" bucket.\n+\nString in https://en.wikipedia.org/wiki/ISO_8601#Durations[ISO-8601 duration format], mandatory, no default.\n`buckets.stewardship.ignoreLabels`::\nThe labels identifying GitHub issues/PRs that should be ignored for the \"stewardship\" bucket.\nIssues/PRs with one of these labels will never be added to the bucket.\n+\nArray of Strings, optional, defaults to an empty array.\n\n[[config-validation]]\n=== Validation of the configuration\n\nThe application will automatically add a check to any pull request that changes its \u003c\u003cconfig,configuration file\u003e\u003e.\n\nThe check is fairly simple, it just attempts to deserialize the YAML file and reports any exception.\n\n[[commands]]\n=== Comment-based commands\n\nhttps://quarkiverse.github.io/quarkiverse-docs/quarkus-github-app/dev/commands.html[Comment-based commands]\nare available for admins.\nYou can invoke it by adding a comment on any issue or pull request for repositories where the app is installed.\n\nIt supports the following commands:\n\n* `/lottery draw`: force a lottery draw immediately.\n\u003c\u003cdelay-and-timeout,Timeouts\u003e\u003e are still complied with,\nso this command is mostly useful if you manually edited the notification history or changed the configuration,\nwhich may happen frequently in dev mode in particular.\n\n[[contributing]]\n== Contributing\n\nTo participate in the development of this GitHub App, create a playground project in your own org and\nfollow the steps outlined in https://quarkiverse.github.io/quarkiverse-docs/quarkus-github-app/dev/index.html[the Quarkus GitHub App documentation].\n\nWhen registering your app, request the following Repository permissions:\n\n* Checks - `Read \u0026 Write`: to \u003c\u003cconfig-validation,validate configuration files\u003e\u003e.\n* Issues - `Read \u0026 Write`: to list issues that should be notified, and to create \"notification\" issues in another repository.\n* Pull Requests - `Read \u0026 Write`: to list PRs that should be notified, and to react to \u003c\u003ccommands,comment-based commands\u003e\u003e.\n\nAnd subscribe to the following events:\n\n* Check run, Check suite, Pull request: to \u003c\u003cconfig-validation,validate configuration files\u003e\u003e.\n* Issue comment: to listen to \u003c\u003ccommands,comment-based commands\u003e\u003e.\n\n[[deployment]]\n== Deployment\n\nMaintainers can review the application and update configuration/secrets on the OpenShift console.\n\nThere is only one namespace at the moment:\n\n* Production (`main` branch):\n** Console: https://console-openshift-console.apps.ospo-osci.z3b1.p1.openshiftapps.com/k8s/cluster/projects/prod-quarkus-github-lottery\n\nDeployment will happen automatically when pushing to the relevant branch.\n\nBe careful about which configuration you change in the UI,\nas deployment may overwrite part of the topology.\n\n[[license]]\n== License\n\nThis project is licensed under the Apache License Version 2.0.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fquarkusio%2Fquarkus-github-lottery","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fquarkusio%2Fquarkus-github-lottery","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fquarkusio%2Fquarkus-github-lottery/lists"}