GitLab Pipeline如何获取运行当月的首尾日期?
GitLab Pipeline 获取当月首日与末日的实现方案
方案一:直接用Shell脚本实现(推荐,轻量无依赖)
GitLab Runner默认自带bash和date命令,无需额外依赖,直接通过CI内置变量CI_JOB_STARTED_AT即可生成所需日期,步骤如下:
流水线示例配置
get_month_boundaries: script: # 提取CI_JOB_STARTED_AT中的年月部分(格式:YYYY-MM) - RUN_YEAR_MONTH=$(echo "$CI_JOB_STARTED_AT" | cut -d'-' -f1,2) # 生成当月第一天(固定为YYYY-MM-01) - MONTH_FIRST_DAY="${RUN_YEAR_MONTH}-01" # 生成当月最后一天:基于当月1号加1个月再减1天,自动适配28/29/30/31天的月份 - MONTH_LAST_DAY=$(date -d "${RUN_YEAR_MONTH}-01 +1 month -1 day" +"%Y-%m-%d") # 输出变量值 - echo "当月第一天: $MONTH_FIRST_DAY" - echo "当月最后一天: $MONTH_LAST_DAY" # 可选:将变量写入dotenv,供后续流水线任务使用 - echo "MONTH_FIRST_DAY=$MONTH_FIRST_DAY" >> variables.env - echo "MONTH_LAST_DAY=$MONTH_LAST_DAY" >> variables.env artifacts: reports: dotenv: variables.env
方案优势
- 无需额外安装环境,直接复用Runner自带工具,流水线执行速度更快
- 逻辑简洁,适配所有月份的天数(包括闰年2月)
方案二:Python脚本实现(适合复杂日期场景)
如果需要更复杂的日期处理(如时区转换、自定义格式),可以用Python的datetime模块处理,避免手动切片可能出现的格式兼容问题:
1. 编写Python脚本(get_dates.py)
import datetime import os # 从环境变量读取CI启动时间,兼容ISO格式的Z后缀 started_at_str = os.environ.get("CI_JOB_STARTED_AT") started_at = datetime.datetime.fromisoformat(started_at_str.replace('Z', '+00:00')) # 计算当月第一天 month_first = started_at.replace(day=1) # 计算当月最后一天:先跳到下月,再减去当月天数 next_month = started_at.replace(day=28) + datetime.timedelta(days=4) month_last = next_month - datetime.timedelta(days=next_month.day) # 输出变量(可自定义日期格式) print(f"MONTH_FIRST_DAY={month_first.strftime('%Y-%m-%d')}") print(f"MONTH_LAST_DAY={month_last.strftime('%Y-%m-%d')}")
2. 流水线配置
get_month_boundaries_python: image: python:3.9-slim script: - python get_dates.py # 可选:写入dotenv供后续任务使用 - python get_dates.py >> variables.env artifacts: reports: dotenv: variables.env
方案优势
- 日期处理逻辑更严谨,自动处理时区、闰年等边缘情况
- 扩展性强,可快速添加复杂日期转换需求
方案对比建议
- 仅需获取当月首尾日期:优先选择Shell脚本方案,轻量高效
- 有复杂日期处理需求:选择Python脚本方案,可靠性更高
内容的提问来源于stack exchange,提问作者TM1
相关产品推荐
相关产品推荐

