Passing GitHub Actions workflow step output to JavaScript

When you want your JavaScript code to access all of the data from a previous GitHub Actions workflow step.

GitHub Actions workflows allow each step to create output that is available in other steps, such as:

name: Test Steps Output
on: workflow_dispatch
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - id: release
        run: |
          echo "release_created=true" >> "$GITHUB_OUTPUT"
          echo "project_name=MyProject" >> "$GITHUB_OUTPUT"

      - run: echo ${{ steps.release.outputs.release_created }}

This outputs the release_created value from the release step in the next step. You can pass this individually into a JavaScript file by creating environment variables:

name: Test Steps Output
on: workflow_dispatch
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: Check out repo
        uses: actions/checkout@v4

      - name: Set up Node.js
        uses: actions/setup-node@v4

      - id: release
        run: |
          echo "release_created=true" >> "$GITHUB_OUTPUT"
          echo "project_name=MyProject" >> "$GITHUB_OUTPUT"

      - run: node extract.mjs
        env:
          RELEASE_CREATED: ${{ steps.release.outputs.release_created }}
          PROJECT_NAME: ${{ steps.release.outputs.project_name }}

However, that can get unwieldy if there are more than a few step outputs, and especially if you’re unsure exactly which outputs will be created.

Instead, you can use the toJSON() helper to serialize all of the step outputs into a JSON object and create one environment variable to capture it:

name: Test Steps Output
on: workflow_dispatch
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: Check out repo
        uses: actions/checkout@v4

      - name: Set up Node.js
        uses: actions/setup-node@v4

      - id: release
        run: |
          echo "release_created=true" >> "$GITHUB_OUTPUT"
          echo "project_name=MyProject" >> "$GITHUB_OUTPUT"

      - run: node extract.mjs
        env:
          RELEASE_OUTPUTS: ${{ toJSON(steps.release.outputs) }}

Now, inside of extract.mjs, you can use retrieve all of the data from the release step by parsing the RELEASE_OUTPUTS environment variable:

const releaseOutputs = JSON.parse(process.env.RELEASE_OUTPUTS || "{}");

console.log(releaseOutputs.released_created);   // true
console.log(releaseOutputs.project_name);   // MyProject

This makes it a lot easier to create JavaScript files to work in your GitHub Actions workflow.

Understanding JavaScript Promises E-book Cover

Demystify JavaScript promises with the e-book that explains not just concepts, but also real-world uses of promises.

Download the Free E-book!

The community edition of Understanding JavaScript Promises is a free download that arrives in minutes.