我们能够在gitlabci上做到这一点,但在我们移动到github actions之后就不行了。如果为存储库设置了变量DEPLOY=false,我们希望跳过某些工作(如构建docker映像、部署helm chart等)。我们在许多存储库中使用通用的可重用工作流。
jobs:
dockerbuildpush:
runs-on: [self-hosted, Ubuntu-22.04]
if: env.BUILD != false
我已经尝试了${{}}语法,但它不被认为是有效的语法。似乎我可以做同样的行动,但不是工作或工作流程。工作流包含许多作业,作业包含许多操作。我可以嫉妒。不管它是什么:用于操作,而不是用于工作或工作流?!
您可以在作业和步骤级别使用If
条件检查。
sample.yml
name: Sample
on:
push:
env:
PUSH: true
jobs:
dockerbuildpush:
if: ${{ vars.DEPLOY != 'false' }}
uses: owner/repo/.github/workflows/reusable-workflow.yml@main
with:
key1: value1
key2: value2
push: ${{ env.push }}
secrets: inherit
reusable-workflow.yml
name: Sample
on:
workflow_call:
inputs:
push:
required: true
type: boolean
key1:
required: true
type: string
key2:
required: false
type: string
default: ''
secrets:
ABC:
required: true
PQR:
required: true
jobs:
buildpush:
runs-on: [self-hosted, Ubuntu-22.04]
steps:
- name: Build
run: ..
- if: ${{ inputs.build != 'false' }}
name: Push
run: ..
在sample.yml
中,dockerbuildpush
作业只会在DEPLOY
变量为true
时运行,而在reusable-workflow.yml
步骤中,push
只会在输入push
为true
时运行
在其他这种情况下,对我们来说唯一一致有效的方法就是将存储库名称添加到可重用工作流中的if条件中。
if: github.repository != 'my-org/my-repository'
如果明天我们需要从这些可重用的工作流中排除更多的repos,那么我们做
if: github.repository != 'my-org/my-repository' || 'my-org/my-repository1'
如果包含这些可重用工作流的repos数量多于要排除的repos数量,那么我们总是可以使用==
条件而不是!=
条件。这也将修改的负担转移给了开发人员,而不是应该这样做的开发人员/贡献者/维护者。如果将来有人决定从本地github迁移到离线github,或者从一个github服务器迁移到另一个github服务器,那么大多数工作流配置都在yaml中,而不是在repo中作为变量。