Для тестирования мы используем замечательный open source инструмент xUnitFor1C. Он позволяет запускать тесты не только интерактивно, но и в пакетном режиме, заблаговременно сохраняя результаты в xml–файл, который понимает плагин JUnit для Jenkins. Все бы ничего, но разработка в проекте идет настолько активно, что редко успеваешь вовремя обновляться, то ли из-за большой лени, то ли из-за большого потока текучки. Вот я и решил немного автоматизировать процесс обновления обработки xddTestRunner.epf. Ну а чего, Jenkins умный, пускай сам о себе позаботится.
Для успешного выполнения задания нам понадобятся следующие инструменты: непосредственно сам Jenkins (предварительно сконфигурированный для работы с git), и установленный Python версии 3.4 и выше. Наш план таков:
Jenkins получает новые файлы из репозитория. После их получения специальный скрипт на Python сравнивает уже существующий файл и новый. Если есть различия – свежая версия xddTestRunner подменяет старую, а пользователям в slack-чат отправляется уведомление об обновлении файла из ссылкой на новую версию.
Давайте посмотрим на настройки Jenkins. Здесь ничего особенного. В разделе Source Code Managment установлена ссылка на репозиторий и ветка, которую будем загружать.
Следующий раздел, который нам необходимо заполнить – Build. В нем мы должны заполнить секцию "Execute Windows batch command", которая позволяет запускать наш скрипт сравнения файлов.
Настройка Jenkins окончена. Давайте рассмотрим наш скрипт, который будет сравнивать, подменять файлы и отправлять сообщения в Slack.
Первая важная функция – отправка оповещения в чат. Взял я ее отсюда. Приведем листинг кода.
def get_connection(organization): return http.client.HTTPSConnection('{0}.slack.com'.format(organization)) def get_url(token): return '/services/hooks/incoming-webhook?token={0}'.format(token) def post_message(connection, url, urltofile): headers = {'Content-Type': 'application/json'} color = 'good' text = 'Внимание вышла новая версия обработки xddTestRunner <' + urltofile + '|Скачать>.' message = { 'username': 'TestRunnerChecker', "channel": "#1c", "icon_emoji": ":ghost:", 'fallback': text, 'pretext': text, 'color': color } connection.request('POST', url, json.dumps(message), headers) response = connection.getresponse() print(response.read().decode())
Процедура сравнения файлов и копирования файлов – совсем простая задача.
if not filecmp.cmp(namespace.repofile, namespace.destfile): shutil.copy(namespace.repofile, os.path.dirname(namespace.destfile)) send_message(URL)
В результате мы получаем вот такое симпатичное сообщение(файл автоматически закачивается в нужный каталог на build-сервере).
Вот как-то так. Буду рад конструктивной критике. Оригинал статьи.