Практика Gitlab для небольших и микрокоманд фронтенда

Git
Практика Gitlab для небольших и микрокоманд фронтенда

Во время эпидемии я чувствовал, что весь мой организм сильно обленился, и мне постепенно осознанно захотелось взбодриться и вернуться к нормальному ритму. Недавно кодовая база команды изменилась сGerritмигрировал вGitlab, чтобы позволить фронтенд-команде разрабатывать повседневную работуметодичный,Эффективная работа, История развитияпрослеживаемый, я тоже проконсультировался и узнал много информации. Обратитесь к мейнстриму в отраслиGit рабочий процесс, в сочетании с бизнес-характеристиками компании, я также разобрал наборРабочий процесс Git для вашей команды, поделись здесь.

управление филиалом

Первое, что нужно сказать, это управление филиалами, управление филиаламиgitОснова рабочего процесса, хороший дизайн ветки помогает стандартизировать процесс разработки, а такжеCI/CDОсновы.

отраслевая стратегия

мейнстрим в индустрииgitРабочий процесс, как правило, делится наdevelop, release, master, hotfix/xxx, feature/xxxфилиал. Каждая ветвь выполняет свои обязанности и проходит через всюразработать, протестировать, внедритьобработать. Я также сделал некоторые настройки, основанные на основной стратегии ветвления.Вот краткая сводка в таблице:

название филиала позиционирование филиала описывать Контроль доступа
develop отделение развития Вы не можете отправить код в ветку разработки, и вам следует создать новую функцию /xxx для разработки по требованию. После завершения итеративной разработки функции код будет объединен в ветку разработки. Разработчик не может напрямую пушить, но может инициировать мерж-реквест
feature/xxx функциональная ветвь Для каждого требования создайте новую ветку функций, например feature/user_login, чтобы разработать функцию входа пользователя. Разработчик может нажать напрямую
release Тестовая ветка Объедините ветку разработки с веткой релиза. ps: эта ветвь должна быть настроена для запуска CI/CD и развертывания в тестовой среде. Сопровождающий может инициировать запрос на слияние
bug/xxx Дефектная ветвь Ошибки, обнаруженные после тестирования, должны основываться наdevelopсоздание веткиbug/xxxВетка исправляет дефекты, после модификации ее нужно объединить в ветку разработки для регрессионного тестирования.
master выпускная ветвь Мастер должен быть в состоянии готовности к выпуску официальных версий для внешнего мира. ps: эта ветвь должна быть настроена для запуска CI/CD и развертывания в производственной среде. Сопровождающий может инициировать запрос на слияние
hotfix/xxx ветвь исправлений Обработка ошибок в последней версии онлайн Разработчик может нажать напрямую
fix/xxx ветка исправления старой версии Работа с ошибками в старых версиях онлайн Разработчик может нажать напрямую

Вообще говоря,develop, release, masterТребуются филиалы. а такжеfeature/xxx, bug/xxx, hotfix/xxx, fix/xxxВетвь и т. д. это чисто семантическое наименование веток.Если хотите быть простым и грубым, то эти ветки можно не классифицировать и назвать какissue/issue号,Напримерissue/1, но вissueКонкретные вопросы и задачи объясняются в документе, чтобы гарантировать, что работа по разработке может быть прослежена.

защитить ветку

использоватьProtected Branches, мы можем помешать разработчикам ошибочноpushна некоторые ветки. Для обычных разработчиков мы толькоdevelopПредложения филиаловmergeразрешения.

保护分支

Для конкретных случаев эксплуатации, пожалуйста, перейдите к следующемуПрактический случайвид в разрезе.

проблемная работа

используется нашей командойГибкая разработкаПлатформа для совместной работы принадлежит Tencent.TAPD, ежедневные итерационные требования, дефекты и т. д. будутTAPDна записи. чтобыGitlabКобаза Code может быть связана с итерационными процедурами, я решил использоватьGitlab issuesДля записи удобно проследить проблему.

веха

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

milestones

Вехи могутРазобрано на N вопросов, новыйissueкогда ты можешьАссоциированные вехи. Например, в этом раунде итерации есть 5 требований, затем можно создать 5 новых.issue. В согласованные сроки, если веха связана со всемиissueВсеClosedЭто означает, что цель успешно достигнута.

创建issue

Этикетка

Gitlabпри условииlabelвыявить и классифицироватьissue, что я считаю очень хорошей функцией. Я перечисляю несколько здесьlabel, идентифицироватьissueизКлассификацияа такжеаварийный уровень.

标签管理

классификация проблем

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

Требования и дефекты

Здесь примерно два случая, одинTAPDЗадокументированные требования и недостатки, другие простые потребности или недостатки сообщаются в устной форме продукту или тестировщикам (это касается небольших компаний...).

дляTAPDЗадокументированные требования и дефекты, созданныеissueДля удобства должна быть прикреплена ссылка (упомянутая выше).

Для нужд и подводных камней устного общения я установил правило, что сам ведущийGitlabсоздано наissue, и просто четко опишите требования или дефекты, иначе я не приму разработку устного общения (также во избежание последствий).

ps: Фактически, продукт или тест должны обеспечиватьissue, не так хорошо, как указано вышеTapdЗаписывать. Я установил такое правило, по сути, это брать взаймыGitlabнайти слово,Устранение словесных требований или недостатков, Ха-ха.

самотестирование разработки

Разработчик сам обнаружил дефекты или проблемы в системе и должен пройтиissueЗадокументируйте проблему и создайте соответствующую ветку для изменения кода.

自测试issue

Практический случай

Как я уже говорил, мой принципissueВедите работу по развитию.

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

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

Разработка требований

feature/1, функциональная ветвь, соответствующая выпуску 1

Создание требований

Нормальный спрос, конечно, исходит от покупателя, такого как менеджер по продукту.Поскольку это объясняется на примере, вот яTAPDОн имитирует написание требования.

TAPD创建需求

создать проблему

СоздайтеGitlab issue,Ссылка наTAPDсопутствующие потребности.

创建issue

一个issue

Создание веток и разработка функций

на основеdevelopсоздание веткиfeatureВетвь для разработки функций (чтобы гарантировать, что локальное хранилище git в настоящее время находится в ветке разработки и синхронизировано с веткой разработки удаленного хранилища).

git checkout -b feature/1

или напрямую с удаленного складаdevelopВетвь создает ветку из базы.

git checkout -b feature/1 origin/develop

пс: я использую его здесьfeature/1Как название ветки, собственно, здесь1используетсяissueномер, и не использовал такие, какfeature/login_verifyтакие имена, потому что мне хочется использоватьissueчисло может более легко найти соответствующийissue, легче отслеживать код.

Затем мы начали разрабатывать новые функции...

快乐地撸代码

commit & push

После завершения разработки функции нам необходимо отправить код и синхронизировать его на удаленном складе.

PS D:\projects\gitlab\project_xxx> git add .
PS D:\projects\gitlab\project_xxx> git cz
cz-cli@4.0.3, cz-conventional-changelog@3.1.0

? Select the type of change that you're committing: feat:     A new feature
? What is the scope of this change (e.g. component or file name): (press enter to skip)
? Write a short, imperative tense description of the change (max 94 chars):
 (9) 登录校验功能
? Provide a longer description of the change: (press enter to skip)

? Are there any breaking changes? No
? Does this change affect any open issues? Yes
? If issues are closed, the commit requires a body. Please enter a longer description of the commit itself:
 -
? Add issue references (e.g. "fix #123", "re #123".):
 fix #1

git push origin HEAD

git czиспользуетсяcommitizenзаменитьgit commit. Для получения подробной информации, пожалуйста, нажмитеУглубленная практика автоматизированного развертывания переднего планапонять глубже.

fix #1для закрытияissue 1.

git push origin HEADЭто означает отправку в удаленный репозиторий с одноименной веткой.

Создать мерж-реквест

Инициировано разработчикомMerge Request, попросите включить функции, разработанные вами, вdevelopветвь.

创建Merge Request

тогдаMaintainerнужноКод проверки, после подтвержденияСогласен с объединением. Затем эта часть кода находится в удаленномGitСклад находится на хранении, и его тянут другие студенты-разработчикиdevelopВидны ветки.

проверка версии

issue/2, журнал обработки обновлений, номер версии и т. д., соответствующий issue 2

Ритм развития каждой команды отличается, и некоторые команды будутНепрерывная интеграцияТест релизной версии, некоторые могут быть раз в два дня, подробно это обсуждаться не будет...

Так что же нам делать, когда мы готовы к тестированию?

Благодаря пониманию предыдущего раздела мы уже знаем, что функциональные требования в итерации будут проходить черезfeature/xxxветвь слилась сdevelopветвь.

Перед тестированием, вообще говоря, необходимо обновитьCHANGELOG.mdа такжеpackage.jsonномер версии, который можно указатьMaintainerИли другие студенты, которые отвечают за это дело.

В основном для выполнения npm версии major/minor/patch -m 'что-то сделано', пожалуйста, обратитесь к конкретной операцииУглубленная практика автоматизированного развертывания переднего планаодна статья.

git checkout -b issue/2 origin/develop
npm version minor -m '迭代1第一次提测'
git push origin HEAD
然后发起merge request合入develop分支

В этом случае последниеdevelopКод ответвления запускает функцию в среде разработки, чтобы убедиться, что самопроверка версии проходит успешно.

При тестировании, поMaintainerположить началоMerge Request,Будуdevelopслияние кодов филиаловreleaseветвь, которая автоматически срабатывает в это времяGitlab CI/CD, который автоматически создается и публикуется втестовая среда.

После проверки версии ответственные лица должныTAPDИзмените статус соответствующих требований и дефектов на **"в процессе тестирования"**.

Исправление ошибок тестовой среды

bug/3, ветка ошибок, соответствующая проблеме 3

Речь идет о системах в тестовой среде, обнаруженных инженерами-испытателями в ходе цикла итераций.bug,ЭтиbugБудет записано на платформе для совместной разработки agileTAPDначальство. Восстановление тестовой средыbugШаги аналогичны потребностям разработки, и шаги просто ниже шагов:

  1. Создать задачу на Gitlab

    Создайте проблему и прикрепите ссылку на дефект на TAPD для удобства отслеживания

  2. Создавать ветки и исправлять ошибки

    на основеdevelopВетка для создания ветки:

    // 3是issue号
    git checkout -b bug/3 origin/develop
    

    Тогда меняй код...

  3. commit & push

    PS D:\projects\gitlab\project_xxx> git cz
    cz-cli@4.0.3, cz-conventional-changelog@3.1.0
    
    ? Select the type of change that you're committing: fix:      A bug fix
    ? What is the scope of this change (e.g. component or file name): (press enter to skip)
    ? Write a short, imperative tense description of the change (max 95 chars):
     (11) 修复一个测试环境bug
    ? Provide a longer description of the change: (press enter to skip)
    
    ? Are there any breaking changes? No
    ? Does this change affect any open issues? Yes
    ? If issues are closed, the commit requires a body. Please enter a longer description of the commit itself:
     -
    ? Add issue references (e.g. "fix #123", "re #123".):
     fix #3
     
    git push origin HEAD
    
  4. Инициировать запрос на слияние

    Инициировано разработчикомMerge Request, запрос на слияние кода, введенного путем исправления дефектаdevelopветвь.

    потомMaintainerнужноКод проверки, согласен с этимMerge Request.

  5. В ожидании регрессионного тестирования

    Долженbugбудет в следующий разCI/CDЗатем войдите в процесс регрессионного тестирования.

  6. Ошибка тестовой среды высокого уровня

    если высокий уровеньbug, например, если работа системы нарушена, и тестер не может выполнить нормальное тестирование,releaseфилиал на базеbugветвь, слияние после модификацииreleaseветка, перезапускcherry pickВписаться вdevelopветвь.

Публикация в рабочей среде

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

release合入master

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

а такжеreleaseВетки похожи,masterВетки запускаются автоматическиGitlab CI/CD, который автоматически создается и публикуется вПроизводственная среда.

онлайн-откат

revert/4, ветвь отката, соответствующая выпуску 4

Код был обновлен до онлайна, но была обнаружена ошибка, и система не могла нормально работать. В настоящее время, если проблема не может быть проверена вовремя, единственный способ сделать это — сначала откатить версию.

Скажи это первыминерционное мышлениеНиже мой запасной вариант.

сначала создайтеissueзаписывать:

创建记录回滚的issue

на основеmasterсоздание веткиrevert/4ветвь

git checkout -b revert/4 origin/master

Предположим, что текущая версия1.1.0, мы хотим вернуться к предыдущей версии1.0.3. Тогда нам нужно посмотреть на1.0.3информация о версии.

PS D:\tusi\projects\gitlab\projectname> git show 1.0.3
commit 90c9170a499c2c5f8f8cf4e97fc49a91d714be50 (tag: 1.0.3, fix/1.0.2_has_bug)
Author: tusi <tusi@xxx.com.cn>
Date:   Thu Feb 20 13:29:31 2020 +0800

    fix:1.0.2

diff --git a/README.md b/README.md
index ac831d0..2ee623b 100644
--- a/README.md
+++ b/README.md
@@ -10,6 +10,8 @@

 只想修改旧版本的bug,不改最新的master

+1.0.2版本还是有个版本,再修复下
+
 特性2提交

 特性3提交

главным образом, чтобы получить1.0.3версия, соответствующаяcommit id, значение которого90c9170a499c2c5f8f8cf4e97fc49a91d714be50.

Далее мы согласноcommit idпровестиresetоперацию, а затем отправить в удаленную ветку с тем же именем.

git reset --hard 90c9170a499c2c5f8f8cf4e97fc49a91d714be50
git push origin HEAD

Затем начнитеMerge RequestПучокrevert/4слияние ветвейmasterветвь.

回滚分支合入master

Вообще говоря, с этой волной операций проблем нет, и она может решить проблему обычного отката.

Временный обходной путь

из-заmasterВетка является защищенной веткой.push. Если вы не хотите проходитьmergeспособ отката, так что вы можете только временно установитьMaintainerимеютpushразрешения, затем поMaintainerВыполните операцию отката.

git checkout master
git pull
git show 1.0.3
git reset --hard 90c9170a499c2c5f8f8cf4e97fc49a91d714be50
git push origin HEAD

После того, как вы закончите, не забудьтеmasterотключитьpush.

В: Почему бы не позволитьMaintainerвсегда естьmasterизpushразрешения?

A: Основная причина - предотвратить несчастные случаи в производственной среде, безопаснее давать временные разрешения!

Что не так с git reset --hard?

Как название,git reset --hardПроблема действительно есть.git reset --hardПринадлежит к высокопроизвою игру, двигаться напрямуюHEADУказатель отбрасывает последующие записи отправки. Если вы случайно допустили ошибку, не паникуйте, вы все равно можете запроситьgit reflogоказатьсяcommitIdспасен;git resetСуществует также скрытая проблема послеbranchпровестиmergeВо время работыgit resetКод отката был повторно введен. Итак, как решить эти проблемы?

一筹莫展

Не паникуйте, на этот раз вы должны вытащитьgit revert.

Q: git revertГде преимущества?

Первый,git revertОперация отката выполняется через новый коммит, а указатель HEAD перемещается вперед, благодаря чему запись не потеряется, кроме того,git revertне вызоветmergeКод отката был ошибочно введен при использовании старой ветки. самое главное,git revertОн более совершенен в детальном контроле отката, который может удовлетворить потребности частичного отката.

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

我太难了

Во-первых, давайте проверим журнал и найдем два требования.commitId

PS D:\tusi\projects\test\git_test> git log --oneline
86252da (HEAD -> master, origin/master, origin/HEAD) 解决冲突
e3cef4e (origin/release, release) Merge branch 'develop' into 'release'
f247f38 (origin/develop, develop) 需求2
89502c2 需求1

мы используемgit revertОткатить код, относящийся к требованию 1

git revert -n 89502c2

В это время может потребоваться разрешение конфликта, а после разрешения конфликта можноpushна удаленныйmasterразветвленный.

git add .
git commit -m '回滚需求1的相关代码,并解决冲突'
git push origin master

Это все еще похоже на овощ, если у больших парней есть более элегантное решение, попросите совета!

Исправление онлайн-ошибок

исправление / 5, ветка исправления, соответствующая выпуску 5

Например, система не может войти в систему.bug, инженер-испытатель тожеTAPDБыла отправлена ​​запись об ошибке. тогда исправить онлайнbugКакие шаги?

  1. Создайтеissue, заголовок можно изменить сTAPDсерединаBugОдинcopyЗайди сюда, и описание будет вставленоBugВсего одна ссылка.

  2. на основеmasterветка создать веткуhotfix/5.

    git checkout -b hotfix/5 origin/master
    
  3. Сверните код, чтобы исправить эту ошибку...

  4. почини этоbugПосле этого отправьте код филиала на удаленный склад с одноименным филиалом

    git push origin HEAD
    
  5. затем инициироватьcherry pickсливаться сmasterа такжеdevelopфилиал, и вmasterветка с новой версиейtag(Предполагая, что текущий самый большойtagда1.0.0, то новая версияtagДолжно быть1.0.1).

Исправление ошибок в старых версиях онлайн

fix/6, онлайн-ветвь исправления старой версии, соответствующая выпуску 6

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

  1. Создайтеissue, четко опишите проблему

  2. Предположим, что текущая версия1.0.0,а также0.9.0версия изbug, следует основываться наtag 0.9.0Создайтеfixветвь.

    git checkout -b fix/6 0.9.0
    
  3. После устранения дефекта его следует пометить новымtag 0.9.1, и нажмите на удаленный.

    git tag 0.9.1
    git push origin tag 0.9.1
    
  4. если этоbugТакже присутствует в последнихmasterфилиал, вам нужноgit push origin HEADпредставить этоfixРазветвите код в удаленный репозиторий с тем же именем, а затем запуститеcherry pickсливаться сmaster, конфликт, вероятно, существует в это время, и конфликт необходимо разрешить.

    cherry pick

cherry pick

в обученииcherry pickРаньше я всегда думал, что толькоgit mergeКод можно объединять, и я несколько раз сталкивался с проблемой объединения нежелательного кода. имеютcherry pickМы можем представить единую консолидированную запись, разрешениеgit mergeПроблема с объединением слишком большого количества нежелательного контента при решенииbugособенно полезно.

git rebase

После использования этого некоторое время я обнаружил, что с помощьюgit mergeПри объединении ветвей это сделаетgit logизGraphГрафик выглядит несколько затянутым.

PS D:\tusi\projects\gitlab\projectname> git log --pretty --oneline --graph
*   7f513b0 (HEAD -> develop) Merge branch 'issue/55' into 'release'
|\
| * 1c94437 (origin/issue/55, issue/55) fix: 【bug】XXX1
| *   c84edd6 Merge branch 'release' of host:project_repository into release
| |\
| |/
|/|
* |   115a26c Merge branch 'develop' into 'release'
|\ \
| * \   60d7de6 Merge branch 'issue/30' into 'develop'
| |\ \
| | * | 27c59e8 (origin/issue/30, issue/30) fix: 【bug】XXX2
| | | *   ea17250 Merge branch 'release' of host:project_repository into release
| | | |\
| |_|_|/
|/| | |
* | | |   9fd704b Merge branch 'develop' into 'release'
|\ \ \ \
| |/ / /
| * | |   a774d26 Merge branch 'issue/30' into 'develop'
| |\ \ \
| | |/ /

Потом я узналgit rebase, перебазирование, хахаха. из-заrebaseЯ мало что знаю об этом, и я не осмеливаюсь легко изменить это в настоящее время.rebase,после всегоrebaseЕсть еще много скрытых ям, так что будьте осторожны при их использовании! Сначала выкопайте яму здесь, а потом засыпьте яму, когда поймёте...

Меры предосторожности

  1. В общем, самодеятельностьMerge Requestдругой коллегаReviewИ согласитесь на слияние, что более способствует поиску проблем в коде.
  2. правильный,TAPDтакже поддерживаетGitlabсинергетический. Подробнее см.Рекомендации по сопоставлению исходного кода.

Эпилог

Практика доказала, что этоGitВ настоящее время рабочий процесс может охватывать большинство сценариев в процессе разработки моего проекта. Однако следует отметить, что лучше всего подходит тот, который подходит именно вам.Слепое принятие чужих планов иногда будет недопустимым.

Вышеупомянутое является исключительно внутренним для небольшой и микро-команды, работающей над интерфейсом.GitlabНа практике должно быть много недостатков.Если есть какие-либо ошибки, пожалуйста, поправьте меня, добро пожаловать на обмен.

欢迎关注&交流