GitHub Actions 检测密钥是否存在。

5
在我的GitHub操作中,我想在尝试使用秘密之前测试其是否存在,以便向用户提供更详细的错误消息。我目前的策略是在操作开始时添加以下步骤:
- name: check if MY_SECRET exists
  run: if [ `echo ${{secrets.MY_SECRET}} | wc -c` -lt 2 ]; then echo the secret \"MY_SECRET\" has not been made; echo please go to \"settings \> secrets \> actions\" to create it; exit 1; fi

这种错误处理方式比没有任何错误处理要好一些,因为它会停止操作并给用户提供一些有用的建议。但是我想知道是否有更好的解决方案。特别是,GitHub是否推荐如何处理这种情况?例如,是否可以调用市场上的其他操作?(我已经检查了市场,但找不到任何可行的解决方案,但可能我错过了什么。)

在我看来,这似乎是一个我可能经常需要重用的功能,因此假设没有市场或内置的解决方案,我打算制作自己的操作,以便我可以调用来完成这项工作。我注意到市场上的许多操作都是使用 Node 实现的。这是否被认为比 Bash 更可取?是否有任何理由不应该在 Bash 中实现这个功能?

最后,由于我正在处理机密信息,请考虑安全性。请在提出任何解决方案时牢记这一点。同时,请对我的当前解决方案进行安全性评估。

1个回答

9
在 "在工作流程中使用加密密钥 " 中提到:

命令行进程可能会被其他用户(使用 ps 命令)看到或被 安全审计事件 捕获。
为了保护密钥,请考虑使用环境变量、STDIN 或目标进程支持的其他机制。

以及:

密钥不能直接在 if: 条件语句 中引用。

相反,考虑将密钥设置为作业级别的环境变量,然后引用这些环境变量来 有条件地运行作业中的步骤。

在您的情况下:

steps:
      - name: "check is MY_SECRET exists"
        env: 
            super_secret: ${{ secrets.MY_SECRET }}
        if: ${{ env.super_secret == '' }}
        run: 'echo "echo the secret \"MY_SECRET\" has not been made; echo please go to \"settings \> secrets \> actions\" to create it"

你能详细说明为什么这是对我当前解决方案的改进吗?它更安全吗?如果是,为什么?还有其他的好处吗?谢谢。 - Mathew
@Mathew,详细说明已在第一节完成。避免运行命令行,使用文档建议的环境变量。 - VonC
@Mathew 在我的情况下,它不会回显密钥本身,只会基于 if env 条件的消息。 - VonC
好的。感谢澄清。另外,我认为你在第5行想要使用env.super_secret。此外,你建议将这段代码重构为可以调用的动作,还是保持原样? - Mathew
谢谢你关于重构的建议。这解决了我所有的疑虑,所以我现在接受这个答案。我尝试了你的代码,使用 env.MY_SECRET 时它没有正确工作,但是当我使用 env.super_secret 像我建议的那样时它可以工作。对我来说这很有道理,因为 super_secretenv 中,而 MY_SECRETsecrets 中。不过也许我犯了一个错误。无论如何,非常感谢你的时间,我非常感激。 - Mathew
显示剩余2条评论

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