json 如何在Github Actions中将cURL Response值分配给变量

h6my8fg2  于 2023-10-21  发布在  Git
关注(0)|答案(1)|浏览(117)

我是YAML/CURL和Github Actions的新手,所以我试图在YML上分配一个变量,我试图从cURL生成的JSON响应中分配一个键值。我尝试通过 -o 将JSON响应放入一个文件中,并将该文件的信息分配给一个变量,但根本没有成功。也许我这样做是错的,但我只是不知道。
下面是我的一个尝试的例子:

curl -u ${{ secrets.test1 }}/token:${{ secrets.test2 }} "https://test/api/v2/blablabla/test" -o Data.json 
info="$(<Data.json).info" >> $GITHUB_OUTPUT

我也试着这样做:

info = "$(curl -u ${{ secrets.test1 }}/token:${{ secrets.test2 }} 'https://test/api/v2/blablabla/test' | jq -r 'info.blablabla')"

我不知道该怎么分配,我试过这些方法和其他一些方法,但我突然不知道该怎么做。任何解决方案对我来说都是令人满意的。谢谢你!

laawzig2

laawzig21#

你的方法有Bash问题,独立于Actions;在赋值语句中=周围不能有空格:

info=$(...)

然后,您可能会自己控制secret,但通常最好的做法是从环境中的Actions上下文设置值,然后引用环境变量:

- env:
    user: ${{ secrets.test1 }}
    pass: ${{ secrets.test2 }}
  run: |
    curl -u "$user/token:$pass" ...

这有助于防止shell注入攻击。
最后,设置多行输出参数在历史上是相当挑剔的,但现在很简单:你必须使用here-doc。文档展示了如何对环境变量执行此操作,但它对输出参数的作用相同:

{
    echo "param<<EOF"
    curl wttr.in?format=j1
    echo "EOF"
} >> "$GITHUB_OUTPUT"

这将使curl命令的输出在param输出参数中可用。
如果您不确定here-doc的内容,您可能希望将输出持久化到一个文件中,然后读取该文件,而不是传递参数(文档中的当前建议),或者您可以使用随机化参数(以前推荐):

# Generate 8 random uppercase characters
delim=$(tr -dc '[:upper:]' < /dev/urandom | head -c8)
{
    echo "param<<$delim"
    curl wttr.in?format=j1
    echo "$delim"
} >> "$GITHUB_OUTPUT"

综上所述,对于您的情况,假设JSON负载在其自己的行中不包含字符串EOF,您可以这样做:

- name: Set info output parameter
  id: setinfo
  env:
    user: ${{ secrets.test1 }}
    pass: ${{ secrets.test2 }}
  run: |
    {
        echo "info=<<EOF"
        curl -u "$user/token:$pass" 'https://test/api/v2/blablabla/test' \
            | jq -r 'info.blablabla'
        echo "EOF"
    } >> "$GITHUB_OUTPUT"

相关问题