仅使用GitHub Actions在特定分支上运行作业

时间:2019-09-27 17:56:54

标签: github github-actions

我是GitHub Actions的新手,我有2个工作-一个运行我的测试,另一个将我的项目部署到服务器上。

很显然,我希望测试可以在每个分支上运行,但是只有在将某些东西推入主控之后,才应该进行部署。

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

这听起来像是一种解决方案,但是它们可以并行运行。在理想情况下,测试将首先运行,并且只有在测试成功的情况下,部署工作才能开始。使用2个单独的工作流时不是这种情况。

我将如何实现这一目标?可以在特定分支上运行职位吗?

4 个答案:

答案 0 :(得分:11)

大多数答案提供了一个分支的解决方案。要限制作业在一组特定的分支上运行,可以使用带有多个||运算符的if条件来执行此操作,但这太冗长且不尊重DRY principle 。使用contains函数可以以较少的重复次数来存档相同的文件。

使用多个||

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

使用contains

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

完整示例:

---
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/staging
        refs/heads/production
      ', github.ref)
    steps:
    - uses: actions/checkout@v2
    - name: Deploy
      run: …

答案 1 :(得分:9)

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

我测试了此工作流程,该工作流程在每次推送时都运行作业test,但仅在master分支上运行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

下面是我的原始答案,如果您希望拥有单独的工作流程,还可以使用另一种解决方案。

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

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

第二个工作流程仅运行master,并在测试成功通过的同时运行您的测试和部署。

on:
  push:
    branches:
      - master

答案 2 :(得分:0)

虽然此时您不能具有处于 job 级别的条件,但是可以具有处于 step 级别的条件-请参见Contexts and expression syntax for GitHub Actions

要获取分支名称,当前的解决方案是检查GITHUB_REF环境变量-有关详细信息,请参见Default environment variablesthis question

将所有内容放在一起-如果您决定在上一个链接中接受已接受的答案,则您的工作流程可能如下所示:

jobs:

 test:
  runs-on: ubuntu-latest
  steps:
  - name: Run tests
    run: ./my-tests.sh

 deploy:
  runs-on: ubuntu-latest
  needs: test
  steps:
  - name: Extract branch name
    shell: bash
    run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF##*/})"
    id: extract_branch
  - name: Deploy
    run: ./deploy.sh
    if: steps.extract_branch.outputs.branch == 'master'

如果您希望将所有内容保留在工作流文件中,而不要使用单独的脚本,则可以随时将if添加到给定作业的每个步骤中。


我希望这只是一个临时解决方案/解决方法,并且在测试版结束之前会添加工作条件。

答案 3 :(得分:0)

这是我只应在特定分支上运行的步骤所要做的事情。

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