Получаем статистику по 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

См. также

Автотесты для типовых конфигураций ERP Управление предприятием 2 и Комплексная автоматизация 2 (для vanessa automation)

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

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

2220 руб.

04.07.2022    6974    26    1    

24

Системы контроля версий для 1С-разработчиков.

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

Основы командной разработки на 1С. Использование систем контроля версий при разработке на платформе 1С:Предприятие 8

4900 руб.

29.06.2022    9444    78    4    

112

Управление сборкой. Расширение для конфигурации СППР

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    10830    7    5    

30

Автоматическое подтверждение легальности обновления базы или как обновить 100 типовых баз 1С за 5 часов

DevOps и автоматизация разработки Обновление 1С Платформа 1С v8.3 Конфигурации 1cv8 1С:Бухгалтерия 3.0 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Расширение для конфигураций 1С для автоматического подтверждения легальности обновления и выполнения обработчиков обновления при пакетном автоматическом обновлении большого числа баз 1С. А также сам модуль обработки по автоматическому обновлению баз.

2 стартмани

08.05.2019    24451    56    VPanin56    26    

28

Обновляемый список последних статей Инфостарт для профиля Github

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

Не знаете, чем бы таким заполнить свой профиль Github? Заполните его своими статьями на Инфостарт! Этот простой workflow сам соберет список ваших последних статей и будет периодически обновлять его для актуализации данных.

08.04.2024    938    bayselonarrend    2    

31

Процесс разработки с использованием GIT и расширений для 1С:ERP. Без EDT

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

Доработки 1С:ERP на крупных проектах можно организовать, не внося изменения в саму типовую конфигурацию, а используя только расширения и отдельные «микроконфигурации». Расскажем о том, как это сделать без EDT, используя процесс разработки GitHub Flow.

02.04.2024    4935    Begemoth80    24    

45

Особенности национального Workflow: Github Actions и OneScript

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

Сегодня мы посмотрим на Github Actions - встроенный инструментарий Github для автоматизации рабочих процессов. Разберем, что это такое, зачем и причем тут OneScript.

25.03.2024    1606    bayselonarrend    3    

38

Автоматизация процесса разработки с помощью сервиса GitFlic

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

GitFlic – первая в России полностью самостоятельная реализация сервиса для хранения репозиториев с исходным кодом. За три года разработки сервис GitFlic стал полноценным инструментом, которым можно заменить GitLab, GitHub и BitBucket. Расскажем о том, как выстроить в GitFlic процесс автоматического тестирования, статического анализа кода и сборки приложений.

05.03.2024    2115    user1989937    6    

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

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

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

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

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