Получаем статистику по git-репозиторию в разрезе разработчиков

13.03.23

Разработка - DevOps и автоматизация разработки

Итак! Представим, что наступил момент, когда разработка через исходный код реализована на предприятии в полном объеме. Мы разрабатываем в EDT или конфигураторе (но выгружаем конфигурацию в исходный код), версионируем внешние отчеты и обработки и расширения, собираем релизы, проверяем код статическим анализом, в разработке царит гармония и мир. Красота! Но менеджерам этого мало, всегда хочется чего-то еще, и вот мне прилетает задача - дай статистику по вкладу в код каждого разработчика.

Введение

Итак! Представим, что наступил момент, когда разработка через исходный код реализована на предприятии в полном объеме. Мы разрабатываем в EDT или конфигураторе (но выгружаем конфигурацию в исходный код), версионируем внешние отчеты и обработки и расширения, собираем релизы, проверяем код статическим анализом, в разработке царит гармония и мир. Красота!

Но менеджерам этого мало, всегда хочется чего-то еще, и вот мне прилетает задача - дай статистику по вкладу в код каждого разработчика.

Задача решаема - есть исходный код, есть репо с историей, значит ничто не может помешать получить нужную информацию.

Сразу скажу, что в эта статья посвящена только техническому аспекту получения статистики работы программистов. Моральную сторону не рассматриваю, считаю, что оценивать разработчика по количеству строк кода непродуктивно и вообще опасно. Статистика работы программиста может использоваться только как один из параметров, не самый главный!

Поиск по ключевым словам git+stat на github дал множество репозиториев с программами на разных языках, помогающих оформить профиль, специализированных на github, среди которых почти затерялся репо git-quick-stats.

 

Предоставлю слово великолепному README.md этого репо (перевод мой):

 

git-quick-stats — это простой и эффективный способ доступа к различной статистике в репозитории git.

Любой репозиторий git может содержать массу информации о коммитах, участниках и файлах. Извлечение этой информации не всегда просто, в основном потому, что существует огромное количество опций для огромного количества команд git — не думаю, что есть хоть один человек, который знает их все. Наверное, даже сам Линус Торвальдс не знает их:)

Давайте посмотрим, как выглядит статистика, получаемая git-quick-stats. Для получения этих картинок я обработал репозиторий самого этого приложения git-quick-stats.

 

git-commit-per-author

git-commit-per-year

 

Интересно, правда?

Этот инструмент представляет из себя исполняемый sh-скрипт, использующий набор линуксовых утилит:

  • awk
  • basename
  • cat
  • column
  • echo
  • git
  • grep
  • head
  • printf
  • seq
  • sort
  • tput
  • tr
  • uniq

Соответственно, он будет работать в линукс "из коробки", либо в Windows с помощью специальных прокладок. В качестве "прокладок" может быть или WSL (возможность запускать нативные линуксовые команды), либо так называемый git bash - специальная командная оболочка с встроенными линуксовыми командами.

 

Установка

В deb-дистрибутивах линукс (Debian, Ubuntu и остальные) команда установки очень проста:

apt install git-quick-stats

В остальных дистрибутивах нужно склонировать репо и установить приложение:

git clone https://github.com/arzzen/git-quick-stats.git && cd git-quick-stats
sudo make install

Для Windows, если мы собираемся пользоваться git bash можно просто склонировать репо в нужный каталог:

git clone https://github.com/arzzen/git-quick-stats.git

 

Использование

Мне нравится git-клиент GitExtensions, на его примере покажу, как я запускаю это приложение. В GitExtensions открываю локальный репозиторий (в данном примере сам склонированный репо git-quick-stats), перехожу во вкладку Console.

 

gitextensions

 

Консоль - это и есть git bash - специальная командная оболочка с возможностью выполнения линуксовых команд.

В консоли пишу путь к файлу скрипта git-quick-stats. Репо я склонировал в каталог Git на диске C, значит путь будет следующим:

C:/GIT/git-quick-stats/git-quick-stats

 

gitextensions-console

 

И нажимаю на Enter

Запускается приложение в интерактивном режиме:

 

interactive-menu

 

Нужно вписать номер нужной функции и нажать Enter

 

contribution-stats

 

Это все очень хорошо, но как автоматизировать все это?

git-quick-stats может работать не только интерактивно, но и в режиме скрипта. Например, то же самое, что мы получили интерактивно выше, можно получить командой:

C:/GIT/git-quick-stats/git-quick-stats -T

 

Статистика скриптом

Ну и прекрасно. Задача решена. Есть замечательный ключ команды, который позволяет выгружать данные сразу в csv, а значит напрямую в эксель.

C:/GIT/git-quick-stats/git-quick-stats -V

Правда тут приходится ответить еще на интерактивный вопрос - какая ветка?

Which branch? master

И вот мы получаем экселеподобный текст:

$ C:/GIT/git-quick-stats/git-quick-stats -V

Which branch? master

author,insertions,insertions_per,deletions,deletions_per,files,files_per,commits,commits_per,lines_changed,lines_changed_per

 Jess <jessachandler@gmail.com>,31,1%,1,0%,1,0%,1,1%,32,0%

 Lukas Mestan <lukas.mestan@hyperia.sk>,88,2%,51,2%,7,3%,7,4%,139,2%

 Pawaer <pawaer@t-online.de>,1,0%,1,0%,1,0%,1,1%,2,0%

 Jorge Maldonado Ventura <jorgesumle@freakspot.net>,3,0%,3,0%,1,0%,1,1%,6,0%

 ...

Тут у нас есть автор (author), количество вставленных строк (insertions), удаленных строк (deletions), измененных файлов (files), коммитов (commits), измененных строк (lines_changed), также в колонках с суффиксом _per выведены эти же значения в процентах.

Уважаемые менеджеры, держите статистику.

И тут менеджеры говорят - нам нужна статистика по неделям. Мы планируем работу программистов по неделям, соответственно хотим видеть, статистику по программистам в разрезе недель.

Окей... git-quick-stats умеет работать с периодами. Период нельзя передать параметром, но зато можно указать в переменных окружения.

Для установки начала периода нужно выполнить команду, она устанавливает в переменную окружения _GIT_SINCE дату 2023-01-01:

export _GIT_SINCE=2023-01-01

Для установки окончания периода нужно выполнить команду, она устанавливает в переменную окружения _GIT_UNTIL дату 2023-01-31:

export _GIT_UNTIL=2023-01-31

Кроме того, нам пригодится команда указания ветки репозитория в переменной окружения:

export _GIT_BRANCH=master

Проверим установку переменной _GIT_BRANCH. Выполним сначала эту команду в консоли, а затем команду вывода статистики в csv формате. Запроса имени ветки больше нет:

    $ C:/GIT/git-quick-stats/git-quick-stats -V

    author,insertions,insertions_per,deletions,deletions_per,files,files_per,commits,commits_per,lines_changed,lines_changed_per

      Jess <jessachandler@gmail.com>,31,1%,1,0%,1,0%,1,1%,32,0%

      Lukas Mestan <lukas.mestan@hyperia.sk>,88,2%,51,2%,7,3%,7,4%,139,2%

      Pawaer <pawaer@t-online.de>,1,0%,1,0%,1,0%,1,1%,2,0%

     ...

Итак, напишем скрипт, получающий статистику по репозиторию в разрезе недель. Скрипт будем писать на православном OneScript (а как иначе, я же программист 1С все-таки).

Но как из скрипта запустить git bash? Мы же запускали специальную консоль для работы с git-quick-stats, вряд ли можно указать oscript, чтобы он выполнил команду из git bash...

Оказывается, можно.

У oscript есть библиотека 1commands, библиотека для упрощения работы c запуском различных приложений и командных файлов. В этой библиотеке есть одна очень интересная возможность - запуск командного файла.

Для PowerShell это выглядит так:

КомандныйФайл = Новый КомандныйФайл;
КомандныйФайл.УстановитьПриложение("C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe");
КомандныйФайл.Создать("",".ps1");
КомандныйФайл.ДобавитьКоманду("Get-Help");
Сообщить(КомандныйФайл.ПолучитьТекстФайла());
КодВозврата = КомандныйФайл.Исполнить();

Мы же можем сделать точно то же самое и для git bash - создаем командный файл, только в качестве приложения установим "C:\Program Files\Git\bin\bash.exe"

Для использования библиотеки в начале скрипта укажем волшебную директиву:

#Использовать 1commands

И конечно же, если библиотека еще не установлена в системе, установим ее:

opm install 1commands

И затем сформируем и выполним командный файл:   

    КомандныйФайл = Новый КомандныйФайл;
    КомандныйФайл.УстановитьПриложение("C:\Program Files\Git\bin\bash.exe");
    КомандныйФайл.УстановитьКодировкуВывода(КодировкаТекста.UTF8);
    КомандныйФайл.Создать("",".sh");
    КомандныйФайл.ДобавитьКоманду(СтрШаблон("export _GIT_SINCE=""""%1""""", Формат(НачалоПериода, "ДФ=yyyy-MM-dd")));
    КомандныйФайл.ДобавитьКоманду(СтрШаблон("export _GIT_UNTIL=""""%1""""", Формат(КонецПериода, "ДФ=yyyy-MM-dd")));
    КомандныйФайл.ДобавитьКоманду("export _GIT_BRANCH=master");
    КомандныйФайл.ДобавитьКоманду("cd Путь/К/Анализируемому/Репо");
    КомандныйФайл.ДобавитьКоманду("C:/GIT/git-quick-stats/git-quick-stats -V");
    КодВозврата = КомандныйФайл.Исполнить();
    Вывод = КомандныйФайл.ПолучитьВывод();

Здесь еще пришлось добавить установку кодировки вывода, так как без нее русские имена разработчиков превращались в крякозябры.

Ну а сделать цикл по неделям и распарсить полученный вывод статистики - дело техники.

Общая логика скрипта такова - создаем таблицу значений, куда положим строки с данными статистики. Проходим циклом по нужным периодам. Формируем данные статистики и кладем полученные строчки в общую таблицу. Сохраняем получившуюся таблицу как обычный текстовый файл с разделителями в csv формате.

Приведу листинг функции сохранения таблицы значений в csv. Функция универсальная, может пригодиться не только тут.

    Процедура ЗаписатьТаблицуЗначенийНаДиск(ТаблицаЗначений, ИмяФайла)

        МассивСтрок = Новый Массив;
        МассивОписанияКолонок = Новый Массив;
        Для каждого Колонка Из ТаблицаЗначений.Колонки Цикл
            МассивОписанияКолонок.Добавить(Колонка.Имя);    
        КонецЦикла;

        МассивСтрок.Добавить(СтрСоединить(МассивОписанияКолонок, ";"));

        Для Каждого Строка Из ТаблицаЗначений Цикл

            ОписаниеСтроки = Новый Массив;
            Для каждого Колонка Из ТаблицаЗначений.Колонки Цикл
                ОписаниеСтроки.Добавить(Строка[Колонка.Имя]);    
            КонецЦикла;
            МассивСтрок.Добавить(СтрСоединить(ОписаниеСтроки, ";"));

        КонецЦикла;

        ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла);
        ЗаписьТекста.Записать(СтрСоединить(МассивСтрок, Символы.ПС));
        ЗаписьТекста.Закрыть();

    КонецПроцедуры

Давайте еще заведем три параметра у скрипта - куда сохранять полученную статистику, какие репозитории обрабатывать (а их может быть несколько), и с какой даты обрабатывать.

Для работы с параметрами есть библиотека для oscript - cmdline. Операционная система передает аргументы командной строки в виде массива, а библиотека предоставляет интерфейс для доступа к нему:

    #Использовать cmdline
    Парсер = Новый ПарсерАргументовКоманднойСтроки();
    Парсер.ДобавитьИменованныйПараметр("-file");
    Парсер.ДобавитьИменованныйПараметр("-repo");
    Парсер.ДобавитьИменованныйПараметр("-since");
    Параметры = Парсер.Разобрать(АргументыКоманднойСтроки);
    ИмяФайла = Параметры["-file"];
    Репо = Параметры["-repo"];
    НачалоПериодаСтрокой = Параметры["-since"];

Теперь можно указывать параметры не в тексте скрипта, в командной строке:

oscript .\git-stat.os -file "my_stat.csv" -repo "C:/GIT/git-quick-stats" -since "20200101"

В репозитории git_stat вы можете найти полный текст скрипта - файл называется git-stat.os. Применить его у себя очень просто - проверьте, установлен ли у вас вообще oscript, git и git bash,  клонируйте git-quick-stats, проверьте правильность путей до утилиты git bash и git-quick-stats...

... и анализируйте.

 

Table

Git oscript statistic

См. также

DevOps для 1С DevOps и автоматизация разработки Программист Стажер Платные (руб)

Данный онлайн-курс (интенсив) предусматривает изучение процессов, инструментов и методик DevOps, их применение при разработке на платформе 1С. 

9000 руб.

20.06.2023    17345    1    3    

254

Тестирование QA DevOps и автоматизация разработки Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет Налоговый учет Платные (руб)

Готовые тестовые сценарии, предназначенные для регресс-тестирования функционала конфигурации после обновления типовым релизом. Сценарии проверяют интерактивное заполнение форм документов, справочников и результат проведения документов. Сценарии возможно использовать как для vanessa-automation, так и для СППР. Поддерживаемые версии конфигураций ERP2 и КА2: 2.5.16.115.

2220 руб.

04.07.2022    7550    32    1    

25

Тестирование QA DevOps и автоматизация разработки Программист Пользователь Платформа 1С v8.3 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Налоговый учет Платные (руб)

Автотесты 1С - готовые тестовые сценарии, предназначенные для регресс-тестирования функционала конфигурации после обновления типовым релизом. Сценарии проверяют интерактивное заполнение форм документов, справочников и результат проведения документов. Сценарий – feature-файл, разработанный с помощью vanessa-automation. Запуск сценария выполняется интерактивно с помощью vanessa-automation или с помощью vanessa-runner в CI-системах. Доступно тестирование тонкого клиента. Поддерживаемые версии конфигураций 1С:Бухгалтерия предприятие 3.0 и версии КОРП: 3.0.144.49.

1728 руб.

20.01.2022    7143    17    0    

11

1С-программирование DevOps и автоматизация разработки Групповая разработка (Git, хранилище) DevOps для 1С Программист Стажер Платформа 1С v8.3 Платные (руб)

Использования систем контроля версий — стандарт современной разработки. На курсе научимся использованию Хранилища 1С и GIT при разработке на 1С:Предприятие 8. Разберем подходы и приемы коллективной разработки, научимся самостоятельно настраивать системы и ориентироваться в них.

4900 руб.

29.06.2022    10332    83    4    

116

DevOps и автоматизация разработки Системный администратор Программист Руководитель проекта Платформа 1С v8.3 Конфигурации 1cv8 1С:Франчайзи, автоматизация бизнеса Платные (руб)

Подсистема «Управление сборкой GLI» предназначена для динамического формирования сборочных линий Gitlab и отслеживания процесса доработок систем на базе1С:Предприятия Позволяет упростить выпуск новых релизов системы, подготовить описание доработок системы. Интегрируется с GitLab API по событиям Push, Merge-request, Pipeline. Уведомляет пользователей о результатах сборки/тестирования сборочных конвейеров через СВ, либо при её недоступности или отсутствию по E-Mail. Поможет при отправке исправлений ошибок в общую базу тестирования, сформирует запросы на слияние в ветку версии только по протестированному и подтверждённому функционалу. Подсистема рассчитана исключительно на клиент - серверную архитектуру тестовых ИБ. Поддерживаемая версии СППР 2.0.4.15, платформа не ниже 8.3.17.1549, 2.0.7.3 / не ниже 8.3.21.1664, начиная с релиза 1.0.4.30 требуется платформа не ниже 8.3.23 рекомендуемый релиз 8.3.23.1997

7000 руб.

26.08.2022    11522    8    5    

32

Тестирование QA DevOps и автоматизация разработки Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Набор универсальных подсценариев для заполнения форм типовых объектов справочников и документов конфигураций ERP 2.5 и КА 2.5. Сценарии представляют собой feature-файлы для vanessa-automation с тегом @exportscenarios. Используются для разработки функциональных сценариев.

1500 руб.

26.01.2023    3468    6    0    

3

Групповая разработка (Git, хранилище) Программист Стажер Бесплатно (free)

О проблемах новых 1С-проектов в общем океане открытого программного обеспечения.

07.07.2024    2434    bayselonarrend    57    

33

Групповая разработка (Git, хранилище) OneScript Программист Платформа 1С v8.3 Бесплатно (free)

Скрипт для работы с SonarQube и локальным репозиторием Git.<br> Цель проекта – возможность выполнить быструю проверку качества кода перед тем, как помещать доработки в рабочее хранилище. В Sonar и Git выгружается не вся конфигурация, а только объекты из заданного списка.<br> https://github.com/vkrivov/go/

02.07.2024    2285    vkrivov@yandex.ru    8    

17
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. artbear 1558 13.03.23 15:24 Сейчас в теме
(0) Хорошая статья.
Правильно используешь 1commands

небольшое дополнение - cmdline уже морально устарел.
лучше использовать пакет cli для работы с командной строкой, с ним многое проще.
2. AllexSoft 14.03.23 15:56 Сейчас в теме
Когда разработчик пишет много кода - как правило это плохо, он не умеет увидеть общее в разрозненных задачах, сделать программные интерфейсы, не умеет переиспользовать код, не знает стандартных библиотек, не знает стандартных подходов к решению задач или решения стандартных алгоритмов.. с такими запросами по анализу строк кода в гите - надо слать лесом, прям сразу и бесповоротно. Много кода пишут новички - они часто занимаются копированием.
По мне так более корректные данные надо брать из сонара например, по % дублирования, и про ошибкам\дефектам в разрезе разработчиков. Например плотность ошибок\дефектов на 1000 строк кода.
Любопытно, у автора по его выгрузке на реальных данных что получилось? Реально ли хорошие разработчики в топе по строкам кода?
pisarevEV; eternium; ardn; +3 Ответить
3. ardn 632 14.03.23 20:03 Сейчас в теме
(2)
у автора по его выгрузке на реальных данных что получилось? Реально ли хорошие разработчики в топе по строкам кода?

Я и так вижу работу программистов - непосредственно в изменениях исходного кода. И я тоже против оценки "по строчкам"

(2)
По мне так более корректные данные надо брать из сонара

Это тема следующей статьи.
Оставьте свое сообщение