当前位置: 首页 > 知识库问答 >
问题:

在github操作工作流中,是否有方法让多个作业重用同一设置?

徐嘉勋
2023-03-14

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

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

但我不知道正确的方法是什么:

  1. 我应该用共享的安装代码创建我自己的Github Action吗?
  2. 我应该创建一个已经预安装了Lua和Luarocks的Docker映像吗?
  3. 我应该使用单个工作吗?如果短绒和测试套件是同一工作的步骤,我仍然可以有独立的复选标记吗?
  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

我试图搜索类似的问题,但找不到任何准确回答我问题的答案:

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

共有2个答案

屈翰飞
2023-03-14

下面的代码片段应该为您完成这项工作。您可以使用一个作业并创建多个任务,而不是创建两个作业,一个用于lint,另一个用于测试

name: Github Actions CI

on: [ pull_request ]

jobs:
    lint:
        name: Lint and 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

            - name: Install Luacheck
              run: luarocks install luacheck

            - name: Run Lint Check
            - run: ./run-linter.sh

            - name: Install Busted
              run: luarocks install busted

            - name: Build Project
              run: ./build-project.sh

            - name: Run Test Suite
            - run: ./run-test-suite.sh

罗伟兆
2023-03-14

从今天(2021年8月)开始,复合动作不再局限于run。GitHub动作:用动作合成减少重复

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

旧答案

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

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

章鱼猫/打招呼/行动。yml:

runs:
  using: "composite"
  steps: 
    - run: echo "Nice to meet you!"
      shell: pwsh

有关更多详细信息,您也可以在此处查看公司的ADR。

为什么不能对所有作业运行一次,因为每个作业可能在不同的机器上运行。

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

 类似资料:
  • 设置容器要使用的卷数组。可以使用卷在服务或作业中的其他步骤之间共享数据。可以在主机上指定命名Docker卷、匿名Docker卷或绑定挂载。 工作流程 第一个作业(build)有一个build目录,但当第二个作业(deploy)运行时,它没有,只包含源代码。 这个项目是一个mono repo,我试图部署的代码位于路径,因此所有标志。

  • 我想设置我的工作流程来执行以下操作: 在任何事件上(拉请求,在任何分支上推送) 结账码 构建项目 运行测试 为其他作业上传工件 从以前的工作下载工件 推送页面 从以前的工作下载工件 创建发行版 将工件上传到发行版 在我的中,指令适用于所有作业,因此在我的情况下不起作用。另一方面,仅在同一工作流中工作。 实现所述工作流程的正确方法是什么?

  • 我在GitHub中有一个包含多个服务的monorepo 我想在两个条件下同时构建它们(使用GitHub操作): 标记-使用标记名称构建图像() 分支main-使用带有缓存的标签构建图像。 我找不到如何创建通用工作流和修改参数(如函数)的方法。 我能想到的唯一解决方案是创建一个复合操作,如下所示: 但现在我遇到了一个问题,需要在两个工作流中指定服务的所有作业,例如: 主要分支机构工作流: 标记分支工

  • 在正常情况下,一个工作流是否会由多个工作流工作人员同时执行?因为多个工作流工作者可以投票决定任务来执行,如果没有,他该怎么做?

  • 问题内容: 我有一个名为“开发”的工作,另一个名为“代码分析”的项目。目前,我们有两个不同的作业和不同的工作区,但是代码相同。有什么办法可以将同一工作空间用于多个作业? 我检查了Jenkins中可用的插件,但是没有找到合适的插件。 问题答案: 假设您的“开发” Jenkins工作空间为。在“代码分析”作业配置页面中,在选项卡下单击并选择选项,并提供与“开发”作业相同的工作空间。

  • 今天早上,我发现了我的GitHub Actions BETA版邀请,并开始玩它,目的是迁移一些我目前在CircleCi上运行的简单构建、测试和部署管道。 我仍然在试图理解操作,但我心目中的流程是,在推动之后,工作流中的第一个操作将启动一个Docker容器。在这个容器中,我将运行一些简单的构建过程,比如最小化资产和移除人工制品。接下来的操作将在构建上运行一些测试。管道中的下一个操作将部署到许多环境中