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

2500 руб.

20.06.2023    23620    20    4    

320

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

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

4900 руб.

29.06.2022    12510    106    4    

138

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

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

3000 руб.

05.08.2024    1676    17    1    

11

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

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

2160 руб.

20.01.2022    8157    24    0    

14

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

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

2400 руб.

04.07.2022    8729    39    1    

30

OneScript Программист Бесплатно (free)

Вместе создадим библиотеку на Oscript с нуля, шаг за шагом: от базовой структуры проекта до перевода на ОСень. Разберем структуру проекта, работу с файлом конфигурации, логирование, уведомления, консольный интерфейс и многое другое. Освоим весь цикл разработки и сделаем первый шаг к созданию собственных инструментов на Oscript!

13.01.2025    1727    leobrn    8    

54

OneScript Программист Платформа 1С v8.3 Бесплатно (free)

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

10.01.2025    1607    KamranV21    12    

35

OneScript Программист Бесплатно (free)

В мире OneScript давно существуют библиотеки для облегчения работы с каким-либо классом программного обеспечения, например v8runner - помощник выполнения команд конфигуратора или gitrunner - программная обертка для запуска команд git. Есть библиотека и для работы с автономным сервером 1с. Однако библиотеке ibcmdrunner уже три года, а про нее нет ни одной публикации на инфостарте. Исправляю эту несправедливость.

09.01.2025    1163    ardn    0    

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

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

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

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

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