GitLab跨项目触发配置咨询:bat文件触发Python脚本执行
GitLab跨项目流水线配置方案
Project A 的 .gitlab-ci.yml
这套配置会在提交 .bat 文件时自动触发流水线,完成参数提取、触发Project B、清理bat文件的全流程:
stages: - extract_params - trigger_b - cleanup # 从提交的bat文件中提取目标参数 extract_params: stage: extract_params rules: - changes: - "*.bat" # 仅当提交包含bat文件时触发流水线 script: # 拿到本次提交的bat文件名 - BAT_FILE=$(git diff --name-only HEAD~1 HEAD | grep .bat) # 👇根据你的bat文件实际格式调整提取逻辑 # 示例:假设bat文件里的第一行就是带4个参数的命令,提取前4个参数 - ARGS=$(head -n1 $BAT_FILE | awk '{print $1, $2, $3, $4}') - ARG1=$(echo $ARGS | cut -d' ' -f1) - ARG2=$(echo $ARGS | cut -d' ' -f2) - ARG3=$(echo $ARGS | cut -d' ' -f3) - ARG4=$(echo $ARGS | cut -d' ' -f4) # 把参数和文件名存入环境变量,传给后续步骤 - echo "ARG1=$ARG1" >> variables.env - echo "ARG2=$ARG2" >> variables.env - echo "ARG3=$ARG3" >> variables.env - echo "ARG4=$ARG4" >> variables.env - echo "BAT_FILE=$BAT_FILE" >> variables.env artifacts: reports: dotenv: variables.env # 传递变量到后续阶段 # 触发Project B的流水线并传递参数,等待其执行完成 trigger_project_b: stage: trigger_b needs: [extract_params] rules: - changes: - "*.bat" script: # 用GitLab API触发Project B,替换成你的GitLab地址和Project B ID - | curl --request POST --header "PRIVATE-TOKEN: $PROJECT_B_TRIGGER_TOKEN" \ "https://你的GitLab域名/api/v4/projects/ProjectB的ID/trigger/pipeline" \ --form "ref=main" # Project B要执行的分支 --form "variables[ARG1]=$ARG1" \ --form "variables[ARG2]=$ARG2" \ --form "variables[ARG3]=$ARG3" \ --form "variables[ARG4]=$ARG4" \ --form "WAIT_FOR_COMPLETION=true" # 强制等待B的流水线跑完再继续 variables: # 这个令牌要在Project A的CI/CD变量里提前配置 PROJECT_B_TRIGGER_TOKEN: $PROJECT_B_TRIGGER_TOKEN # 清理已处理的bat文件,提交到仓库 cleanup_bat: stage: cleanup needs: [trigger_project_b] rules: - changes: - "*.bat" script: - git config --global user.name "GitLab CI Bot" - git config --global user.email "ci-bot@your-domain.com" - git rm $BAT_FILE - git commit -m "Cleanup: Remove processed $BAT_FILE" - git push origin HEAD:$CI_COMMIT_BRANCH
Project B 的 .gitlab-ci.yml
这套配置只接受触发式流水线,执行Python脚本并接收传递的参数:
stages: - run_script run_python_script: stage: run_script rules: - if: $CI_PIPELINE_SOURCE == "trigger" # 只处理来自Project A的触发请求 script: # 执行你的Python脚本,传入参数 - python 你的脚本文件名.py $ARG1 $ARG2 $ARG3 $ARG4
必做配置说明
- 权限与令牌:
- 去Project B的「设置→CI/CD→流水线触发令牌」生成一个令牌,复制后到Project A的「设置→CI/CD→变量」里添加
PROJECT_B_TRIGGER_TOKEN,值为这个令牌。 - 确保Project A的CI/CD服务账号有Project B的流水线触发权限,以及Project A自身的代码推送权限。
- 去Project B的「设置→CI/CD→流水线触发令牌」生成一个令牌,复制后到Project A的「设置→CI/CD→变量」里添加
- 参数提取逻辑:
- 一定要根据你实际的
.bat文件格式调整extract_params阶段的脚本,比如如果bat里是用set ARG1=xxx定义参数,就改成ARG1=$(grep ARG1 $BAT_FILE | cut -d'=' -f2)。
- 一定要根据你实际的
- 分支适配:
- 把配置里的
ref=main改成Project B实际要执行的分支名。
- 把配置里的
内容的提问来源于stack exchange,提问作者Connor
相关产品推荐
相关产品推荐

