Github-Action-Day15:在 Steps 之间共享数据

这是我的 Github Action Advent Calendar 的第十五天的内容,如果您想要了解更多已经发布的 tips 信息,查看此处的 索引

在 Github Action 的一个 job 中,你可以拥有多个 step ,一个接一个的运行。每个 step 都可以唤起一个 action — 如 获取您仓库中的代码安装一个特定的 Node.js 版本 — 或者它可以仅仅只是一个 run step,仅仅运行您提供的脚本。

但是您通常希望与您之前运行的 step 进行交互 — 例如,您可能想要运行一个更新您的软件版本号的 step,为发布这个软件做好准备。然后,您可能希望在实际的发布 step 中使用这个版本号。

然而,您如何来回获取这个数据呢?Github Action 运行每个 step 都在它们自己的进程中运行。这意味着您不能直接在一个 step 中设置一个环境变量,然后在另一个 step 中引用这个环境变量。换句话说,这样做是行不通的。

steps:
# This will NOT work. These two `run` steps are written
# as different scripts and run by different shells, so
# the `FOO` variable will NOT persist between them.
# 这个方式行不通。这两个 `run` 会被写入
# 不同的脚本中,而且运行在不同的shell环境下,所以
# `FOO` 变量不会在它们之间持续存在。
- run: export FOO=bar
- run: echo $FOO

但是,Github Action 确实给了您在执行环境内部持久化数据的工具。您可以通过编写一个标准的输出流 (即, 直接使用 echo 命令) 向 Github Action 写入命令 — 包括一个命令来指示 Github Action 在接下来的 run step 中设置环境变量。

在当前的 shell 中设置环境变量之后,您可以向 Github Action 使用 set-env 命令,促使该环境变量注入后续的 steps 中。

Translate Note:

根据最新的更新:GitHub Actions: Deprecating set-env and add-path commands | GitHub Changelog

set-env 命令已被废弃,为了保证文章正确性,下面的内容在原文上有一定的修改。

下面是一个 如何设置共享环境变量的例子,通过将 echo 命令中 一定格式的内容 重定向到 $GITHUB_ENV 中,对应的环境变量就设置成功了:

现在我可以在我后续的 steps 中真正地获取到在 FOO 中的环境变量值。

image-20210829164559774

更多的使用细节请查看官方文档:GitHub Actions 的工作流程命令 - GitHub Docs

Github Action 将这些 steps 作为单独的脚本运行 — 这意味着在单独的 shell 中运行,并且每次都获取到一个原始的环境变量。但是使用在 Github Action 平台中的开发工具,您可以在多个 shell 调用器中共享数据。

Translate Note:

每个 step 都在一个单独的 shell 中运行,这样每个 step 都只会加载最原始的环境变量,运行在一个封闭的环境中。

而使用 set-euv 可以将一个step中的数据注入到其余的step运行的 shell 中,相当于共享数据。