Help us learn about your current experience with the documentation. Take the survey.

外部仓库的 GitLab CI/CD

  • Tier: Premium, Ultimate
  • Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated

GitLab CI/CD 可以与 GitHubBitbucket Cloud 或任何其他 Git 服务器一起使用。存在一些 已知问题

与其将整个项目迁移到 GitLab,您可以连接外部仓库以获得 GitLab CI/CD 的好处。

连接外部仓库会设置 仓库镜像,并创建一个轻量级项目,其中 issues、merge requests、wiki 和 snippets 功能被禁用。这些功能 可以稍后重新启用

连接到外部仓库

要连接到外部仓库:

  1. 在左侧边栏顶部,选择 Create new ( plus ) 和 New project/repository
  2. 选择 Run CI/CD for external repository
  3. 选择 GitHubRepository by URL
  4. 完成字段填写。

如果 Run CI/CD for external repository 选项不可用:

  • GitLab 实例可能没有配置任何导入源。 请联系管理员检查 导入源配置
  • 项目镜像 可能被禁用。 如果被禁用,只有管理员可以使用 Run CI/CD for external repository 选项。 请联系管理员检查 项目镜像配置

外部拉取请求的流水线

当 GitLab CI/CD 与 GitHub 上的外部仓库 一起使用时,可以在拉取请求(Pull Request)的上下文中运行流水线。

当您将更改推送到 GitHub 中的远程分支时,GitLab CI/CD 可以为该分支运行流水线。但是,当您为该分支打开或更新拉取请求时,您可能希望:

  • 运行额外的作业。
  • 不运行特定的作业。

例如:

always-run:
  script: echo 'this should always run'

on-pull-requests:
  script: echo 'this should run on pull requests'
  rules:
    - if: $CI_PIPELINE_SOURCE == "external_pull_request_event"

except-pull-requests:
  script: echo 'This should not run for pull requests, but runs in other cases.'
  rules:
    - if: $CI_PIPELINE_SOURCE == "external_pull_request_event"
      when: never
    - when: on_success

外部拉取请求的流水线执行

当仓库从 GitHub 导入时,GitLab 会订阅 pushpull_request 事件的网络钩子(webhooks)。一旦收到 pull_request 事件,拉取请求数据将被存储并作为引用保留。如果拉取请求刚刚创建,GitLab 会立即为外部拉取请求创建流水线。

如果更改被推送到拉取请求引用的分支,并且拉取请求仍然打开,则会为外部拉取请求创建流水线。

在这种情况下,GitLab CI/CD 会创建 2 个流水线。一个用于分支推送,一个用于外部拉取请求。

拉取请求关闭后,即使新更改被推送到同一分支,也不会为外部拉取请求创建流水线。

额外的预定义变量

通过使用外部拉取请求的流水线,GitLab 向流水线作业暴露了额外的 预定义变量

变量名以 CI_EXTERNAL_PULL_REQUEST_ 为前缀。

已知问题

此功能不支持:

鉴于 GitLab 会创建 2 个流水线,如果更改被推送到引用打开拉取请求的远程分支,两者都会通过 GitHub 集成贡献于拉取请求的状态。如果您只想在外部拉取请求上运行流水线,而不是在分支上运行,可以在作业规范中添加 except: [branches]了解更多

故障排除