Что такое GIT и как он работает?
Если ввести такой запрос в поисковик, большинство источников ответят так: Git (от англ. – Global Information Tracker) – это распределенная система управления версиями. И в этом определении, не очень понятном неподготовленному читателю, вся суть Git’а.
Разберемся, что же значит «управление версиями» и когда система управления версиями становится «распределенной».
Git – это разновидность VCS (Version Control System). А VCS – это программа для работы с постоянно изменяющейся информацией. Такое ПО может хранить множество версий одного и того же файла (документа) и возвращаться к более раннему состоянию (версии).
Например, код пишут четыре программиста. Они работают в разных местах, с разных компьютеров, в разное время. VCS сохраняет все изменения, внесенные всеми программистами, и в любой момент можно вернуться к версии, созданной три дня или месяц назад.
Какие VCS есть в природе:
- собственно Git;
- SVN;
- Mercurial;
- CVS (Concurrent Versions System);
- Team Foundation Server.
Все они делятся на два типа:
02. O que é controle de versão — Git e Github para Iniciantes
- распределенные (Git, Mercurial) – изменения хранятся в локальных хранилищах компьютеров и оттуда синхронизируются с другими компьютерами;
- централизованные (CVS, SVN) – все данные хранятся на центральном сервере, и оттуда каждый локальный компьютер получает обновленные данные.
Git относится к распределенным системам, поэтому не зависит от центрального сервера, где хранятся файлы. Git сохраняет данные в локальном репозитории. Что такое репозиторий Git? Это каталог на жестком диске рабочего компьютера программиста. Для большей стабильности и ускорения синхронизации разных версий проекта локальный репозиторий хранят онлайн в специальных сервисах: Github, Gitlab, Bitbucket.
Зачем нужен Git
Обычно вся работа над проектом (сайтом) со стороны разработчика сводится к трем простым операциям:
- удаление;
- добавление;
- изменение.
И когда сайт состоит из менее чем 10 файлов, то проблем с этим нет: и так понятно, где что удалено или добавлено.
Но чем больше и шире проект, тем больше людей в нем задействовано, и работу каждого разработчика над каждой версией становится сложно контролировать. А это необходимо: ведь люди допускают ошибки, а также могут одновременно работать с одним и тем же файлом, и без контроля версий сохранится только версия работы одного из программистов.
С приходом VCS работать стало гораздо проще:
- можно откатывать изменения, если смысла в их внедрении нет;
- можно быстро и безболезненно восстанавливать поврежденные файлы;
- можно определить, кто из команды писал определенный блок кода;
- можно следить за процессом, даже если в один и тот же момент над одним модулем работает несколько разработчиков или даже команд по всему миру.
Как работает Git: основы
Для многих работа с контролем версий превратилась в простое копирование файлов в локальный каталог либо добавление в текущий файл даты изменения.
Git // Dicionário do Programador
Но подход «просто забэкапить этот файл» весьма опасен и может дать сбой. И цена ошибки – не один час потраченного времени на восстановление.
Самый известный способ избежать проблем с командной работой программистов над проектом – на этапе разработки внедрить полноценную систему контроля версий, а именно Git.
Использование Git помогает сотрудникам всегда знать, что и когда произошло с файлом. В Git у каждого разработчика имеется своя собственная полноценная рабочая площадка, на которой и ведется вся работа. Периодически (обычно в конце рабочего дня либо после выполнения задачи) проводится синхронизация с удаленным главным репозиторием:
Схема работы GIT
Есть один общий проект, который напрямую связан с удаленным репозиторием. В проекте участвует команда разработчиков. Каждый из них работает со своей локальной копией репозитория, тем самым временно не затрагивая работу других разработчиков.
Внося изменения, разработчик синхронизируется с удаленной площадкой. Если возникает ситуация, когда один и тот же разработчик кастомизировал один и тот же участок кода, то возникает конфликт между версиями, который решается уже на ходу.
5 причин работать с Git
- Легко масштабировать работу по проекту, легко включать в процесс нужных сотрудников. При грамотном ведении репозитория в кратчайшие сроки можно развернуть дополнительную площадку или удалить лишнего разработчика из проекта.
- Проект легко передавать из команды в команду, от разработчика к разработчику: просто отправьте ссылку на репозиторий.
- Ничего не теряется. Все версии файлов сохраняются, и ситуаций, при которой может «потеряться» безвозвратно та или иная разработка, не бывает.
- Можно «распараллелить» работу между разработчиками и целыми командами: распределите нагрузки между сотрудниками – так вы значительно повысите скорость выполнения проектных работ.
- Можно отслеживать, как идет работа, логирует ее, и в любой момент можно увидеть, кто и когда внес изменения.
- Подводя итог: Git – это система работы команды программистов, при которой все они могут вносить изменения одновременно, не опасаясь за работоспособность проекта. Git необходим, если над сайтом работают сразу несколько команд разработчиков, и сам сайт при этом весьма сложен в архитектуре и состоит из большого числа файлов.
Источник: seo.ru
Введение в системы контроля версий
Часто разработчики трудятся в команде над одним проектом, а значит, сразу несколько человек могут изменять один файл одновременно. Чтобы избежать путаницы, в таких случаях используют систему контроля версий, которая позволяет хранить историю изменений проекта и при необходимости помогает вернуться к предыдущей версии.
Версионирование
Чтобы лучше понять проблему версионирования, рассмотрим пример дизайнера, который закончил работать над проектом и отправил финальную версию заказчику. У дизайнера есть папка, в которой хранится финальная версия проекта:
source/ barbershop_index_final.psd
Всё хорошо, дизайнер закончил работу, но заказчик прислал в ответ правки. Чтобы была возможность вернуться к старой версии проекта, дизайнер создал новый файл barbershop_index_final_2.psd , внёс изменения и отправил заказчику:
source/ barbershop_index_final.psd barbershop_index_final_2.psd
Этим всё не ограничилось, в итоге структура проекта разрослась и стала выглядеть так:
source/ barbershop_index_final.psd barbershop_index_final_2.psd … barbershop_index_final_19.psd … barbershop_index_latest_final.psd barbershop_index_latest_final_Final.psd
Вероятно, многие уже сталкивались с подобным, например, при написании курсовых работ во время учёбы. В профессиональной разработке создавать новые файлы для версионирования — плохая практика. Обычно у разработчиков в папке проекта хранится множество файлов.
Также над одним проектом может работать несколько человек. Если каждый разработчик для версионирования будет создавать новый файл, немного изменяя название предыдущей версии, то в скором времени в проекте начнётся хаос и никто не будет понимать, какие файлы нужно открывать.
Git
Для решения проблемы с сохранением новой версии файлов удобно использовать системы контроля версий. Одна из самых популярных — Git. Работу Git можно сравнить с процессом сохранения и загрузки в компьютерных играх:
- если впереди ждёт тяжёлое сражение, то перед этим лучше заранее сохраниться;
- чтобы это сделать, нужно выполнить специальную команду;
- после чего сохранение попадает в специальную папку и содержит состояние игры;
- теперь при необходимости всегда есть возможность вернуться к предыдущей версии игры.
Папка с данными игры могла бы выглядеть так:
SomeGame/ | — saves | | — save001.sav | | — save002.sav | | … | | папка с сохранениями | | — game.exe | . файлы игры
Файлы, необходимые для работы приложения, хранятся в рабочей области. В папке saves хранится история всех сохранений игры. Git сохраняет код вашего проекта по такому же принципу: сохранения попадают в специальную скрытую папку, а рабочей областью является содержимое корневой папки.
Основные понятия
Список терминов, которые будут вам полезны.
Репозиторий
Проект, в котором была инициализирована система Git, называется репозиторием. При инициализации в проект добавляется скрытая папка .git . Репозиторий хранит все рабочие файлы и историю их изменений.
Рабочая область и хранилище
barbershop/ | — .git | | — bea0f8e | | — hb-427307464A | | Хранилище | | — css | — index.html | Рабочая область
Корневая папка проекта — это рабочая область. В ней находятся все файлы и папки, необходимые для его работы.
Хранилище — это содержимое скрытой папки .git . В этой папке хранятся все версии рабочей области и служебная информация. Этим версиям система автоматически даёт название, состоящее из букв и цифр. В примере выше — это bea0f8e и d516600 . Не стоит проводить манипуляции с папкой .git вручную. Вся работа с системой производится командами через специальные приложения или консоль.
Коммит
Точно так же, как и в игре, в системе контроля версий Git можно сохранить текущее состояние проекта. Для этого есть специальная команда — commit . Она делает так, что новая версия проекта сохраняется и добавляется в хранилище. В файле с сохранением отображаются: все изменения, которые происходили в рабочей области, автор изменений и краткий комментарий, описывающий суть изменений. Каждый коммит хранит полное состояние рабочей области, её папок и файлов проекта.
В итоге проект работает так:
- Репозиторий хранит все версии проекта. В случае передачи этого проекта другому человеку, он увидит всё, что с ним происходило до этого.
- Ничего не теряется и не удаляется бесследно. При удалении файла в новой версии добавляется запись о том, что файл был удалён.
- Всегда можно вернуться к любой из версий проекта, загрузив её из хранилища в рабочую область.
Система контроля версий Git
Git — это распределённая и децентрализованная система управления версиями файлов. Децентрализованная система означает, что у каждого разработчика есть личный репозиторий проекта с полным набором всех версий. А все необходимые для работы файлы находятся на компьютере. При этом постоянное подключение к сети не требуется, поэтому система работает быстро. При командной разработке нужна синхронизация репозиториев, так как проект — один и его состояние должно быть у всех одинаковым.
Работа в команде
Как синхронизовать данные репозиториев между разработчиками? Изначально Git репозитории сами могут синхронизироваться от пользователя к пользователю. Дополнительные программы для этого не нужны. Есть специальные команды в консоли, позволяющие передавать данные из одного репозитория в другой.
Этот способ сложный и редко используется. Чаще всего разработчики синхронизируют локальный репозиторий с удалённым. Удалённый репозиторий — это тот же репозиторий, только его данные находятся в облаке.
Этапы синхронизации
Как сделать так, чтобы разработчик смог передать актуальную версию проекта коллеге?
Для взаимодействия с системой Git в консоль вводятся специальные команды. Не пугайтесь, работу с консолью можно будет заменить на работу с одной из программ, о которых расскажем ниже. Но чтобы лучше понимать суть, придётся запомнить несколько команд. Все они начинаются с ключевого слова git . Для синхронизации есть две основных команды: pull (англ. «тянуть») и push (англ. «толкать»).
Pull
Если работа над проектом ведётся в команде, то перед тем как начать писать код, нужно получить последнюю версию проекта. Для этого нужно выполнить команду pull . Так мы забираем все изменения, которые были совершены со времени последней синхронизации с удалённым репозиторием. Теперь они у нас в репозитории на локальном компьютере.
Push
Чтобы отправить коллегам последнюю версию проекта выполняем команду push . Если в удалённом репозитории с момента последней синхронизации не было никаких изменений, то все сохранённые изменения успешно загрузятся в облако, и коллеги получат последнюю версию проекта, выполнив команду pull . Если же были изменения, то Git попросит вас перед отправкой подтянуть последние версии, сделав pull .
Типовой рабочий процесс с использованием Git
Разберём типовой процесс разработки сайта в команде. Представим, что Игорь и Алиса — разработчики на одном проекте. Игорь начал верстать проект и сделал первые коммиты, в которых зафиксировал изменения в файле index.html . Для схематичности названия коммитов будут простые: B1 и B2.
После того как Игорь сделал два коммита, он захотел отправить свои изменения в удалённый репозиторий. Чтобы их передать, Игорь выполнил команду git push . После чего в облаке появилось две версии проекта. То есть Игорь отправил не только финальную версию проекта, но и все сохранённые изменения.
После пуша данные синхронизировались с удалённым репозиторием. Но как Алисе теперь получить изменения? Для этого она выполняет команду git pull и получает все изменения из облака к себе на компьютер. Таким образом, состояние проекта у Игоря и Алисы синхронизировались, и они могут дальше продолжить работать над ним.
Параллельные изменения
Что произойдёт, если разработчики изменят одинаковый файл и сделают push ? Предположим, что Игорь и Алиса изменили файл index.html , сделали коммит с изменениями и запушили его. Игорь оказался быстрее Алисы и сделал push первым.
В этом случае Git сообщит Алисе, что нельзя пушить свои изменения, потому что она не делала pull . Дело в том, что после того как Игорь синхронизировался с удалённым репозиторием, версия проекта Алисы стала отличаться от той, что находится на удалённом репозитории, и Git это видит. Система сообщает, что перед тем, как выполнить команду push , нужно выполнить pull , чтобы забрать изменения. Алиса делает pull и ей вновь приходит уведомление от Git. В этот раз он сообщает Алисе о том, что произошёл конфликт.
Конфликт
Дело в том, что Игорь и Алиса изменили одинаковый файл и теперь Алисе предстоит решить конфликт.
Существуют два вида конфликтов:
- Автоматически разрешаемый конфликт.
- Конфликт, который нужно разрешить вручную.
Ниже рассмотрим оба варианта.
Слияние
Допустим, что на третьей строке Игорь добавил в проект шапку, а на четвёртой Алиса добавила футер.
Git видит, что произведённые изменения не затрагивают друг друга. Он сам объединит две версии проектов в одну, совершив слияние. После этого Алиса спокойно синхронизируется с удалённым репозиторием, отправив новую версию проекта.
Во время слияния Git не знает, в каком порядке расположить коммит В3 Игоря и коммит В4 Алисы, из-за которых случился конфликт. Поэтому Git разрешает существовать нескольким версиям проекта одновременно. Как раз для этого и нужен следующий коммит В5, в котором происходит слияние предыдущих параллельных версий. После того как Алиса запушит изменения, она отправляет все версии проектов на удалённый репозиторий. В следующий раз, когда Игорь сделает pull , он получит полную историю со слиянием конфликта.
Допустим, что Игорь и Алиса продолжили работать над проектом, но в этот раз изменили одинаковую строку в файле index.html . Вновь Игорь оказался быстрее и первым синхронизировал свои изменения с удалённым репозиторием. Алиса сделала pull и получила сообщение о конфликте.
В таком случае Git не знает чья версия проекта правильная и поступает очень просто. Он изменяет файл index.html , добавляя в него изменения и Игоря и Алисы. После этого предупреждает Алису о конфликте и просит выбрать правильный вариант.
Версии проектов разделяются строками второй, четвёртой и шестой. Их нужно удалить и оставить правильный вариант заголовка. После того как Алиса это сделает, она сможет закоммитить изменения и запушить их на удалённый репозиторий. Игорь же при следующей синхронизации с облаком получит тот вариант заголовка, который выбрала Алиса.
Окружение Git
Git — удобная система. Плюсом является то, что вокруг него создано множество сервисов, которые позволяют сделать работу с ним удобнее. Расскажем о тех, что будут вам полезны в начале работы.
GitHub
GitHub — это сайт, сервис и то самое облако, в котором можно хранить удалённые репозитории и через которое коллеги могут синхронизировать свои версии проектов. Как зарегистрироваться, мы рассказали в этой статье.
GUI
Облегчить работу с Git и GitHub могут специальные программы. Такие программы в удобной форме показывают изменения в коде, список коммитов и обладают другими удобными возможностями. Обычно в подобных программах есть возможность выполнять стандартные Git команды: pull , push , commit и прочие — просто нажав на кнопку.
Следующая глава
Глава 2. Словарь терминов для Git и GitHub
Собрали основные термины, использующиеся в Git и GitHub.
Источник: htmlacademy.ru
Git version что это за программа
Случилось странное с гитом. Пока я управлял слиянием веток из консоли все было +/- норм, но потом я проделал те же операции с частью веток прямо в удаленном репозитории и началось. Широко открытыми от изумления глазами я наблюдал, как из моего проекта начали исчезать одна за другой папки. Итого: из 8 папок, хранившихся в проекте, осталось 2, а 6 пропали.
В сухом остатке в репозитории на гитхабе лежат все 8 папок в ветке master, а в проекте — только 2. При этом просто запулить из удаленного репозитория недостающие папки не выходит. Очень хочется двух вещей: 1) понять что произошло и почему, что бы не попасть в эту неловкую ситуацию снова. 2) понять как исправить не поправимое цивилизованными средствами. upd. проблема решилась сама собой. Не знаю что и как, но клиент IDEA действительно очень удобный
Абдулла Уровень 19
15 мая 2022
при вводе git commit -m “all txt files were added to the project” пишет error: pathspec ‘txt’ did not match any file(s) known to git error: pathspec ‘files’ did not match any file(s) known to git error: pathspec ‘were’ did not match any file(s) known to git error: pathspec ‘added’ did not match any file(s) known to git error: pathspec ‘to’ did not match any file(s) known to git error: pathspec ‘the’ did not match any file(s) known to git error: pathspec ‘project”’ did not match any file(s) known to git
Ivasishinav Уровень 18
28 марта 2022
создаю конфликт в txt файле между master и development ветками, делаю слияние в master ветку, решаю конфликт подправив txt файл вручную, добавляю txt файл в master ветку, пишу git commit и выдает такое окно git status после перезапуска git bash такой совет YesOn для выхода : «Нажимаете клавишу Esc и пишете команду: «:wq», затем нажимаете Enter.» помог, спасибо! Но что это за окно не понятно
Alex Уровень 35
23 марта 2022
Через консоль это хорошо, не знаю, может быть я не прав, но зачем всё это, если через IDE проще понятнее и быстрее. Но как пользоваться консолью тоже нужно знать, поэтому к данному материалу я ещё вернусь точно. Но разобраться в том как это работает и как этим пользоваться помогло вот это видео , собственно сегодня только начал разбираться (первый вечер), до этого знал про git в общих чертах что это и зачем нужно, поэтому видео помогло лучше чем статья. К статье вернусь позже. Пишу не ради критики, а для таких же как я, решивших разобраться с нуля, на мой взгляд проще понять через IDE
YesOn Уровень 13
11 февраля 2022
Если при выполнении инструкции статьи в разделе: «Резолвим конфликты» после команды:
git commit
вы попали в редактор коммитов и не знаете как оттуда выйти, то делается это так: Нажимаете клавишу Esc и пишете команду: «:wq», затем нажимаете Enter. Ещё, если после этой команды:
git clone https://github.com/romankh3/git-demo
у вас не срабатывает команда
git pull
внимательно посмотрите на скрин инструкции и перейдите в каталог git-demo, для этого нужно набрать в редакторе команду:
cd git-demo
Это на случай, если Вам так и не удалось догадаться. почему что-то пошло не по инструкции, эти моменты просто там пропущены. Наверное чтобы тренировать внимательность, учиться разбираться и осознавать, что ты делаешь .
YesOn Уровень 13
11 февраля 2022
Есть ещё один лайфхак, чтобы не писать длинное название файла с расширением или длинное название ветки начните набирать пару символов. затем нажимайте клавишу Tab на клавиатуре, и в консоли автоматически заполняется нужное название с расширением. Это поможет от опечаток.
Andrei Уровень 18
28 января 2022
Толковая статья. Спасибо!
4 ноября 2021
Хорошая статья. Её бы еще немного доработать. смерджить(merge), спулить (pull), запушить (push) — в вашем варианте «перевода», получились жаргонные слова. Они не дают нам понимания, жаргон — это только ругательства. Термины «с улицы» или «дворовые». Также как, если бы вы использовали русские ругательства матом.
Их можно перевести и подобрать к ним более точные синонимы русского языка. Еще один момент: Вы употребляете «мы находимся» . Не совсем верно. Мы находимся на кафедре, мы находимся перед компьютером. Точнее будет «текущее выбранное приложение», «сейчас у нас выбрана ветка», сейчас у нас выбрана консоль или приложение такое-то.
hidden #2641196 Уровень 51
11 августа 2021
Roman Beekeeper Уровень 35
11 марта 2021
⚡️UPDATE⚡️ Друзья, создал телеграм-канал , в котором освещаю свою писательскую деятельность и свою open-source разработку в целом. Не хотите пропустить новые статьи? Присоединяйтесь ✌️
Источник: javarush.com
Автоматизированное семантическое управление версиями с помощью GitVersion
При создании новых программных проектов или изменении уже существующих процессов всегда бывает сложно определить правильную стратегию управления версиями. Выбор стратегии ветвления, достижение консенсуса с членами команды и, наконец, что не менее важно, обеспечение соблюдения и автоматизация процесса — вот те препятствия, которые необходимо преодолеть.
Особенно сложным раз от раза было автоматизировать стратегию. Внутри репозитория всегда выполняются определенные действия вручную, чтобы задать следующую версию. И в данном случае рассматривается только “хороший путь” (happy path). Как быть с исправлениями ошибок? Нужно ли менять магическое свойство каждый раз, когда требуется развертывание?
Одним словом, много работы.
Но что, если есть инструмент, способный вычислить правильный, удобночитаемый номер версии? Вот тут-то и вступает в игру GitVersion!
Что такое управление версиями программного обеспечения?
Когда вы слышите о желании объяснить управление версиями программного обеспечения, то поначалу можете подумать: зачем этим заниматься? Первоначальное определение уже звучит тривиально. Когда люди начинают вдумываться в него, то обычно делают вывод, что всё совсем не так просто.
С помощью управления версиями программного обеспечения мы пытаемся найти способ однозначно идентифицировать различные фазы в жизненном цикле ПО. Когда речь идет о конкретной версии, мы используем этот номер или пояснительный текст в качестве ссылки на состояние ПО в конкретный момент времени.
С помощью примечаний к релизу или журнала изменений можно вести список изменений и сообщать его заинтересованным сторонам. Таким образом, мы даем себе и пользователям системы средство быстро и без хлопот определить, в чем был достигнут прогресс.
Какие существуют схемы управления версиями?
В рамках управления версиями приложения можно выбрать несколько различных схем. Это зависит от того, что будет поддерживать выбранное программное обеспечение для непрерывной интеграции.
Распространенные схемы управления версиями таковы:
- Номер сборки: здесь используется число (инкремент), определяемое запуском автоматического конвейера сборки.
- Дата и время: здесь временная метка сборки используется в качестве уникальной временной метки-определителя версии.
- Семантическая версия: сокращенно Semver; здесь версия определяется на основе схемы major.minor.patch.
У первых двух схем есть один общий недостаток: они не описательные. При сравнении нескольких версий, следующих одна за другой, пользователю трудно понять, были ли внесены в новую версию неразрушающие изменения. Смысл новой версии нельзя вывести исключительно из ее номера.
Семантическое версионирование предлагает решение, которое будет более описательным. Семантический номер версии соответствует структуре MAJOR.MINOR.PATCH.
Различные разделы здесь — это числа. Мы увеличиваем:
- основную часть, когда вводим несовместимые/меняющие API изменения;
- второстепенную часть, когда добавляем функциональность обратно совместимым образом;
- патч-часть, когда делаем обратно совместимые исправления ошибок.
Номер версии может быть дополнен тегом, например 0.1.0-alpha. Таким образом, наименование версии становится более описательным.
Семантическая стратегия стала отраслевым стандартом для версионирования приложений. Для данной стратегии существует четко определенная спецификация. Рекомендуется прочитать ее до конца, так как понимание спецификации поможет в дальнейшем правильно определять номер версии.
Интеграция семантического управления версиями в процессы CI/CD
Семантическое управление версиями выглядит потрясающе! Но как внедрить его в автоматизированные процессы?
В рабочих процессах команд, разрабатывающих программное обеспечение, актуальный код хранится в системе управления версиями. Git — одна из самых популярных систем, которая используется большинством крупнейших игроков в мире разработки программного обеспечения.
При помощи GitVersion, задействовав ветви git и конвейеры CI/CD, возможна интеграция, где автоматически генерируются номера версий. GitVersion представляет собой интерфейс командной строки, чтобы произвести эти цифры версии. GitVersion хорошо работает с существующими стратегиями ветвления Git, такими как GitFlow или GitHub Flow. Хотя рекомендуется пользоваться стандартизированной стратегией ветвления, благодаря гибкой конфигурации GitVersion можно настроить в соответствии с любыми желаемыми потребностями.
GitVersion обеспечивает плавную интеграцию с Azure DevOps и GitHub Actions. Если решение CI/CD допускает установку пользовательских инструментов командной строки, вы можете так и сделать. Существуют пошаговые руководства, доступные для нескольких серверов сборки, таких как Bamboo и Octopus Deploy. Единственные три требования, которые есть у GitVersion, — это обязательное использование Git, правильная настройка стратегии ветвления и правильная конфигурация.
Что мы будем устанавливать в целях демонстрации?
Для примера мы создадим версию пакета NPM с помощью Azure DevOps. Для создания пакета NPM понадобится CLI NPM, который необходимо загрузить вместе с Node.js. Установщики для Windows, Linux или MacOS можно найти на сайте Node.js.
Мы будем использовать клиент командной строки GitVersion для создания собственной конфигурации GitVersion. Этот клиент можно установить через chocolatey или HomeBrew. GitVersion для Linux устанавливается с помощью Mono. Руководство по этому процессу можно найти здесь.
Предположим, что у нас уже есть пустой репозиторий Git в Azure DevOps. Если нет, вы можете воспользоваться следующим руководством.
Настройка пакета NPM
Для нашего примера мы создадим простую функцию, которая может использоваться другими приложениями. Во-первых, необходимо сгенерировать package.json через клиент командной строки NPM.
Начнем создавать модуль, открыв терминал (MacOS/Linux) или CMD (Windows). Затем выполним внутри репозитория команду npm init . Эта команда проведет вас через весь процесс создания файла package.json . Когда вас попросят указать желаемую версию, установите ее как 0.0.1. Позже она будет автоматически заменена внутри конвейера сборки.
После прохождения этого процесса создается нужный нам файл package.json . Откройте свою любимую IDE, создайте файл index.js , а потом скопируйте и вставьте туда следующее содержимое:
function hello(name) return «Hello, !».format(name);
>
module.exports = hello;
Приведенная выше функция принимает аргумент name . При вызове он вернет текст: “Hello, [имя]!”.
Настройка конфигурации GitVersion
Чтобы запускать задачи GitVersion внутри конвейеров, нужно установить расширение GitTools из Visual Studio Marketplace. Оно поможет определить правильную версию и изменить номер запуска сборки на сгенерированную семантическую версию.
Давайте создадим собственную конфигурацию GitVersion, открыв терминал (MacOS/Linux) или CMD (Windows) и введя команду gitversion init .
В этом меню выберем опцию (2): Run getting started wizard . Этот мастер поможет настроить GitVersion в соответствии с вашей стратегией ветвления. В примере был сделан выбор следовать стратегии GitHub Flow. Если вы не можете определиться, то выберите (3) Unsure, tell me more . Вы получите несколько вопросов, которые помогут определить, какие настройки подходят вам лучше всего.
Затем вам будет предложено выбрать режим инкремента по умолчанию:
Возможны следующие варианты:
- Следование SemVer и применение инкремента только когда релиз был помечен тегом (режим непрерывной доставки). При выборе этого параметра числа в номере сборки увеличиваются только при добавлении тегов к коммитам. Сборки, следующие после помеченной тегом, будут иметь тот же номер версии с увеличенным номером в качестве метки. Пример: 1.0.1+3 (третья по счету сборка).
- Инкремент на основе конфигурации ветки каждого коммита (режим непрерывного развертывания). В этом режиме номера версий будут увеличиваться при каждом коммите, к сборкам на ветке разработки будет прибавлен тег alpha , а к сборкам на ветке релиза — beta .
- Каждое слияние ветки с мастер-веткой будет увеличивать версии (магистральный режим). В этом режиме каждый коммит слияния (например, пулл-реквест для ветки) вызовет увеличение версии патча.
Поскольку мы создаем пакет NPM, первый вариант не подходит. Мы хотим выпускать новые версии приложения, когда сливаемся в главную ветвь. Менеджеры пакетов, такие как NPM и NuGet, не поддерживают одни и те же версии с разными метками. Так что остановимся на варианте №3. После чего выбираем опцию “Сохранить и выйти” ( save and quit ).
Подробнее об инкременте версии можно прочитать здесь.
При проверке репозитория мы заметим, что был создан файл GitVersion.yml . Это файл YAML, содержащий конфигурацию GitVersion.
mode: Mainline
branches: <>
ignore:
sha: []
merge-message-formats: <>
Внутри него можно задать несколько параметров конфигурации. К примеру, какой режим инкрементирования следует использовать для каждой ветки, или несколько сообщений bump, которые будут применяться для ручного инкрементирования основных и второстепенных версий патчей. Подробнее об этом позже.
Возможные параметры конфигурации можно найти на странице конфигураций GitVersion.
Настройка конвейера сборки
Теперь самая важная часть — создание конвейера сборки. Внутри Azure DevOps функциональность конвейеров Azure должна использоваться для интеграции конвейеров CI. Большинство задач внутри этого конвейера будут специфичны для нужд приложения, которое необходимо спроектировать, но одна задача у них будет общая. А именно — определить версию через GitVersion.
Поскольку мы создаем модуль NPM, нам понадобится выполнить следующие задачи:
- Определение версии с помощью GitVersion.
- Установка номера версии прямо в файле package.json .
- Публикация модуля.
Как и файл конфигурации GitVersion, скрипты конвейеров Azure DevOps определены в YAML. Другой вариант — классическая форма, где задачи можно создавать путем навигации по графическому веб-интерфейсу Azure DevOps.
С учетом трех указанных выше задач, файл azure-pipelines.yml будет в результате выглядеть следующим образом:
Пройдемся по скрипту и объясним, что на самом деле происходит.
- Строки 1–2: этот триггер определяет, на каких ветках сделанные коммиты будут запускать конвейер сборки.
- Строки 4–5: блок пула описывает, какой пул агентов (сборку) следует использовать. В нашем случае требуется виртуальная машина Ubuntu последней версии. Поддерживаемые операционные системы и их предустановленное программное обеспечение можно найти здесь.
- Строки 8–11: это задача GitVersion для определения правильной версии. При выполнении этой задачи встроенный интерфейс командной строки GitVersion вычислит правильный номер версии и сделает его доступным через переменные конвейера.
- Строки 12–18: это задача программной замены номера версии в файле package.json . В соответствии с лучшими практиками промежуточный номер GITVERSIONNUMBER определяется и заполняется переменной конвейера $(GitVersion.SemVer) . Эта переменная содержит номер версии, который был определен задачей GitVersion.
- Строки 19–24: это задача публикации NPM, необходимая, чтобы опубликовать NPM-модуль в реестре NPM. В нашем случае это артефакты Azure (Azure Artifacts), часть среды Azure DevOps.
Поместите файл azure-pipelines.yml в корневой каталог репозитория.
Если вы всё сделали правильно, в папке у вас должны быть следующие файлы:
- azure-pipelines.yml;
- GitVersion.yml;
- index.js;
- package.json.
Запуск первой сборки
Пора начинать! Сделаем коммит и отправим наше творение в Azure DevOps, а потом посмотрим, что произойдет в разделе “build pipelines”.
Похоже, тут пусто. Файл иногда не попадает в Azure DevOps автоматически.
Давайте добавим конвейер, нажав кнопку создать конвейер. Выберите Azure Repos Git , а затем правильный репозиторий, чтобы сообщить разделу конвейеров Azure Pipelines, где хранятся azure-конвейеры. Теперь конвейеры Azure должны забрать ранее закоммиченный файл конвейеров. Нажмите кнопку запуска, чтобы сделать это вручную.
Примерно через двадцать секунд сборка завершится успешно, и результат будет виден в обзоре. Если посмотреть в колонку “Последний запуск”, то можно найти и первую версию. В нашем случае это будет первая версия по умолчанию, 0.1.0. Поскольку сборка прошла успешно, внутри артефактов Azure также добавляется опубликованный пакет.
NPM-пакет действительно оказался в Azure Artifacts. Сгенерированный номер версии был соблюден, поскольку в качестве начального номера версии внутри нашего файла package.json установлен 0.0.1.
Инкремент патча, минорной и мажорной версий
Таким образом можно создавать новые версии. Давайте проверим это, сделав коммит и отправив небольшое изменение в репозиторий. Это немедленно запускает новую сборку, которая завершается примерно через двадцать секунд.
Эта новая сборка автоматически увеличивает версию патча. Но как насчет минорной и мажорной версий? Как их можно увеличить?
GitVersion предлагает множество возможностей для увеличения версий вручную.
- Установка свойства next-version в конфигурации GitVersion. Подойдёт только в качестве базовой версии.
- Имя ветви. Установив имя ветви release-1.0.1 или release/1.0.1, GitVersion будет использовать эту версию для всех сборок на этой ветви, с увеличенным номером в качестве метки.
- Пометка в коммите. GitVersion будет использовать этот тег в качестве номера версии.
- Сообщения коммита.
В последнем случае добавление +semver: breaking или +semver: major к сообщению о коммите увеличит основную версию. С помощью +semver: feature или +semver: minor можно увеличить номер минорной версии. И наконец, с +semver: patch или +semver: fix будет увеличиваться патч-версия.
При отправке с коммитом сообщения “Big change +semver: major” GitVersion действительно увеличивает основную версию. Теперь она принимает значение 1.0.0.
При проверке артефактов Azure приходим к выводу, что определенная версия действительно соблюдается и используется.
Заключение
С помощью семантического версионирования можно создавать описательные версии для приложений.
GitVersion предлагает простой подход для интеграции автоматически генерируемых семантических версий в конвейеры CI/CD. С помощью стратегий ветвления Git и конфигурации GitVersion интеграция становится простой и гибкой. Основные, минорные и патч-версии могут быть легко обновлены с помощью различных средств.
- Используй git-команды, как senior developer
- Развертывание Gatsby-сайта с помощью GitHub Actions
- 10 популярных проектов GitHub, написанных на Python
Источник: medium.com