Информация о пулл-риквесте в тестах Тревиса


Так сложилось, что этой осенью я читал курс по веб-разработке студентам Факультета управления и информационных технологий СПбГПУ. Домашние и курсовые работы сдаются в виде пулл-риквестов на гитхабе, это самое удобное из всего, что только можно придумать. А после того, как я добавил простейшие тесты в Тревисе, стало совсем хорошо.

Одна из неудобных вещей в учебном процессе — выдача разных заданий на курсовую работу разным студентам. Очень не хотелось делать это вручную. Тут в голову пришла мысль — а ведь у каждого студента есть своя учётка на гитхабе, берём первую букву ника, получаем номер символа в кодовой таблице и получаем остаток от деления на количество заданий — вот нам и номер задания (естественно, от нуля %).

Дальше нужно проверить в Тревисе, что задание выбрано верно. Здесь пришлось немного пораскинуть мозгами. Дело в том, что Тревис поступает следующим образом — клонирует репозиторий в который сделал пулл-риквест и потом делает fetch ветки с пулл-риквестом. Никакой информации о пользователе, который создал запрос тревис не получает. Но посмотрим, что мы всё-таки можем узнать.

В виртуалке, на которой прогоняются тесты есть набор переменных окружения. Из них нам интересны TRAVIS_REPO_SLUG и TRAVIS_PULL_REQUEST. Первая — это название тестируемого репозитория, а вторая — номер пулл-риквеста (или false, если тестируются основные ветки репозитория.

Зная эти две переменные задача решается элементарно: отправляем гет-запрос в api гитхаба и разбираем пришедший JSON. Получем поле result.user.login — и проверяем, правильно ли студент выбрал себе задание. Нет? Ну всё, фейлим тест, дальше смотреть нет смысла. Вот вам код скрипта, который делает эту проверку.

Слава переменным окружения и открытым апи!