【问题标题】:Use a real git repo during an Openshift build?在 Openshift 构建期间使用真正的 git 存储库?
【发布时间】:2020-11-25 21:21:59
【问题描述】:

当 Openshift 从 git 存储库构建时,源被克隆/导出的方式是克隆不是 git 存储库,即没有 .git 目录。任何人都知道如何将此行为更改为真正的克隆?

相关文档 (https://docs.openshift.com/container-platform/3.5/dev_guide/builds/build_inputs.html#source-code) 中没有任何内容,但文档并非总是如此。

我们的用例是我们的项目使用了一个 gradle 插件,该插件将有关 git 状态的信息添加到构建工件中。这不会在 Openshift 中构建。

【问题讨论】:

  • 您能否确认您使用的是哪个 OpenShift S2I 构建器?尽管在某些情况下可能会创建 .git 目录,但 S2I 构建者可能会故意忽略它,而不是将其移动到完成构建的 src 目录中。可能需要一个小提琴来确保它被保存,但需要知道您使用的是什么 S2I 构建器。
  • 感谢@GrahamDumpleton - 这是内部编写的自定义 s2i。现在我更仔细地查看它的代码,我意识到这是罪魁祸首。好消息是我可以解决它 :-) 如果您要留下与您的评论类似的答案,我可以接受。

标签: git openshift


【解决方案1】:

在编写 S2I 构建器时,默认情况下源代码将被注入目录/tmp/src。您的自定义assemble 脚本,如果它需要防止文件被注入,会将文件移动或复制到它们的最终位置,例如/opt/app-root/src。如果发生,通常在任何编译阶段之前完成。然后构建将在目标目录中运行。

在移动或复制文件并使用 glob 通配符时,您需要确保隐藏文件以“.”开头被包含在内。例如:

shopt -s dotglob
echo "---> Installing application source ..."
mv /tmp/src/* ./

如果您没有shopt -s dotglob,则不会包含.git 等目录。如果后续构建期望 .git 目录存在,这将是一个问题。

如果您使用的是其他人的 S2I 构建器,并且留下了 .git 目录,您可以在应用程序代码目录中包含一个可执行的 .s2i/bin/assemble 脚本并添加到其中。

#!/bin/bash

mv /tmp/src/.git ./

/usr/libexec/s2i/assemble

这假设原始assemble 脚本位于/usr/libexec/s2i/ 的典型位置。

【讨论】:

  • 超越!
【解决方案2】:

冒着违背权威答案(字面意思)的风险,我发现我不需要自定义汇编脚本。事实上,.git 目录在 /tmp/src 中根本不可用。可能是我的情况有所不同,因为我正在做一个副本,例如:

s2i build file://$(pwd) --copy --keep-symlinks ${S2I_IMAGE} ${IMAGE_TO_BUILD}

在这种情况下,有一个正则表达式将.git 目录排除在复制之外(通过https://github.com/openshift/source-to-image/issues/457 的问题找到)。因此,就我而言,我不需要通过设置排除正则表达式来排除 .git 目录:

s2i build file://$(pwd) --exclude="" --copy --keep-symlinks ${S2I_IMAGE} ${IMAGE_TO_BUILD}

这样,无需更改汇编脚本,.git 目录被复制到汇编上下文中完全没有问题。

【讨论】:

    猜你喜欢
    • 2014-11-26
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 2020-11-10
    相关资源
    最近更新 更多