Для локальной проверки ваших решений можно пользоваться следующей командой:
$ bash .test/taskX/validateгде X - номер соответствующего задания.
В директории src находится исходный код приложения wordcount, написанного на языке Си,
для подсчета количества слов в указанных файлах или во входном потоке STDIN.
Также в корне репозитория находится конфигурационный файл config.json, в котором указано
название приложения (которое может отличаться от названия исходного файла) и версия приложения.
Предполагается, что эти значения должны явно передаваться при компиляции приложения с помощью
директивы препроцессора -D,
переопределяя тем самым объявления NAME и VERSION из src/wordcount.c.
Требуется автоматизировать процесс сборки приложения с помощью системы сборки make с учетом следующих требований:
- Итоговый артефакт сборки (скомпилированное приложение) должен находиться в директории
buildи называться в соответствии со значениемname, указанном в config.json; - При компиляции приложения необходимо определить значения объявлений
NAMEиVERSIONв соответствии со значениямиnameиversion, указанными в config.json; - При изменении исходного кода приложения или
config.json, приложение должно перекомпилироваться; - При отсутствии изменений, перекомпиляции не должно происходить;
- В качестве цели по умолчанию следует использовать
стандартную цель
all; - Также необходимо объявить цель
clean, которая производит очистку артефактов сборки.
Important
Для получения значений из config.json следует воспользоваться стандартной утилитой jq,
которую можно установить следующей командой на Ubuntu:
$ sudo apt install jqС помощью этой утилиты можно получить значения name и version следующими командами:
$ jq -r .name config.json
wordcount
$ jq -r .version config.json
1.0.0Пример использования
$ make
...
$ ./build/wordcount
wordcount version 1.0.0
$ make
make: Nothing to be done for 'all'.
$ make cleanTip
Настоятельно рекомендуется ознакомиться со следующими главами из из официальной документации:
В директории test находятся тесты с расширением .txt и ожидаемый вывод
с расширением .expected для приложения wordcount, собранного в предыдущем задании.
Требуется автоматизировать процесс тестирования приложения с помощью системы сборки make с учетом следующих требований:
- Необходимо проверить соответствие всех вывода приложения на всех тестах в директории test;
- В случае несоответствия вывода на каком-либо тесте, нужно вывести разницу ожидаемого вывода с полученным, и завершить тестирование с ошибкой;
- В случае успешного прохождения всех тестов, никакого вывода в консоль не должно происходить;
- Тестирование должно неявно вызывать сборку приложения, если она еще не произошла;
- Процедура тестирования не должна оставлять после себя никаких лишних файлов в репозитории или каким-либо образом изменять его содержимое;
- В качестве цели следует использовать
стандартную цель
check.
Пример использования
$ make
...
$ make checkTip
Рекомендуется ознакомиться со следующими разделами документации:
Для сборки и исполнения приложения может требоваться определенное окружение или зависимости.
В случае приложения wordcount его сборка требует установленной в системе утилиты jq
для получения конфигурационных значений из config.json.
Требуется унифицировать окружение сборки и тестирования приложения wordcount с помощью
Docker.
Необходимо создать Dockerfile с учетом следующих требований:
- Сборка Docker-образа должна запускать тесты из предыдущего задания и заканчиваться ошибкой, если тесты не прошли;
- При запуске образа должно запускаться собранное приложение;
- В итоговом образе должно находиться полное содержимое репозитория;
- Рабочая директория в контейнере должна быть выставлена в корень репозитория.
Пример использования
$ docker build --network host -t wordcount .
[+] Building ...
$ docker run --rm -i wordcount --version
wordcount version 1.0.0Последним шагом является создание системы Continuous Integration (CI), для автоматической верификации (сборки и тестирования) каждого изменения в репозитории приложения.
Требуется создать workflow в
GitHub Actions,
который будет автоматически запускать сборку и тестирование приложения с помощью make
на каждый push и Pull request в main ветку.
Tip
По умолчанию GitHub Actions исполняются на выделенной виртуальной машине, на которой установлены многие стандартные зависимости и системы сборки для различных языков программирования.
В частности, там предустановлены все необходимые зависимости для сборки
приложений на Си с помощью make, а также уже установлена утилита jq.
Таким образом, в нашем случае для GitHub Actions не требуется производить
сборку в Docker окружении, что значительно ускоряет сборку и тестирование.