如何在GitHub Actions的作业中获取矩阵作业名称?

7

我试图为矩阵中每个失败的作业单独上传日志。每组日志都需要基于作业矩阵具有一个名称,否则它们会互相覆盖,我就无法确定产生结果工件的作业。

我尝试打印所有上下文:

name: My workflow
on:
  pull_request:
    types: [opened, synchronize]
jobs:
  my-job:
    name: OS ${{ matrix.os }}
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os:
          - ubuntu-18.04
          - ubuntu-20.04
    steps:
      - run: echo "${{ toJSON(github) }}"
      - run: echo "${{ toJSON(env) }}"
      - run: echo "${{ toJSON(job) }}"
      - run: echo "${{ toJSON(steps) }}"
      - run: echo "${{ toJSON(runner) }}"
      - run: echo "${{ toJSON(secrets) }}"
      - run: echo "${{ toJSON(strategy) }}"
      - run: echo "${{ toJSON(matrix) }}"
      - run: echo "${{ toJSON(needs) }}"
      - run: echo "${{ toJSON(inputs) }}"

这些中没有包含在运行工作流时显示的任务名称。

2个回答

5

目前无法直接从Github上下文中提取jobs.<job_id>.name

还没有(或许以后会有)一种本地化的方法可以从运行者上下文中提取job_name,只能使用${{ github.job }}来提取job_id

因此,回答您的问题(标题),使用矩阵或不使用矩阵,在没有解决方案的情况下,都不可能(但也许以后会有)实现。

注意: 您可以在这里这里找到一些关于相同问题的其他线程。


在您的情况下,由于您使用了matrix来定义作业名称,因此实际上可以通过使用环境变量在工作流程中设置作业名称,做出以下解决方案:

jobs:
  my-job:
    name: OS ${{ matrix.os }}
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os:
          - ubuntu-18.04
          - ubuntu-20.04
    steps:
      - run: echo ${{ github.job }} # Will only return the job_id: "my-job"
      - run: |
          JOB_NAME="OS ${{ matrix.os }}"
          echo $JOB_NAME
          echo "JOB_NAME=$JOB_NAME" >> $GITHUB_ENV

      - name: Print JOB_NAME
        run: |
          echo "JOB NAME:" ${{ env.JOB_NAME }}

如果您想查看,我在这里测试了它。

这样,JOB_NAME环境变量可以在任何步骤中使用(如果要将其用作日志文件名),甚至可以保存为输出以用于顺序作业。

创建日志文件时,您可以将timestamp或工作流run_id${{ github.run_id }})添加到JOB_NAME作为日志文件名,以标识上传它的工作流。


谢谢您提供详细的答案,但它并没有真正回答我的问题。我已经知道如何使用变量了;我正在尝试避免在作业本身中重复使用 jobs.*.name - l0b0
为什么这里会重复 jobs.*.name?你正在使用作业名称的矩阵,因此每个作业执行中它将始终是唯一的。如果您使用它上传日志,则对于此工作流运行它将始终是唯一的。现在,如果您想使它们在运行工作流多次时也保持唯一,那么将时间戳添加到日志文件名(以及 JOB NAME 变量)是否可以解决问题?关于答案,我说的仍然成立,您目前无法从运行器上下文中获取 job_name,只能获取 job_id。没有任何变通方法,无论是否使用矩阵都不可能。 - GuiFalourd
不妨使用工作流程 run_id (${{ github.run_id}}) 代替 timestamp,因为它对于每个运行也是唯一的。这个组合键在你的情况下会更加完美。 - GuiFalourd

2

我最近发现的一种可能的解决方法是使用矩阵表达式,而不是单独命名每个组件:

jobs:
  test:
    name: Run ${{ join(matrix.*, ' - ') }} - ${{ github.event_name }}

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