我是GitHub Actions的新手,我有2个工作-一个运行我的测试,另一个将我的项目部署到服务器上。
很显然,我希望测试可以在每个分支上运行,但是只有在将某些东西推入主控之后,才应该进行部署。
我正在努力寻找在特定分支上运行作业的方法。我知道有可能只在特定分支上运行整个工作流程,但这意味着我将拥有“测试”工作流程和“部署”工作流程。
这听起来像是一种解决方案,但是它们可以并行运行。在理想情况下,测试将首先运行,并且只有在测试成功的情况下,部署工作才能开始。使用2个单独的工作流时不是这种情况。
我将如何实现这一目标?可以在特定分支上运行职位吗?
答案 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 variables和this 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 ...