-
Notifications
You must be signed in to change notification settings - Fork 85
add implementation of permissions inputs #217
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
parkerbxyz
merged 18 commits into
actions:permissions_inputs
from
gr2m:permissions_inputs
Mar 25, 2025
Merged
Changes from all commits
Commits
Show all changes
18 commits
Select commit
Hold shift + click to select a range
e7bf441
add TODO comment for implementation of permissions
gr2m 44c52c7
WIP implementation, not yet tested
gr2m 0fd3535
test: log out requests for snapshot testing
gr2m 70b72c0
add test for permissions input
gr2m b50f29d
log out GET installation request on actual request
gr2m dd71e55
only log intercepted requests once
gr2m 53969ea
log all requests for the main tests
gr2m c486f31
remove left-over console.log
gr2m 7415eca
docs(README): `permissions`
gr2m ba95655
Update README.md
gr2m 6d291e5
use undici call history to log out mocked calls
gr2m 2958493
docs(CONTRIBUTING); initial version
gr2m 1ac56bb
remove debug code that would notk even work lol
gr2m 12f3940
docs(CONTRIBUTING): add link to test/README.md
gr2m ade1981
refactor: move `getPermissionsFromInputs` into its own file
gr2m a4c5901
Update README.md
gr2m c49eac1
Update CONTRIBUTING.md
gr2m a872a8b
Update CONTRIBUTING.md
gr2m File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
# Contributing | ||
|
||
Initial setup | ||
|
||
```console | ||
npm install | ||
``` | ||
|
||
Run tests locally | ||
|
||
```console | ||
npm test | ||
``` | ||
|
||
Learn more about how the tests work in [test/README.md](test/README.md). |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -121,7 +121,7 @@ jobs: | |
|
||
> [!TIP] | ||
> The `<BOT USER ID>` is the numeric user ID of the app's bot user, which can be found under `https://api.github.com/users/<app-slug>%5Bbot%5D`. | ||
> | ||
> | ||
> For example, we can check at `https://api.github.com/users/dependabot[bot]` to see the user ID of Dependabot is 49699333. | ||
> | ||
> Alternatively, you can use the [octokit/request-action](https://github.com/octokit/request-action) to get the ID. | ||
|
@@ -195,6 +195,32 @@ jobs: | |
body: "Hello, World!" | ||
``` | ||
|
||
### Create a token with specific permissions | ||
|
||
> [!NOTE] | ||
> Selected permissions must be granted to the installation of the specified app and repository owner. Setting a permission that the installation does not have will result in an error. | ||
|
||
```yaml | ||
on: [issues] | ||
|
||
jobs: | ||
hello-world: | ||
runs-on: ubuntu-latest | ||
steps: | ||
- uses: actions/create-github-app-token@v1 | ||
id: app-token | ||
with: | ||
app-id: ${{ vars.APP_ID }} | ||
private-key: ${{ secrets.PRIVATE_KEY }} | ||
owner: ${{ github.repository_owner }} | ||
permission-issues: write | ||
- uses: peter-evans/create-or-update-comment@v3 | ||
with: | ||
token: ${{ steps.app-token.outputs.token }} | ||
issue-number: ${{ github.event.issue.number }} | ||
body: "Hello, World!" | ||
``` | ||
|
||
### Create tokens for multiple user or organization accounts | ||
|
||
You can use a matrix strategy to create tokens for multiple user or organization accounts. | ||
|
@@ -251,23 +277,23 @@ jobs: | |
runs-on: self-hosted | ||
|
||
steps: | ||
- name: Create GitHub App token | ||
id: create_token | ||
uses: actions/create-github-app-token@v1 | ||
with: | ||
app-id: ${{ vars.GHES_APP_ID }} | ||
private-key: ${{ secrets.GHES_APP_PRIVATE_KEY }} | ||
owner: ${{ vars.GHES_INSTALLATION_ORG }} | ||
github-api-url: ${{ vars.GITHUB_API_URL }} | ||
|
||
- name: Create issue | ||
uses: octokit/[email protected] | ||
with: | ||
route: POST /repos/${{ github.repository }}/issues | ||
title: "New issue from workflow" | ||
body: "This is a new issue created from a GitHub Action workflow." | ||
env: | ||
GITHUB_TOKEN: ${{ steps.create_token.outputs.token }} | ||
- name: Create GitHub App token | ||
id: create_token | ||
uses: actions/create-github-app-token@v1 | ||
with: | ||
app-id: ${{ vars.GHES_APP_ID }} | ||
private-key: ${{ secrets.GHES_APP_PRIVATE_KEY }} | ||
owner: ${{ vars.GHES_INSTALLATION_ORG }} | ||
github-api-url: ${{ vars.GITHUB_API_URL }} | ||
|
||
- name: Create issue | ||
uses: octokit/[email protected] | ||
with: | ||
route: POST /repos/${{ github.repository }}/issues | ||
title: "New issue from workflow" | ||
body: "This is a new issue created from a GitHub Action workflow." | ||
env: | ||
GITHUB_TOKEN: ${{ steps.create_token.outputs.token }} | ||
``` | ||
|
||
## Inputs | ||
|
@@ -309,6 +335,12 @@ steps: | |
> [!NOTE] | ||
> If `owner` is set and `repositories` is empty, access will be scoped to all repositories in the provided repository owner's installation. If `owner` and `repositories` are empty, access will be scoped to only the current repository. | ||
|
||
### `permission-<permission name>` | ||
|
||
**Optional:** The permissions to grant to the token. By default, the token inherits all of the installation's permissions. We recommend to explicitly list the permissions that are required for a use case. This follows GitHub's own recommendation to [control permissions of `GITHUB_TOKEN` in workflows](https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/controlling-permissions-for-github_token). The documentation also lists all available permissions, just prefix the permission key with `permission-` (e.g., `pull-requests` → `permission-pull-requests`). | ||
|
||
The reason we define one `permision-<permission name>` input per permission is to benefit from type intelligence and input validation built into GitHub's action runner. | ||
|
||
### `skip-token-revoke` | ||
|
||
**Optional:** If truthy, the token will not be revoked when the current job is complete. | ||
|
@@ -344,6 +376,10 @@ The action creates an installation access token using [the `POST /app/installati | |
> [!NOTE] | ||
> Installation permissions can differ from the app's permissions they belong to. Installation permissions are set when an app is installed on an account. When the app adds more permissions after the installation, an account administrator will have to approve the new permissions before they are set on the installation. | ||
|
||
## Contributing | ||
|
||
[CONTRIBUTING.md](CONTRIBUTING.md) | ||
|
||
## License | ||
|
||
[MIT](LICENSE) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
/** | ||
* Finds all permissions passed via `permision-*` inputs and turns them into an object. | ||
* | ||
* @see https://docs.github.com/en/actions/sharing-automations/creating-actions/metadata-syntax-for-github-actions#inputs | ||
* @param {NodeJS.ProcessEnv} env | ||
* @returns {undefined | Record<string, string>} | ||
*/ | ||
export function getPermissionsFromInputs(env) { | ||
return Object.entries(env).reduce((permissions, [key, value]) => { | ||
if (!key.startsWith("INPUT_PERMISSION_")) return permissions; | ||
|
||
const permission = key.slice("INPUT_PERMISSION_".length).toLowerCase(); | ||
if (permissions === undefined) { | ||
return { [permission]: value }; | ||
} | ||
|
||
return { | ||
// @ts-expect-error - needs to be typed correctly | ||
...permissions, | ||
[permission]: value, | ||
}; | ||
}, undefined); | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We are exporting the promise returned by
main()
for testing. We need to await the execution in order to snapshot all requests that were sent by it.