如果没有更改,Git提交将导致构建失败,但退出代码仍然为0



在编写GitHub操作以提交构建工件并将其推送到另一个repo时,我遇到了git push的奇怪行为,我不理解。

这是我的构建脚本:

#!/bin/sh
# Exit immediately if a command exits with a non-zero status:
set -e
### Creation of artifacts happens here. They are written to ${GITHUB_WORKSPACE}/output/
echo "Cloning $artifacts_repo ..."
git clone $artifacts_repo "${GITHUB_WORKSPACE}/artifacts_repo"
echo "DEBUG: exit code of 'git clone' operation:"
echo $?
echo "Moving generated files to ${GITHUB_WORKSPACE}/artifacts_repo/auto-generated ..."
mkdir -p "${GITHUB_WORKSPACE}/artifacts_repo/auto-generated"
yes | cp --recursive --force "${GITHUB_WORKSPACE}/output/." "${GITHUB_WORKSPACE}/artifacts_repo/auto-generated"
echo "Committing artifacts ..."
cd "${GITHUB_WORKSPACE}/artifacts_repo"
git status
echo "DEBUG: exit code of 'git status' operation:"
echo $?
git add .
echo "DEBUG: exit code of 'git add' operation:"
echo $?
git commit -m"Auto-generated artifacts"
echo "DEBUG: exit code of 'git commit' operation:"
echo $?
echo "Pushing artifacts ..."
git push
echo "DEBUG: exit code of 'git push' operation:"
echo $?

如果要提交更改,则脚本将成功运行。所有出口代码均为0

如果没有要提交的更改(因为生成的文件与repo中已经存在的文件匹配(,则脚本在git commit操作时失败,而不打印退出代码。另外,其他退出代码仍然是0

我启用了set -e,以使构建在第一个非零退出代码时失败。

如果我删除set -e来调试它,脚本会运行到底,但即使没有提交更改,git commit的退出代码也是0。那么,为什么构建会失败呢?

这是禁用set -e时的输出:

Cloning https://***@github.com/my-org/my-repo.git ...
Cloning into '/github/workspace/artifacts_repo'...
DEBUG: exit code of 'git clone' operation:
0
Moving generated files to /github/workspace/artifacts_repo/auto-generated ...
Committing artifacts ...
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
DEBUG: exit code of 'git status' operation:
0
DEBUG: exit code of 'git add' operation:
0
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
DEBUG: exit code of 'git commit' operation:
0
Pushing artifacts ...
Everything up-to-date
DEBUG: exit code of 'git push' operation:
0

有人知道为什么会发生这种事吗?Git有什么问题吗?这与GitHub操作的工作方式有关吗(我是新手(?我做错什么了吗?

git commit -m"Auto-generated artifacts"
echo "DEBUG: exit code of 'git commit' operation:"
echo $?

echo$?表示先前执行的命令的状态代码。所以这意味着我们已经执行了CCD_ 10,所以状态代码为零。

当启用set-e时,它会监视每个命令的执行,以便一旦git commit给出非零代码,构建就会失败。同样的逻辑适用于所有的echo$?声明。

希望它是清楚的。

相关内容

最新更新