GitLab CI 计划管道未在 master 上运行

时间:2021-01-20 19:58:18

标签: gitlab gitlab-ci

我有一个计划的管道,每天一次将一些数据从一台服务器复制到另一台服务器。

管道在所有分支上都可以正常工作,但如果我选择 master 分支(默认分支)作为 target branch,则不会启动。

我已经尝试过 master 的精确副本并且效果很好。

我认为这可能是因为 master 受保护,但我尝试使用受保护的 master 副本并且它有效。

我真的不确定发生了什么。当我单击计划管道旁边的“播放”按钮时,它说作业已成功调度,但我在作业列表中看不到任何作业。

这里有关于 .gitlab-ci.yml 的一些细节

stages:
  - copy_data
  - linting
  - test
  - deploy


lint:
  needs: []
  stage: linting
  rules:
    - if: $CI_PIPELINE_SOURCE == "schedule"
      when: never
    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH'
      changes:
        - "my_project/**/*.py"
  script:
    - ...

test:
  stage: test
  script:
    - ...
  rules:
    - if: $CI_PIPELINE_SOURCE == "schedule"
      when: never
    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH'

copy_database:on-schedule:
  stage: copy_data
  needs: []
  only:
    - schedules
    - $COPY_DB # this is set in the pipeline menu on gitlab
  script:
    - ...
  timeout: 3h

3 个答案:

答案 0 :(得分:1)

copy_database:on-schedule:
  stage: copy_data
  needs: []
  rules:
    - if: $CI_PIPELINE_SOURCE == "schedule" || $COPY_DB
      when: always
  script:
    ...

答案 1 :(得分:1)

我终于找到了问题所在!问题是 gitlab 说的是 Successfully scheduled a pipeline to run. Go to the Pipelines page for details. 而实际上存在错误。

为了调试它,我使用了 here 描述的技巧,即运行手动管道并设置 CI_PIPELINE_SOURCE = "schedule"。以这种方式运行管道返回了错误消息,我能够解决这个问题。


如果您想知道错误是什么,这里有更多详细信息。

我有两个管道可选地在主分支上运行:

prepare_release:
  stage: prepare_release
  rules:
    - if: $CI_PIPELINE_SOURCE == "schedule"
      when: never
    - if: $CI_COMMIT_TAG
      when: never
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
      when: manual
  script:
    - ...

create_release:
  image: registry.gitlab.com/gitlab-org/release-cli:latest
  stage: release
  needs:
    - job: prepare_release
      artifacts: true
  rules:
     // HERE THERE SHOULD BE A RULE TO PREVENT THIS FROM RUNNING ON SCHEDULE
       // - if: $CI_PIPELINE_SOURCE == "schedule"
    //  when: never
    - if: $CI_COMMIT_TAG
      when: never
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
  script:
    - ...

第二个管道没有

    - if: $CI_PIPELINE_SOURCE == "schedule"
      when: never

因此尝试按计划运行。但是,由于它需要前一个并且未创建,因此会出错。 我的错误是假设“需求”会考虑来自父作业的这个规则。

答案 2 :(得分:0)

这是因为它受到保护,而不是只是因为它受到保护。 create pipelines on a protected branch 的能力取决于用户合并或推送到该分支的能力。计划管道在计划所有者 (initially, the user who created it).

您要么需要让您的用户在 master 上获得合并/推送访问权限,要么让另一个拥有该权限的用户拥有计划的所有权。