这个问题已经出现过很多次,但(在我看来)从未得到可靠的答案,因此我发布此问答希望可以帮助人们解决问题。
问题:
- 从 API 触发作业(而非管道/工作流)
- 在 api v1 中很简单,当您将配置从 2.0 升级到 2.1 时,它会停止工作。 UPD:我相信情况已经不再是这样了。
- 没有人真正指出一种模式或如何使其发挥作用,circleci 通常评论说“这是可能的”,引用此页面:https://circleci.com/docs/2.0/pipeline-variables/#pipeline-parameters-in-configuration (在我看来)这远非直截了当的答案。
- 还有一篇博客文章,但我只是认为它过于简单,至少没有帮助我弄清楚如何在真正的 config.yml 中使用 10 个作业和几乎同样多的工作流程。 https://support.circleci.com/hc/en-us/articles/360041503393-A-workaround-to-trigger-a-single-job-with-2-1-config
最佳答案
解决方案:
这实际上更像是一种解决方法,但它可以变得非常顺利,而不会完全膨胀您的 config.yml。
高级步骤:
- 添加用于停止默认工作流程的参数(您不需要停止计划的工作流程!)
- 为您想要 api 触发的每个作业添加一个工作流程(不用担心,每个作业只有 1 行)
- 为每个作业添加自定义参数(同样,每个作业一行)
- (可选)添加作业始终需要的一些通用或自定义参数(对于也应作为默认工作流程一部分运行的作业实际上不起作用,但对于仅通过 API 触发的作业来说没问题)
范围:
- 无需参数即可工作
- 可以与通用参数(或有限数量的特定参数)一起使用
- 如果您需要使用参数调用作业,但也可以从上一个作业获取数据,则此解决方案实际上不起作用。对于这种更动态的使用,请参阅这个更麻烦的解决方法:What are CircleCi pipelines? Can they be used to trigger job with parameters?
“深入”解决方案,又称代码:
... 测试工作: # 您的测试作业规范
workflows:
version: 2
default-workflow:
unless: << pipeline.parameters.workflow-ondemand >> # set this to false when api-triggering
#You default workflow contd.
# Any amount of scheduled workflows, no changes neeeded
# Oneliner workflow per job
test-job-workflow: {when: << pipeline.parameters.test-job-trigger >>, jobs: [ test-job ]}
# rest of your job workflows
parameters:
# parameter to turn off "default workflow" should always be set to true when triggering a job via API.
workflow-ondemand: {type: boolean, default: false}
# Generic parameters, can be used by jobs needing parameters via API. Example of setting job env var from param1 (not tested):
# environment:
# - MY_ENV_VAR: << pipeline.parameters.param1 >>
param1: {type: string, default: ""}
param2: {type: string, default: ""}
param3: {type: string, default: ""}
param4: {type: string, default: ""}
param5: {type: string, default: ""}
# Build parameters, one per job that is api-triggerable
test-job-trigger: {type: boolean, default: false}
# more triggers here
这就是您所需要的。您可以通过 api 触发,例如:
curl -u ${CIRCLE_API_USER_TOKEN}: -X POST --header "Content-Type: application/json" -d '{
"branch": "DEV-6473",
"parameters": {
"workflow-ondemand": true,
"test-job-trigger": true
}
}' https://circleci.com/api/v2/project/gh/${org}/${repo}/pipeline
关于continuous-integration - 如何使用 2.1 配置和管道通过 API 触发 Circleci 作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60890624/