在Gitlab上自动合并Master到Develop

Automatically merge Master to Develop on Gitlab

在 Gitlab 上遇到问题,因为 develop 分支逐渐偏离 master。例如,如果有人在 master 上应用修补程序,它不会自动出现在 develop 中,这可能会造成冲突。

有没有办法在 CI-CD 进程中自动同步 develop 和 master?

相关:Automatically syncing develop with master on merge

为了建立@matt 的评论,在 Gitlab 或我所知道的任何其他 SCM/CI/CD 系统中没有内置的方法来执行此操作,但如果你真的需要这个,有几个选项:

  1. 您可以在 Gitlab 上注册一个 webhook,以便在有推送到 main 时发送一个 hook,然后无论您在哪里收到 hook 都可以克隆 repo,合并到开发,然后推送回远程。
  2. 另一种选择是通过 API 调用 checkout develop、merge 和 push to remote 来启动一个小型管道作业。这仍然需要第一个选项中的 webhook,但不需要克隆。

但是,如果您有多个人在一个项目上工作,那么这样做可能会很麻烦。假设你有人在开发上工作,无论是开发工作、测试还是其他,并且有一个推送到 main,它会自动合并到 develop。这现在搞砸了第一人称的工作。不过,如果您是项目中唯一的人,这可能没问题。

作为自动合并的替代方案,我在多人接触的项目中做的一件事是添加一个简单的管道作业,当有推送到 main 时发送松弛通知。它看起来像这样:

Merge Notification:
  stage: "Send Notifications"
  image: centos:7
  only:
    - main
  needs: []
  variables:
    GIT_STRATEGY: none
  script:
    - 'curl -X POST --data-urlencode "payload={\"text\": \"There has been an update to the _*$CI_BUILD_REF_NAME*_ branch. Please be sure to rebase your non-merged code as soon as possible!\", \"icon_emoji\": \":gitlab:\"}" https://hooks.slack.com/services/redacted'

我在这里使用 centos:7 图片,但通常对于这些类型的东西我使用 alpine 图片,因为它的大小 <50mb。我做这份工作很久以前我不记得为什么我使用 centos。其他图片在这里应该也能正常工作,所以你只需要试验一下。

  • only: main 子句表示,只有分支为 main

    时,该作业才会添加到管道中
  • needs: [] 子句对 Gitlab 来说比较新。它允许您定义非循环管道,这仅意味着您可以 运行 无序作业。此示例“不需要”来自管道早期的其他作业,因此它可以安全地 运行 一旦管道启动,无论阶段如何。如果您有足够的 运行 可用人员(或时间,如果使用 Gitlab.com),所有符合条件的工作都可以一次 运行,跨越所有阶段,具体取决于他们的 needs

  • 接下来,我们告诉工作我们根本不需要clone/fetch这个项目。 GIT_STRATEGY: none 变量意味着不要从 Gitlab 克隆项目。

  • 最后,我们 运行 唯一 script 是标准 curl 命令,用于将消息发送到特定的 Slack 频道。如果您不使用 slack,这可以换成任何其他服务。