- Notifications
You must be signed in to change notification settings - Fork0
Write workflows scripting the GitHub API in JavaScript
License
aliceUnhinged613/github-script
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
This action makes it easy to quickly write a script in your workflow thatuses the GitHub API and the workflow run context.
In order to use this action, ascript
input is provided. The value of thatinput should be the body of an asynchronous function call. The followingarguments will be provided:
github
A pre-authenticatedoctokit/rest.js clientcontext
An object containing thecontext of the workflowruncore
A reference to the@actions/core packageio
A reference to the@actions/io package
Since thescript
is just a function body, these values will already bedefined, so you don't have to (see examples below).
Seeoctokit/rest.js for the API clientdocumentation.
Note This action is still a bit of an experiment—the API may change infuture versions. 🙂
Seedevelopment.md.
The return value of the script will be in the step's outputs under the"result" key.
-uses:actions/github-script@v3id:set-resultwith:script:return "Hello!"result-encoding:string-name:Get resultrun:echo "${{steps.set-result.outputs.result}}"
See"Result encoding" for details on how the encoding ofthese outputs can be changed.
By default, the JSON-encoded return value of the function is set as the "result" in theoutput of a github-script step. For some workflows, string encoding is preferred. This option can be set using theresult-encoding
input:
-uses:actions/github-script@v3id:my-scriptwith:github-token:${{secrets.GITHUB_TOKEN}}result-encoding:stringscript:return "I will be string (not JSON) encoded!"
Note thatgithub-token
is optional in this action, and the input is therein case you need to use a non-default token.
By default, github-script will use the token provided to your workflow.
on:issues:types:[opened]jobs:comment:runs-on:ubuntu-lateststeps: -uses:actions/github-script@v3with:github-token:${{secrets.GITHUB_TOKEN}}script:| github.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, body: '👋 Thanks for reporting!' })
on:issues:types:[opened]jobs:apply-label:runs-on:ubuntu-lateststeps: -uses:actions/github-script@v3with:github-token:${{secrets.GITHUB_TOKEN}}script:| github.issues.addLabels({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, labels: ['Triage'] })
on:pull_requestjobs:welcome:runs-on:ubuntu-lateststeps: -uses:actions/github-script@v3with:github-token:${{secrets.GITHUB_TOKEN}}script:| // Get a list of all issues created by the PR opener // See: https://octokit.github.io/rest.js/#pagination const creator = context.payload.sender.login const opts = github.issues.listForRepo.endpoint.merge({ ...context.issue, creator, state: 'all' }) const issues = await github.paginate(opts) for (const issue of issues) { if (issue.number === context.issue.number) { continue } if (issue.pull_request) { return // Creator is already a contributor. } } await github.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, body: 'Welcome, new contributor!' })
You can use thegithub
object to access the Octokit API. Forinstance,github.request
on:pull_requestjobs:diff:runs-on:ubuntu-lateststeps: -uses:actions/github-script@v3with:github-token:${{secrets.GITHUB_TOKEN}}script:| const diff_url = context.payload.pull_request.diff_url const result = await github.request(diff_url) console.log(result)
(Note that this particular example only works for a public URL, where thediff URL is publicly accessible. Getting the diff for a private URL requiresusing the API.)
This will print the full diff object in the screen;result.data
willcontain the actual diff text.
If you don't want to inline your entire script that you want to run, you canuse a separate JavaScript module in your repository like so:
on:pushjobs:echo-input:runs-on:ubuntu-lateststeps: -uses:actions/checkout@v2 -uses:actions/github-script@v2with:script:| const script = require(`${process.env.GITHUB_WORKSPACE}/path/to/script.js`) console.log(script({github, context}))
Note that the script path given torequire()
must be anabsolute path in this case, hence usingGITHUB_WORKSPACE
.
And then export a function from your module:
module.exports=(github,context)=>{returncontext.payload.client_payload.value}
You can also use async functions in this manner, as long as youawait
it inthe inline script.
Note that because you can'trequire
things like the GitHub context orActions Toolkit libraries, you'll want to pass them as arguments to yourexternal function.
Additionally, you'll want to use thecheckoutaction to make sure your script file isavailable.
This action makes it easy to quickly write a script in your workflow thatuses the GitHub API and the workflow run context.
In order to use this action, ascript
input is provided. The value of thatinput should be the body of an asynchronous function call. The followingarguments will be provided:
github
A pre-authenticatedoctokit/rest.js clientcontext
An object containing thecontext of the workflowruncore
A reference to the@actions/core packageio
A reference to the@actions/io package
Since thescript
is just a function body, these values will already bedefined, so you don't have to (see examples below).
Seeoctokit/rest.js for the API clientdocumentation.
Note This action is still a bit of an experiment—the API may change infuture versions. 🙂
Seedevelopment.md.
The return value of the script will be in the step's outputs under the"result" key.
-uses:actions/github-script@v3id:set-resultwith:script:return "Hello!"result-encoding:string-name:Get resultrun:echo "${{steps.set-result.outputs.result}}"
See"Result encoding" for details on how the encoding ofthese outputs can be changed.
By default, the JSON-encoded return value of the function is set as the "result" in theoutput of a github-script step. For some workflows, string encoding is preferred. This option can be set using theresult-encoding
input:
-uses:actions/github-script@v3id:my-scriptwith:github-token:${{secrets.GITHUB_TOKEN}}result-encoding:stringscript:return "I will be string (not JSON) encoded!"
Note thatgithub-token
is optional in this action, and the input is therein case you need to use a non-default token.
By default, github-script will use the token provided to your workflow.
on:issues:types:[opened]jobs:comment:runs-on:ubuntu-lateststeps: -uses:actions/github-script@v3with:github-token:${{secrets.GITHUB_TOKEN}}script:| github.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, body: '👋 Thanks for reporting!' })
on:issues:types:[opened]jobs:apply-label:runs-on:ubuntu-lateststeps: -uses:actions/github-script@v3with:github-token:${{secrets.GITHUB_TOKEN}}script:| github.issues.addLabels({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, labels: ['Triage'] })
on:pull_requestjobs:welcome:runs-on:ubuntu-lateststeps: -uses:actions/github-script@v3with:github-token:${{secrets.GITHUB_TOKEN}}script:| // Get a list of all issues created by the PR opener // See: https://octokit.github.io/rest.js/#pagination const creator = context.payload.sender.login const opts = github.issues.listForRepo.endpoint.merge({ ...context.issue, creator, state: 'all' }) const issues = await github.paginate(opts) for (const issue of issues) { if (issue.number === context.issue.number) { continue } if (issue.pull_request) { return // Creator is already a contributor. } } await github.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, body: 'Welcome, new contributor!' })
You can use thegithub
object to access the Octokit API. Forinstance,github.request
on:pull_requestjobs:diff:runs-on:ubuntu-lateststeps: -uses:actions/github-script@v3with:github-token:${{secrets.GITHUB_TOKEN}}script:| const diff_url = context.payload.pull_request.diff_url const result = await github.request(diff_url) console.log(result)
(Note that this particular example only works for a public URL, where thediff URL is publicly accessible. Getting the diff for a private URL requiresusing the API.)
This will print the full diff object in the screen;result.data
willcontain the actual diff text.
If you don't want to inline your entire script that you want to run, you canuse a separate JavaScript module in your repository like so:
on:pushjobs:echo-input:runs-on:ubuntu-lateststeps: -uses:actions/checkout@v2 -uses:actions/github-script@v2with:script:| const script = require(`${process.env.GITHUB_WORKSPACE}/path/to/script.js`) console.log(script({github, context}))
Note that the script path given torequire()
must be anabsolute path in this case, hence usingGITHUB_WORKSPACE
.
And then export a function from your module:
module.exports=(github,context)=>{returncontext.payload.client_payload.value}
You can also use async functions in this manner, as long as youawait
it inthe inline script.
Note that because you can'trequire
things like the GitHub context orActions Toolkit libraries, you'll want to pass them as arguments to yourexternal function.
Additionally, you'll want to use thecheckoutaction to make sure your script file isavailable.
About
Write workflows scripting the GitHub API in JavaScript
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Uh oh!
There was an error while loading.Please reload this page.
Languages
- TypeScript100.0%