{"id":16805266,"url":"https://github.com/joshjohanning/approveops","last_synced_at":"2026-01-27T00:22:44.956Z","repository":{"id":37897426,"uuid":"456355267","full_name":"joshjohanning/approveops","owner":"joshjohanning","description":"GitHub Action for Approvals in IssueOps (ChatOps)","archived":false,"fork":false,"pushed_at":"2023-12-03T21:13:16.000Z","size":55,"stargazers_count":8,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-11T00:46:01.729Z","etag":null,"topics":["actions","approval","github","issue-ops","issueops"],"latest_commit_sha":null,"homepage":"https://josh-ops.com/posts/github-approveops/","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/joshjohanning.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2022-02-07T04:19:32.000Z","updated_at":"2024-05-10T14:58:17.000Z","dependencies_parsed_at":"2023-11-29T02:25:46.551Z","dependency_job_id":"b21148c0-3bcc-49cc-98b7-8a38e429f18a","html_url":"https://github.com/joshjohanning/approveops","commit_stats":{"total_commits":45,"total_committers":1,"mean_commits":45.0,"dds":0.0,"last_synced_commit":"298e6a98477485b54698819bfb75527c60f53c05"},"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joshjohanning%2Fapproveops","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joshjohanning%2Fapproveops/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joshjohanning%2Fapproveops/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joshjohanning%2Fapproveops/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/joshjohanning","download_url":"https://codeload.github.com/joshjohanning/approveops/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248322605,"owners_count":21084336,"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":["actions","approval","github","issue-ops","issueops"],"created_at":"2024-10-13T09:47:39.446Z","updated_at":"2026-01-27T00:22:44.918Z","avatar_url":"https://github.com/joshjohanning.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# ApproveOps Action\n\n[![GitHub release](https://img.shields.io/github/release/joshjohanning/approveops.svg?logo=github\u0026labelColor=333)](https://github.com/joshjohanning/approveops/releases)\n[![Immutable Releases](https://img.shields.io/badge/releases-immutable-blue?labelColor=333)](https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/immutable-releases)\n[![GitHub marketplace](https://img.shields.io/badge/marketplace-ApproveOps-blue?logo=github\u0026labelColor=333)](https://github.com/marketplace/actions/approveops-approvals-in-issueops)\n[![CI](https://github.com/joshjohanning/approveops/actions/workflows/ci.yml/badge.svg)](https://github.com/joshjohanning/approveops/actions/workflows/ci.yml)\n[![Publish GitHub Action](https://github.com/joshjohanning/approveops/actions/workflows/publish.yml/badge.svg)](https://github.com/joshjohanning/approveops/actions/workflows/publish.yml)\n![Coverage](./badges/coverage.svg)\n\nApprovals in IssueOps\n\nSee the following guide on this action: https://josh-ops.com/posts/github-approveops/\n\n## Usage\n\n```yml\nname: ApproveOps\non:\n  issue_comment:\n    types: [created]\n\njobs:\n  approveops:\n    runs-on: ubuntu-latest\n    if: contains(github.event.comment.body, '/do-stuff')\n\n    steps:\n      - uses: actions/create-github-app-token@v1\n        id: app-token\n        with:\n          app-id: ${{ vars.APP_ID }}\n          private-key: ${{ secrets.PRIVATE_KEY }}\n\n      - name: ApproveOps - Approvals in IssueOps\n        uses: joshjohanning/approveops@v3\n        id: check-approval\n        with:\n          token: ${{ steps.app-token.outputs.token }}\n          approve-command: '/approve'\n          team-name: 'approver-team'\n          fail-if-approval-not-found: true\n          post-successful-approval-comment: false\n```\n\n### Inputs\n\n| Name                               | Description                                                                                                                                                                     | Required | Default                                                                                          |\n| ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------ |\n| `token`                            | GitHub App installation token or PAT that has access to read+write comments and list the team's membership                                                                      | `true`   | `''`                                                                                             |\n| `approve-command`                  | The approval command to look for in the comments                                                                                                                                | `true`   | `/approve`                                                                                       |\n| `team-name`                        | The name of the team in GitHub to check for the approval command, e.g. `approver-team`. **Note:** Team must exist in the same organization as the repository running the action | `true`   | `''`                                                                                             |\n| `fail-if-approval-not-found`       | Fail the action (show the action run as red) if the command is not found in the comments from someone in the approver team                                                      | `true`   | `true`                                                                                           |\n| `post-successful-approval-comment` | Whether to post successful approval comment                                                                                                                                     | `true`   | `true`                                                                                           |\n| `successful-approval-comment`      | Comment to post if an approval is found                                                                                                                                         | `true`   | `':tada:  You were able to run the workflow because someone left an approval in the comments!!'` |\n\n\u003e [!NOTE]\n\u003e The `approve-command` must match the entire comment text (whitespace is ignored). For example, `/approve` will match `/approve` or `/approve\\n`, but not `I /approve this` or `/approve please`.\n\n## Prerequisites\n\n### Team and Authentication\n\n1. Create a GitHub team and add at least one member\n2. Authentication options:\n\n- GitHub App\n  - If you are using a GitHub Github App, it will need following permissions:\n    - **read \u0026 write** on `Repository / Issues` to create the comment\n    - **read-only** on `Organization / Members` to list the members of the team\n  - Generate a `PRIVATE_KEY` for the GitHub app and store it as a repo or organizational secret\n  - Note the `APP ID` to use as an input for an action like `actions/create-github-app-token@v1`\n- Classic PAT\n  - If you are using a classic PAT, it will need the following scopes:\n  - `repo` - to create the comment\n  - `read:org` - to list the members of the team\n- Fine-grained PAT\n  - If you are using a fine-grained PAT, it will need following permissions (same as GitHub App):\n    - **read \u0026 write** on `Repository / Issues` to create the comment\n    - **read-only** on `Organization / Members` to list the members of the team\n\nSee the following guide on creating a GitHub app: https://josh-ops.com/posts/github-apps/\n\nNotes:\n\n- A Personal Access Token (PAT) is not used since we want the comment to show as from a bot\n- The `github.token` is not used since the token can't provide hyperlinks for @ mentions since it doesn't have the scope for org teams, only repository data\n\n### Runner Software Requirements\n\nNo additional software requirements! `v3` of this action now runs natively using Node.js and the GitHub REST API.\n\nThe software running the GitHub Actions workflow must have Node.js version \u003e=20 installed.\n\n\u003e [!TIP]\n\u003e Enable debug logging by setting the `ACTIONS_STEP_DEBUG` secret to `true` to see detailed approval checking logs. See [Enabling debug logging](https://docs.github.com/en/actions/monitoring-and-troubleshooting-workflows/enabling-debug-logging).\n\n## Breaking Changes\n\n### v2 to v3\n\nNo breaking changes. The action was converted from a composite action to a native Node.js action.\n\n### v1 to v2\n\nExtracting the logic for generating a GitHub App's installation token so that you can either use an alternative action or method to retrieve the token or to be able use a GitHub PAT instead.\n\nAdded/removed the following inputs:\n\n| Input             | Action  | Required | Note                                                                                                                                                                  |\n| ----------------- | ------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `token`           | Added   | Yes      | GitHub App installation token or PAT that has access to read+write comments and list the team's membership, e.g.: `${{ steps.get_installation_token.outputs.token }}` |\n| `approve-command` | Added   | No       | Optional, defaults to `/approve`, the command to look for in the comments                                                                                             |\n| `app-id`          | Removed | Yes      | The app ID for a GitHub App, e.g.: `170284`                                                                                                                           |\n| `app-private-key` | Removed | Yes      | The private key for a GitHub App, e.g.: `${{ secrets.APP_PRIVATE_KEY }}`                                                                                              |\n\nRemoved the following dependency:\n\n- `tibdex/github-app-token@v1`\n\n## Screenshots\n\n![approveops](https://user-images.githubusercontent.com/19912012/154545687-8d64a775-eec2-4ec7-90dc-901b2d6d39a5.png)\n\n![workflow](https://user-images.githubusercontent.com/19912012/154543171-33551f48-3026-4737-b8b7-7c427a7a8cd8.png)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoshjohanning%2Fapproveops","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjoshjohanning%2Fapproveops","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoshjohanning%2Fapproveops/lists"}