Gitlab 中是不是存在技术可能性,即在合并期间存储库内容的自定义改编是 Dome?

Posted

技术标签:

【中文标题】Gitlab 中是不是存在技术可能性,即在合并期间存储库内容的自定义改编是 Dome?【英文标题】:Is there the technical possibility in Gitlab that a custom adaption of the repository content is Dome during the merge?Gitlab 中是否存在技术可能性,即在合并期间存储库内容的自定义改编是 Dome? 【发布时间】:2022-01-18 22:33:06 【问题描述】:

是否有可能我可以添加例如在 gitlab 的合并步骤中执行的脚本可以更改存储库的某些内容?

GitLab 完全支持的标准工作流程

    在 GitLab 中创建合并请求 将其添加到要合并的合并列车中 如果未检测到冲突,Gitlab 会创建合并提交(临时) 管道运行以执行一些集成步骤 如果管道执行成功,则推送合并提交

我还需要什么:

我想在第 3 步之后执行一个脚本,这可能会再次更改存储库的某些文件。这些更改应集成到合并提交中。 类似于执行一个更干净的脚本,该脚本在 git 合并之后在合并提交完成之前执行(这在 Gitlab 的远程端作为合并过程的一部分)。

有人对技术解决方案有想法吗? 我会很感激的

【问题讨论】:

您能否用图表扩展您的问题 - 这将有助于理解您的问题 【参考方案1】:

这是可能的,但并不简单。您正在构建的基本上是一个机器人,它必须假设某种个性才能修改代码、提交并将其推送到存储库(理想情况下 - 通过 MR)。

我们将这种方法用于以下情况:

VERSION 文件的自动碰撞 根据存储库 A 中的更改自动执行存储库 B 中的合并请求 等

解决方案

该解决方案可能比您实际需要的更通用,因此您可能需要简化,但效果很好。

你需要:

    一个单独的存储库,您将在其中存储自动化,我们称之为机器人存储库 在目标仓库中创建的访问令牌,具有api, write_repository 范围,我们称之为AUTO_MR_TOKEN 在 bot repo 中创建的秘密,其内容为 AUTO_MR_TOKEN

在机器人代码库中,您将创建一个 gitlab-ci.yml,其中包含以下步骤:

add_mr:
  script:
    # SETUP THE ENVIRONMENT HERE
    - TARGET_REPO="https://oauth2:$AUTO_MR_TOKEN@$CI_SERVER_HOST/$TARGET_PROJECT.git"
    # CLONE THE TARGET REPO
    - git clone -b $TARGET_BRANCH --single-branch $TARGET_REPO
    - git config user.email "$GIT_USER_EMAIL:-$GITLAB_USER_EMAIL"
    - git config user.name "$GIT_USER_NAME:-$GITLAB_USER_NAME"
    # MAKE CHANGES
    - echo "DO YOUR MAGIC HERE"
    - |
      git commit -m "commit from bot"
      git push origin master $TARGET_BRANCH \
        -o merge_request.create \
        -o merge_request.target=master 

然后,在目标存储库中 - 您将根据您的工作流程,在管道的适当步骤中触发此机器人作业。

【讨论】:

非常感谢您的详细回答。我现在不能完全确定这是否解决了我的问题,或者可能不完全理解它的技术。那么这个描述的操作是否修改了 Gitlab 中已经完成的合并提交? 所以我已经通过 Gitlab 在目标仓库中创建了合并请求。然后在批准后,我点击“添加到合并列车。然后目标 repo 的管道开始(基于尚未推送回 Master 的合并结果)。然后我的管道的第一步可以是触发我的机器人 repo 的操作,这将修改 gitlab 合并提交(gitlab 尚未推送)。然后我的目标回购管道应该继续进行一些集成测试。 如果这些通过,则应推送合并提交并关闭合并请求。如果管道失败,则不应推送 gitlab 合并提交,并且我的功能分支仍应仅具有在单击“添加到合并训练”之前存在的列表提交 这实际上取决于您如何将其集成到您的管道中。理论上 - 你可以简单地获取令牌并克隆 -> 提交 -> 推送到 repo,即使没有 MR。您可以将此类脚本添加到管道的几乎任何现有步骤中。 我认为如果 GitLab 使用“基于合并结果运行管道”功能,则此合并尚未提交,因此另一个克隆此分支的 git bot 在技术上无法访问(因为此合并结果是不致力于分支)

以上是关于Gitlab 中是不是存在技术可能性,即在合并期间存储库内容的自定义改编是 Dome?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过命令行创建 GitLab 合并请求

Gitlab合并代码的几种情况

不同 GitLab CI 合并请求规则之间的区别

如何限制将特定分支合并到 Gitlab 中的其他分支?

Python 操作Gitlab-API 实现批量的合并分支

GitLab合并请求报错