在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 系统中没有内置的方法来执行此操作,但如果你真的需要这个,有几个选项:
- 您可以在 Gitlab 上注册一个 webhook,以便在有推送到 main 时发送一个 hook,然后无论您在哪里收到 hook 都可以克隆 repo,合并到开发,然后推送回远程。
- 另一种选择是通过 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,这可以换成任何其他服务。
在 Gitlab 上遇到问题,因为 develop
分支逐渐偏离 master
。例如,如果有人在 master
上应用修补程序,它不会自动出现在 develop
中,这可能会造成冲突。
有没有办法在 CI-CD 进程中自动同步 develop 和 master?
相关:Automatically syncing develop with master on merge
为了建立@matt 的评论,在 Gitlab 或我所知道的任何其他 SCM/CI/CD 系统中没有内置的方法来执行此操作,但如果你真的需要这个,有几个选项:
- 您可以在 Gitlab 上注册一个 webhook,以便在有推送到 main 时发送一个 hook,然后无论您在哪里收到 hook 都可以克隆 repo,合并到开发,然后推送回远程。
- 另一种选择是通过 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,这可以换成任何其他服务。