外部仓库的 GitLab CI/CD
- Tier: Premium, Ultimate
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
GitLab CI/CD 可以与 GitHub、Bitbucket Cloud 或任何其他 Git 服务器一起使用。存在一些 已知问题。
与其将整个项目迁移到 GitLab,您可以连接外部仓库以获得 GitLab CI/CD 的好处。
连接外部仓库会设置 仓库镜像,并创建一个轻量级项目,其中 issues、merge requests、wiki 和 snippets 功能被禁用。这些功能 可以稍后重新启用。
连接到外部仓库
要连接到外部仓库:
- 在左侧边栏顶部,选择 Create new ( ) 和 New project/repository。
- 选择 Run CI/CD for external repository。
- 选择 GitHub 或 Repository by URL。
- 完成字段填写。
如果 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 会订阅 push 和 pull_request 事件的网络钩子(webhooks)。一旦收到 pull_request 事件,拉取请求数据将被存储并作为引用保留。如果拉取请求刚刚创建,GitLab 会立即为外部拉取请求创建流水线。
如果更改被推送到拉取请求引用的分支,并且拉取请求仍然打开,则会为外部拉取请求创建流水线。
在这种情况下,GitLab CI/CD 会创建 2 个流水线。一个用于分支推送,一个用于外部拉取请求。
拉取请求关闭后,即使新更改被推送到同一分支,也不会为外部拉取请求创建流水线。
额外的预定义变量
通过使用外部拉取请求的流水线,GitLab 向流水线作业暴露了额外的 预定义变量。
变量名以 CI_EXTERNAL_PULL_REQUEST_ 为前缀。
已知问题
此功能不支持:
- GitHub Enterprise 所需的 手动连接方法。 如果集成是手动连接的,外部拉取请求 不会触发流水线。
- 来自派生仓库的拉取请求。来自派生仓库的拉取请求将被忽略。
鉴于 GitLab 会创建 2 个流水线,如果更改被推送到引用打开拉取请求的远程分支,两者都会通过 GitHub 集成贡献于拉取请求的状态。如果您只想在外部拉取请求上运行流水线,而不是在分支上运行,可以在作业规范中添加 except: [branches]。
了解更多。