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

仅在具有GitHub操作的特定分支上运行作业

巫马化
2023-03-14

我对GitHub Actions比较陌生,我有两个工作——一个是运行我的测试,另一个是将我的项目部署到服务器上。

显然,我希望测试在每个分支上运行,但是部署应该只在某个东西被推送到主控时发生。

我正在努力寻找在特定分支机构工作的方法。我知道只在特定分支上运行整个工作流是可能的,但是这意味着我将有一个“测试”工作流和一个“部署”工作流。

这听起来像是一个解决方案,但它们可以并行运行。在理想情况下,测试将首先运行,并且只有测试成功,部署作业才会启动。使用两个单独的工作流时,情况并非如此。

我怎样才能做到这一点?是否可以在特定分支上运行作业?

共有3个答案

水恩
2023-03-14

大多数答案为一个分支提供了解决方案。要限制作业在任何特定的分支集上运行,可以使用带有多个析取(|运算符if条件来执行;但这太冗长了,不尊重枯燥的原则。

同样可以使用包含函数以较少的重复进行归档。

使用包含

contains('
  refs/heads/dev
  refs/heads/staging
  refs/heads/production
', github.ref)

与使用多个|相比:

github.ref == 'refs/heads/dev' || github.ref == 'refs/heads/staging' || github.ref == 'refs/heads/production' || …

完整的例子:

---
on: push
jobs:
  test:
    name: Test
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Run tests
      run: …

  deployment:
    name: Deployment
    runs-on: ubuntu-latest
    needs: [test]
    if:
      contains('
        refs/heads/dev
        refs/heads/staging
        refs/heads/production
      ', github.ref)
    steps:
    - uses: actions/checkout@v2
    - name: Deploy
      run: …

包德业
2023-03-14

下面是我为应该只在特定分支上运行的步骤所做的工作。

- name: Publish Image
  # Develop branch only
  if: github.ref == 'refs/heads/develop'
  run: |
    ... publish commands ...
扈翰
2023-03-14

在最近的更新中,您现在可以将if条件置于job级别。请参阅此处的文档。https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idif

我测试了这个工作流,它在每次推送时运行作业test,但只在主分支上运行deploy

name: my workflow
on: push
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: Execute tests
        run: exit 0
  deploy:
    runs-on: ubuntu-latest
    needs: test
    if: github.ref == 'refs/heads/master'
    steps:
      - name: Deploy app
        run: exit 0

下面是我的原始答案,如果您希望有单独的工作流程,还有一个替代解决方案

第一个工作流针对每个分支运行,但主分支除外。在此工作流中,您仅运行测试。

on:
  push:
    branches:
      - '*'
      - '!master'

第二个工作流只运行master,如果测试成功通过,则运行测试和部署。

on:
  push:
    branches:
      - master

 类似资料:
  • 我有以下GitHub操作的文件(删除了一些代码,以便更容易理解这个问题): 我经历了以下步骤: 在分支上进行一些提交,并推动这些更改 我期望GitHub Actions在第2项之后运行测试和部署阶段作业。但是相反,它只是再次运行,而没有运行。 如上所述,即使在推送到之后,它仍然在分支上运行,而不是在分支上运行。我有点假设这可能是由于一些奇怪的行为与快进合并。但是GitHub显然意识到我推动了,因为

  • 我已经在GitHub Actions上工作了很长一段时间,我们有一个指定的工作流程。工作流程是用yaml编写的。 我试图为设置一些条件,并且在运行中跳过yaml的块。这意味着——如果针对X分支提出拉取请求——该代码块应该运行。 像这样的东西: 有人能帮我解决这个问题吗?

  • 我已经在GitHub操作中设置了一个工作流来运行我的测试并创建测试覆盖的工件。我的YAML文件的精简版本如下所示: 问题是当测试失败时,工件不会被创建。 我从文档中找到了关于的条件,但这也会导致在我的步骤失败时运行此步骤。我不希望发生这种情况,因为在这种情况下没有什么可归档的。 如果上一步已经运行(成功或失败),我如何才能运行此步骤?

  • $ git branch 添加-a选项,就可以显示包括远端分支在内的分支清单。 创建分支 $ git branch <branchname> 高级篇 【教程1 操作分支】 1. 建立分支 修改分支的名称 $ git branch -m <oldbranch> <newbranch> 删除分支 $ git branch -d <branchname> 若有未合并到HEAD的提交,则不能删除分支。如果

  • 我正在使用新的GitHub操作,下面的工作流的想法是当pr打开或同步时运行,它应该首先检查并安装依赖项,然后运行几个纱线脚本 目前它成功地进入了结帐阶段,但是一旦安装作业运行,我就会出现以下错误 错误:找不到包。“/home/runner/work/myRepo/myRepo”中的json文件 从这个结帐失败或者我在一个错误的文件夹中判断?

  • 我正在使用一个无线电组件,当选择一个项目时,我想在该组件上执行对支持bean的操作(不是导航到结果页面,而是执行一些操作,然后通过Ajax更新当前页面)。问题是我无法让支持bean值更改侦听器操作执行 还有背豆法... 代码中是否有我遗漏的错误?我使用了相同的结构来选择多个复选框,这是有效的。。。