在Github操作中读取JSON文件

pvcm50d1  于 2023-03-09  发布在  Git
关注(0)|答案(9)|浏览(351)

我想读取JSON文件并使用Github Actions YAML文件中字符串形式的属性。我该怎么做?(我需要package.json的版本)

ds97pgxw

ds97pgxw1#

使用内置的fromJson(value)(参见此处:https://docs.github.com/en/actions/learn-github-actions/expressions#fromjson)
阅读一个文件取决于你使用的shell。下面是一个sh的例子:

name: Test linux job
on:
  push

jobs:
  testJob:
    name: Test
    runs-on: ubuntu-latest
    steps:
      - id: set_var
        run: |
          content=`cat ./path/to/package.json`
          # the following lines are only required for multi line json
          content="${content//'%'/'%25'}"
          content="${content//$'\n'/'%0A'}"
          content="${content//$'\r'/'%0D'}"
          # end of optional handling for multi line json
          echo "::set-output name=packageJson::$content"
      - run: |
          echo "${{fromJson(steps.set_var.outputs.packageJson).version}}"

按照https://github.community/t5/GitHub-Actions/set-output-Truncates-Multiline-Strings/td-p/37870处理多行JSON
关于set-env/set-output多行处理的GitHub问题:https://github.com/actions/toolkit/issues/403

lnxxn5zx

lnxxn5zx2#

以下是Official GHA Docs示例的一个版本,其中包括两处更改:
1.从文件加载json(./your.json
1.删除换行符(源代码)
1.使用fromJson分析输出并设置矩阵变量。

name: build
on: push
jobs:
  job1:
    runs-on: ubuntu-latest
    outputs:
      matrix: ${{ steps.set-matrix.outputs.matrix }}
    steps:
    - id: set-matrix
      run: |
        JSON=$(cat ./your.json)
        echo "::set-output name=matrix::${JSON//'%'/'%25'}"

  job2:
    needs: job1
    runs-on: ubuntu-latest
    strategy:
      matrix: ${{fromJson(needs.job1.outputs.matrix)}}
    steps:
    - run: build
j8yoct9x

j8yoct9x3#

使用多行环境变量:

- run: |
    echo 'PACKAGE_JSON<<EOF' >> $GITHUB_ENV
    cat ./package.json >> $GITHUB_ENV
    echo 'EOF' >> $GITHUB_ENV
- run: |
    echo '${{ fromJson(env.PACKAGE_JSON).version }}'

这样就避免了任何需要逃逸的情况。

kjthegm6

kjthegm64#

on: [push, pull_request] 
name: Build
jobs:
  build:
    name: Example
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with: 
          path: './'      
      - run: |
          echo "`jq '.base_config[0].value="Alpha-21"' config.json `" > config.json
          echo "`jq '.base_config[1].value="1.2.14"' config.json`" > config.json
          echo "`jq '.base_config[2].value="29/12/2020"' config.json `" > config.json
     
      - uses: EndBug/add-and-commit@v6
        with:
          message: 'Add the version and date'
          add: '*.json --force'
          cwd: './' 
          token: ${{ secrets.TOKEN }}
flvtvl50

flvtvl505#

灵感来自于@dastrobu which adds key/val to $GITHUB_ENV的回答,并使用jq将package.json转换/缩小为一行:

- run: echo "PACKAGE_JSON=$(jq -c . < package.json)" >> $GITHUB_ENV
- run: echo '${{ fromJson(env.PACKAGE_JSON).version }}'
nom7f22z

nom7f22z6#

我曾经用它从JSON数据中获取值。希望这能有所帮助

- name: fetch the json value
    run: |
         githubjson=`cat $GITHUB_EVENT_PATH`
         echo $githubjson
         number=`echo $(jq -r '.number' <<< "$githubjson")`
         PRTitle=`echo $(jq -r '.pull_request.title' <<< "$githubjson")`
         PRUrl=`echo $(jq -r '.pull_request.html_url' <<< "$githubjson")`
         PRBody=`echo $(jq -r '.pull_request.body' <<< "$githubjson")`
vltsax25

vltsax257#

使用Powershell:

- name: Read json
  id: read-json
  shell: pwsh
  run: |
    $json = Get-Content yourfile.json | ConvertFrom-Json
    echo "::set-output name=prop::$(echo $json.prop)"

- run: echo ${{ steps.read-json.outputs.prop}}
xsuvu9jc

xsuvu9jc8#

您可以很容易地使用Script操作来实现这一点。

- name: "Read JSON"
        uses: actions/github-script@v6
        id: check-env
        with:
          result-encoding: string
          script: |
            try {
              const fs = require('fs')
              const jsonString = fs.readFileSync('./dir/file.json')
              var apps = JSON.parse(jsonString)
            } catch(err) {
              core.error("Error while reading or parsing the JSON")
              core.setFailed(err)
            }
piok6c0g

piok6c0g9#

set-output和save-state现在已弃用。自2023年6月1日起,通过stdout使用save-state或set-output命令的工作流将失败,并显示错误。Read

相关问题