GitLab CI中default:before_script仅在validate阶段执行,如何实现全阶段生效?
问题原因
官方提供的Terraform.latest.gitlab-ci.yml模板里,build、deploy这类核心任务自身定义了before_script。GitLab CI的规则是:任务级别的before_script会直接覆盖全局default:before_script,所以这些任务不会执行你写的全局默认脚本。
解决方法
方法一:用!reference复用全局脚本逻辑
把你写的全局before_script单独定义为可复用锚点,然后在模板的每个任务里引用这个锚点,再保留模板原有的before_script内容。
示例配置:
# 先把动态设置TF_ROOT的逻辑定义为可复用锚点 .default_tf_root_setup: before_script: - # 这里放你获取变更模块、设置TF_ROOT的脚本 - CHANGED_MODULE=$(git diff --name-only $CI_MERGE_REQUEST_TARGET_BRANCH_NAME...$CI_COMMIT_SHA | grep -E 'modules/[^/]+' | cut -d'/' -f2 | head -n1) - export TF_ROOT="modules/$CHANGED_MODULE" # 引用模板后,重写build任务的before_script build: extends: .terraform_build before_script: - !reference [.default_tf_root_setup, before_script] - # 复制模板中.terraform_build原有的before_script内容 - terraform init -reconfigure -backend-config=$TERRAFORM_BACKEND_CONFIG - terraform workspace select $TERRAFORM_WORKSPACE || terraform workspace new $TERRAFORM_WORKSPACE
方法二:直接重写任务的before_script
把你的动态设置逻辑和模板原有的before_script内容合并,直接覆盖任务的before_script配置。比如:
deploy: extends: .terraform_deploy before_script: - # 先执行TF_ROOT设置逻辑 - CHANGED_MODULE=$(git diff --name-only $CI_MERGE_REQUEST_TARGET_BRANCH_NAME...$CI_COMMIT_SHA | grep -E 'modules/[^/]+' | cut -d'/' -f2 | head -n1) - export TF_ROOT="modules/$CHANGED_MODULE" - # 再执行模板原有的初始化步骤 - terraform init -reconfigure -backend-config=$TERRAFORM_BACKEND_CONFIG - terraform workspace select $TERRAFORM_WORKSPACE
方法三:用独立脚本统一处理
把设置TF_ROOT的逻辑写到单独的脚本文件(比如scripts/set_tf_root.sh),然后在模板所有任务的before_script开头执行这个脚本,确保所有任务都先完成TF_ROOT的设置。
示例脚本scripts/set_tf_root.sh:
#!/bin/bash CHANGED_MODULE=$(git diff --name-only $CI_MERGE_REQUEST_TARGET_BRANCH_NAME...$CI_COMMIT_SHA | grep -E 'modules/[^/]+' | cut -d'/' -f2 | head -n1) export TF_ROOT="modules/$CHANGED_MODULE"
修改模板任务的before_script:
build: extends: .terraform_build before_script: - chmod +x scripts/set_tf_root.sh && ./scripts/set_tf_root.sh - # 保留模板原有的before_script内容
内容的提问来源于stack exchange,提问作者Ricardo Silva
相关产品推荐
相关产品推荐

