How to send multi line string in json in GitHub actions?

I am working on GitHub actions, and I have a case where I need to send a multiline string as json. I am getting some unexpected token error.

This is my test.md and workflow:

---------------------------
  **test**
  - update something
  - another (update)
  
  **test2**
  - Add `test` to param
  
steps:
    - uses: actions/checkout@v2
    - name: Get Log
      id: getLog
      run: |
        CHANGELOG="$(cat test.md)"
        CHANGELOG="$($CHANGELOG//'%'/'%25')"
        CHANGELOG="$($CHANGELOG//$'\n'/'%0A')" 
        CHANGELOG="$($CHANGELOG//$'\r'/'%0D')"
        echo "::set-output name=changeLog::$CHANGELOG"
    - name: Invoke CLI workflow with changelog
      uses: benc-uk/workflow-dispatch@v1
      with:
        workflow: Workflow publish
        token: ${{ secrets.TOKEN }}
        repo: repo/name
        inputs: '{ "changeLog": "${{steps.getLog.outputs.changeLog}}"}'

I am getting an unexpected token error. How solve this?

Thanks in advance

Upvotes: 3

Views: 12798

Answers (1)

mkungla
mkungla

Reputation: 3558

There seem to be 2 issues you have in provided example.

  1. your string substitution seems invalid. that should be something like this.
run: |
  CHANGELOG=$(cat test.md)
  CHANGELOG="${CHANGELOG//'%'/'%25'}"
  CHANGELOG="${CHANGELOG//$'\n'/'%0A'}"
  CHANGELOG="${CHANGELOG//$'\r'/'%0D'}"
  echo "::set-output name=changeLog::$CHANGELOG"
  1. You are just composing invalid json for object.
inputs: '{ "changeLog": "${{steps.getLog.outputs.changeLog}}"}'

which outputs invalid json:

{ "changeLog": "---------------------------
  **test**
  - update something
  - another (update)
  
  **test2**
  - Add `test` to param"}

to fix this use Context function toJSON()

inputs: '{ "changeLog": ${{ toJSON(steps.getLog.outputs.changeLog) }}}'

which outputs valid json:

{ "changeLog": "---------------------------\n  **test**\n  - update something\n  - another (update)\n  \n  **test2**\n  - Add `test` to param"}

EDIT

I released small composite Set text output action to handle multi-line strings.

- uses: actions/checkout@v2
- name: test changelog
  uses: mkungla/actions-set-text-output@v1
  id: get-changekog
  with:
    text: $(cat tests/test-changelog.md)
- run: echo "${{ steps.get-changekog.outputs.value }}"

Upvotes: 9

Related Questions