如何在gitlab-ci.yml中每6小时运行任务?无需curl且当前版本无Pipeline schedules
解决GitLab CI每6小时自动运行任务(无需Pipeline Schedules或本地curl)
我完全懂你的需求——不想依赖本地curl手动触发,也没法用官方的Pipeline Schedules功能,就想让GitLab自己搞定定时任务。下面给你一个纯GitLab内部就能实现的方案,不需要任何外部工具:
方案:流水线自循环触发
核心思路是让流水线自己触发下一次运行,形成自动循环。第一次手动触发一次后,后续就会每6小时自动执行,全程由GitLab处理。
1. 创建项目访问令牌
首先得搞一个有权限触发流水线的令牌:
- 进入你的GitLab项目 → 设置 → 访问令牌
- 新建一个令牌,勾选
api和read_repository权限,把令牌值存好(只会显示一次,别搞丢了)
2. 添加CI安全变量
把令牌放到CI的安全变量里,避免泄露:
- 进入项目 → 设置 → CI/CD → 变量
- 添加变量
GITLAB_API_TOKEN,值为刚才的令牌,勾选「保护变量」和「掩码变量」
3. 修改.gitlab-ci.yml
添加专门的触发任务,同时配置你的业务任务:
stages: - run-jobs - schedule-next-run # 替换成你实际需要定时运行的任务 your_scheduled_tasks: stage: run-jobs script: - echo "执行每6小时一次的任务..." # 这里写你的实际任务命令,比如构建、测试或部署脚本 # 触发下一次流水线的任务 trigger_next_run: stage: schedule-next-run image: alpine/curl:latest script: # 等待6小时(21600秒) - sleep 21600 # 调用GitLab API触发下一次流水线 - | curl --silent --request POST \ --header "PRIVATE-TOKEN: $GITLAB_API_TOKEN" \ "https://你的GitLab实例地址/api/v4/projects/$CI_PROJECT_ID/pipeline?ref=$CI_COMMIT_BRANCH" # 限制只有手动或API触发的流水线才执行这个任务,避免意外的无限循环 rules: - if: '$CI_PIPELINE_SOURCE == "web" || $CI_PIPELINE_SOURCE == "api"'
注意事项
- runner资源:这个方案会占用一个runner长达6小时(sleep的时间),如果你的runner资源紧张,建议专门分配一个runner来处理这个定时任务
- 第一次启动:需要手动点击一次项目里的「运行流水线」,之后就会自动循环下去
- 终止循环:如果要停止定时任务,找到正在运行的
trigger_next_run任务,手动取消即可
内容的提问来源于stack exchange,提问作者Rajasekar
相关产品推荐
相关产品推荐

