如何检测 GIT 服务器是否处于活动状态?
How can I detect if a GIT server is active?
服务器:Atlassian Bitbucket v4.14.3(又名 Stash)
客户端:git 版本 2.17.1(在 Linux Ubuntu 18LTS 上)
检测 GIT 服务器是否存在并提供服务的最佳方法是什么?
用例 1:Bitbucket 服务器每天停机以执行完整备份。在备份期间,它不响应请求,任何 'git clone and git push' 命令都会失败(我们从脚本发出这些命令)。
在发出 'clone' 或 'push' 之前,我想知道 GIT 服务器是否在生产中以避免错误。
用例 2:Bitbucket 服务器有时会宕机(升级、维护等)。和上面的情况类似,我想在发出'clone'或'push'之前知道它是否在生产中以避免错误。
Bitbucket 服务器有一些 API 来检查吗?
git 客户端是否有命令来检查它? (我更喜欢这个选项,以避免对服务器的依赖)
我试过 'git ls-remote -h ssh:/reponame --exit-code' ,但我想知道是否有更好的选择,我不必提供存储库名称。
您可以发出几乎任何您喜欢的 API 命令来检查服务是否已启动。例如,您可以 get info for the current user。这并不意味着 API 稍后仍会出现。
"Check then do" 不起作用。考虑以下场景。
- 检查 Bitbucket 是否启动。
- 起来了!
- Bitbucket 出现故障。
- 发出 Bitbucket 命令。
- 命令失败。
这是计算机科学中的一个常见主题。其他示例包括...
- 检查文件是否存在。
- 存在!
- 文件被删除。
- 尝试打开文件。
- 打开失败。
您想检查是否启动并一次性发出命令,称为"atomic",因为这两个操作不能分开。对于文件,您只需尝试打开文件并查找错误。对于 Git,发出 git
命令并检查它是否成功。
对于可能需要多个命令的整个过程,最安全的做法是编写一个健壮的系统,可以处理过程中任何时候的错误。这意味着能够自动重试失败的网络调用,例如 git pull
,并能够重新启动在中间失败的进程。
这是我最终处理它的方式(请注意,根据下面的评论,最好的方法是在发出所需的 git 命令后检查这些错误,以使其成为原子操作):
1- 使用存储库名称执行 'git ls-remote',并检测它是否 returns 为 0(没有问题)或其他。我得到的 'something else' 值为 128。
2a- 如果 'ls-remote' 返回的不是零,请确保服务器可访问。寻找 'Git server not found:'
3b- elif,检查 GIT 服务器是否处于维护模式。因为我的服务器是 Bitbucket,所以我寻找 'Bitbucket is currently unavailable'。
3c- elif,检查 GIT 服务器是否正在重启。我在重启期间得到 'Connection refused'。
3d-elif,确认存储库存在。 'Repository not found' 的 stderr 给出了提示。
3- 执行所需的 git 命令(然后检查错误)。
服务器:Atlassian Bitbucket v4.14.3(又名 Stash) 客户端:git 版本 2.17.1(在 Linux Ubuntu 18LTS 上)
检测 GIT 服务器是否存在并提供服务的最佳方法是什么?
用例 1:Bitbucket 服务器每天停机以执行完整备份。在备份期间,它不响应请求,任何 'git clone and git push' 命令都会失败(我们从脚本发出这些命令)。 在发出 'clone' 或 'push' 之前,我想知道 GIT 服务器是否在生产中以避免错误。
用例 2:Bitbucket 服务器有时会宕机(升级、维护等)。和上面的情况类似,我想在发出'clone'或'push'之前知道它是否在生产中以避免错误。
Bitbucket 服务器有一些 API 来检查吗? git 客户端是否有命令来检查它? (我更喜欢这个选项,以避免对服务器的依赖)
我试过 'git ls-remote -h ssh:/reponame --exit-code' ,但我想知道是否有更好的选择,我不必提供存储库名称。
您可以发出几乎任何您喜欢的 API 命令来检查服务是否已启动。例如,您可以 get info for the current user。这并不意味着 API 稍后仍会出现。
"Check then do" 不起作用。考虑以下场景。
- 检查 Bitbucket 是否启动。
- 起来了!
- Bitbucket 出现故障。
- 发出 Bitbucket 命令。
- 命令失败。
这是计算机科学中的一个常见主题。其他示例包括...
- 检查文件是否存在。
- 存在!
- 文件被删除。
- 尝试打开文件。
- 打开失败。
您想检查是否启动并一次性发出命令,称为"atomic",因为这两个操作不能分开。对于文件,您只需尝试打开文件并查找错误。对于 Git,发出 git
命令并检查它是否成功。
对于可能需要多个命令的整个过程,最安全的做法是编写一个健壮的系统,可以处理过程中任何时候的错误。这意味着能够自动重试失败的网络调用,例如 git pull
,并能够重新启动在中间失败的进程。
这是我最终处理它的方式(请注意,根据下面的评论,最好的方法是在发出所需的 git 命令后检查这些错误,以使其成为原子操作):
1- 使用存储库名称执行 'git ls-remote',并检测它是否 returns 为 0(没有问题)或其他。我得到的 'something else' 值为 128。
2a- 如果 'ls-remote' 返回的不是零,请确保服务器可访问。寻找 'Git server not found:'
3b- elif,检查 GIT 服务器是否处于维护模式。因为我的服务器是 Bitbucket,所以我寻找 'Bitbucket is currently unavailable'。
3c- elif,检查 GIT 服务器是否正在重启。我在重启期间得到 'Connection refused'。
3d-elif,确认存储库存在。 'Repository not found' 的 stderr 给出了提示。
3- 执行所需的 git 命令(然后检查错误)。