clone_repo() 函数
clone_repo() 函数旨在克隆一个 Git版本库,可选择包括子模块,支持分支和提交 ID 选择,以及处理连接超时的重试机制。 它还会对错误信息进行安全处理。
参数:
repository
: 要克隆的 Git 仓库的 URL。git_branch
: 要签出的分支。 如果未提供,则使用默认分支。directory_name
:将克隆版本库的目录名称。token_path
: 包含 Git 身份验证令牌的文件路径。use_submodules
:(可选)设置为 "1 "可克隆子模块,默认为 "0"。commit_id
:(可选)克隆后要重置的特定提交 ID。
功能实施:
Initialize Variables
: 设置环境变量和默认值。Token and User Validation
: 确保验证详细信息可用。Clone Repository
: 克隆版本库,可选择重试机制。Submodule Handling
: 如果启用了子模块,则设置必要的环境并克隆子模块。Checkout Branch or Commit
: 签出指定的分支或提交。Finalize and Export
: 设置环境变量并打印状态信息。
返回值
clone_repo
函数完成后会设置多个环境变量/属性:
git_branch
: 签出的分支。git_commit
: 重置版本库的提交 ID。directory_name
: 克隆版本库的目录。submodules_status
: 子模块的状态(如果有)。
功能调用:
clone_repo <repo url e.g. https://github.ibm.com/owner/repo.git> <branch e.g. master> <repo directory e.g. repo_directory> <token path e.g. /path/to/token> <if submodules to be used e.g. 1> <commit id e.g. abcd1234>
子模块克隆
- 如果
USE_SUBMODULES
设置为1
,脚本就会检查管道环境变量,以确定是否要克隆子模块以及如何配置子模块。 - 子模块克隆只支持在
.gitmodules
文件中使用HTTP(S)
协议声明的子模块。 脚本依赖于所提供的 Git 身份验证令牌,该令牌在HTTP(S)
URL 中使用。 使用其他协议声明的子模块(如SSH
)将无法无缝运行,因为脚本未配置为处理 SSH 密钥或其他身份验证方法。 - 变量
opt-in-clone-submodules
和opt-in-clone-remote-submodules
在决定脚本如何处理子模块的克隆方面起着至关重要的作用。 opt-in-clone-submodules
:控制是否在版本库克隆过程中克隆子模块。- 如果
opt-in-clone-submodules
设置为1
,脚本就会在 Git 克隆命令中包含--recurse-submodules
参数,指示 Git 初始化和更新版本库中的每个子模块。 - 如果未设置或设置为其他值,子模块将不会被克隆,脚本将仅克隆主版本库。
- 如果
opt-in-clone-remote-submodules
:扩展了opt-in-clone-submodules
的行为,允许从远程版本库克隆子模块,而不是使用父版本库中指定的本地路径。- 如果
opt-in-clone-remote-submodules
设置为1
,脚本就会在--recurse-submodules
旁边添加--remote-submodules
参数。 这样,Git 就能从远程源获取并克隆子模块,而不是仅仅依赖父版本库中指定的路径。 - 如果未设置或设置为其他值,子模块将使用父版本库的
.gitmodules
文件中提供的默认本地路径克隆。
- 如果
重要说明:
Retry Mechanism
:如果出现“连接超时”错误,脚本会重试克隆命令,最多 5 次,两次重试之间有 2 秒钟的延迟。Error Handling
:如果出现身份验证或其他重要错误,脚本将以非零状态退出,并提供解决常见问题的指导。Error Message Sanitisation
:脚本会对错误信息进行消毒,以确保敏感信息(如身份验证令牌)不会在输出中暴露。 使用 sed 将 URL 的敏感部分替换为占位符。