推送镜像

推送镜像是一个下游仓库镜像上游仓库中所做的提交。推送镜像被动地接收上游仓库中所做提交的副本。为了防止镜像与上游仓库发生偏离,请不要直接向下游镜像推送提交,而是向上游仓库推送提交。

虽然拉取镜像会定期从上游仓库获取更新,但推送镜像只有在以下情况下才会接收更改:

当您向上游仓库推送更改时,推送镜像会在以下时间内接收:

  • 五分钟内。
  • 如果启用了仅镜像受保护的分支,则在一分钟内。

当一个分支合并到默认分支并在源项目中删除时,它将在下一次推送时从远程镜像中删除。具有未合并更改的分支将被保留。如果一个分支发生偏离,镜像仓库部分会显示错误。

极狐GitLab 静默模式会禁用推送到和从远程镜像拉取。

配置推送镜像

要为现有项目设置推送镜像:

  1. 在左侧边栏中,选择搜索或转到并找到您的项目。
  2. 选择设置 > 仓库
  3. 展开镜像仓库
  4. 输入仓库 URL。
  5. 镜像方向下拉列表中,选择推送
  6. 选择一种认证方法。有关更多信息,请参阅镜像的认证方法
  7. 如有必要,选择仅镜像受保护的分支
  8. 如果需要,选择保留偏离的引用
  9. 要保存配置,选择镜像仓库

通过 API 配置推送镜像

您还可以通过远程镜像 API创建和修改项目推送镜像。

保留偏离的引用

默认情况下,如果远程(下游)镜像上的任何引用(分支或标签)与本地仓库发生偏离,上游仓库将覆盖远程上的任何更改:

  1. 一个仓库将 maindevelop 分支镜像到远程。
  2. 在远程镜像上向 develop 分支添加了一个新提交。
  3. 下一次推送会更新远程镜像以匹配上游仓库。
  4. 在远程镜像上添加到 develop 分支的新提交将丢失。

如果选择了保留偏离的引用,则更改将以不同方式处理:

  1. 跳过对远程镜像上 develop 分支的更新。
  2. 远程镜像上的 develop 分支保留在上游仓库中不存在的提交。任何存在于远程镜像但不存在于上游的引用将保持不变。
  3. 更新被标记为失败。

创建镜像后,您只能通过远程镜像 API修改保留偏离的引用的值。

从 GitLab 设置推送镜像到 GitHub

要配置从极狐GitLab 到 GitHub 的镜像:

  1. 创建一个具有至少读取和写入仓库内容权限的GitHub 细粒度个人访问令牌。如果您的仓库包含 .github/workflows 目录,您还必须授予工作流的读取和写入权限。为了更细粒度的访问,您可以将令牌配置为仅适用于特定仓库。
  2. 使用以下格式输入Git 仓库 URL,根据需要更改变量:

    https://github.com/GROUP/PROJECT.git
    
    • GROUP:GitHub 上的组。
    • PROJECT:GitHub 上的项目。
  3. 用户名中,输入个人访问令牌所有者的用户名。
  4. 密码中,输入您的 GitHub 个人访问令牌。
  5. 选择镜像仓库

镜像的仓库会被列出。例如:

https://*****:*****@github.com/<your_github_group>/<your_github_project>.git

仓库会在此后不久推送。要强制推送,请选择立即更新 )。

从 GitLab 设置推送镜像到 AWS CodeCommit

AWS CodeCommit 推送镜像是将极狐GitLab 仓库连接到 AWS CodePipeline 的最佳方式。极狐GitLab 尚未被支持为其源代码管理(SCM)提供者之一。每个新的 AWS CodePipeline 需要大量的 AWS 基础设施设置。它还需要每个分支的单独管道。

如果 AWS CodeDeploy 是 CodePipeline 的最后一步,您可以结合这些工具来创建部署:

  • 极狐GitLab CI/CD 管道。
  • .gitlab-ci.yml 的最后一个作业中使用 AWS CLI 部署到 CodeDeploy。

注意: 在 GitLab issue 34014 解决之前,极狐GitLab 到 AWS CodeCommit 的推送镜像无法使用 SSH 认证。

要从极狐GitLab 设置镜像到 AWS CodeCommit:

  1. 在 AWS IAM 控制台中,创建一个 IAM 用户。
  2. 为仓库镜像添加以下最小权限作为内联策略

    Amazon 资源名称(ARN)必须明确包括区域和账户。此 IAM 策略授予对两个示例仓库的镜像访问权限。这些权限已被测试为镜像所需的最小(最少特权)权限:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "MinimumGitLabPushMirroringPermissions",
                "Effect": "Allow",
                "Action": [
                    "codecommit:GitPull",
                    "codecommit:GitPush"
                ],
                "Resource": [
                  "arn:aws:codecommit:us-east-1:111111111111:MyDestinationRepo",
                  "arn:aws:codecommit:us-east-1:111111111111:MyDemo*"
                ]
            }
        ]
    }
    
  3. 用户创建后,选择 AWS IAM 用户名。
  4. 选择安全凭证选项卡。
  5. AWS CodeCommit 的 HTTPS Git 凭证下,选择生成凭证

    注意: 此 Git 用户 ID 和密码专用于与 CodeCommit 通信。不要将其与此用户的 IAM 用户 ID 或 AWS 密钥混淆。

  6. 复制或下载特殊的 Git HTTPS 用户 ID 和密码。
  7. 在 AWS CodeCommit 控制台中,创建一个新的仓库以从您的 GitLab 仓库镜像。
  8. 打开您的新仓库,在右上角选择代码 > 克隆 HTTPS(不是克隆 HTTPS (GRC))。
  9. 在极狐GitLab 中,打开要推送镜像的仓库。
  10. 选择设置 > 仓库,然后展开镜像仓库
  11. 使用以下格式填写Git 仓库 URL字段,替换 <aws-region> 为您的 AWS 区域,替换 <your_codecommit_repo> 为您在 CodeCommit 中的仓库名称:

    https://git-codecommit.<aws-region>.amazonaws.com/v1/repos/<your_codecommit_repo>
    
  12. 对于认证方法,选择用户名和密码
  13. 用户名中,输入 AWS 特殊 HTTPS Git 用户 ID
  14. 密码中,输入之前在 AWS 中创建的特殊 IAM Git 克隆用户 ID 密码。
  15. 对于 CodeCommit,保留仅镜像受保护的分支选项。它推送的频率更高(从每五分钟到每分钟)。

    CodePipeline 需要为您希望设置 AWS CI 的命名分支单独设置管道。由于不支持具有动态名称的功能分支,配置仅镜像受保护的分支不会对 CodePipeline 集成造成灵活性问题。您还必须保护所有希望为其构建 CodePipeline 的命名分支。

  16. 选择镜像仓库。您应该会看到镜像的仓库出现:

    https://*****:*****@git-codecommit.<aws-region>.amazonaws.com/v1/repos/<your_codecommit_repo>
    

要通过强制推送来测试镜像,请选择立即更新(半圆箭头)。 如果上次成功更新显示日期,则表示您已正确配置镜像。 如果未正确工作,则会出现红色的 error 标签,并在悬停文本中显示错误消息。

设置到启用 2FA 的另一个 GitLab 实例的推送镜像

  1. 在目标极狐GitLab 实例上,创建一个具有 write_repository 范围的个人访问令牌
  2. 在源极狐GitLab 实例上:
    1. 使用以下格式输入Git 仓库 URLhttps://<destination host>/<your_gitlab_group_or_name>/<your_gitlab_project>.git
    2. 输入用户名 oauth2
    3. 输入密码。使用在目标极狐GitLab 实例上创建的极狐GitLab 个人访问令牌。
    4. 选择镜像仓库

相关主题