GeezerVisonThe World Wide Web, restored to 800 pixels of glory. | |||||||||
| Home|About|Gaming cabinet|Archives|How it works|Starter sites | |||||||||
GeezerVison is showing github.com — GitHub Script - GitHub Marketplace This action makes it easy to quickly write a script in your workflow that uses the GitHub API and the workflow run context. Thank you for your interest in this GitHub action, however, right now we are not taking contributions. We continue to focus our resources on strategic areas that help our customers be successful while making developers' lives easier. While GitHub Actions remains a key part of this vision, we are allocating resources towards other areas of Actions and are not taking contributions to this repository at this time. The GitHub public roadmap is the best place to follow along for any updates on features we’re working on and what stage they’re in. We are taking the following steps to better direct requests related to GitHub Actions, including:
We will still provide security updates for this project and fix major breaking changes during this time. You are welcome to still raise bugs in this repo. To use this action, provide an input named
Since the See octokit/rest.js for the API client documentation. Version 9 of this action upgrades to New features:
Breaking changes:
Version 8 of this action updated the runtime to Node 24 - https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions#runs-for-javascript-actions All scripts are now run with Node 24 instead of Node 20 and are affected by any breaking changes between Node 20 and 24. This requires a minimum Actions Runner version of v2.327.1 Version 7 of this action updated the runtime to Node 20 - https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions#runs-for-javascript-actions All scripts are now run with Node 20 instead of Node 16 and are affected by any breaking changes between Node 16 and 20 The Version 6 of this action updated the runtime to Node 16 - https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions#runs-for-javascript-actions All scripts are now run with Node 16 instead of Node 12 and are affected by any breaking changes between Node 12 and 16. Version 5 of this action includes the version 5 of For example,
See development.md. Actions expressions are evaluated before the It's highly recommended to not evaluate expressions directly in the To pass inputs, set - uses: actions/github-script@v9 env: TITLE: ${{ github.event.pull_request.title }} with: script: | const title = process.env.TITLE; if (title.startsWith('octocat')) { console.log("PR title starts with 'octocat'"); } else { console.error("PR title did not start with 'octocat'"); } The return value of the script will be in the step's outputs under the "result" key. - uses: actions/github-script@v9 id: set-result with: script: return "Hello!" result-encoding: string - name: Get result run: echo "${{steps.set-result.outputs.result}}" See "Result encoding" for details on how the encoding of these outputs can be changed. By default, the JSON-encoded return value of the function is set as the "result" in the
output of a github-script step. For some workflows, string encoding is preferred. This option can be set using the
- uses: actions/github-script@v9 id: my-script with: result-encoding: string script: return "I will be string (not JSON) encoded!" By default, requests made with the - uses: actions/github-script@v9 id: my-script with: result-encoding: string retries: 3 script: | github.rest.issues.get({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, }) In this example, request failures from You can also configure which status codes should be exempt from retries via the - uses: actions/github-script@v9 id: my-script with: result-encoding: string retries: 3 retry-exempt-status-codes: 400,401 script: | github.rest.issues.get({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, }) By default, the following status codes will not be retried: These retries are implemented using the octokit/plugin-retry.js plugin. The retries use exponential backoff to space out retries. (source) Note that By default, github-script will use the token provided to your workflow. - name: View context attributes uses: actions/github-script@v9 with: script: console.log(context) on: issues: types: [opened] jobs: comment: runs-on: ubuntu-latest steps: - uses: actions/github-script@v9 with: script: | github.rest.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-latest steps: - uses: actions/github-script@v9 with: script: | github.rest.issues.addLabels({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, labels: ['Triage'] }) You can format text in comments using the same Markdown syntax as the GitHub web interface: on: pull_request_target jobs: welcome: runs-on: ubuntu-latest steps: - uses: actions/github-script@v9 with: 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.rest.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.rest.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, body: `**Welcome**, new contributor! Please make sure you've read our [contributing guide](CONTRIBUTING.md) and we look forward to reviewing your Pull request shortly ✨` }) You can use the on: pull_request jobs: diff: runs-on: ubuntu-latest steps: - uses: actions/github-script@v9 with: 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 the diff URL is publicly accessible. Getting the diff for a private URL requires using the API.) This will print the full diff object in the screen; You can use the jobs: list-issues: runs-on: ubuntu-latest steps: - uses: actions/github-script@v9 with: script: | const query = `query($owner:String!, $name:String!, $label:String!) { repository(owner:$owner, name:$name){ issues(first:100, labels: [$label]) { nodes { id } } } }`; const variables = { owner: context.repo.owner, name: context.repo.repo, label: 'wontfix' } const result = await github.graphql(query, variables) console.log(result) If you don't want to inline your entire script that you want to run, you can use a separate JavaScript module in your repository like so: on: push jobs: echo-input: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/github-script@v9 with: script: | const script = require('./path/to/script.js') console.log(script({github, context})) And then export a function from your module: module.exports = ({github, context}) => { return context.payload.client_payload.value } Note that because you can't Additionally, you'll want to use the checkout action to make sure your script file is available. You can also use async functions in this manner, as long as you In your workflow: on: push jobs: echo-input: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/github-script@v9 env: SHA: '${{env.parentSHA}}' with: script: | const script = require('./path/to/script.js') await script({github, context, core}) And then export an async function from your module: module.exports = async ({github, context, core}) => { const {SHA} = process.env const commit = await github.rest.repos.getCommit({ owner: context.repo.owner, repo: context.repo.repo, ref: `${SHA}` }) core.exportVariable('author', commit.data.commit.author.email) } Like importing your own files above, you can also use installed modules.
Note that this is achieved with a wrapper on top on: push jobs: echo-input: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: '20.x' - run: npm ci # or one-off: - run: npm install execa - uses: actions/github-script@v9 with: script: | const execa = require('execa') const { stdout } = await execa('echo', ['hello', 'world']) console.log(stdout) To import an ESM file, you'll need to reference your script by an absolute path and ensure you have a For a script in your repository export default function printStuff() { console.log('stuff') } on: push jobs: print-stuff: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/github-script@v9 with: script: | const { default: printStuff } = await import('${{ github.workspace }}/src/print-stuff.js') await printStuff() If you want type support for your scripts, you could use the command below to install the
$ npm i -D @actions/github-script@github:actions/github-script And then add the // @ts-check /** @param {import('@actions/github-script').AsyncFunctionArguments} AsyncFunctionArguments */ export default async ({core, context}) => { core.debug('Running something at the moment') return context.actor } The If you need access to a different repository or an API that the Learn more about creating and using encrypted secrets The getOctokit(token) getOctokit(token, opts) Parameters:
The returned client is fully configured with the same plugins as Option merging behavior:
- uses: actions/github-script@v9 env: APP_TOKEN: ${{ secrets.MY_APP_TOKEN }} with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | // `github` uses GITHUB_TOKEN (scoped to this repo) await github.rest.issues.addLabels({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, labels: ['triage'] }) // `getOctokit` creates a second client with a different token const appOctokit = getOctokit(process.env.APP_TOKEN) await appOctokit.rest.repos.createDispatchEvent({ owner: 'my-org', repo: 'another-repo', event_type: 'trigger-deploy' }) - uses: actions/github-script@v9 env: ORG_A_TOKEN: ${{ secrets.ORG_A_PAT }} ORG_B_TOKEN: ${{ secrets.ORG_B_PAT }} with: script: | const orgA = getOctokit(process.env.ORG_A_TOKEN) const orgB = getOctokit(process.env.ORG_B_TOKEN) const [repoA, repoB] = await Promise.all([ orgA.rest.repos.get({ owner: 'org-a', repo: 'service' }), orgB.rest.repos.get({ owner: 'org-b', repo: 'service' }) ]) console.log(`Org A: ${repoA.data.full_name}`) console.log(`Org B: ${repoB.data.full_name}`) - uses: actions/github-script@v9 env: GHES_TOKEN: ${{ secrets.GHES_PAT }} with: script: | const ghes = getOctokit(process.env.GHES_TOKEN, { baseUrl: 'https://github.example.com/api/v3' }) const { data } = await ghes.rest.repos.listForOrg({ org: 'internal' }) console.log(`Found ${data.length} repos on GHES`) The provided @actions/exec package allows to execute command or tools in a cross platform way: on: push jobs: use-exec: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/github-script@v9 with: script: | const exitCode = await exec.exec('echo', ['hello']) console.log(exitCode)
on: push jobs: use-get-exec-output: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/github-script@v9 with: script: | const { exitCode, stdout, stderr } = await exec.getExecOutput('echo', ['hello']); console.log(exitCode, stdout, stderr) VerifiedTags1 (1) | |||||||||
| You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |