出于(主要)教学原因,我尝试在GitHub操作中运行此工作流:
name: "We 🎔 Perl"
on:
issues:
types: [opened, edited, milestoned]
jobs:
seasonal_greetings:
runs-on: windows-latest
steps:
- name: Maybe greet
id: maybe-greet
env:
HEY: "Hey you!"
GREETING: "Merry Xmas to you too!"
BODY: ${{ github.event.issue.body }}
run: |
$output=(perl -e 'print ($ENV{BODY} =~ /Merry/)?$ENV{GREETING}:$ENV{HEY};')
Write-Output "::set-output name=GREET::$output"
produce_comment:
name: Respond to issue
runs-on: ubuntu-latest
steps:
- name: Dump job context
env:
JOB_CONTEXT: ${{ jobs.maybe-greet.steps.id }}
run: echo "$JOB_CONTEXT"
我需要两个不同的作业,因为它们使用不同的上下文(操作系统),但我需要将第一个作业中某个步骤的输出转换到第二个作业中。我尝试使用此处找到的jobs
上下文的几种组合,但似乎没有任何方法可以做到这一点。显然,jobs
只是一个YAML变量的名称,它实际上没有上下文,上下文job
只包含成功或失败。
5条答案
按热度按时间pieyvz9o1#
检查2020年4月的“GitHub Actions: New workflow features“,这可能对您的情况有所帮助(参考之前作业的步骤输出)
作业输出
您可以指定一组要传递给后续作业的输出,然后从需求上下文中访问这些值。
请参阅文档:
作业的输出Map。
作业输出可用于依赖于此作业的所有下游作业。
有关定义作业依存关系的详细信息,请参阅
jobs.<job_id>.needs
。作业输出是字符串,包含表达式的作业输出会在每个作业结束时在runner上进行计算。包含机密的输出会在runner上进行编辑,而不会发送到GitHub Actions。
若要在相依工作中使用工作输出,您可以使用
needs
内容。有关详细信息,请参阅“GitHub操作的上下文和表达式语法”。
要在依赖作业中使用作业输出,可以使用需求上下文。
范例
请注意使用
$GITHUB_OUTPUT
,而不是older::set-output
now (Oct. 2022) deprecated。为了避免不受信任的记录数据在没有工作流作者意图的情况下使用
set-state
和set-output
工作流命令,我们引入了一组新的环境文件来管理状态和输出。Jesse Adelman在注解中添加:
这似乎不适用于静态字符串以外的任何对象。
例如,我如何获取step的多行文本输出(比如,我正在运行
pytest
或类似程序),并在另一个作业中使用该输出?wfveoks02#
更新:现在可以设置作业输出,用于将字符串值传输到下游作业。请参阅此答案。
下面是最初的答案。这些技术可能对某些用例仍然有用。
1.将数据写入文件,并使用
actions/upload-artifact
和actions/download-artifact
。有点笨拙,但它工作。1.创建一个存储库调度事件,并将数据发送到第二个工作流。我个人更喜欢这种方法,但缺点是它需要一个
repo
范围的PAT。下面是第二种方法的一个例子,它使用repository-dispatch操作。
这会触发同一存储库中的存储库分派工作流。
ovfsdjhp3#
在
run
步骤中捕获一个命令的整个输出(和返回代码)* 是 * 可能的,我在这里写这个步骤是希望能让其他人省去这个麻烦。公平的警告,这需要很多shell技巧和多行run
来确保所有事情都发生在单个shell示例中。在我的例子中,我需要调用一个脚本并捕获其stdout的全部,以便在后面的步骤中使用,同时保留其结果以进行错误检查:
由于Github的作业输出似乎只能捕获一行文本,因此我 * 还 * 必须对输出中的任何换行符进行转义:
此外,我还需要最终返回脚本的 *exit代码 *,以正确指示它是否失败。
**编辑:**还有an action可以用更少的自举来实现这一点,这是我刚刚发现的。
t9aqgxwy4#
在我的例子中,我希望传递一个完整的build/工件,而不仅仅是一个字符串:
xzabzqsa5#
**2022年10月更新:**GitHub不赞成使用
set-output
,建议使用GITHUB_OUTPUT。定义输出并在其他步骤和作业中引用它们的语法。文档中的示例: