Compare commits
78 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 1b10c78c78 | |||
| 07e2b76066 | |||
| ea0121618b | |||
| 7bd0371149 | |||
| e6bd4e6970 | |||
| 076e9480ca | |||
| 3bbe07d928 | |||
| 28a99e369c | |||
| 4df50600ef | |||
| 4843c538d9 | |||
| f8d387b68d | |||
| d2129bd463 | |||
| 77b94efc3e | |||
| 3ab4c66898 | |||
| 739cf66feb | |||
| db40289976 | |||
| 496a7ac4eb | |||
| 3870dc3051 | |||
| 4451bcbc13 | |||
| dce0ab05f3 | |||
| 2e564a0bb8 | |||
| fee1f7d63c | |||
| 6bda5bc141 | |||
| b04413352d | |||
| 5cbc65624c | |||
| b4f638f48e | |||
| efd9eb0674 | |||
| 340567cb0e | |||
| 5c1e00d1af | |||
| 64cd9c9a45 | |||
| 29824e69f5 | |||
| b212e6a739 | |||
| 8efbf9bf0f | |||
| 7e473efe3c | |||
| dce3be8b28 | |||
| 5480f4325a | |||
| d90aa53233 | |||
| 55e2a4b2cc | |||
| cc6f999683 | |||
| 40fa6b52b3 | |||
| 396e5022f0 | |||
| f48f2eb932 | |||
| b7f83f6278 | |||
| 2a47cfc9ef | |||
| 1ff8cc40cc | |||
| b96fde71c0 | |||
| 6701853927 | |||
| bef1eaf1c0 | |||
| 1526738aa4 | |||
| f3d5ec2073 | |||
| def152b8a7 | |||
| 5d7307be63 | |||
| 525760a53f | |||
| 8ab05a8a84 | |||
| d00315e88c | |||
| fcc6c288e5 | |||
| 49bb2edce3 | |||
| a8d6161485 | |||
| 5204204e81 | |||
| 0f859bf9e6 | |||
| a1cbe0fa3c | |||
| d7ee281215 | |||
| 93c1f04d6f | |||
| dff4b11d10 | |||
| 6d44c9fd24 | |||
| df432ceedc | |||
| 333678481b | |||
| db3cdf4098 | |||
| d64d7d7355 | |||
| 1b6f53e48e | |||
| 061a84d5f5 | |||
| c8f34a61a8 | |||
| 4821f52fa7 | |||
| 2950cbc446 | |||
| 30bf6253fa | |||
| c3c17c79cc | |||
| 9ba274d954 | |||
| a3c826a204 |
@@ -1,17 +0,0 @@
|
|||||||
name: 'Publish Immutable Action'
|
|
||||||
|
|
||||||
on:
|
|
||||||
release:
|
|
||||||
types: [published]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
publish:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
id-token: write
|
|
||||||
packages: write
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- name: Publish Immutable Action
|
|
||||||
uses: actions/publish-immutable-action@v0.0.4
|
|
||||||
@@ -3,7 +3,9 @@ name: release
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
|
- "*.x"
|
||||||
- main
|
- main
|
||||||
|
- beta
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
@@ -16,14 +18,13 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
# build local version to create token
|
# build local version to create token
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v6
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version-file: .node-version
|
node-version-file: package.json
|
||||||
cache: 'npm'
|
|
||||||
|
|
||||||
- run: npm ci
|
- run: npm ci
|
||||||
- run: npm run build
|
- run: npm run build
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
# This workflow warns and then closes issues that have had no activity for a specified amount of time.
|
||||||
|
# https://github.com/actions/stale
|
||||||
|
|
||||||
|
name: Stale
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
schedule:
|
||||||
|
# 00:00 UTC on Mondays
|
||||||
|
- cron: '0 0 * * 1'
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
env:
|
||||||
|
DAYS_BEFORE_STALE: 180
|
||||||
|
DAYS_BEFORE_CLOSE: 60
|
||||||
|
STALE_LABEL: 'stale'
|
||||||
|
STALE_LABEL_URL: ${{github.server_url}}/${{github.repository}}/labels/stale
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
stale:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/stale@v10
|
||||||
|
with:
|
||||||
|
operations-per-run: 100
|
||||||
|
days-before-stale: ${{ env.DAYS_BEFORE_STALE }}
|
||||||
|
days-before-close: ${{ env.DAYS_BEFORE_CLOSE }}
|
||||||
|
stale-issue-label: ${{ env.STALE_LABEL }}
|
||||||
|
stale-pr-label: ${{ env.STALE_LABEL }}
|
||||||
|
stale-issue-message: 'This issue has been marked ${{ env.STALE_LABEL_URL }} because it has been open for ${{ env.DAYS_BEFORE_STALE }} days with no activity. Please close this issue if it is no longer needed. If this issue is still relevant and you would like it to remain open, simply update it within the next ${{ env.DAYS_BEFORE_CLOSE }} days.'
|
||||||
|
stale-pr-message: 'This pull request has been marked ${{ env.STALE_LABEL_URL }} because it has been open for ${{ env.DAYS_BEFORE_STALE }} days with no activity. Please close this pull request if it is no longer needed. If this pull request is still relevant and you would like it to remain open, simply update it within the next ${{ env.DAYS_BEFORE_CLOSE }} days.'
|
||||||
+39
-11
@@ -4,39 +4,42 @@ on:
|
|||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
|
- beta
|
||||||
pull_request:
|
pull_request:
|
||||||
|
merge_group:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
integration:
|
integration:
|
||||||
name: Integration
|
name: integration
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v6
|
||||||
|
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version-file: .node-version
|
node-version-file: package.json
|
||||||
cache: 'npm'
|
|
||||||
|
|
||||||
- run: npm ci
|
- run: npm ci
|
||||||
- run: npm test
|
- run: npm test
|
||||||
|
|
||||||
end-to-end:
|
end-to-end:
|
||||||
name: End-to-End
|
name: end-to-end
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
# do not run from forks, as forks don’t have access to repository secrets
|
# do not run from forks, as forks don’t have access to repository secrets
|
||||||
if: github.event.pull_request.head.repo.owner.login == github.event.pull_request.base.repo.owner.login
|
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.owner.login == github.event.pull_request.base.repo.owner.login
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v6
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version-file: package.json
|
||||||
cache: "npm"
|
|
||||||
- run: npm ci
|
- run: npm ci
|
||||||
- run: npm run build
|
- run: npm run build
|
||||||
- uses: ./ # Uses the action in the root directory
|
- uses: ./ # Uses the action in the root directory
|
||||||
@@ -51,3 +54,28 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
route: GET /installation/repositories
|
route: GET /installation/repositories
|
||||||
- run: echo '${{ steps.get-repository.outputs.data }}'
|
- run: echo '${{ steps.get-repository.outputs.data }}'
|
||||||
|
|
||||||
|
end-to-end-proxy:
|
||||||
|
name: end-to-end with unreachable proxy
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
# do not run from forks, as forks don’t have access to repository secrets
|
||||||
|
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.owner.login == github.event.pull_request.base.repo.owner.login
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v6
|
||||||
|
- uses: actions/setup-node@v6
|
||||||
|
with:
|
||||||
|
node-version-file: package.json
|
||||||
|
cache: 'npm'
|
||||||
|
- run: npm ci
|
||||||
|
- run: npm run build
|
||||||
|
- uses: ./ # Uses the action in the root directory
|
||||||
|
continue-on-error: true
|
||||||
|
id: test
|
||||||
|
env:
|
||||||
|
NODE_USE_ENV_PROXY: "1"
|
||||||
|
https_proxy: http://127.0.0.1:9
|
||||||
|
with:
|
||||||
|
app-id: ${{ vars.TEST_APP_ID }}
|
||||||
|
private-key: ${{ secrets.TEST_APP_PRIVATE_KEY }}
|
||||||
|
- name: Assert action failed through unreachable proxy
|
||||||
|
run: test "${{ steps.test.outcome }}" = "failure"
|
||||||
|
|||||||
@@ -13,21 +13,30 @@ concurrency:
|
|||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
update-permission-inputs:
|
update-permission-inputs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
COMMIT_MESSAGE: 'feat: update permission inputs'
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v6
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version-file: .node-version
|
node-version-file: package.json
|
||||||
cache: 'npm'
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: npm ci
|
run: npm ci
|
||||||
- name: Run permission inputs update script
|
- name: Run permission inputs update script
|
||||||
run: node scripts/update-permission-inputs.js
|
run: node scripts/update-permission-inputs.js
|
||||||
- name: Commit changes
|
- name: Commit changes
|
||||||
uses: stefanzweifel/git-auto-commit-action@e348103e9026cc0eee72ae06630dbe30c8bf7a79 # v5.1.0
|
id: auto-commit
|
||||||
|
uses: stefanzweifel/git-auto-commit-action@04702edda442b2e678b25b537cec683a1493fcb9 # v7.1.0
|
||||||
with:
|
with:
|
||||||
commit_message: 'feat: update permission inputs'
|
commit_message: ${{ env.COMMIT_MESSAGE }}
|
||||||
|
- name: Update PR title
|
||||||
|
if: github.event_name == 'pull_request' && steps.auto-commit.outputs.changes_detected == 'true'
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
run: |
|
||||||
|
gh pr edit ${{ github.event.pull_request.number }} --title "${{ env.COMMIT_MESSAGE }}"
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
20.9.0
|
|
||||||
+1
-1
@@ -12,4 +12,4 @@ Run tests locally
|
|||||||
npm test
|
npm test
|
||||||
```
|
```
|
||||||
|
|
||||||
Learn more about how the tests work in [test/README.md](test/README.md).
|
Learn more about how the tests work in [tests/README.md](tests/README.md).
|
||||||
|
|||||||
@@ -8,9 +8,9 @@ GitHub Action for creating a GitHub App installation access token.
|
|||||||
|
|
||||||
In order to use this action, you need to:
|
In order to use this action, you need to:
|
||||||
|
|
||||||
1. [Register new GitHub App](https://docs.github.com/apps/creating-github-apps/setting-up-a-github-app/creating-a-github-app)
|
1. [Register new GitHub App](https://docs.github.com/apps/creating-github-apps/setting-up-a-github-app/creating-a-github-app).
|
||||||
2. [Store the App's ID in your repository environment variables](https://docs.github.com/actions/learn-github-actions/variables#defining-configuration-variables-for-multiple-workflows) (example: `APP_ID`)
|
2. [Store the App's Client ID in your repository environment variables](https://docs.github.com/actions/how-tos/write-workflows/choose-what-workflows-do/use-variables#defining-configuration-variables-for-multiple-workflows) (example: `GITHUB_APP_CLIENT_ID`).
|
||||||
3. [Store the App's private key in your repository secrets](https://docs.github.com/actions/security-guides/encrypted-secrets?tool=webui#creating-encrypted-secrets-for-a-repository) (example: `PRIVATE_KEY`)
|
3. [Store the App's private key in your repository secrets](https://docs.github.com/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets?tool=webui#creating-secrets-for-a-repository) (example: `GITHUB_APP_PRIVATE_KEY`).
|
||||||
|
|
||||||
> [!IMPORTANT]
|
> [!IMPORTANT]
|
||||||
> An installation access token expires after 1 hour. Please [see this comment](https://github.com/actions/create-github-app-token/issues/121#issuecomment-2043214796) for alternative approaches if you have long-running processes.
|
> An installation access token expires after 1 hour. Please [see this comment](https://github.com/actions/create-github-app-token/issues/121#issuecomment-2043214796) for alternative approaches if you have long-running processes.
|
||||||
@@ -28,11 +28,11 @@ jobs:
|
|||||||
hello-world:
|
hello-world:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/create-github-app-token@v1
|
- uses: actions/create-github-app-token@v3
|
||||||
id: app-token
|
id: app-token
|
||||||
with:
|
with:
|
||||||
app-id: ${{ vars.APP_ID }}
|
client-id: ${{ vars.GITHUB_APP_CLIENT_ID }}
|
||||||
private-key: ${{ secrets.PRIVATE_KEY }}
|
private-key: ${{ secrets.GITHUB_APP_PRIVATE_KEY }}
|
||||||
- uses: ./actions/staging-tests
|
- uses: ./actions/staging-tests
|
||||||
with:
|
with:
|
||||||
token: ${{ steps.app-token.outputs.token }}
|
token: ${{ steps.app-token.outputs.token }}
|
||||||
@@ -47,19 +47,19 @@ jobs:
|
|||||||
auto-format:
|
auto-format:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/create-github-app-token@v1
|
- uses: actions/create-github-app-token@v3
|
||||||
id: app-token
|
id: app-token
|
||||||
with:
|
with:
|
||||||
# required
|
# required
|
||||||
app-id: ${{ vars.APP_ID }}
|
client-id: ${{ vars.GITHUB_APP_CLIENT_ID }}
|
||||||
private-key: ${{ secrets.PRIVATE_KEY }}
|
private-key: ${{ secrets.GITHUB_APP_PRIVATE_KEY }}
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v6
|
||||||
with:
|
with:
|
||||||
token: ${{ steps.app-token.outputs.token }}
|
token: ${{ steps.app-token.outputs.token }}
|
||||||
ref: ${{ github.head_ref }}
|
ref: ${{ github.head_ref }}
|
||||||
# Make sure the value of GITHUB_TOKEN will not be persisted in repo's config
|
# Make sure the value of GITHUB_TOKEN will not be persisted in repo's config
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- uses: creyD/prettier_action@v4.3
|
- uses: creyD/prettier_action@v6
|
||||||
with:
|
with:
|
||||||
github_token: ${{ steps.app-token.outputs.token }}
|
github_token: ${{ steps.app-token.outputs.token }}
|
||||||
```
|
```
|
||||||
@@ -73,12 +73,12 @@ jobs:
|
|||||||
auto-format:
|
auto-format:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/create-github-app-token@v1
|
- uses: actions/create-github-app-token@v3
|
||||||
id: app-token
|
id: app-token
|
||||||
with:
|
with:
|
||||||
# required
|
# required
|
||||||
app-id: ${{ vars.APP_ID }}
|
client-id: ${{ vars.GITHUB_APP_CLIENT_ID }}
|
||||||
private-key: ${{ secrets.PRIVATE_KEY }}
|
private-key: ${{ secrets.GITHUB_APP_PRIVATE_KEY }}
|
||||||
- name: Get GitHub App User ID
|
- name: Get GitHub App User ID
|
||||||
id: get-user-id
|
id: get-user-id
|
||||||
run: echo "user-id=$(gh api "/users/${{ steps.app-token.outputs.app-slug }}[bot]" --jq .id)" >> "$GITHUB_OUTPUT"
|
run: echo "user-id=$(gh api "/users/${{ steps.app-token.outputs.app-slug }}[bot]" --jq .id)" >> "$GITHUB_OUTPUT"
|
||||||
@@ -98,12 +98,12 @@ jobs:
|
|||||||
auto-format:
|
auto-format:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/create-github-app-token@v1
|
- uses: actions/create-github-app-token@v3
|
||||||
id: app-token
|
id: app-token
|
||||||
with:
|
with:
|
||||||
# required
|
# required
|
||||||
app-id: ${{ vars.APP_ID }}
|
client-id: ${{ vars.GITHUB_APP_CLIENT_ID }}
|
||||||
private-key: ${{ secrets.PRIVATE_KEY }}
|
private-key: ${{ secrets.GITHUB_APP_PRIVATE_KEY }}
|
||||||
- name: Get GitHub App User ID
|
- name: Get GitHub App User ID
|
||||||
id: get-user-id
|
id: get-user-id
|
||||||
run: echo "user-id=$(gh api "/users/${{ steps.app-token.outputs.app-slug }}[bot]" --jq .id)" >> "$GITHUB_OUTPUT"
|
run: echo "user-id=$(gh api "/users/${{ steps.app-token.outputs.app-slug }}[bot]" --jq .id)" >> "$GITHUB_OUTPUT"
|
||||||
@@ -135,13 +135,13 @@ jobs:
|
|||||||
hello-world:
|
hello-world:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/create-github-app-token@v1
|
- uses: actions/create-github-app-token@v3
|
||||||
id: app-token
|
id: app-token
|
||||||
with:
|
with:
|
||||||
app-id: ${{ vars.APP_ID }}
|
client-id: ${{ vars.GITHUB_APP_CLIENT_ID }}
|
||||||
private-key: ${{ secrets.PRIVATE_KEY }}
|
private-key: ${{ secrets.GITHUB_APP_PRIVATE_KEY }}
|
||||||
owner: ${{ github.repository_owner }}
|
owner: ${{ github.repository_owner }}
|
||||||
- uses: peter-evans/create-or-update-comment@v3
|
- uses: peter-evans/create-or-update-comment@v4
|
||||||
with:
|
with:
|
||||||
token: ${{ steps.app-token.outputs.token }}
|
token: ${{ steps.app-token.outputs.token }}
|
||||||
issue-number: ${{ github.event.issue.number }}
|
issue-number: ${{ github.event.issue.number }}
|
||||||
@@ -157,16 +157,16 @@ jobs:
|
|||||||
hello-world:
|
hello-world:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/create-github-app-token@v1
|
- uses: actions/create-github-app-token@v3
|
||||||
id: app-token
|
id: app-token
|
||||||
with:
|
with:
|
||||||
app-id: ${{ vars.APP_ID }}
|
client-id: ${{ vars.GITHUB_APP_CLIENT_ID }}
|
||||||
private-key: ${{ secrets.PRIVATE_KEY }}
|
private-key: ${{ secrets.GITHUB_APP_PRIVATE_KEY }}
|
||||||
owner: ${{ github.repository_owner }}
|
owner: ${{ github.repository_owner }}
|
||||||
repositories: |
|
repositories: |
|
||||||
repo1
|
repo1
|
||||||
repo2
|
repo2
|
||||||
- uses: peter-evans/create-or-update-comment@v3
|
- uses: peter-evans/create-or-update-comment@v4
|
||||||
with:
|
with:
|
||||||
token: ${{ steps.app-token.outputs.token }}
|
token: ${{ steps.app-token.outputs.token }}
|
||||||
issue-number: ${{ github.event.issue.number }}
|
issue-number: ${{ github.event.issue.number }}
|
||||||
@@ -182,13 +182,13 @@ jobs:
|
|||||||
hello-world:
|
hello-world:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/create-github-app-token@v1
|
- uses: actions/create-github-app-token@v3
|
||||||
id: app-token
|
id: app-token
|
||||||
with:
|
with:
|
||||||
app-id: ${{ vars.APP_ID }}
|
client-id: ${{ vars.GITHUB_APP_CLIENT_ID }}
|
||||||
private-key: ${{ secrets.PRIVATE_KEY }}
|
private-key: ${{ secrets.GITHUB_APP_PRIVATE_KEY }}
|
||||||
owner: another-owner
|
owner: another-owner
|
||||||
- uses: peter-evans/create-or-update-comment@v3
|
- uses: peter-evans/create-or-update-comment@v4
|
||||||
with:
|
with:
|
||||||
token: ${{ steps.app-token.outputs.token }}
|
token: ${{ steps.app-token.outputs.token }}
|
||||||
issue-number: ${{ github.event.issue.number }}
|
issue-number: ${{ github.event.issue.number }}
|
||||||
@@ -207,14 +207,14 @@ jobs:
|
|||||||
hello-world:
|
hello-world:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/create-github-app-token@v1
|
- uses: actions/create-github-app-token@v3
|
||||||
id: app-token
|
id: app-token
|
||||||
with:
|
with:
|
||||||
app-id: ${{ vars.APP_ID }}
|
client-id: ${{ vars.GITHUB_APP_CLIENT_ID }}
|
||||||
private-key: ${{ secrets.PRIVATE_KEY }}
|
private-key: ${{ secrets.GITHUB_APP_PRIVATE_KEY }}
|
||||||
owner: ${{ github.repository_owner }}
|
owner: ${{ github.repository_owner }}
|
||||||
permission-issues: write
|
permission-issues: write
|
||||||
- uses: peter-evans/create-or-update-comment@v3
|
- uses: peter-evans/create-or-update-comment@v4
|
||||||
with:
|
with:
|
||||||
token: ${{ steps.app-token.outputs.token }}
|
token: ${{ steps.app-token.outputs.token }}
|
||||||
issue-number: ${{ github.event.issue.number }}
|
issue-number: ${{ github.event.issue.number }}
|
||||||
@@ -249,11 +249,11 @@ jobs:
|
|||||||
owners-and-repos: ${{ fromJson(needs.set-matrix.outputs.matrix) }}
|
owners-and-repos: ${{ fromJson(needs.set-matrix.outputs.matrix) }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/create-github-app-token@v1
|
- uses: actions/create-github-app-token@v3
|
||||||
id: app-token
|
id: app-token
|
||||||
with:
|
with:
|
||||||
app-id: ${{ vars.APP_ID }}
|
client-id: ${{ vars.GITHUB_APP_CLIENT_ID }}
|
||||||
private-key: ${{ secrets.PRIVATE_KEY }}
|
private-key: ${{ secrets.GITHUB_APP_PRIVATE_KEY }}
|
||||||
owner: ${{ matrix.owners-and-repos.owner }}
|
owner: ${{ matrix.owners-and-repos.owner }}
|
||||||
repositories: ${{ join(matrix.owners-and-repos.repos) }}
|
repositories: ${{ join(matrix.owners-and-repos.repos) }}
|
||||||
- uses: octokit/request-action@v2.x
|
- uses: octokit/request-action@v2.x
|
||||||
@@ -279,9 +279,9 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Create GitHub App token
|
- name: Create GitHub App token
|
||||||
id: create_token
|
id: create_token
|
||||||
uses: actions/create-github-app-token@v1
|
uses: actions/create-github-app-token@v3
|
||||||
with:
|
with:
|
||||||
app-id: ${{ vars.GHES_APP_ID }}
|
client-id: ${{ vars.GHES_APP_CLIENT_ID }}
|
||||||
private-key: ${{ secrets.GHES_APP_PRIVATE_KEY }}
|
private-key: ${{ secrets.GHES_APP_PRIVATE_KEY }}
|
||||||
owner: ${{ vars.GHES_INSTALLATION_ORG }}
|
owner: ${{ vars.GHES_INSTALLATION_ORG }}
|
||||||
github-api-url: ${{ vars.GITHUB_API_URL }}
|
github-api-url: ${{ vars.GITHUB_API_URL }}
|
||||||
@@ -296,11 +296,32 @@ jobs:
|
|||||||
GITHUB_TOKEN: ${{ steps.create_token.outputs.token }}
|
GITHUB_TOKEN: ${{ steps.create_token.outputs.token }}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Proxy support
|
||||||
|
|
||||||
|
This action relies on Node.js native proxy support.
|
||||||
|
|
||||||
|
If you set `HTTP_PROXY` or `HTTPS_PROXY`, also set `NODE_USE_ENV_PROXY: "1"` on the action step so Node.js honors those variables. If you need proxy bypass rules, set `NO_PROXY` alongside them.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- uses: actions/create-github-app-token@v3
|
||||||
|
id: app-token
|
||||||
|
env:
|
||||||
|
HTTPS_PROXY: http://proxy.example.com:8080
|
||||||
|
NO_PROXY: github.example.com
|
||||||
|
NODE_USE_ENV_PROXY: "1"
|
||||||
|
with:
|
||||||
|
client-id: ${{ vars.GITHUB_APP_CLIENT_ID }}
|
||||||
|
private-key: ${{ secrets.GITHUB_APP_PRIVATE_KEY }}
|
||||||
|
```
|
||||||
|
|
||||||
## Inputs
|
## Inputs
|
||||||
|
|
||||||
### `app-id`
|
### `client-id` or `app-id`
|
||||||
|
|
||||||
**Required:** GitHub App ID.
|
**Required:** GitHub App Client ID.
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> The legacy `app-id` input is also accepted, but `client-id` is recommended.
|
||||||
|
|
||||||
### `private-key`
|
### `private-key`
|
||||||
|
|
||||||
@@ -313,14 +334,14 @@ steps:
|
|||||||
- name: Decode the GitHub App Private Key
|
- name: Decode the GitHub App Private Key
|
||||||
id: decode
|
id: decode
|
||||||
run: |
|
run: |
|
||||||
private_key=$(echo "${{ secrets.PRIVATE_KEY }}" | base64 -d | awk 'BEGIN {ORS="\\n"} {print}' | head -c -2) &> /dev/null
|
private_key=$(echo "${{ secrets.GITHUB_APP_PRIVATE_KEY }}" | base64 -d | awk 'BEGIN {ORS="\\n"} {print}' | head -c -2) &> /dev/null
|
||||||
echo "::add-mask::$private_key"
|
echo "::add-mask::$private_key"
|
||||||
echo "private-key=$private_key" >> "$GITHUB_OUTPUT"
|
echo "private-key=$private_key" >> "$GITHUB_OUTPUT"
|
||||||
- name: Generate GitHub App Token
|
- name: Generate GitHub App Token
|
||||||
id: app-token
|
id: app-token
|
||||||
uses: actions/create-github-app-token@v1
|
uses: actions/create-github-app-token@v3
|
||||||
with:
|
with:
|
||||||
app-id: ${{ vars.APP_ID }}
|
client-id: ${{ vars.GITHUB_APP_CLIENT_ID }}
|
||||||
private-key: ${{ steps.decode.outputs.private-key }}
|
private-key: ${{ steps.decode.outputs.private-key }}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -343,7 +364,7 @@ The reason we define one `permision-<permission name>` input per permission is t
|
|||||||
|
|
||||||
### `skip-token-revoke`
|
### `skip-token-revoke`
|
||||||
|
|
||||||
**Optional:** If truthy, the token will not be revoked when the current job is complete.
|
**Optional:** If true, the token will not be revoked when the current job is complete.
|
||||||
|
|
||||||
### `github-api-url`
|
### `github-api-url`
|
||||||
|
|
||||||
@@ -370,7 +391,7 @@ The action creates an installation access token using [the `POST /app/installati
|
|||||||
1. The token is scoped to the current repository or `repositories` if set.
|
1. The token is scoped to the current repository or `repositories` if set.
|
||||||
2. The token inherits all the installation's permissions.
|
2. The token inherits all the installation's permissions.
|
||||||
3. The token is set as output `token` which can be used in subsequent steps.
|
3. The token is set as output `token` which can be used in subsequent steps.
|
||||||
4. Unless the `skip-token-revoke` input is set to a truthy value, the token is revoked in the `post` step of the action, which means it cannot be passed to another job.
|
4. Unless the `skip-token-revoke` input is set to true, the token is revoked in the `post` step of the action, which means it cannot be passed to another job.
|
||||||
5. The token is masked, it cannot be logged accidentally.
|
5. The token is masked, it cannot be logged accidentally.
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
|
|||||||
+21
-4
@@ -5,9 +5,13 @@ branding:
|
|||||||
icon: "lock"
|
icon: "lock"
|
||||||
color: "gray-dark"
|
color: "gray-dark"
|
||||||
inputs:
|
inputs:
|
||||||
|
client-id:
|
||||||
|
description: "GitHub App Client ID"
|
||||||
|
required: false
|
||||||
app-id:
|
app-id:
|
||||||
description: "GitHub App ID"
|
description: "GitHub App ID"
|
||||||
required: true
|
required: false
|
||||||
|
deprecationMessage: "Use 'client-id' instead."
|
||||||
private-key:
|
private-key:
|
||||||
description: "GitHub App private key"
|
description: "GitHub App private key"
|
||||||
required: true
|
required: true
|
||||||
@@ -18,8 +22,9 @@ inputs:
|
|||||||
description: "Comma or newline-separated list of repositories to install the GitHub App on (defaults to current repository if owner is unset)"
|
description: "Comma or newline-separated list of repositories to install the GitHub App on (defaults to current repository if owner is unset)"
|
||||||
required: false
|
required: false
|
||||||
skip-token-revoke:
|
skip-token-revoke:
|
||||||
description: "If truthy, the token will not be revoked when the current job is complete"
|
description: "If true, the token will not be revoked when the current job is complete"
|
||||||
required: false
|
required: false
|
||||||
|
default: "false"
|
||||||
# Make GitHub API configurable to support non-GitHub Cloud use cases
|
# Make GitHub API configurable to support non-GitHub Cloud use cases
|
||||||
# see https://github.com/actions/create-github-app-token/issues/77
|
# see https://github.com/actions/create-github-app-token/issues/77
|
||||||
github-api-url:
|
github-api-url:
|
||||||
@@ -30,18 +35,28 @@ inputs:
|
|||||||
description: "The level of permission to grant the access token for GitHub Actions workflows, workflow runs, and artifacts. Can be set to 'read' or 'write'."
|
description: "The level of permission to grant the access token for GitHub Actions workflows, workflow runs, and artifacts. Can be set to 'read' or 'write'."
|
||||||
permission-administration:
|
permission-administration:
|
||||||
description: "The level of permission to grant the access token for repository creation, deletion, settings, teams, and collaborators creation. Can be set to 'read' or 'write'."
|
description: "The level of permission to grant the access token for repository creation, deletion, settings, teams, and collaborators creation. Can be set to 'read' or 'write'."
|
||||||
|
permission-artifact-metadata:
|
||||||
|
description: "The level of permission to grant the access token to create and retrieve build artifact metadata records. Can be set to 'read' or 'write'."
|
||||||
|
permission-attestations:
|
||||||
|
description: "The level of permission to create and retrieve the access token for repository attestations. Can be set to 'read' or 'write'."
|
||||||
permission-checks:
|
permission-checks:
|
||||||
description: "The level of permission to grant the access token for checks on code. Can be set to 'read' or 'write'."
|
description: "The level of permission to grant the access token for checks on code. Can be set to 'read' or 'write'."
|
||||||
permission-codespaces:
|
permission-codespaces:
|
||||||
description: "The level of permission to grant the access token to create, edit, delete, and list Codespaces. Can be set to 'read' or 'write'."
|
description: "The level of permission to grant the access token to create, edit, delete, and list Codespaces. Can be set to 'read' or 'write'."
|
||||||
permission-contents:
|
permission-contents:
|
||||||
description: "The level of permission to grant the access token for repository contents, commits, branches, downloads, releases, and merges. Can be set to 'read' or 'write'."
|
description: "The level of permission to grant the access token for repository contents, commits, branches, downloads, releases, and merges. Can be set to 'read' or 'write'."
|
||||||
|
permission-custom-properties-for-organizations:
|
||||||
|
description: "The level of permission to grant the access token to view and edit custom properties for an organization, when allowed by the property. Can be set to 'read' or 'write'."
|
||||||
permission-dependabot-secrets:
|
permission-dependabot-secrets:
|
||||||
description: "The level of permission to grant the access token to manage Dependabot secrets. Can be set to 'read' or 'write'."
|
description: "The level of permission to grant the access token to manage Dependabot secrets. Can be set to 'read' or 'write'."
|
||||||
permission-deployments:
|
permission-deployments:
|
||||||
description: "The level of permission to grant the access token for deployments and deployment statuses. Can be set to 'read' or 'write'."
|
description: "The level of permission to grant the access token for deployments and deployment statuses. Can be set to 'read' or 'write'."
|
||||||
|
permission-discussions:
|
||||||
|
description: "The level of permission to grant the access token for discussions and related comments and labels. Can be set to 'read' or 'write'."
|
||||||
permission-email-addresses:
|
permission-email-addresses:
|
||||||
description: "The level of permission to grant the access token to manage the email addresses belonging to a user. Can be set to 'read' or 'write'."
|
description: "The level of permission to grant the access token to manage the email addresses belonging to a user. Can be set to 'read' or 'write'."
|
||||||
|
permission-enterprise-custom-properties-for-organizations:
|
||||||
|
description: "The level of permission to grant the access token for organization custom properties management at the enterprise level. Can be set to 'read', 'write', or 'admin'."
|
||||||
permission-environments:
|
permission-environments:
|
||||||
description: "The level of permission to grant the access token for managing repository environments. Can be set to 'read' or 'write'."
|
description: "The level of permission to grant the access token for managing repository environments. Can be set to 'read' or 'write'."
|
||||||
permission-followers:
|
permission-followers:
|
||||||
@@ -56,6 +71,8 @@ inputs:
|
|||||||
description: "The level of permission to grant the access token for issues and related comments, assignees, labels, and milestones. Can be set to 'read' or 'write'."
|
description: "The level of permission to grant the access token for issues and related comments, assignees, labels, and milestones. Can be set to 'read' or 'write'."
|
||||||
permission-members:
|
permission-members:
|
||||||
description: "The level of permission to grant the access token for organization teams and members. Can be set to 'read' or 'write'."
|
description: "The level of permission to grant the access token for organization teams and members. Can be set to 'read' or 'write'."
|
||||||
|
permission-merge-queues:
|
||||||
|
description: "The level of permission to grant the access token to manage the merge queues for a repository. Can be set to 'read' or 'write'."
|
||||||
permission-metadata:
|
permission-metadata:
|
||||||
description: "The level of permission to grant the access token to search repositories, list collaborators, and access repository metadata. Can be set to 'read' or 'write'."
|
description: "The level of permission to grant the access token to search repositories, list collaborators, and access repository metadata. Can be set to 'read' or 'write'."
|
||||||
permission-organization-administration:
|
permission-organization-administration:
|
||||||
@@ -67,7 +84,7 @@ inputs:
|
|||||||
permission-organization-custom-org-roles:
|
permission-organization-custom-org-roles:
|
||||||
description: "The level of permission to grant the access token for custom organization roles management. Can be set to 'read' or 'write'."
|
description: "The level of permission to grant the access token for custom organization roles management. Can be set to 'read' or 'write'."
|
||||||
permission-organization-custom-properties:
|
permission-organization-custom-properties:
|
||||||
description: "The level of permission to grant the access token for custom property management. Can be set to 'read', 'write', or 'admin'."
|
description: "The level of permission to grant the access token for repository custom properties management at the organization level. Can be set to 'read', 'write', or 'admin'."
|
||||||
permission-organization-custom-roles:
|
permission-organization-custom-roles:
|
||||||
description: "The level of permission to grant the access token for custom repository roles management. Can be set to 'read' or 'write'."
|
description: "The level of permission to grant the access token for custom repository roles management. Can be set to 'read' or 'write'."
|
||||||
permission-organization-events:
|
permission-organization-events:
|
||||||
@@ -131,6 +148,6 @@ outputs:
|
|||||||
app-slug:
|
app-slug:
|
||||||
description: "GitHub App slug"
|
description: "GitHub App slug"
|
||||||
runs:
|
runs:
|
||||||
using: "node20"
|
using: "node24"
|
||||||
main: "dist/main.cjs"
|
main: "dist/main.cjs"
|
||||||
post: "dist/post.cjs"
|
post: "dist/post.cjs"
|
||||||
|
|||||||
Vendored
+11516
-30829
File diff suppressed because one or more lines are too long
Vendored
+11170
-30402
File diff suppressed because one or more lines are too long
@@ -7,9 +7,13 @@
|
|||||||
*/
|
*/
|
||||||
export function getPermissionsFromInputs(env) {
|
export function getPermissionsFromInputs(env) {
|
||||||
return Object.entries(env).reduce((permissions, [key, value]) => {
|
return Object.entries(env).reduce((permissions, [key, value]) => {
|
||||||
if (!key.startsWith("INPUT_PERMISSION_")) return permissions;
|
if (!key.startsWith("INPUT_PERMISSION-")) return permissions;
|
||||||
|
if (!value) return permissions;
|
||||||
|
|
||||||
const permission = key.slice("INPUT_PERMISSION_".length).toLowerCase();
|
const permission = key.slice("INPUT_PERMISSION-".length).toLowerCase()
|
||||||
|
.replaceAll(/-/g, "_");
|
||||||
|
|
||||||
|
// Inherit app permissions if no permissions inputs are set
|
||||||
if (permissions === undefined) {
|
if (permissions === undefined) {
|
||||||
return { [permission]: value };
|
return { [permission]: value };
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-7
@@ -2,7 +2,7 @@ import pRetry from "p-retry";
|
|||||||
// @ts-check
|
// @ts-check
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} appId
|
* @param {string} clientId
|
||||||
* @param {string} privateKey
|
* @param {string} privateKey
|
||||||
* @param {string} owner
|
* @param {string} owner
|
||||||
* @param {string[]} repositories
|
* @param {string[]} repositories
|
||||||
@@ -13,7 +13,7 @@ import pRetry from "p-retry";
|
|||||||
* @param {boolean} skipTokenRevoke
|
* @param {boolean} skipTokenRevoke
|
||||||
*/
|
*/
|
||||||
export async function main(
|
export async function main(
|
||||||
appId,
|
clientId,
|
||||||
privateKey,
|
privateKey,
|
||||||
owner,
|
owner,
|
||||||
repositories,
|
repositories,
|
||||||
@@ -70,7 +70,7 @@ export async function main(
|
|||||||
}
|
}
|
||||||
|
|
||||||
const auth = createAppAuth({
|
const auth = createAppAuth({
|
||||||
appId,
|
appId: clientId,
|
||||||
privateKey,
|
privateKey,
|
||||||
request,
|
request,
|
||||||
});
|
});
|
||||||
@@ -89,11 +89,12 @@ export async function main(
|
|||||||
permissions
|
permissions
|
||||||
),
|
),
|
||||||
{
|
{
|
||||||
onFailedAttempt: (error) => {
|
shouldRetry: ({ error }) => error.status >= 500,
|
||||||
|
onFailedAttempt: (context) => {
|
||||||
core.info(
|
core.info(
|
||||||
`Failed to create token for "${parsedRepositoryNames.join(
|
`Failed to create token for "${parsedRepositoryNames.join(
|
||||||
","
|
","
|
||||||
)}" (attempt ${error.attemptNumber}): ${error.message}`
|
)}" (attempt ${context.attemptNumber}): ${context.error.message}`
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
retries: 3,
|
retries: 3,
|
||||||
@@ -104,9 +105,9 @@ export async function main(
|
|||||||
({ authentication, installationId, appSlug } = await pRetry(
|
({ authentication, installationId, appSlug } = await pRetry(
|
||||||
() => getTokenFromOwner(request, auth, parsedOwner, permissions),
|
() => getTokenFromOwner(request, auth, parsedOwner, permissions),
|
||||||
{
|
{
|
||||||
onFailedAttempt: (error) => {
|
onFailedAttempt: (context) => {
|
||||||
core.info(
|
core.info(
|
||||||
`Failed to create token for "${parsedOwner}" (attempt ${error.attemptNumber}): ${error.message}`
|
`Failed to create token for "${parsedOwner}" (attempt ${context.attemptNumber}): ${context.error.message}`
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
retries: 3,
|
retries: 3,
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@
|
|||||||
* @param {import("@octokit/request").request} request
|
* @param {import("@octokit/request").request} request
|
||||||
*/
|
*/
|
||||||
export async function post(core, request) {
|
export async function post(core, request) {
|
||||||
const skipTokenRevoke = Boolean(core.getInput("skip-token-revoke"));
|
const skipTokenRevoke = core.getBooleanInput("skip-token-revoke");
|
||||||
|
|
||||||
if (skipTokenRevoke) {
|
if (skipTokenRevoke) {
|
||||||
core.info("Token revocation was skipped");
|
core.info("Token revocation was skipped");
|
||||||
|
|||||||
+24
-29
@@ -1,41 +1,36 @@
|
|||||||
import core from "@actions/core";
|
import * as core from "@actions/core";
|
||||||
import { request } from "@octokit/request";
|
import { request } from "@octokit/request";
|
||||||
import { ProxyAgent, fetch as undiciFetch } from "undici";
|
|
||||||
|
|
||||||
|
// Get the GitHub API URL from the action input and remove any trailing slash
|
||||||
const baseUrl = core.getInput("github-api-url").replace(/\/$/, "");
|
const baseUrl = core.getInput("github-api-url").replace(/\/$/, "");
|
||||||
|
|
||||||
// https://docs.github.com/actions/hosting-your-own-runners/managing-self-hosted-runners/using-a-proxy-server-with-self-hosted-runners
|
const proxyEnvironmentKeys = [
|
||||||
const proxyUrl =
|
"https_proxy",
|
||||||
process.env.https_proxy ||
|
"HTTPS_PROXY",
|
||||||
process.env.HTTPS_PROXY ||
|
"http_proxy",
|
||||||
process.env.http_proxy ||
|
"HTTP_PROXY",
|
||||||
process.env.HTTP_PROXY;
|
];
|
||||||
|
|
||||||
/* c8 ignore start */
|
function proxyEnvironmentConfigured() {
|
||||||
// Native support for proxies in Undici is under consideration: https://github.com/nodejs/undici/issues/1650
|
return proxyEnvironmentKeys.some((key) => process.env[key]);
|
||||||
// Until then, we need to use a custom fetch function to add proxy support.
|
}
|
||||||
const proxyFetch = (url, options) => {
|
|
||||||
const urlHost = new URL(url).hostname;
|
|
||||||
const noProxy = (process.env.no_proxy || process.env.NO_PROXY || "").split(
|
|
||||||
",",
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!noProxy.includes(urlHost)) {
|
function nativeProxySupportEnabled() {
|
||||||
options = {
|
return process.env.NODE_USE_ENV_PROXY === "1";
|
||||||
...options,
|
}
|
||||||
dispatcher: new ProxyAgent(String(proxyUrl)),
|
|
||||||
};
|
export function ensureNativeProxySupport() {
|
||||||
|
if (!proxyEnvironmentConfigured() || nativeProxySupportEnabled()) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
return undiciFetch(url, options);
|
throw new Error(
|
||||||
};
|
"A proxy environment variable is set, but Node.js native proxy support is not enabled. Set NODE_USE_ENV_PROXY=1 for this action step.",
|
||||||
/* c8 ignore stop */
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Configure the default settings for GitHub API requests
|
||||||
export default request.defaults({
|
export default request.defaults({
|
||||||
headers: {
|
headers: { "user-agent": "actions/create-github-app-token" },
|
||||||
"user-agent": "actions/create-github-app-token",
|
|
||||||
},
|
|
||||||
baseUrl,
|
baseUrl,
|
||||||
/* c8 ignore next */
|
|
||||||
request: proxyUrl ? { fetch: proxyFetch } : {},
|
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
// @ts-check
|
// @ts-check
|
||||||
|
|
||||||
import core from "@actions/core";
|
import * as core from "@actions/core";
|
||||||
import { createAppAuth } from "@octokit/auth-app";
|
import { createAppAuth } from "@octokit/auth-app";
|
||||||
|
|
||||||
import { getPermissionsFromInputs } from "./lib/get-permissions-from-inputs.js";
|
import { getPermissionsFromInputs } from "./lib/get-permissions-from-inputs.js";
|
||||||
import { main } from "./lib/main.js";
|
import { main } from "./lib/main.js";
|
||||||
import request from "./lib/request.js";
|
import request, { ensureNativeProxySupport } from "./lib/request.js";
|
||||||
|
|
||||||
if (!process.env.GITHUB_REPOSITORY) {
|
if (!process.env.GITHUB_REPOSITORY) {
|
||||||
throw new Error("GITHUB_REPOSITORY missing, must be set to '<owner>/<repo>'");
|
throw new Error("GITHUB_REPOSITORY missing, must be set to '<owner>/<repo>'");
|
||||||
@@ -15,31 +15,40 @@ if (!process.env.GITHUB_REPOSITORY_OWNER) {
|
|||||||
throw new Error("GITHUB_REPOSITORY_OWNER missing, must be set to '<owner>'");
|
throw new Error("GITHUB_REPOSITORY_OWNER missing, must be set to '<owner>'");
|
||||||
}
|
}
|
||||||
|
|
||||||
const appId = core.getInput("app-id");
|
async function run() {
|
||||||
const privateKey = core.getInput("private-key");
|
ensureNativeProxySupport();
|
||||||
const owner = core.getInput("owner");
|
|
||||||
const repositories = core
|
|
||||||
.getInput("repositories")
|
|
||||||
.split(/[\n,]+/)
|
|
||||||
.map((s) => s.trim())
|
|
||||||
.filter((x) => x !== "");
|
|
||||||
|
|
||||||
const skipTokenRevoke = Boolean(core.getInput("skip-token-revoke"));
|
const clientId = core.getInput("client-id") || core.getInput("app-id");
|
||||||
|
if (!clientId) {
|
||||||
|
throw new Error("The 'client-id' (or deprecated 'app-id') input must be set to a non-empty string. If using a secret or variable, ensure it is available in this workflow context.");
|
||||||
|
}
|
||||||
|
const privateKey = core.getInput("private-key");
|
||||||
|
const owner = core.getInput("owner");
|
||||||
|
const repositories = core
|
||||||
|
.getInput("repositories")
|
||||||
|
.split(/[\n,]+/)
|
||||||
|
.map((s) => s.trim())
|
||||||
|
.filter((x) => x !== "");
|
||||||
|
|
||||||
const permissions = getPermissionsFromInputs(process.env);
|
const skipTokenRevoke = core.getBooleanInput("skip-token-revoke");
|
||||||
|
|
||||||
|
const permissions = getPermissionsFromInputs(process.env);
|
||||||
|
|
||||||
|
return main(
|
||||||
|
clientId,
|
||||||
|
privateKey,
|
||||||
|
owner,
|
||||||
|
repositories,
|
||||||
|
permissions,
|
||||||
|
core,
|
||||||
|
createAppAuth,
|
||||||
|
request,
|
||||||
|
skipTokenRevoke,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// Export promise for testing
|
// Export promise for testing
|
||||||
export default main(
|
export default run().catch((error) => {
|
||||||
appId,
|
|
||||||
privateKey,
|
|
||||||
owner,
|
|
||||||
repositories,
|
|
||||||
permissions,
|
|
||||||
core,
|
|
||||||
createAppAuth,
|
|
||||||
request,
|
|
||||||
skipTokenRevoke,
|
|
||||||
).catch((error) => {
|
|
||||||
/* c8 ignore next 3 */
|
/* c8 ignore next 3 */
|
||||||
console.error(error);
|
console.error(error);
|
||||||
core.setFailed(error.message);
|
core.setFailed(error.message);
|
||||||
|
|||||||
Generated
+493
-2493
File diff suppressed because it is too large
Load Diff
+22
-18
@@ -2,37 +2,41 @@
|
|||||||
"name": "create-github-app-token",
|
"name": "create-github-app-token",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "2.0.2",
|
"version": "3.1.1",
|
||||||
"description": "GitHub Action for creating a GitHub App Installation Access Token",
|
"description": "GitHub Action for creating a GitHub App Installation Access Token",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=24.4.0"
|
||||||
|
},
|
||||||
|
"packageManager": "npm@10.9.4",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "esbuild main.js post.js --bundle --outdir=dist --out-extension:.js=.cjs --platform=node --target=node20.0.0 --packages=bundle",
|
"build": "esbuild main.js post.js --bundle --outdir=dist --out-extension:.js=.cjs --platform=node --packages=bundle",
|
||||||
"test": "c8 --100 ava tests/index.js",
|
"test": "c8 --100 node --test tests/index.js",
|
||||||
"coverage": "c8 report --reporter html",
|
"coverage": "c8 report --reporter html",
|
||||||
"postcoverage": "open-cli coverage/index.html"
|
"postcoverage": "open-cli coverage/index.html"
|
||||||
},
|
},
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/core": "^1.11.1",
|
"@actions/core": "^3.0.0",
|
||||||
"@octokit/auth-app": "^7.2.0",
|
"@octokit/auth-app": "^8.2.0",
|
||||||
"@octokit/request": "^9.2.2",
|
"@octokit/request": "^10.0.8",
|
||||||
"p-retry": "^6.2.1",
|
"p-retry": "^8.0.0"
|
||||||
"undici": "^7.7.0"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@octokit/openapi": "^18.2.0",
|
"@octokit/openapi": "^22.0.0",
|
||||||
"@sinonjs/fake-timers": "^14.0.0",
|
"c8": "^11.0.0",
|
||||||
"ava": "^6.2.0",
|
"esbuild": "^0.27.4",
|
||||||
"c8": "^10.1.3",
|
"open-cli": "^9.0.0",
|
||||||
"dotenv": "^16.4.7",
|
"undici": "^7.24.6",
|
||||||
"esbuild": "^0.25.2",
|
"yaml": "^2.8.3"
|
||||||
"execa": "^9.5.2",
|
|
||||||
"open-cli": "^8.0.0",
|
|
||||||
"yaml": "^2.7.1"
|
|
||||||
},
|
},
|
||||||
"release": {
|
"release": {
|
||||||
"branches": [
|
"branches": [
|
||||||
"+([0-9]).x",
|
"+([0-9]).x",
|
||||||
"main"
|
"main",
|
||||||
|
{
|
||||||
|
"name": "beta",
|
||||||
|
"prerelease": true
|
||||||
|
}
|
||||||
],
|
],
|
||||||
"plugins": [
|
"plugins": [
|
||||||
"@semantic-release/commit-analyzer",
|
"@semantic-release/commit-analyzer",
|
||||||
|
|||||||
@@ -1,11 +1,17 @@
|
|||||||
// @ts-check
|
// @ts-check
|
||||||
|
|
||||||
import core from "@actions/core";
|
import * as core from "@actions/core";
|
||||||
|
|
||||||
import { post } from "./lib/post.js";
|
import { post } from "./lib/post.js";
|
||||||
import request from "./lib/request.js";
|
import request, { ensureNativeProxySupport } from "./lib/request.js";
|
||||||
|
|
||||||
post(core, request).catch((error) => {
|
async function run() {
|
||||||
|
ensureNativeProxySupport();
|
||||||
|
|
||||||
|
return post(core, request);
|
||||||
|
}
|
||||||
|
|
||||||
|
run().catch((error) => {
|
||||||
/* c8 ignore next 3 */
|
/* c8 ignore next 3 */
|
||||||
console.error(error);
|
console.error(error);
|
||||||
core.setFailed(error.message);
|
core.setFailed(error.message);
|
||||||
|
|||||||
@@ -19,6 +19,22 @@
|
|||||||
"write"
|
"write"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"artifact_metadata": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "The level of permission to grant the access token to create and retrieve build artifact metadata records.",
|
||||||
|
"enum": [
|
||||||
|
"read",
|
||||||
|
"write"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"attestations": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "The level of permission to create and retrieve the access token for repository attestations.",
|
||||||
|
"enum": [
|
||||||
|
"read",
|
||||||
|
"write"
|
||||||
|
]
|
||||||
|
},
|
||||||
"checks": {
|
"checks": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"description": "The level of permission to grant the access token for checks on code.",
|
"description": "The level of permission to grant the access token for checks on code.",
|
||||||
@@ -59,6 +75,14 @@
|
|||||||
"write"
|
"write"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"discussions": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "The level of permission to grant the access token for discussions and related comments and labels.",
|
||||||
|
"enum": [
|
||||||
|
"read",
|
||||||
|
"write"
|
||||||
|
]
|
||||||
|
},
|
||||||
"environments": {
|
"environments": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"description": "The level of permission to grant the access token for managing repository environments.",
|
"description": "The level of permission to grant the access token for managing repository environments.",
|
||||||
@@ -75,6 +99,14 @@
|
|||||||
"write"
|
"write"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"merge_queues": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "The level of permission to grant the access token to manage the merge queues for a repository.",
|
||||||
|
"enum": [
|
||||||
|
"read",
|
||||||
|
"write"
|
||||||
|
]
|
||||||
|
},
|
||||||
"metadata": {
|
"metadata": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"description": "The level of permission to grant the access token to search repositories, list collaborators, and access repository metadata.",
|
"description": "The level of permission to grant the access token to search repositories, list collaborators, and access repository metadata.",
|
||||||
@@ -187,6 +219,14 @@
|
|||||||
"write"
|
"write"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"custom_properties_for_organizations": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "The level of permission to grant the access token to view and edit custom properties for an organization, when allowed by the property.",
|
||||||
|
"enum": [
|
||||||
|
"read",
|
||||||
|
"write"
|
||||||
|
]
|
||||||
|
},
|
||||||
"members": {
|
"members": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"description": "The level of permission to grant the access token for organization teams and members.",
|
"description": "The level of permission to grant the access token for organization teams and members.",
|
||||||
@@ -221,7 +261,7 @@
|
|||||||
},
|
},
|
||||||
"organization_custom_properties": {
|
"organization_custom_properties": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"description": "The level of permission to grant the access token for custom property management.",
|
"description": "The level of permission to grant the access token for repository custom properties management at the organization level.",
|
||||||
"enum": [
|
"enum": [
|
||||||
"read",
|
"read",
|
||||||
"write",
|
"write",
|
||||||
@@ -384,6 +424,15 @@
|
|||||||
"read",
|
"read",
|
||||||
"write"
|
"write"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
"enterprise_custom_properties_for_organizations": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "The level of permission to grant the access token for organization custom properties management at the enterprise level.",
|
||||||
|
"enum": [
|
||||||
|
"read",
|
||||||
|
"write",
|
||||||
|
"admin"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"example": {
|
"example": {
|
||||||
|
|||||||
+12
-6
@@ -2,14 +2,14 @@
|
|||||||
|
|
||||||
Add one test file per scenario. You can run them in isolation with:
|
Add one test file per scenario. You can run them in isolation with:
|
||||||
|
|
||||||
```bash
|
```
|
||||||
node tests/post-token-set.test.js
|
node tests/post-token-set.test.js
|
||||||
```
|
```
|
||||||
|
|
||||||
All tests are run together in [tests/index.js](index.js), which can be executed with ava
|
All tests are run together in [tests/index.js](index.js), which can be executed with Node's built-in test runner
|
||||||
|
|
||||||
```
|
```
|
||||||
npx ava tests/index.js
|
node --test tests/index.js
|
||||||
```
|
```
|
||||||
|
|
||||||
or with npm
|
or with npm
|
||||||
@@ -20,11 +20,17 @@ npm test
|
|||||||
|
|
||||||
## How the tests work
|
## How the tests work
|
||||||
|
|
||||||
The output from the tests is captured into a snapshot ([tests/snapshots/index.js.md](snapshots/index.js.md)). It includes all requests sent by our scripts to verify it's working correctly and to prevent regressions.
|
The output from the tests is captured into a snapshot ([tests/index.js.snapshot](index.js.snapshot)). It includes all requests sent by our scripts to verify it's working correctly and to prevent regressions.
|
||||||
|
|
||||||
|
To update snapshots after an intentional change:
|
||||||
|
|
||||||
|
```
|
||||||
|
node --test --test-update-snapshots tests/index.js
|
||||||
|
```
|
||||||
|
|
||||||
## How to add a new test
|
## How to add a new test
|
||||||
|
|
||||||
We have tests both for the `main.js` and `post.js` scripts.
|
We have tests both for the `main.js` and `post.js` scripts.
|
||||||
|
|
||||||
- If you do not expect an error, take [main-token-permissions-set.test.js](tests/main-token-permissions-set.test.js) as a starting point.
|
- If you do not expect an error, take [main-token-permissions-set.test.js](main-token-permissions-set.test.js) as a starting point.
|
||||||
- If your test has an expected error, take [main-missing-app-id.test.js](tests/main-missing-app-id.test.js) as a starting point.
|
- If your test has an expected error, take [main-missing-client-and-app-id.test.js](main-missing-client-and-app-id.test.js) as a starting point.
|
||||||
|
|||||||
+38
-11
@@ -1,15 +1,23 @@
|
|||||||
import { readdirSync } from "node:fs";
|
import { readdirSync } from "node:fs";
|
||||||
|
import { execFile } from "node:child_process";
|
||||||
|
import { promisify } from "node:util";
|
||||||
|
|
||||||
import test from "ava";
|
import { snapshot, test } from "node:test";
|
||||||
import { execa } from "execa";
|
|
||||||
|
const execFileAsync = promisify(execFile);
|
||||||
|
|
||||||
|
// Serialize strings as-is so multiline output is human-readable in snapshots
|
||||||
|
snapshot.setDefaultSnapshotSerializers([
|
||||||
|
(value) => (typeof value === "string" ? value : undefined),
|
||||||
|
]);
|
||||||
|
|
||||||
// Get all files in tests directory
|
// Get all files in tests directory
|
||||||
const files = readdirSync("tests");
|
const files = readdirSync("tests");
|
||||||
|
|
||||||
// Files to ignore
|
// Files to ignore
|
||||||
const ignore = ["index.js", "main.js", "README.md", "snapshots"];
|
const ignore = ["index.js", "index.js.snapshot", "main.js", "README.md"];
|
||||||
|
|
||||||
const testFiles = files.filter((file) => !ignore.includes(file));
|
const testFiles = files.filter((file) => !ignore.includes(file)).sort();
|
||||||
|
|
||||||
// Throw an error if there is a file that does not end with test.js in the tests directory
|
// Throw an error if there is a file that does not end with test.js in the tests directory
|
||||||
for (const file of testFiles) {
|
for (const file of testFiles) {
|
||||||
@@ -18,12 +26,31 @@ for (const file of testFiles) {
|
|||||||
}
|
}
|
||||||
test(file, async (t) => {
|
test(file, async (t) => {
|
||||||
// Override Actions environment variables that change `core`’s behavior
|
// Override Actions environment variables that change `core`’s behavior
|
||||||
const env = {
|
const {
|
||||||
GITHUB_OUTPUT: undefined,
|
GITHUB_OUTPUT,
|
||||||
GITHUB_STATE: undefined,
|
GITHUB_STATE,
|
||||||
};
|
HTTP_PROXY,
|
||||||
const { stderr, stdout } = await execa("node", [`tests/${file}`], { env });
|
HTTPS_PROXY,
|
||||||
t.snapshot(stderr, "stderr");
|
http_proxy,
|
||||||
t.snapshot(stdout, "stdout");
|
https_proxy,
|
||||||
|
NO_PROXY,
|
||||||
|
no_proxy,
|
||||||
|
NODE_OPTIONS,
|
||||||
|
NODE_USE_ENV_PROXY,
|
||||||
|
...env
|
||||||
|
} = process.env;
|
||||||
|
const { stderr, stdout } = await execFileAsync("node", [`tests/${file}`], {
|
||||||
|
env,
|
||||||
|
});
|
||||||
|
const trimmedStderr = stderr.replace(/\r?\n$/, "");
|
||||||
|
const trimmedStdout = stdout.replace(/\r?\n$/, "");
|
||||||
|
await t.test("stderr", (t) => {
|
||||||
|
if (trimmedStderr) t.assert.snapshot(trimmedStderr);
|
||||||
|
else t.assert.strictEqual(trimmedStderr, "");
|
||||||
|
});
|
||||||
|
await t.test("stdout", (t) => {
|
||||||
|
if (trimmedStdout) t.assert.snapshot(trimmedStdout);
|
||||||
|
else t.assert.strictEqual(trimmedStdout, "");
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,320 @@
|
|||||||
|
exports[`action-deprecated-inputs.test.js > stdout 1`] = `
|
||||||
|
app-id — Use 'client-id' instead.
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`main-app-id-fallback.test.js > stdout 1`] = `
|
||||||
|
Inputs 'owner' and 'repositories' are not set. Creating token for this repository (actions/create-github-app-token).
|
||||||
|
::add-mask::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
|
||||||
|
::set-output name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
|
||||||
|
::set-output name=installation-id::123456
|
||||||
|
|
||||||
|
::set-output name=app-slug::github-actions
|
||||||
|
::save-state name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
::save-state name=expiresAt::2016-07-11T22:14:10Z
|
||||||
|
--- REQUESTS ---
|
||||||
|
GET /repos/actions/create-github-app-token/installation
|
||||||
|
POST /app/installations/123456/access_tokens
|
||||||
|
{"repositories":["create-github-app-token"]}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`main-client-id-precedence.test.js > stdout 1`] = `
|
||||||
|
Inputs 'owner' and 'repositories' are not set. Creating token for this repository (actions/create-github-app-token).
|
||||||
|
::add-mask::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
|
||||||
|
::set-output name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
|
||||||
|
::set-output name=installation-id::123456
|
||||||
|
|
||||||
|
::set-output name=app-slug::github-actions
|
||||||
|
::save-state name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
::save-state name=expiresAt::2016-07-11T22:14:10Z
|
||||||
|
--- REQUESTS ---
|
||||||
|
GET /repos/actions/create-github-app-token/installation
|
||||||
|
POST /app/installations/123456/access_tokens
|
||||||
|
{"repositories":["create-github-app-token"]}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`main-custom-github-api-url.test.js > stdout 1`] = `
|
||||||
|
Inputs 'owner' and 'repositories' are set. Creating token for the following repositories:
|
||||||
|
|
||||||
|
- actions/create-github-app-token
|
||||||
|
::add-mask::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
|
||||||
|
::set-output name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
|
||||||
|
::set-output name=installation-id::123456
|
||||||
|
|
||||||
|
::set-output name=app-slug::github-actions
|
||||||
|
::save-state name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
::save-state name=expiresAt::2016-07-11T22:14:10Z
|
||||||
|
--- REQUESTS ---
|
||||||
|
GET /api/v3/repos/actions/create-github-app-token/installation
|
||||||
|
POST /api/v3/app/installations/123456/access_tokens
|
||||||
|
{"repositories":["create-github-app-token"]}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`main-missing-client-and-app-id.test.js > stderr 1`] = `
|
||||||
|
The 'client-id' (or deprecated 'app-id') input must be set to a non-empty string. If using a secret or variable, ensure it is available in this workflow context.
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`main-missing-client-and-app-id.test.js > stdout 1`] = `
|
||||||
|
::error::The 'client-id' (or deprecated 'app-id') input must be set to a non-empty string. If using a secret or variable, ensure it is available in this workflow context.
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`main-missing-owner.test.js > stderr 1`] = `
|
||||||
|
GITHUB_REPOSITORY_OWNER missing, must be set to '<owner>'
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`main-missing-repository.test.js > stderr 1`] = `
|
||||||
|
GITHUB_REPOSITORY missing, must be set to '<owner>/<repo>'
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`main-private-key-with-escaped-newlines.test.js > stdout 1`] = `
|
||||||
|
Inputs 'owner' and 'repositories' are not set. Creating token for this repository (actions/create-github-app-token).
|
||||||
|
::add-mask::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
|
||||||
|
::set-output name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
|
||||||
|
::set-output name=installation-id::123456
|
||||||
|
|
||||||
|
::set-output name=app-slug::github-actions
|
||||||
|
::save-state name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
::save-state name=expiresAt::2016-07-11T22:14:10Z
|
||||||
|
--- REQUESTS ---
|
||||||
|
GET /repos/actions/create-github-app-token/installation
|
||||||
|
POST /app/installations/123456/access_tokens
|
||||||
|
{"repositories":["create-github-app-token"]}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`main-proxy-requires-native-support.test.js > stderr 1`] = `
|
||||||
|
A proxy environment variable is set, but Node.js native proxy support is not enabled. Set NODE_USE_ENV_PROXY=1 for this action step.
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`main-proxy-requires-native-support.test.js > stdout 1`] = `
|
||||||
|
::error::A proxy environment variable is set, but Node.js native proxy support is not enabled. Set NODE_USE_ENV_PROXY=1 for this action step.
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`main-repo-skew.test.js > stderr 1`] = `
|
||||||
|
'Issued at' claim ('iat') must be an Integer representing the time that the assertion was issued.
|
||||||
|
[@octokit/auth-app] GitHub API time and system time are different by 30 seconds. Retrying request with the difference accounted for.
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`main-repo-skew.test.js > stdout 1`] = `
|
||||||
|
Inputs 'owner' and 'repositories' are set. Creating token for the following repositories:
|
||||||
|
|
||||||
|
- actions/failed-repo
|
||||||
|
::add-mask::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
|
||||||
|
::set-output name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
|
||||||
|
::set-output name=installation-id::123456
|
||||||
|
|
||||||
|
::set-output name=app-slug::github-actions
|
||||||
|
::save-state name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
::save-state name=expiresAt::2016-07-11T22:14:10Z
|
||||||
|
--- REQUESTS ---
|
||||||
|
GET /repos/actions/failed-repo/installation
|
||||||
|
GET /repos/actions/failed-repo/installation
|
||||||
|
POST /app/installations/123456/access_tokens
|
||||||
|
{"repositories":["failed-repo"]}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`main-token-get-owner-set-fail-response.test.js > stdout 1`] = `
|
||||||
|
Input 'repositories' is not set. Creating token for all repositories owned by smockle.
|
||||||
|
Failed to create token for "smockle" (attempt 1): GitHub API not available
|
||||||
|
::add-mask::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
|
||||||
|
::set-output name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
|
||||||
|
::set-output name=installation-id::123456
|
||||||
|
|
||||||
|
::set-output name=app-slug::github-actions
|
||||||
|
::save-state name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
::save-state name=expiresAt::2016-07-11T22:14:10Z
|
||||||
|
--- REQUESTS ---
|
||||||
|
GET /users/smockle/installation
|
||||||
|
GET /users/smockle/installation
|
||||||
|
POST /app/installations/123456/access_tokens
|
||||||
|
null
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`main-token-get-owner-set-repo-fail-response.test.js > stdout 1`] = `
|
||||||
|
Inputs 'owner' and 'repositories' are set. Creating token for the following repositories:
|
||||||
|
|
||||||
|
- actions/failed-repo
|
||||||
|
Failed to create token for "failed-repo" (attempt 1): GitHub API not available
|
||||||
|
::add-mask::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
|
||||||
|
::set-output name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
|
||||||
|
::set-output name=installation-id::123456
|
||||||
|
|
||||||
|
::set-output name=app-slug::github-actions
|
||||||
|
::save-state name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
::save-state name=expiresAt::2016-07-11T22:14:10Z
|
||||||
|
--- REQUESTS ---
|
||||||
|
GET /repos/actions/failed-repo/installation
|
||||||
|
GET /repos/actions/failed-repo/installation
|
||||||
|
POST /app/installations/123456/access_tokens
|
||||||
|
{"repositories":["failed-repo"]}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`main-token-get-owner-set-repo-set-to-many-newline.test.js > stdout 1`] = `
|
||||||
|
Inputs 'owner' and 'repositories' are set. Creating token for the following repositories:
|
||||||
|
|
||||||
|
- actions/create-github-app-token
|
||||||
|
- actions/toolkit
|
||||||
|
- actions/checkout
|
||||||
|
::add-mask::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
|
||||||
|
::set-output name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
|
||||||
|
::set-output name=installation-id::123456
|
||||||
|
|
||||||
|
::set-output name=app-slug::github-actions
|
||||||
|
::save-state name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
::save-state name=expiresAt::2016-07-11T22:14:10Z
|
||||||
|
--- REQUESTS ---
|
||||||
|
GET /repos/actions/create-github-app-token/installation
|
||||||
|
POST /app/installations/123456/access_tokens
|
||||||
|
{"repositories":["create-github-app-token","toolkit","checkout"]}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`main-token-get-owner-set-repo-set-to-many.test.js > stdout 1`] = `
|
||||||
|
Inputs 'owner' and 'repositories' are set. Creating token for the following repositories:
|
||||||
|
|
||||||
|
- actions/create-github-app-token
|
||||||
|
- actions/toolkit
|
||||||
|
- actions/checkout
|
||||||
|
::add-mask::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
|
||||||
|
::set-output name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
|
||||||
|
::set-output name=installation-id::123456
|
||||||
|
|
||||||
|
::set-output name=app-slug::github-actions
|
||||||
|
::save-state name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
::save-state name=expiresAt::2016-07-11T22:14:10Z
|
||||||
|
--- REQUESTS ---
|
||||||
|
GET /repos/actions/create-github-app-token/installation
|
||||||
|
POST /app/installations/123456/access_tokens
|
||||||
|
{"repositories":["create-github-app-token","toolkit","checkout"]}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`main-token-get-owner-set-repo-set-to-one.test.js > stdout 1`] = `
|
||||||
|
Inputs 'owner' and 'repositories' are set. Creating token for the following repositories:
|
||||||
|
|
||||||
|
- actions/create-github-app-token
|
||||||
|
::add-mask::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
|
||||||
|
::set-output name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
|
||||||
|
::set-output name=installation-id::123456
|
||||||
|
|
||||||
|
::set-output name=app-slug::github-actions
|
||||||
|
::save-state name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
::save-state name=expiresAt::2016-07-11T22:14:10Z
|
||||||
|
--- REQUESTS ---
|
||||||
|
GET /repos/actions/create-github-app-token/installation
|
||||||
|
POST /app/installations/123456/access_tokens
|
||||||
|
{"repositories":["create-github-app-token"]}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`main-token-get-owner-set-repo-unset.test.js > stdout 1`] = `
|
||||||
|
Input 'repositories' is not set. Creating token for all repositories owned by actions.
|
||||||
|
::add-mask::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
|
||||||
|
::set-output name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
|
||||||
|
::set-output name=installation-id::123456
|
||||||
|
|
||||||
|
::set-output name=app-slug::github-actions
|
||||||
|
::save-state name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
::save-state name=expiresAt::2016-07-11T22:14:10Z
|
||||||
|
--- REQUESTS ---
|
||||||
|
GET /users/actions/installation
|
||||||
|
POST /app/installations/123456/access_tokens
|
||||||
|
null
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`main-token-get-owner-unset-repo-set.test.js > stdout 1`] = `
|
||||||
|
No 'owner' input provided. Using default owner 'actions' to create token for the following repositories:
|
||||||
|
- actions/create-github-app-token
|
||||||
|
::add-mask::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
|
||||||
|
::set-output name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
|
||||||
|
::set-output name=installation-id::123456
|
||||||
|
|
||||||
|
::set-output name=app-slug::github-actions
|
||||||
|
::save-state name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
::save-state name=expiresAt::2016-07-11T22:14:10Z
|
||||||
|
--- REQUESTS ---
|
||||||
|
GET /repos/actions/create-github-app-token/installation
|
||||||
|
POST /app/installations/123456/access_tokens
|
||||||
|
{"repositories":["create-github-app-token"]}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`main-token-get-owner-unset-repo-unset.test.js > stdout 1`] = `
|
||||||
|
Inputs 'owner' and 'repositories' are not set. Creating token for this repository (actions/create-github-app-token).
|
||||||
|
::add-mask::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
|
||||||
|
::set-output name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
|
||||||
|
::set-output name=installation-id::123456
|
||||||
|
|
||||||
|
::set-output name=app-slug::github-actions
|
||||||
|
::save-state name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
::save-state name=expiresAt::2016-07-11T22:14:10Z
|
||||||
|
--- REQUESTS ---
|
||||||
|
GET /repos/actions/create-github-app-token/installation
|
||||||
|
POST /app/installations/123456/access_tokens
|
||||||
|
{"repositories":["create-github-app-token"]}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`main-token-permissions-set.test.js > stdout 1`] = `
|
||||||
|
Inputs 'owner' and 'repositories' are not set. Creating token for this repository (actions/create-github-app-token).
|
||||||
|
::add-mask::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
|
||||||
|
::set-output name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
|
||||||
|
::set-output name=installation-id::123456
|
||||||
|
|
||||||
|
::set-output name=app-slug::github-actions
|
||||||
|
::save-state name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a
|
||||||
|
::save-state name=expiresAt::2016-07-11T22:14:10Z
|
||||||
|
--- REQUESTS ---
|
||||||
|
GET /repos/actions/create-github-app-token/installation
|
||||||
|
POST /app/installations/123456/access_tokens
|
||||||
|
{"repositories":["create-github-app-token"],"permissions":{"issues":"write","pull_requests":"read"}}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`post-proxy-requires-native-support.test.js > stderr 1`] = `
|
||||||
|
A proxy environment variable is set, but Node.js native proxy support is not enabled. Set NODE_USE_ENV_PROXY=1 for this action step.
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`post-proxy-requires-native-support.test.js > stdout 1`] = `
|
||||||
|
::error::A proxy environment variable is set, but Node.js native proxy support is not enabled. Set NODE_USE_ENV_PROXY=1 for this action step.
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`post-revoke-token-fail-response.test.js > stdout 1`] = `
|
||||||
|
::warning::Token revocation failed:
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`post-token-expired.test.js > stdout 1`] = `
|
||||||
|
Token expired, skipping token revocation
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`post-token-set.test.js > stdout 1`] = `
|
||||||
|
Token revoked
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`post-token-skipped.test.js > stdout 1`] = `
|
||||||
|
Token revocation was skipped
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`post-token-unset.test.js > stdout 1`] = `
|
||||||
|
Token is not set
|
||||||
|
`;
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
import { DEFAULT_ENV, test } from "./main.js";
|
||||||
|
|
||||||
|
// Verify `main` falls back to `app-id` when `client-id` is not set
|
||||||
|
await test(
|
||||||
|
() => {},
|
||||||
|
{
|
||||||
|
...DEFAULT_ENV,
|
||||||
|
"INPUT_CLIENT-ID": "",
|
||||||
|
"INPUT_APP-ID": "123456",
|
||||||
|
}
|
||||||
|
);
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
import { DEFAULT_ENV, test } from "./main.js";
|
||||||
|
|
||||||
|
// Verify `client-id` takes precedence when both `client-id` and `app-id` are set
|
||||||
|
await test(
|
||||||
|
() => {},
|
||||||
|
{
|
||||||
|
...DEFAULT_ENV,
|
||||||
|
"INPUT_CLIENT-ID": "Iv1.0123456789abcdef",
|
||||||
|
"INPUT_APP-ID": "123456",
|
||||||
|
}
|
||||||
|
);
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
import { DEFAULT_ENV } from "./main.js";
|
||||||
|
|
||||||
|
for (const [key, value] of Object.entries({
|
||||||
|
...DEFAULT_ENV,
|
||||||
|
"INPUT_CLIENT-ID": "",
|
||||||
|
"INPUT_APP-ID": "",
|
||||||
|
})) {
|
||||||
|
process.env[key] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Log only the error message, not the full stack trace, because the stack
|
||||||
|
// trace contains environment-specific paths and ANSI codes that differ
|
||||||
|
// between local and CI environments.
|
||||||
|
const _error = console.error;
|
||||||
|
console.error = (err) => _error(err?.message ?? err);
|
||||||
|
|
||||||
|
// Verify `main` exits with an error when neither `client-id` nor `app-id` is set.
|
||||||
|
const { default: promise } = await import("../main.js");
|
||||||
|
await promise;
|
||||||
|
process.exitCode = 0;
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
process.env.GITHUB_REPOSITORY = "actions/create-github-app-token";
|
||||||
|
process.env.GITHUB_REPOSITORY_OWNER = "actions";
|
||||||
|
process.env.HTTPS_PROXY = "http://127.0.0.1:3128";
|
||||||
|
|
||||||
|
const originalConsoleError = console.error;
|
||||||
|
console.error = (...args) => {
|
||||||
|
originalConsoleError(
|
||||||
|
...args.map((arg) => (arg instanceof Error ? arg.message : arg)),
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
await import("../main.js");
|
||||||
|
await new Promise((resolve) => setImmediate(resolve));
|
||||||
|
process.exitCode = 0;
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import { test } from "./main.js";
|
import { mock } from "node:test";
|
||||||
|
|
||||||
import { install } from "@sinonjs/fake-timers";
|
import { test } from "./main.js";
|
||||||
|
|
||||||
// Verify `main` retry when the clock has drifted.
|
// Verify `main` retry when the clock has drifted.
|
||||||
await test((mockPool) => {
|
await test((mockPool) => {
|
||||||
@@ -11,7 +11,7 @@ await test((mockPool) => {
|
|||||||
const mockInstallationId = "123456";
|
const mockInstallationId = "123456";
|
||||||
const mockAppSlug = "github-actions";
|
const mockAppSlug = "github-actions";
|
||||||
|
|
||||||
install({ now: 0, toFake: ["Date"] });
|
mock.timers.enable({ apis: ["Date"], now: 0 });
|
||||||
|
|
||||||
mockPool
|
mockPool
|
||||||
.intercept({
|
.intercept({
|
||||||
@@ -59,4 +59,6 @@ await test((mockPool) => {
|
|||||||
};
|
};
|
||||||
})
|
})
|
||||||
.times(2);
|
.times(2);
|
||||||
|
}).finally(() => {
|
||||||
|
mock.timers.reset();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,6 +2,6 @@ import { test } from "./main.js";
|
|||||||
|
|
||||||
// Verify `main` successfully sets permissions
|
// Verify `main` successfully sets permissions
|
||||||
await test(() => {
|
await test(() => {
|
||||||
process.env.INPUT_PERMISSION_ISSUES = `write`;
|
process.env["INPUT_PERMISSION-ISSUES"] = `write`;
|
||||||
process.env.INPUT_PERMISSION_PULL_REQUESTS = `read`;
|
process.env["INPUT_PERMISSION-PULL-REQUESTS"] = `read`;
|
||||||
});
|
});
|
||||||
|
|||||||
+7
-4
@@ -8,7 +8,8 @@ export const DEFAULT_ENV = {
|
|||||||
// inputs are set as environment variables with the prefix INPUT_
|
// inputs are set as environment variables with the prefix INPUT_
|
||||||
// https://docs.github.com/actions/creating-actions/metadata-syntax-for-github-actions#example-specifying-inputs
|
// https://docs.github.com/actions/creating-actions/metadata-syntax-for-github-actions#example-specifying-inputs
|
||||||
"INPUT_GITHUB-API-URL": "https://api.github.com",
|
"INPUT_GITHUB-API-URL": "https://api.github.com",
|
||||||
"INPUT_APP-ID": "123456",
|
"INPUT_SKIP-TOKEN-REVOKE": "false",
|
||||||
|
"INPUT_CLIENT-ID": "Iv1.0123456789abcdef",
|
||||||
// This key is invalidated. It’s from https://github.com/octokit/auth-app.js/issues/465#issuecomment-1564998327.
|
// This key is invalidated. It’s from https://github.com/octokit/auth-app.js/issues/465#issuecomment-1564998327.
|
||||||
"INPUT_PRIVATE-KEY": `-----BEGIN RSA PRIVATE KEY-----
|
"INPUT_PRIVATE-KEY": `-----BEGIN RSA PRIVATE KEY-----
|
||||||
MIIEowIBAAKCAQEA280nfuUM9w00Ib9E2rvZJ6Qu3Ua3IqR34ZlK53vn/Iobn2EL
|
MIIEowIBAAKCAQEA280nfuUM9w00Ib9E2rvZJ6Qu3Ua3IqR34ZlK53vn/Iobn2EL
|
||||||
@@ -37,6 +38,8 @@ so0tiQKBgGQXZaxaXhYUcxYHuCkQ3V4Vsj3ezlM92xXlP32SGFm3KgFhYy9kATxw
|
|||||||
Cax1ytZzvlrKLQyQFVK1COs2rHt7W4cJ7op7C8zXfsigXCiejnS664oAuX8sQZID
|
Cax1ytZzvlrKLQyQFVK1COs2rHt7W4cJ7op7C8zXfsigXCiejnS664oAuX8sQZID
|
||||||
x3WQZRiXlWejSMUAHuMwXrhGlltF3lw83+xAjnqsVp75kGS6OH61
|
x3WQZRiXlWejSMUAHuMwXrhGlltF3lw83+xAjnqsVp75kGS6OH61
|
||||||
-----END RSA PRIVATE KEY-----`,
|
-----END RSA PRIVATE KEY-----`,
|
||||||
|
// The Actions runner sets all inputs to empty strings if not set.
|
||||||
|
"INPUT_PERMISSION-ADMINISTRATION": "",
|
||||||
};
|
};
|
||||||
|
|
||||||
export async function test(cb = (_mockPool) => {}, env = DEFAULT_ENV) {
|
export async function test(cb = (_mockPool) => {}, env = DEFAULT_ENV) {
|
||||||
@@ -60,7 +63,7 @@ export async function test(cb = (_mockPool) => {}, env = DEFAULT_ENV) {
|
|||||||
const owner = env.INPUT_OWNER ?? env.GITHUB_REPOSITORY_OWNER;
|
const owner = env.INPUT_OWNER ?? env.GITHUB_REPOSITORY_OWNER;
|
||||||
const currentRepoName = env.GITHUB_REPOSITORY.split("/")[1];
|
const currentRepoName = env.GITHUB_REPOSITORY.split("/")[1];
|
||||||
const repo = encodeURIComponent(
|
const repo = encodeURIComponent(
|
||||||
(env.INPUT_REPOSITORIES ?? currentRepoName).split(",")[0],
|
(env.INPUT_REPOSITORIES ?? currentRepoName).split(",")[0]
|
||||||
);
|
);
|
||||||
|
|
||||||
mockPool
|
mockPool
|
||||||
@@ -76,7 +79,7 @@ export async function test(cb = (_mockPool) => {}, env = DEFAULT_ENV) {
|
|||||||
.reply(
|
.reply(
|
||||||
200,
|
200,
|
||||||
{ id: mockInstallationId, app_slug: mockAppSlug },
|
{ id: mockInstallationId, app_slug: mockAppSlug },
|
||||||
{ headers: { "content-type": "application/json" } },
|
{ headers: { "content-type": "application/json" } }
|
||||||
);
|
);
|
||||||
|
|
||||||
// Mock installation access token request
|
// Mock installation access token request
|
||||||
@@ -97,7 +100,7 @@ export async function test(cb = (_mockPool) => {}, env = DEFAULT_ENV) {
|
|||||||
.reply(
|
.reply(
|
||||||
201,
|
201,
|
||||||
{ token: mockInstallationAccessToken, expires_at: mockExpiresAt },
|
{ token: mockInstallationAccessToken, expires_at: mockExpiresAt },
|
||||||
{ headers: { "content-type": "application/json" } },
|
{ headers: { "content-type": "application/json" } }
|
||||||
);
|
);
|
||||||
|
|
||||||
// Run the callback
|
// Run the callback
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
process.env["INPUT_GITHUB-API-URL"] = "https://api.github.com";
|
||||||
|
process.env.HTTPS_PROXY = "http://127.0.0.1:3128";
|
||||||
|
|
||||||
|
const originalConsoleError = console.error;
|
||||||
|
console.error = (...args) => {
|
||||||
|
originalConsoleError(
|
||||||
|
...args.map((arg) => (arg instanceof Error ? arg.message : arg)),
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
await import("../post.js");
|
||||||
|
await new Promise((resolve) => setImmediate(resolve));
|
||||||
|
process.exitCode = 0;
|
||||||
@@ -7,6 +7,7 @@ process.env.STATE_token = "secret123";
|
|||||||
// inputs are set as environment variables with the prefix INPUT_
|
// inputs are set as environment variables with the prefix INPUT_
|
||||||
// https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions#example-specifying-inputs
|
// https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions#example-specifying-inputs
|
||||||
process.env["INPUT_GITHUB-API-URL"] = "https://api.github.com";
|
process.env["INPUT_GITHUB-API-URL"] = "https://api.github.com";
|
||||||
|
process.env["INPUT_SKIP-TOKEN-REVOKE"] = "false";
|
||||||
|
|
||||||
// 1 hour in the future, not expired
|
// 1 hour in the future, not expired
|
||||||
process.env.STATE_expiresAt = new Date(
|
process.env.STATE_expiresAt = new Date(
|
||||||
|
|||||||
@@ -7,6 +7,10 @@ process.env.STATE_token = "secret123";
|
|||||||
// 1 hour in the past, expired
|
// 1 hour in the past, expired
|
||||||
process.env.STATE_expiresAt = new Date(Date.now() - 1000 * 60 * 60).toISOString();
|
process.env.STATE_expiresAt = new Date(Date.now() - 1000 * 60 * 60).toISOString();
|
||||||
|
|
||||||
|
// inputs are set as environment variables with the prefix INPUT_
|
||||||
|
// https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions#example-specifying-inputs
|
||||||
|
process.env["INPUT_SKIP-TOKEN-REVOKE"] = "false";
|
||||||
|
|
||||||
const mockAgent = new MockAgent();
|
const mockAgent = new MockAgent();
|
||||||
|
|
||||||
setGlobalDispatcher(mockAgent);
|
setGlobalDispatcher(mockAgent);
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ process.env.STATE_token = "secret123";
|
|||||||
// inputs are set as environment variables with the prefix INPUT_
|
// inputs are set as environment variables with the prefix INPUT_
|
||||||
// https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions#example-specifying-inputs
|
// https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions#example-specifying-inputs
|
||||||
process.env["INPUT_GITHUB-API-URL"] = "https://api.github.com";
|
process.env["INPUT_GITHUB-API-URL"] = "https://api.github.com";
|
||||||
|
process.env["INPUT_SKIP-TOKEN-REVOKE"] = "false";
|
||||||
|
|
||||||
// 1 hour in the future, not expired
|
// 1 hour in the future, not expired
|
||||||
process.env.STATE_expiresAt = new Date(Date.now() + 1000 * 60 * 60).toISOString();
|
process.env.STATE_expiresAt = new Date(Date.now() + 1000 * 60 * 60).toISOString();
|
||||||
|
|||||||
@@ -2,4 +2,8 @@
|
|||||||
// https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#sending-values-to-the-pre-and-post-actions
|
// https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#sending-values-to-the-pre-and-post-actions
|
||||||
delete process.env.STATE_token;
|
delete process.env.STATE_token;
|
||||||
|
|
||||||
|
// inputs are set as environment variables with the prefix INPUT_
|
||||||
|
// https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions#example-specifying-inputs
|
||||||
|
process.env["INPUT_SKIP-TOKEN-REVOKE"] = "false";
|
||||||
|
|
||||||
await import("../post.js");
|
await import("../post.js");
|
||||||
|
|||||||
@@ -1,384 +0,0 @@
|
|||||||
# Snapshot report for `tests/index.js`
|
|
||||||
|
|
||||||
The actual snapshot is saved in `index.js.snap`.
|
|
||||||
|
|
||||||
Generated by [AVA](https://avajs.dev).
|
|
||||||
|
|
||||||
## action-deprecated-inputs.test.js
|
|
||||||
|
|
||||||
> stderr
|
|
||||||
|
|
||||||
''
|
|
||||||
|
|
||||||
> stdout
|
|
||||||
|
|
||||||
''
|
|
||||||
|
|
||||||
## main-custom-github-api-url.test.js
|
|
||||||
|
|
||||||
> stderr
|
|
||||||
|
|
||||||
''
|
|
||||||
|
|
||||||
> stdout
|
|
||||||
|
|
||||||
`Inputs 'owner' and 'repositories' are set. Creating token for the following repositories:␊
|
|
||||||
␊
|
|
||||||
- actions/create-github-app-token␊
|
|
||||||
::add-mask::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
␊
|
|
||||||
::set-output name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
␊
|
|
||||||
::set-output name=installation-id::123456␊
|
|
||||||
␊
|
|
||||||
::set-output name=app-slug::github-actions␊
|
|
||||||
::save-state name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
::save-state name=expiresAt::2016-07-11T22:14:10Z␊
|
|
||||||
--- REQUESTS ---␊
|
|
||||||
GET /api/v3/repos/actions/create-github-app-token/installation␊
|
|
||||||
POST /api/v3/app/installations/123456/access_tokens␊
|
|
||||||
{"repositories":["create-github-app-token"]}`
|
|
||||||
|
|
||||||
## main-missing-owner.test.js
|
|
||||||
|
|
||||||
> stderr
|
|
||||||
|
|
||||||
'GITHUB_REPOSITORY_OWNER missing, must be set to \'<owner>\''
|
|
||||||
|
|
||||||
> stdout
|
|
||||||
|
|
||||||
''
|
|
||||||
|
|
||||||
## main-missing-repository.test.js
|
|
||||||
|
|
||||||
> stderr
|
|
||||||
|
|
||||||
'GITHUB_REPOSITORY missing, must be set to \'<owner>/<repo>\''
|
|
||||||
|
|
||||||
> stdout
|
|
||||||
|
|
||||||
''
|
|
||||||
|
|
||||||
## main-private-key-with-escaped-newlines.test.js
|
|
||||||
|
|
||||||
> stderr
|
|
||||||
|
|
||||||
''
|
|
||||||
|
|
||||||
> stdout
|
|
||||||
|
|
||||||
`Inputs 'owner' and 'repositories' are not set. Creating token for this repository (actions/create-github-app-token).␊
|
|
||||||
::add-mask::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
␊
|
|
||||||
::set-output name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
␊
|
|
||||||
::set-output name=installation-id::123456␊
|
|
||||||
␊
|
|
||||||
::set-output name=app-slug::github-actions␊
|
|
||||||
::save-state name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
::save-state name=expiresAt::2016-07-11T22:14:10Z␊
|
|
||||||
--- REQUESTS ---␊
|
|
||||||
GET /repos/actions/create-github-app-token/installation␊
|
|
||||||
POST /app/installations/123456/access_tokens␊
|
|
||||||
{"repositories":["create-github-app-token"]}`
|
|
||||||
|
|
||||||
## main-repo-skew.test.js
|
|
||||||
|
|
||||||
> stderr
|
|
||||||
|
|
||||||
`'Issued at' claim ('iat') must be an Integer representing the time that the assertion was issued.␊
|
|
||||||
[@octokit/auth-app] GitHub API time and system time are different by 30 seconds. Retrying request with the difference accounted for.`
|
|
||||||
|
|
||||||
> stdout
|
|
||||||
|
|
||||||
`Inputs 'owner' and 'repositories' are set. Creating token for the following repositories:␊
|
|
||||||
␊
|
|
||||||
- actions/failed-repo␊
|
|
||||||
::add-mask::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
␊
|
|
||||||
::set-output name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
␊
|
|
||||||
::set-output name=installation-id::123456␊
|
|
||||||
␊
|
|
||||||
::set-output name=app-slug::github-actions␊
|
|
||||||
::save-state name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
::save-state name=expiresAt::2016-07-11T22:14:10Z␊
|
|
||||||
--- REQUESTS ---␊
|
|
||||||
GET /repos/actions/failed-repo/installation␊
|
|
||||||
GET /repos/actions/failed-repo/installation␊
|
|
||||||
POST /app/installations/123456/access_tokens␊
|
|
||||||
{"repositories":["failed-repo"]}`
|
|
||||||
|
|
||||||
## main-token-get-owner-set-fail-response.test.js
|
|
||||||
|
|
||||||
> stderr
|
|
||||||
|
|
||||||
''
|
|
||||||
|
|
||||||
> stdout
|
|
||||||
|
|
||||||
`Input 'repositories' is not set. Creating token for all repositories owned by smockle.␊
|
|
||||||
Failed to create token for "smockle" (attempt 1): GitHub API not available␊
|
|
||||||
::add-mask::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
␊
|
|
||||||
::set-output name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
␊
|
|
||||||
::set-output name=installation-id::123456␊
|
|
||||||
␊
|
|
||||||
::set-output name=app-slug::github-actions␊
|
|
||||||
::save-state name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
::save-state name=expiresAt::2016-07-11T22:14:10Z␊
|
|
||||||
--- REQUESTS ---␊
|
|
||||||
GET /users/smockle/installation␊
|
|
||||||
GET /users/smockle/installation␊
|
|
||||||
POST /app/installations/123456/access_tokens␊
|
|
||||||
null`
|
|
||||||
|
|
||||||
## main-token-get-owner-set-repo-fail-response.test.js
|
|
||||||
|
|
||||||
> stderr
|
|
||||||
|
|
||||||
''
|
|
||||||
|
|
||||||
> stdout
|
|
||||||
|
|
||||||
`Inputs 'owner' and 'repositories' are set. Creating token for the following repositories:␊
|
|
||||||
␊
|
|
||||||
- actions/failed-repo␊
|
|
||||||
Failed to create token for "failed-repo" (attempt 1): GitHub API not available␊
|
|
||||||
::add-mask::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
␊
|
|
||||||
::set-output name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
␊
|
|
||||||
::set-output name=installation-id::123456␊
|
|
||||||
␊
|
|
||||||
::set-output name=app-slug::github-actions␊
|
|
||||||
::save-state name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
::save-state name=expiresAt::2016-07-11T22:14:10Z␊
|
|
||||||
--- REQUESTS ---␊
|
|
||||||
GET /repos/actions/failed-repo/installation␊
|
|
||||||
GET /repos/actions/failed-repo/installation␊
|
|
||||||
POST /app/installations/123456/access_tokens␊
|
|
||||||
{"repositories":["failed-repo"]}`
|
|
||||||
|
|
||||||
## main-token-get-owner-set-repo-set-to-many-newline.test.js
|
|
||||||
|
|
||||||
> stderr
|
|
||||||
|
|
||||||
''
|
|
||||||
|
|
||||||
> stdout
|
|
||||||
|
|
||||||
`Inputs 'owner' and 'repositories' are set. Creating token for the following repositories:␊
|
|
||||||
␊
|
|
||||||
- actions/create-github-app-token␊
|
|
||||||
- actions/toolkit␊
|
|
||||||
- actions/checkout␊
|
|
||||||
::add-mask::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
␊
|
|
||||||
::set-output name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
␊
|
|
||||||
::set-output name=installation-id::123456␊
|
|
||||||
␊
|
|
||||||
::set-output name=app-slug::github-actions␊
|
|
||||||
::save-state name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
::save-state name=expiresAt::2016-07-11T22:14:10Z␊
|
|
||||||
--- REQUESTS ---␊
|
|
||||||
GET /repos/actions/create-github-app-token/installation␊
|
|
||||||
POST /app/installations/123456/access_tokens␊
|
|
||||||
{"repositories":["create-github-app-token","toolkit","checkout"]}`
|
|
||||||
|
|
||||||
## main-token-get-owner-set-repo-set-to-many.test.js
|
|
||||||
|
|
||||||
> stderr
|
|
||||||
|
|
||||||
''
|
|
||||||
|
|
||||||
> stdout
|
|
||||||
|
|
||||||
`Inputs 'owner' and 'repositories' are set. Creating token for the following repositories:␊
|
|
||||||
␊
|
|
||||||
- actions/create-github-app-token␊
|
|
||||||
- actions/toolkit␊
|
|
||||||
- actions/checkout␊
|
|
||||||
::add-mask::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
␊
|
|
||||||
::set-output name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
␊
|
|
||||||
::set-output name=installation-id::123456␊
|
|
||||||
␊
|
|
||||||
::set-output name=app-slug::github-actions␊
|
|
||||||
::save-state name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
::save-state name=expiresAt::2016-07-11T22:14:10Z␊
|
|
||||||
--- REQUESTS ---␊
|
|
||||||
GET /repos/actions/create-github-app-token/installation␊
|
|
||||||
POST /app/installations/123456/access_tokens␊
|
|
||||||
{"repositories":["create-github-app-token","toolkit","checkout"]}`
|
|
||||||
|
|
||||||
## main-token-get-owner-set-repo-set-to-one.test.js
|
|
||||||
|
|
||||||
> stderr
|
|
||||||
|
|
||||||
''
|
|
||||||
|
|
||||||
> stdout
|
|
||||||
|
|
||||||
`Inputs 'owner' and 'repositories' are set. Creating token for the following repositories:␊
|
|
||||||
␊
|
|
||||||
- actions/create-github-app-token␊
|
|
||||||
::add-mask::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
␊
|
|
||||||
::set-output name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
␊
|
|
||||||
::set-output name=installation-id::123456␊
|
|
||||||
␊
|
|
||||||
::set-output name=app-slug::github-actions␊
|
|
||||||
::save-state name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
::save-state name=expiresAt::2016-07-11T22:14:10Z␊
|
|
||||||
--- REQUESTS ---␊
|
|
||||||
GET /repos/actions/create-github-app-token/installation␊
|
|
||||||
POST /app/installations/123456/access_tokens␊
|
|
||||||
{"repositories":["create-github-app-token"]}`
|
|
||||||
|
|
||||||
## main-token-get-owner-set-repo-unset.test.js
|
|
||||||
|
|
||||||
> stderr
|
|
||||||
|
|
||||||
''
|
|
||||||
|
|
||||||
> stdout
|
|
||||||
|
|
||||||
`Input 'repositories' is not set. Creating token for all repositories owned by actions.␊
|
|
||||||
::add-mask::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
␊
|
|
||||||
::set-output name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
␊
|
|
||||||
::set-output name=installation-id::123456␊
|
|
||||||
␊
|
|
||||||
::set-output name=app-slug::github-actions␊
|
|
||||||
::save-state name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
::save-state name=expiresAt::2016-07-11T22:14:10Z␊
|
|
||||||
--- REQUESTS ---␊
|
|
||||||
GET /users/actions/installation␊
|
|
||||||
POST /app/installations/123456/access_tokens␊
|
|
||||||
null`
|
|
||||||
|
|
||||||
## main-token-get-owner-unset-repo-set.test.js
|
|
||||||
|
|
||||||
> stderr
|
|
||||||
|
|
||||||
''
|
|
||||||
|
|
||||||
> stdout
|
|
||||||
|
|
||||||
`No 'owner' input provided. Using default owner 'actions' to create token for the following repositories:␊
|
|
||||||
- actions/create-github-app-token␊
|
|
||||||
::add-mask::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
␊
|
|
||||||
::set-output name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
␊
|
|
||||||
::set-output name=installation-id::123456␊
|
|
||||||
␊
|
|
||||||
::set-output name=app-slug::github-actions␊
|
|
||||||
::save-state name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
::save-state name=expiresAt::2016-07-11T22:14:10Z␊
|
|
||||||
--- REQUESTS ---␊
|
|
||||||
GET /repos/actions/create-github-app-token/installation␊
|
|
||||||
POST /app/installations/123456/access_tokens␊
|
|
||||||
{"repositories":["create-github-app-token"]}`
|
|
||||||
|
|
||||||
## main-token-get-owner-unset-repo-unset.test.js
|
|
||||||
|
|
||||||
> stderr
|
|
||||||
|
|
||||||
''
|
|
||||||
|
|
||||||
> stdout
|
|
||||||
|
|
||||||
`Inputs 'owner' and 'repositories' are not set. Creating token for this repository (actions/create-github-app-token).␊
|
|
||||||
::add-mask::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
␊
|
|
||||||
::set-output name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
␊
|
|
||||||
::set-output name=installation-id::123456␊
|
|
||||||
␊
|
|
||||||
::set-output name=app-slug::github-actions␊
|
|
||||||
::save-state name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
::save-state name=expiresAt::2016-07-11T22:14:10Z␊
|
|
||||||
--- REQUESTS ---␊
|
|
||||||
GET /repos/actions/create-github-app-token/installation␊
|
|
||||||
POST /app/installations/123456/access_tokens␊
|
|
||||||
{"repositories":["create-github-app-token"]}`
|
|
||||||
|
|
||||||
## main-token-permissions-set.test.js
|
|
||||||
|
|
||||||
> stderr
|
|
||||||
|
|
||||||
''
|
|
||||||
|
|
||||||
> stdout
|
|
||||||
|
|
||||||
`Inputs 'owner' and 'repositories' are not set. Creating token for this repository (actions/create-github-app-token).␊
|
|
||||||
::add-mask::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
␊
|
|
||||||
::set-output name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
␊
|
|
||||||
::set-output name=installation-id::123456␊
|
|
||||||
␊
|
|
||||||
::set-output name=app-slug::github-actions␊
|
|
||||||
::save-state name=token::ghs_16C7e42F292c6912E7710c838347Ae178B4a␊
|
|
||||||
::save-state name=expiresAt::2016-07-11T22:14:10Z␊
|
|
||||||
--- REQUESTS ---␊
|
|
||||||
GET /repos/actions/create-github-app-token/installation␊
|
|
||||||
POST /app/installations/123456/access_tokens␊
|
|
||||||
{"repositories":["create-github-app-token"],"permissions":{"issues":"write","pull_requests":"read"}}`
|
|
||||||
|
|
||||||
## post-revoke-token-fail-response.test.js
|
|
||||||
|
|
||||||
> stderr
|
|
||||||
|
|
||||||
''
|
|
||||||
|
|
||||||
> stdout
|
|
||||||
|
|
||||||
'::warning::Token revocation failed: '
|
|
||||||
|
|
||||||
## post-token-expired.test.js
|
|
||||||
|
|
||||||
> stderr
|
|
||||||
|
|
||||||
''
|
|
||||||
|
|
||||||
> stdout
|
|
||||||
|
|
||||||
'Token expired, skipping token revocation'
|
|
||||||
|
|
||||||
## post-token-set.test.js
|
|
||||||
|
|
||||||
> stderr
|
|
||||||
|
|
||||||
''
|
|
||||||
|
|
||||||
> stdout
|
|
||||||
|
|
||||||
'Token revoked'
|
|
||||||
|
|
||||||
## post-token-skipped.test.js
|
|
||||||
|
|
||||||
> stderr
|
|
||||||
|
|
||||||
''
|
|
||||||
|
|
||||||
> stdout
|
|
||||||
|
|
||||||
'Token revocation was skipped'
|
|
||||||
|
|
||||||
## post-token-unset.test.js
|
|
||||||
|
|
||||||
> stderr
|
|
||||||
|
|
||||||
''
|
|
||||||
|
|
||||||
> stdout
|
|
||||||
|
|
||||||
'Token is not set'
|
|
||||||
Binary file not shown.
Reference in New Issue
Block a user