git pre-receive hook - получение новейшего кода

Я пытаюсь написать pre-receive hook для git, который будет извлекать последнюю версию отправляемого кода и запускать для него модульные тесты. Мой код ниже, но когда доходит до «git checkout $ newrev», я получаю:

удаленный: фатальный: ссылка - это не дерево: 188de39ca68e238bcd7ee9842a79397f39a5849e

Что мне нужно сделать, чтобы проверить отправляемый код до того, как произойдет получение?

#!/bin/bash
while read oldrev newrev refname
do
  echo "Preparing to run unit tests for $newrev"
  TEST_DIR=/opt/git/sommersault-push-tests/sommersault

  # check out this version of the code
  unset GIT_DIR
  echo $refname
  cd $TEST_DIR
  git checkout $newrev

  ...do more stuff...
done

person Maria Gullickson    schedule 20.08.2012    source источник
comment
Ты уверен, что сможешь это сделать? Как он может получить код проверки, который не получил? Я бы подумал, что вам нужно сделать хук после получения, а затем откатить (сбросить), если тесты не пройдут.   -  person wadesworld    schedule 20.08.2012
comment
Думаю, @wadesworld дал вам правильный совет. Я мог бы просто указать эту ссылку как решение аналогичной проблемы: stackoverflow.com/questions/2087216/   -  person Nicolás Ozimica    schedule 20.08.2012
comment
Ах хорошо. Я только начинал просматривать этот пост - codeutopia.net/blog/2011/06/30/ - что, кажется, подразумевает, что код можно получить. (Он использует архив git, а не git checkout, хотя я не смог заставить его работать.) Но логично, что у него еще не было доступа к коду.   -  person Maria Gullickson    schedule 20.08.2012
comment
Собственно, я беру это обратно. На странице руководства githooks указано This hook is invoked by git-receive-pack on the remote repository, что указывает на то, что это происходит после получения нового содержимого. Обратите внимание, однако, что он получает строку ввода для каждой обновляемой ссылки, но пока не уверен в причине ошибки ..   -  person wadesworld    schedule 21.08.2012


Ответы (2)


Несмотря на то, что другие люди предлагали, коммит уже получен, но еще не написан.

Я бы даже сказал, что хуки предварительного приема лучше подходят для развертывания этих хуков после получения. Вот почему Heroku использует для развертывания хуки предварительного приема. Если ваше развертывание не происходит, вы можете просто отклонить фиксацию.

Вот код, который поможет вам:

#!/bin/bash
while read oldrev newrev refname
do
    echo "Preparing to run unit test for $newrev ... "
    git archive $newrev | tar -x -C /tmp/newrev
    cd /tmp/newrev

    echo "Running unit test for $newrev ... "
    # execute your test suite here

    rc=$?

    cd $GIT_DIR
    rm -rf /tmp/newrev
    if [[ $rc != 0 ]] ; then
        echo "Push rejected: Unit test failed on revision $newrev."
        exit $rc
    fi
done

exit 0
person codingjoe    schedule 04.03.2014

Я использую этот сценарий на основе этого как это сделать. Выполняет phpunit только в выбранных ветках

#!/bin/sh

while read oldrev newrev refname
do
    # Only run this script for the dev branch. You can remove this
    # if block if you wish to run it for others as well.
    if [ $refname = "refs/heads/dev" ] ; then
        # Anything echo'd will show up in the console for the person
        # who's doing a push
        echo "Preparing to run phpunit for $newrev ... "

        # Since the repo is bare, we need to put the actual files someplace,
        # so we use the temp dir we chose earlier
        mkdir -p /tmp/$refname
        git archive $newrev | tar -x -C /tmp/$refname

        echo "Running phpunit for $newrev ... "

        # This part is the actual code which is used to run our tests
        # In my case, the phpunit testsuite resides in the tests directory, so go there
        cd /tmp/$refname
        composer install > /dev/null

        # And execute the testsuite, phpunit will send a response error if tests fail
        phpunit --group no-db

        # Clean temp dir
        rm -rf /tmp/$refname
    fi
done

# Everything went OK so we can exit with a zero
exit 0

Настроить по желанию ...

person Quim Calpe    schedule 01.11.2014