【问题标题】:Git pre-receive hook automatically run unit tests being pushed in the current refGit pre-receive hook 自动运行单元测试被推送到当前 ref
【发布时间】:2019-05-03 04:07:40
【问题描述】:

我的流程有问题,我设置了一个 pre-receive 挂钩来为分支 master 和 dev 运行单元测试,如下所示:

#!/bin/bash
while read oldrev newrev ref
do
        if [[ ${ref} = refs/heads/master ]];
        then
                BRANCH=master
                WORKING_DIR="/var/www/project/project_api"
        elif [[ ${ref} = refs/heads/dev ]]
        then
                BRANCH=dev
                WORKING_DIR="/var/www/project/project_api_dev"
        else
                echo "Ref $ref received. Will not run unit tests."
        fi
done

if (test "$BRANCH" != ""); then
        echo "Running Unit Tests..."
        cd "$WORKING_DIR"
        npm test
        rc=$?
        if [[ $rc != 0 ]] ; then
                echo "Unit Tests FAILED"
                echo "Push is REJECTED"
                exit $rc
        fi

        echo "Unit Tests PASSED"
fi

exit 0

使用此设置,如果其中一个单元测试(被推送)失败,我想拒绝推送。

问题在于它运行的是已经签出到工作目录$WORKING_DIR 的测试,而不是当前ref 中推送的测试。

我想在运行 npm 测试之前总是检查 tests 文件夹,但我不确定这是否是在推送之前自动运行单元测试的正确方法。

【问题讨论】:

    标签: git unit-testing githooks


    【解决方案1】:

    pre-receive hook 被调用...就在之前开始更新远程存储库上的引用。

    因此您的文件不会反映您推送的内容。

    您应该推送到一个中间“门”存储库,post-receveive 挂钩将:

    • 运行测试
    • 如果通过,则推送到实际的目标存储库
    • 如果失败,请发回电子邮件并重置目标分支

    【讨论】:

    • 让我确保我得到它正确,我应该git --work-tree=${WORKING_DIR}/build --git-dir=${GIT_DIR} checkout ${BRANCH} -f 然后我在build 目录中运行测试,如果它通过我删除构建并推送到${WORKING_DIR} 根目录?
    • @AliElKhateeb 这可能是该概念的实现,是的:中间步骤。但我不确定这是否会检查正确的内容,如果在预接收挂钩级别完成。
    猜你喜欢
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 2023-03-11
    • 2023-04-08
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 2012-08-16
    相关资源
    最近更新 更多