在 github 操作工作流中,有没有办法让多个作业重用相同的设置?

hug*_*omg 23 github-actions

我最近将我的项目与 github 操作连接起来以进行持续集成。我创建了两个单独的作业:第一个检查拉取请求中的代码是否被我们的 linter 接受,第二个检查代码是否通过了测试套件。我喜欢这样的两个工作在 Github 网页中显示为拉取请求的两个单独的复选标记:

在此处输入图片说明

我现在遇到的问题是工作流 YAML 文件中有一些重复的代码:前 3 个步骤,安装 Lua 和 Luarocks。不仅维护起来很烦人,而且两次运行相同的操作也会浪费 CI 分钟。有没有办法避免这种情况?这样设置代码只写在一个地方,并且只在工作流执行时运行一次

但我很困惑什么是正确的方法:

  1. 我应该使用共享设置代码创建自己的 Github Action 吗?
  2. 我应该创建一个已经预先安装了 Lua 和 Luarocks 的 Docker 镜像吗?
  3. 我应该使用单个作业吗?如果 linter 和测试套件是同一个工作的步骤,我是否仍然可以有独立的复选标记?
  4. 还有什么?

这是我的工作流程的当前 YAML 文件:

name: Github Actions CI

on: [ pull_request ]

jobs:
    lint:
        name: Lint
        runs-on: ubuntu-latest
        steps:
            - uses: actions/checkout@v2
            - uses: leafo/gh-actions-lua@v8.0.0
            - uses: leafo/gh-actions-luarocks@v4.0.0

            - run: luarocks install luacheck
            - run: ./run-linter.sh

    test:
        name: Test
        runs-on: ubuntu-latest
        steps:
            - uses: actions/checkout@v2
            - uses: leafo/gh-actions-lua@v8.0.0
            - uses: leafo/gh-actions-luarocks@v4.0.0

            - run: luarocks install busted
            - run: ./build-project.sh
            - run: ./run-test-suite.sh
Run Code Online (Sandbox Code Playgroud)

我尝试搜索类似的问题,但找不到完全回答我的问题的任何内容:

  1. 在 GitHub Actions 工作流程中缓存 APT 包:我无法使用此解决方案,因为我无法精确指定我正在使用的所有依赖项的所有版本,以便缓存它们。我也不介意工作流的单独运行是否未缓存。我更担心代码重复。
  2. Github 操作在作业之间共享工作区/工件?我不想管理上传工件到单独的服务,然后删除它们。
  3. 跨作业重用 github 操作的部分:在该问题中,作业之间的唯一区别是单个变量,因此接受的答案是使用构建矩阵。但我不认为构建矩阵在我的情况下也能正常工作,只有设置代码相同?

Car*_*nal 20

GitHub Actions 中的代码重用主要有 3 种方法:

一篇文章描述了它们的优点和缺点。

在您的情况下,如果重复的步骤位于单个工作流程中,您还可以:

  1. 将它们提取到“准备”工作
  2. 上传构建工件
  3. 将“准备”工作添加到两个工作的“需要”键
  4. 下载两个作业中的构建工件

  • 是的,但复合操作仅允许您对常见任务进行分组。每项工作仍然需要完成那些多余的常见任务。应该有一种方法可以让所有其他作业都依赖于“needs”关键字来完成 1 次设置工作 (7认同)

Krz*_*tof 19

截至今天(2021 年 8 月),复合动作不再限于run. GitHub Actions:通过动作组合减少重复

name: "Publish to Docker"
description: "Pushes built artifacts to Docker"

inputs:
  registry_username:
    description: “Username for image registry”
    required: true
  registry_password:
    description: “Password for image registry”
    required: true

runs:
  using: "composite"
  steps:
      - uses: docker/setup-buildx-action@v1

      - uses: docker/login-action@v1
        with:
          username: ${{inputs.registry_username}}
          password: ${{inputs.registry_password}}

      - uses: docker/build-push-action@v2
        with:
          context: .
          push: true
          tags: user/app:latest
Run Code Online (Sandbox Code Playgroud)

旧答案

您正在寻找的是复合操作,它可以帮助您重用已定义的一组步骤。

jobs:
    lint:
        name: Lint
        runs-on: ubuntu-latest
        steps:
            - uses: octocat/say-hello@v1

            - run: luarocks install luacheck
            - run: ./run-linter.sh

    test:
        name: Test
        runs-on: ubuntu-latest
        steps:
            - uses: octocat/say-hello@v1

            - run: luarocks install busted
            - run: ./build-project.sh
            - run: ./run-test-suite.sh
Run Code Online (Sandbox Code Playgroud)

octocat/say-hello/action.yml:

runs:
  using: "composite"
  steps: 
    - run: echo "Nice to meet you!"
      shell: pwsh
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,您还可以在此处查看 ADR 。

以及为什么你不能简单地为所有作业运行一次,因为每个作业可能在不同的机器上运行。

作业是在同一个运行器上执行的一组步骤。默认情况下,具有多个作业的工作流将并行运行这些作业。您还可以配置工作流以按顺序运行作业。例如,一个工作流可以有两个顺序作业来构建和测试代码,其中测试作业取决于构建作业的状态。如果构建作业失败,则测试作业将不会运行。

  • 这个答案具有误导性。截至目前,不可能在复合操作中使用操作,因为不支持关键字“uses”。 (2认同)

归档时间:

查看次数:

9063 次

最近记录:

4 年,2 月 前