英文:
Skip a GitHub Action workflow that is run on successful completion of previous workflow, when the initial trigger was a pull request containing 'WIP'
问题
背景 / 上下文
我们有两个 GitHub Action 工作流程,1. "构建、测试和打包" 和 2. "部署到 UAT"。
工作流程 (1) 是基于以下触发条件启动的:
# 在拉取请求(更改或推送)或标签(用于发布)时运行
on:
pull_request:
release:
并构建我们的软件,运行单元测试等,并打包 Docker 容器,准备在环境中运行。
然后,工作流程 (2) 在工作流程 (1) 成功完成后触发:
on:
# 当构建工作流程完成时(不一定是成功的 - 需要下面的 IF 条件)
# 注意:这总是作为来自主分支的运行
workflow_run:
workflows: ["构建、测试和打包"]
types:
- completed
# 或手动
# 注意:这总是作为来自主分支的运行
workflow_dispatch:
inputs:
PACKAGE_VERSION:
description: "PACKAGE_VERSION"
required: false
此外,这还需要在工作流程中的第一步上使用 'if' 来排除对工作流程 (1) 的 不成功 执行的运行:
if: ${{ github.event.workflow_run.conclusion == 'success' || github.event_name == 'workflow_dispatch' }}
问题
我想要做的是,在初始拉取请求中,如果包含 "WIP",则不运行部署工作流程 (2),而仍然允许我们的 CI 管道运行以验证所有拉取请求的测试,即使它们是 "WIP"。这是为了避免污染我们的 UAT 环境,除了当前指定的 'current' PR 之外的任何构建。
这是否可行?
英文:
Background / Context
We have two GitHub Action workflows 1. "Build, Test & Package" and 2. "Deploy to UAT".
Workflow (1) is triggered based on:
# runs on pull request (change or push) or tag (for release)
on:
pull_request:
release:
And builds our software, runs unit tests etc and packages up docker containers ready to be run in an environment.
Workflow (2) is then triggered on successful completion of workflow (1):
on:
# when the build workflow finished (not necessarily succeeded - that needs the IF below)
# NOTE: this *always* runs as if from the master branch
workflow_run:
workflows: ["Build, Test & Package"]
types:
- completed
# or manually
# NOTE: this *always* runs as if from the master branch
workflow_dispatch:
inputs:
PACKAGE_VERSION:
description: "PACKAGE_VERSION"
required: false
Which also needs an 'if' on the first step in the workflow to exclude running for unsuccessful executions of workflow (1).
if: ${{ github.event.workflow_run.conclusion == 'success' || github.event_name == 'workflow_dispatch' }}
Question
What I'd like to do, is EXCLUDE running the deployment workflow (2) when the initial pull request that kicks off the whole pipeline starting with (1) has "WIP" in its name somewhere.
Basically this is to avoid polluting our UAT environment with any build other than a current nominated 'current' PR, whilst still allowing our CI pipeline to run to verify tests etc for ALL pull requests even if they are 'WIP'.
Is this possible?
答案1
得分: 2
只翻译代码部分:
# 在拉取请求(更改或推送)或标签(发布)上运行
on:
pull_request:
release:
jobs:
my-job:
runs-on: ubuntu-latest
steps:
- name: 设置 WIP 变量
run: |
if [[ ${{ github.event.pull_request.title }} == *"WIP"* ]]; then
echo "拉取请求标题中包含 'WIP'"
echo "wip=true" >> $GITHUB_OUTPUT
else
echo "拉取请求标题中不包含 'WIP'"
echo "wip=false" >> $GITHUB_OUTPUT
fi
id: wip
第二个作业:
my-other-job:
needs: my-job
if: needs.my-job.outputs.wip == 'false'
runs-on: ubuntu-latest
steps:
- name: 做其他事情
run: |
echo "只有当 WIP 为 false 时才会运行此作业"
在第一和第二作业分开的工作流程中,您需要在第一步骤中使用像 "设置环境变量" 这样的操作:
- 记录您的环境变量:
echo "wip=true" > ./.github/variables/myvars.env
然后在第二步骤中,还原您记录的环境变量:
- name: 设置环境变量
uses: tw3lveparsecs/github-actions-setvars@latest
with:
envFilePath: ./.github/variables/myvars.env
英文:
Since you can get the title of a Pull Request, that means you can also set a variable (IE "set an output parameter") to 'true' in (1), your first job.
And you can use that same variable in (2), as a condition for its execution.
# runs on pull request (change or push) or tag (for release)
on:
pull_request:
release:
jobs:
my-job:
runs-on: ubuntu-latest
steps:
- name: Set WIP variable
run: |
if [[ ${{ github.event.pull_request.title }} == *"WIP"* ]]; then
echo "WIP is in the pull request title"
echo "wip=true" >> $GITHUB_OUTPUT
else
echo "WIP is not in the pull request title"
echo "wip=false" >> $GITHUB_OUTPUT
fi
id: wip
And for the second job:
my-other-job:
needs: my-job
if: needs.my-job.outputs.wip == 'false'
runs-on: ubuntu-latest
steps:
- name: Do something else
run: |
echo "This job will only run if WIP is false"
But if those two jobs are in separate workflows, you will need to use in (1) an action like "Set environment variables"
- record your environment variables:
echo "wip=true" > ./.github/variables/myvars.env
Then in (2), restore you recorded environment variables:
- name: Set Environment Variables
uses: tw3lveparsecs/github-actions-setvars@latest
with:
envFilePath: ./.github/variables/myvars.env
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论