GitLab CI:如何用缓存触发前阶段生成的YAML子流水线?
问题解决与配置修正
错误原因
GitLab CI中,trigger是用于定义触发子流水线的特殊Job,这类Job不能包含script、cache等普通Job的配置项,否则会抛出jobs:child-pipeline config contains unknown keys: trigger错误。另外,跨Job传递生成的YAML文件应该用artifacts而非cache——cache是用于同一Job重复执行时复用数据的,可靠性和跨Job传递能力远不如artifacts。
修正后的完整配置
variables: yamlPath: '' stages: - generate - trigger-child generateyaml: stage: generate image: name: amazon/aws-cli entrypoint: [''] before_script: - yum -y install zip jq git script: - echo $CI_COMMIT_MESSAGE - cp deployment_scripts/deploy.sh . - rm -rf deployment_scripts - bash deploy.sh - # 生成所有YAML文件路径列表(排除主配置文件) - yamlPath=$(find . -name "*.yml" ! -name ".gitlab-ci.yml" | xargs echo | sed 's/ /,/g') - echo "Generated YAML files: $yamlPath" # 通过artifacts传递生成的YAML到后续Job artifacts: paths: - '*.yml' when: always child-pipeline: stage: trigger-child # 依赖generateyaml Job完成,确保能获取到生成的YAML文件 needs: [generateyaml] trigger: # 触发当前目录下所有非主配置的YAML文件 include: - local: '*.yml' # 如果YAML文件在子目录,可添加以下规则匹配所有子目录 # - local: '**/*.yml'
关键改动说明
- 恢复阶段定义:明确
generate(生成YAML)和trigger-child(触发子流水线)的执行顺序,保证依赖关系。 - 替换cache为artifacts:
generateyamlJob用artifacts传递生成的YAML文件,这是GitLab CI跨Job传递产物的标准方式。 - 简化trigger Job结构:
child-pipelineJob移除script和cache配置,只保留trigger相关定义,符合GitLab对触发子流水线Job的规则。 - 添加依赖关系:
needs: [generateyaml]确保子流水线Job在YAML生成完成后再执行,避免文件缺失。 - 批量触发YAML:通过
local: '*.yml'匹配当前目录下所有YAML文件,若需包含子目录,添加**/*.yml即可。
内容的提问来源于stack exchange,提问作者Shreyas Murali
相关产品推荐
相关产品推荐

