-
Notifications
You must be signed in to change notification settings - Fork 87
feat: permissions #168
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
Merged
feat: permissions #168
Changes from all commits
Commits
Show all changes
13 commits
Select commit
Hold shift + click to select a range
580a7f4
WIP script to update `action.yml` with permissions based on https://g…
gr2m 165aac0
build(deps): `@octokit/openapi`
gr2m 5275c2e
build(package): lock file
gr2m f48303c
build: update script to utilize `@octokit/openapi` as source of app p…
gr2m 766bb55
build: update `action.yml` by running script
gr2m be692b8
build: end generated file with newline
parkerbxyz f4d40fc
build: use `Intl.ListFormat` to format permission access values
parkerbxyz b17ed31
style: format with Prettier
parkerbxyz d1c86cd
Merge branch 'main' into permissions_inputs
parkerbxyz 3674124
build: swap order of description and valid values in `action.yml`
parkerbxyz 7bc649b
add implementation of permissions inputs (#217)
gr2m d64ecbb
Add comment to explain why we are exporting main
parkerbxyz f3280eb
Merge branch 'main' into permissions_inputs
parkerbxyz 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
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
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.
Uh oh!
There was an error while loading. Please reload this page.