如何在GitLab CICD中通过环境变量筛选CSV指定日期与项目记录
实现方案
1. 适配Python脚本的参数逻辑
修改现有采集脚本,优先从环境变量读取过滤参数,空值自动走全量采集逻辑:
- 读取三个核心参数:
FROM_DATE(起始日期)、TO_DATE(截止日期)、PROJECT_ID(项目ID) - 参数判空规则:所有参数传入空字符串、全空格时,视为未传参,不启用对应过滤条件
- 增加基础格式校验:日期强制要求
YYYY-MM-DD格式,项目ID支持多值传入时用英文逗号分隔即可 - 保持原有CSV输出逻辑不变,最终固定生成
git_commit_report.csv文件,表头沿用原有定义
参考参数读取代码片段:
import os from datetime import datetime # 读取CI传入的环境变量,空值统一转为None FROM_DATE = os.getenv("FROM_DATE", "").strip() or None TO_DATE = os.getenv("TO_DATE", "").strip() or None PROJECT_ID = os.getenv("PROJECT_ID", "").strip() or None # 日期格式校验 def parse_date(date_str): if not date_str: return None try: return datetime.strptime(date_str, "%Y-%m-%d") except ValueError: raise RuntimeError("日期格式错误,请使用YYYY-MM-DD格式,例如2024-01-01") # 转换为脚本逻辑可用的参数 filter_from_date = parse_date(FROM_DATE) filter_to_date = parse_date(TO_DATE) filter_projects = [pid.strip() for pid in PROJECT_ID.split(",")] if PROJECT_ID else None # 后续接入原有提交采集逻辑,传入上述三个过滤参数即可
2. 编写GitLab CI流水线配置
在仓库根目录创建/更新.gitlab-ci.yml,配置手动触发的作业,将三个参数设为运行时可输入项:
stages: - gen_report generate_commit_report: stage: gen_report image: python:3.11-slim variables: FROM_DATE: description: "起始日期(YYYY-MM-DD),留空则拉取最早的提交记录" value: "" TO_DATE: description: "截止日期(YYYY-MM-DD),留空则拉取到最新的提交记录" value: "" PROJECT_ID: description: "待统计的项目ID,多个项目用英文逗号分隔,留空则统计所有项目" value: "" before_script: # 安装脚本依赖,替换为你实际用到的依赖包 - pip install --no-cache-dir python-gitlab pandas script: # 运行采集脚本,环境变量会自动注入到脚本进程 - python collect_git_commits.py artifacts: name: "git_commit_report_${CI_PIPELINE_IID}" expire_in: 30d paths: - git_commit_report.csv rules: - if: '$CI_PIPELINE_SOURCE == "web"' # 仅允许手动从网页触发流水线时运行
3. 配置固定CI变量
进入GitLab项目的「设置」-「CI/CD」-「变量」页面,提前配置两个全局固定变量,不要硬编码在脚本里:
GITLAB_PRIVATE_TOKEN:拥有所有待统计项目读取权限的GitLab访问令牌,开启Masked、Protected选项GITLAB_HOST:你的GitLab实例访问地址,例如https://gitlab.your-company.com,开启Masked选项
脚本里直接读取这两个变量调用GitLab API即可。
4. 运行逻辑
- 用户打开流水线运行页面时,会自动弹出三个参数输入框
- 填写对应日期、项目ID后运行,脚本会按传入的过滤条件生成指定范围的提交CSV
- 所有参数留空直接运行,脚本自动拉取全量项目、全时间范围的提交记录生成CSV
- 流水线运行完成后,在作业产物里即可直接下载生成的CSV文件
注意:如果待统计的提交量较大,建议在脚本里增加API分页拉取逻辑,避免单次拉取数据量过大导致内存溢出。
内容的提问来源于stack exchange,提问作者The Tester
相关产品推荐
相关产品推荐

