如何在GitHub Actions中对多行值进行掩码处理?

5

动作:

- id: sets-a-secret
  run: |
    local_secret=$(doppler secrets get GAR_JSON_KEY --plain)
    echo "::add-mask::$local_secret"
    echo "::set-output name=my-secret::$local_secret"
  env:
    DOPPLER_TOKEN: ${{ secrets.DOPPLER_TOKEN }}

local_secret 的值为:

{
  "type": "service_account",
  "project_id": "contrawork"
}

在GitHub中,只有值的第一行被隐藏在日志中:

##[debug]/usr/bin/bash -e /var/actions-runner/_runners/1/_work/_temp/10dcce73-cb22-43d9-853d-6c9674f6895e.sh
::add-mask::***
  "type": "service_account",
  "project_id": "contrawork"
}
::set-output name=my-secret::***
##[debug]steps['sets-a-secret']['outputs']['my-secret']='***'
  "type": "service_account",
  "project_id": "contrawork"
}
##[debug]Finishing: Run local_secret=$(doppler secrets get GAR_JSON_KEY --plain)

如何正确使用add-mask以避免在输出中暴露多行值?

3个回答

1
你可以通过对每行进行掩码处理来实现这一点。
以下是一个示例:
name: Multiline variables

on:
  push:
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
        
      - name: Set multiline env variable
        run: |
          echo 'MULTI<<EOF' >> $GITHUB_ENV
          echo -e "Test\nstring" >> $GITHUB_ENV
          echo 'EOF' >> $GITHUB_ENV

      - name: Mask multiline env
        run: |
         while read -r line;
         do
           echo "::add-mask::${line}"
         done <<< "${{ env.MULTI }}"
        
      - name: Print multiline secret
        run: echo -e "${{ env.MULTI }}"

但你的MULTI将在“mask…”作业的日志中可用。 - MeGaPk

1
还有一种方法可以用一行代码来完成,使用sed命令:
echo $local_secret | sed 's/^ */::add-mask::/'

解释:
sed读取$local_secret的内容,并对每一行应用sed命令s/^ */::add-mask::/。
s/:表示替换命令 /^ */:匹配行的开头(^),后跟零个或多个空格字符 /::add-mask::/:指定要替换的字符串
也就是说,它只是在每一行的开头添加::add-mask::语句,然后将其输出,从而对其进行掩码处理。
如果掩码行的开头有空格,那么去除掩码行开头的空格也是为了掩码密钥,以防止在某个地方不应该有空格的情况下出现。例如,在for循环中很容易发生这种情况。
GitHub的掩码机制似乎已经处理了这个问题,但是如果他们改变了行为,我仍然会选择这个解决方案。

1

一个避免掩盖每一行的替代方法是模拟actions/toolkit setSecret 命令 的行为

使用这个Perl命令也可以实现相同的效果(确保您的环境已安装Perl):

perl -pe 's/%/%25/g;s/\n/%0A/g;s/\r/%0D/g'

这实质上是对输入进行url-encoding的子集操作。

示例:

- id: sets-a-secret
  run: |
    local_secret=$(doppler secrets get GAR_JSON_KEY --plain)
    echo "::add-mask::$local_secret" | perl -pe 's/%/%25/g;s/\n/%0A/g;s/\r/%0D/g'

    delim="$(head -c7 /dev/urandom | base64)"
    echo "my-secret<<$delim\n$local_secret\n$delim"
  env:
    DOPPLER_TOKEN: ${{ secrets.DOPPLER_TOKEN }}

现在你的输出应该被正确地屏蔽了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接