You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:06:38