如何:在 push/merge 掌握,commit/push 特定文件到另一个项目

How to: At push/merge to master, commit/push specific files to another project

当用户合并到母版时,将这些文件合并到用户无权访问的另一个项目母版。我授予非技术用户编辑一些配置文件的权限,然后我通过 saltstack 将其推送到生产系统。它在同一 gitlab 服务器上使用不同的项目作为其配置。

我想我需要在初始项目上设置一个 git 挂钩,git 挂钩会 运行 一个脚本来完成剩下的工作,但我不确定这是否可以使用 git-cherrypick 命令或部署密钥来完成。

用户正在登录 gitlab 并在 gitlab UI 中编辑文件,它会自动执行 commit/merge 请求,然后管理员将完成合并 request/merge。

然后我希望我可以获取这些文件,将它们复制到我的 saltstack state /files/ 目录,其中 highstate 运行 并将配置推送到生产服务器。我只是缺少这样做的自动化机制,我是 git 的新手,想知道在我写一个糟糕的 bash 之前是否有 git 机制脚本来完成它。

为什么不复制它们,为什么不使用 gitlab 项目作为 saltstack 的文件后端? 一旦有人批准了合并请求,1 分钟后您就可以 运行 一个带有新更改的高状态。 这基本上意味着您的 salt-master 与存储配置文件(和 saltstates)的 gitlab 项目有连接。它与使用 /srv/salt 相同,但仅限于 gitlab。通过这样做,您还可以利用 git/gitlab 在版本控制方面提供的好处。 如果您想设置它,请查看 this documentation

关于在存储库之间镜像特定文件,我想您可以尝试使用 gitfs 并围绕它构建某种管道。 (也许 CI/CD) 您还可以每分钟通过 rsync 克隆 repos 和同步它们。 为此,一个简单的 cron 脚本可能会有所帮助。该脚本应在每次执行时拉取 repo1,将所有内容同步到 repo2 并将其推送到远程。

希望能帮到你。

这是来自 CFEngine 社区的 shell 脚本(CFEngine 是一种配置管理工具),用于将文件从 VCS 中拉出,然后放置在那里,CFEngine 服务器将拾取它们并使它们可供其他 CFEngine 使用分发给主机的代理:https://github.com/cfengine/core/tree/master/contrib/masterfiles-stage 在 CFEngine 术语中,"masterfiles" 是从真实来源分发的文件。

您可以考虑在另一个项目 (https://docs.gitlab.com/ee/ci/multi_project_pipelines.html) 上触发管道作业,但用户需要对这两个项目的访问权限。

另一种可能的选择是 git 个子模块 (https://git-scm.com/book/en/v2/Git-Tools-Submodules)