我们能够在 gitlabci 上执行此操作,但在我们转移到 github actions 之后就不行了。 如果为存储库设置了变量 DEPLOY=false,我们希望跳过某些作业,例如 *building docker images、部署 helm chart 等)。我们在许多存储库中使用通用的可重用工作流程。
jobs:
dockerbuildpush:
runs-on: [self-hosted, Ubuntu-22.04]
if: env.BUILD != false
我已经尝试过 ${{ }} 语法,但它不被视为有效语法。看来我可以对动作做同样的事情,但不能对工作或工作流程做同样的事情。工作流包含许多作业,作业包含许多操作。我可以在 if 中做 env.WHATEVER:用于操作而不是用于作业或工作流?!
您可以在工作和步骤级别使用
If
条件检查。
样本.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'
如果明天我们需要从此类可重用的工作流程中排除更多的回购协议,那么我们会这样做
if: github.repository != 'my-org/my-repository' || 'my-org/my-repository1'
如果包含此类可重用工作流程的回购数量多于要排除的回购数量,那么我们始终可以使用
==
条件而不是!=
条件。这也将修改的负担转移给了 devops,而不是 repo 的开发者/贡献者/维护者,这是应该的方式。如果将来决定从本地 github 迁移到非本地 github 或从一个 github 服务器迁移到另一个 github 服务器,那么大多数工作流配置都在 yaml 中,而不是 repo 中的 vars。