gifts2017

Автоматизируем процедуру обновления xddTestRunner с помощью Jenkins

Опубликовал Андрей Комар (akomar) в раздел Программирование - Практика программирования

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

Для тестирования мы используем замечательный 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", которая позволяет запускать наш скрипт сравнения файлов.

Раздел Build

Настройка 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-сервере).

Сообщение в Slack-чат

Вот как-то так. Буду рад конструктивной критике. Оригинал статьи.

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Armando Armando (Armando) 06.11.14 22:29
Ветка master редко обновляется, не знаю что вы там не успеваете))) Но за пример спасибо.
2. Андрей Комар (akomar) 06.11.14 22:37
Ну я использую develop, она обновляется довольно часто)
3. Артур Аюханов (artbear) 07.11.14 01:01
Лень и Автоматизация наше все. Молодец!
amon_ra; dyr89; awa; Evil Beaver; +4 Ответить 1
4. Андрей Комар (akomar) 07.11.14 01:23
5. Максим Кузнецов (Makushimo) 07.11.14 07:13
Нифига не понятно, о чем тут кулуарят. -)))))
но плюс поставлю.

на всякий случай.
6. Евгений Сосна (pumbaE) 07.11.14 10:02
(5) Makushimo, говорим про автоматизацию. Сами 1с-ники вроде как всех автоматизируют, а про себя забывают. Более интересный вариант с чем в жизни встречаешься вот такая http://infostart.ru/public/311163/ автоматизация. Даже если откинуть использование git , а просто пройтись по всем файлам в папке и обновить по версиям обработка - это уже шаг в перед.
7. Максим Жохов (ZhokhovM) 07.11.14 17:09
Еще моя такая http://infostart.ru/public/290025/, может кому понадобится.
8. Андрей Овсянкин (Evil Beaver) 07.11.14 19:09
И не забывайте, что можно не только пользоваться, но и контрибьютить (то бишь, вносить вклад) в xUnitFor1C
9. Петр Базелюк (pbazeliuk) 07.11.14 22:38
(8) Evil Beaver, ну как бы мы с Андреем внесли весомый вклад в разработку xUnitFor1C, полностью переделали загрузку тестов для УФ, добавили поддержку интерфейса "Такси". Когда будем посвободней сделаем что-то еще :)
10. Armando Armando (Armando) 07.11.14 22:55
Есть и такие, кто вклад внес, а пользоваться так и не начал))
Как в анекдоте про чукчу, который таксиста обманул - деньги заплатил, а сам не поехал)
11. Артур Аюханов (artbear) 07.11.14 23:51
(10) Поправь на "а пользоваться так и НЕ начал", иначе звучит странно :)
Генератор тестовых данных доработал, а сам тесты не юзаешь :(
12. Armando Armando (Armando) 08.11.14 00:00
(11) artbear, спасибо исправил. Как обычно пишу и отправляю не глядя)
Тесты пришлось отложить. Дела разгребем и вернусь к ним.
13. Андрей Овсянкин (Evil Beaver) 12.11.14 22:55
(9) pbazeliuk, я не про вас, вы-то как раз супер ;). Это скорее к остальным участникам беседы призыв.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа