Ọnọdụ ndị a na-ahụkarị na ntinye aka na-aga n'ihu

Вы изучили команды Git но хотите представлять, как непрерывная интеграция (Continuous Integration, CI) происходит в реальности? Или может вы хотите оптимизировать свои ежедневные действия? Этот курс даст вам практические навыки непрерывной интеграции с использованием репозитория на GitHub. Данный курс не задуман как некий визард, который можно просто прокликать, напротив, вы будете совершать те же действия, что люди на самом деле делают на работе, тем же способом, которым они это делают. Я буду объяснять теорию по мере прохождения вами имеющих к ней отношение шагов.

Что мы будем делать?

Ka anyị na-aga n'ihu, anyị ga-eji nwayọọ nwayọọ mepụta ndepụta nke usoro CI, nke bụ ụzọ dị mma isi cheta ndepụta a. N'ikwu ya n'ụzọ ọzọ, anyị ga-emepụta ndepụta nke omume ndị mmepe na-eme mgbe ha na-eme njikọ na-aga n'ihu, na-eme ka njikọ na-aga n'ihu. Anyị ga-ejikwa ule dị mfe iji weta usoro CI anyị nso na nke bụ ezie.

GIF a schematically na-egosi mmekwa ahụ na ebe nchekwa gị ka ị na-aga n'ihu na nkuzi ahụ. Dị ka ị pụrụ ịhụ, ọ dịghị ihe mgbagwoju anya ebe a na naanị ihe kasị mkpa.

Ọnọdụ ndị a na-ahụkarị na ntinye aka na-aga n'ihu

Вы пройдёте такие стандартные для CI сценарии:

  • Na-arụ ọrụ na atụmatụ;
  • Применение автотестов для обеспечения качества;
  • Mmezu nke ọrụ izizi;
  • Разрешение конфликта при слиянии ветвей (merge conflict);
  • Njehie na-eme na gburugburu mmepụta.

Kedu ihe ị ga-amụta?

Ị ga-enwe ike ịza ajụjụ ndị a:

  • Kedu ihe bụ njikọta na-aga n'ihu (CI)?
  • Какие типы автотестов используются при CI, и в ответ на какие действия они запускаются?
  • Kedu ihe bụ arịrịọ ịdọrọ na mgbe achọrọ ha?
  • Kedu ihe bụ Test Driven Development (TDD) na kedu ka o si metụta CI?
  • Ekwesịrị m ijikọ ma ọ bụ megharịa mgbanwe ndị ahụ?
  • Откатывать или чинить в следующей версии?

Na mbụ m sụgharịrị ihe dị ka "ịdọrọ arịrịọ" n'ebe nile, ma n'ihi ya, m kpebiri ịlaghachi nkebi ahịrịokwu n'asụsụ Bekee n'ebe ụfọdụ iji belata ogo nke ara na ederede. Mgbe ụfọdụ, m ga-eji “programmer surzhik” dị ka ngwaa magburu onwe ya “kwenye” ebe ndị mmadụ na-eji ya na-arụ ọrụ.

Что такое непрерывная интеграция?

Njikọ aka na-aga n'ihu, ma ọ bụ CI, bụ omume ọrụ aka nke onye otu ọ bụla na-ejikọta koodu ha n'ime ebe nchekwa ihe ọ dịkarịa ala otu ugboro n'ụbọchị, na koodu ga-esi na ya pụta ga-enwerịrị ike ịrụ ya n'enweghị njehie.

Существуют разночтения по поводу этого термина

Предметом спора является частота интеграции. Некоторые утверждают, что объединять код лишь раз в день недостаточно на самом деле интегрироваться непрерывно. В пример приводится команда, где все берут свежий код утром и интегрируются один раз вечером. Хотя это и разумное возражение, всё же в целом считается, что вариант определения "раз в день" достаточно практичен, конкретен, и подходит для команд разных размеров.

Другое возражение состоит в том, что C++ давно не единственный язык, используемый при разработке, и простое требование сборки без ошибок, как способ валидации, слабовато. Некий набор тестов (например, модульных(unit), выполняемых локально) также должен завершиться успешно. В данный момент, сообщество тяготеет к тому, чтобы такое требование было обязательным, и, в будущем "сборка + модульные тесты", видимо, станет общепринятым, если это уже не произошло.

Njikọ aka na-aga n'ihu dị iche na nnyefe na-aga n'ihu (Nnyefe na-aga n'ihu, CD) n'ihi na ọ chọghị onye ntọhapụ mgbe usoro ntinye ọ bụla gasịrị.

Ndepụta usoro anyị ga-eji oge niile

  1. Pull in the latest code. Create a branch from master. Malite ịrụ ọrụ.
  2. Mepụta nkwa na alaka ọhụrụ gị. Wulite ma nwalee na mpaghara. Gafere? Gaa na nzọụkwụ ọzọ. Ọ dara? Dozie mperi ma ọ bụ ule wee nwaa ọzọ.
  3. Pịa na ebe nchekwa dịpụrụ adịpụ ma ọ bụ alaka ụlọ ọrụ dịpụrụ adịpụ.
  4. Create a pull request. Discuss the changes, add more commits as discussion continues. Make tests pass on the feature branch.
  5. Merge/rebase commits from master. Make tests pass on the merge result.
  6. Bugharịa site na ngalaba njirimara na mmepụta.
  7. Ọ bụrụ na ihe niile dị mma na mmepụta maka oge ụfọdụ, jikọta mgbanwe na nna ukwu.

Ọnọdụ ndị a na-ahụkarị na ntinye aka na-aga n'ihu

️ Nkwadebe

Jide n'aka na ị nwere ngwanrọ kwesịrị ekwesị

Iji nweta nkuzi a ị ga-achọ Node.js и Git ahịa.

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

Gbaa mbọ hụ na ị nwere onye ahịa Git arụnyere na-akwado ahịrị iwu

Ọ bụrụ na ị nwebeghị onye ahịa Git na-akwado ahịrị iwu, ị nwere ike ịhụ ntuziaka nwụnye ebe a.

Подготовьте репозиторий

Вам потребуется создать личную копию(fork) ebe nchekwa template nwere koodu maka usoro ahụ na GitHub. Ka anyị kwenye ịkpọ nke a nkeonwe репозиторием курса.

Сделали? Если вы не меняли настройки по умолчанию, ваш репозиторий курса скорее всего называется continuous-integration-team-scenarios-students, ọ dị na akaụntụ GitHub gị ma URL dị ka nke a

https://github.com/<ваше имя ползователя на GitHub>/continuous-integration-team-scenarios-students

Я буду называть этот адрес просто <URL репозитория>.

Ihe nkwado akụkụ dị ka <тут> будут означать, что вы должны заменить такое выражение на соответствующее значение.

Убедитесь что Omume GitHub gụnyere maka ebe nchekwa ihe ọmụmụ a. Ọ bụrụ na enyereghị ha aka, biko mee ka ha nwee ike site na ịpị nnukwu bọtịnụ dị n'etiti ibe ahụ, nke ị nwere ike nweta site na ịpị Actions na interface GitHub.

Ị gaghị enwe ike mezue usoro ahụ na-eso ntuziaka m ma ọ bụrụ na GitHub Actions adịghị enyere.

Ọnọdụ ndị a na-ahụkarị na ntinye aka na-aga n'ihu

Вы всегда можете использовать способность GitHub отображать Markdown чтобы увидеть текущее состояние списка, который мы сочиняем, тут

https://github.com/<your GitHub user name>/continuous-integration-team-scenarios-students/blob/master/ci.md

Banyere azịza ya

Ọ bụ ezie na ụzọ kacha mma iji mezue nkuzi a bụ ime ya n'onwe gị, ị nwere ike ịnwe nsogbu ụfọdụ.

Если вы чувствуете, что не понимаете что делать и не можете продолжать, можете подсмотреть в ветку solution, которая есть в вашем стартовом репозитории.
Biko ejikọtala ọnụ solution в master n'oge usoro. Ị nwere ike iji ngalaba a chọpụta ihe ị ga-eme, ma ọ bụ tulee koodu gị na nke onye odee, na-eji ike niile Git na-enye anyị. Ọ bụrụ na ị furu efu kpamkpam, ị nwere ike dochie alaka gị kpamkpam master на ветку solution wee tọgharịa ndekọ ndekọ ọrụ gị na usoro usoro ị chọrọ.

Используйте это только если вам это действительно нужно

Tinye koodu gị

git add .
git commit -m "Backing up my work"

Эти команды

  • переименовывают master в master-backup;
  • переименовывают solution в master;
  • переключают(checkout) на новую ветку master ma degharịa ọdịnaya nke akwụkwọ ndekọ aha ọrụ;
  • создают ветку "solution" из "master" (которая раньше была "solution") на случай если вам в будущем понадобится ветка "solution".

git branch -m master master-backup
git branch -m solution master
git checkout master -f
git branch solution

После этих действий вы можете использовать git log master чтобы выяснить, какой коммит вам нужен.
Ị nwere ike ịtọgharịa ndekọ ọrụ gị ka ọ bụrụ nke a:

git reset --hard <the SHA you need>

Ọ bụrụ na ị nwere obi ụtọ na nsonaazụ ya, n'oge ụfọdụ, ị ga-achọ ibipụta ụdị nke ebe nchekwa gị na ebe nchekwa dịpụrụ adịpụ. Echefula ịkọwapụta alaka ụlọ ọrụ dịpụrụ adịpụ mgbe ị na-eme nke a.

git push --force origin master

Biko mara na anyị na-eji git push --force. O yighị ka ị ga-achọ ime nke a ọtụtụ oge, mana anyị nwere ọnọdụ akọwapụtara ebe a yana otu onye ọrụ nchekwa nke, na mgbakwunye, ghọtara ihe ọ na-eme.

Malite ịrụ ọrụ

Ọnọdụ ndị a na-ahụkarị na ntinye aka na-aga n'ihu

Ka anyị malite ịchịkọta ndepụta nke usoro CI anyị. Dị ka ọ na-adịkarị, ị ga-amalite nzọụkwụ a site na ịlele ụdị koodu kachasị ọhụrụ site na ebe nchekwa dịpụrụ adịpụ, mana anyị enweghị ebe nchekwa mpaghara, yabụ anyị na-emechi ya site na nke dịpụrụ adịpụ kama.

️ Задание: обновите локальный репозиторий, создайте ветку из master, начните работать

  1. Mechie ebe nchekwa ihe ọmụmụ si <URL репозитория>.
  2. Na-agba ọsọ npm install n'ime akwụkwọ akụkọ ihe mere eme; Anyị chọrọ ya iji wụnye Jest, nke anyị na-eji mee ule.
  3. Создайте ветку и назовите ее feature. Переключитесь на эту ветку.
  4. Tinye koodu ule na ci.test.js n'etiti okwu na-arịọ m ka m mee nke a.

    it('1. pull latest code', () => {
      expect(/.*pull.*/ig.test(fileContents)).toBe(true);
    });
    
    it('2. add commits', () => {
      expect(/.*commit.*/ig.test(fileContents)).toBe(true);
    });
    
    it('3. push to the remote branch with the same name', () => {
      expect(/.*push.*/ig.test(fileContents)).toBe(true);
    });
    
    it('4. create a pull request and continue working', () => {
      expect(/.*pulls+request.*/ig.test(fileContents)).toBe(true);
    });

  5. Tinye ederede nwere nzọụkwụ anọ mbụ na faịlụ ahụ ci.md.
    1. Pull in the latest code. Create a branch from `master`. Start working.    
    2. Create commits on your new branch. Build and test locally.  
    Pass? Go to the next step. Fail? Fix errors or tests and try again.  
    3. Push to your remote repository or remote branch.  
    4. Create a pull request. Discuss the changes, add more commits  
    as discussion continues. Make tests pass on the feature branch.  

    Egwuregwu

# Клонируйте репозиторий курса
git clone <repository URL>
cd <repository name>

# Выполните npm install в каталоге репозитория курса; он установит Jest, который мы используем для запуска тестов.
npm install

# Создайте ветку и назовите ее feature. Переключитесь на эту в ветку.
git checkout -b feature

# Отредактируйте ci.test.js как описано выше.
# Отредактируйте ci.md как описано выше

Создавайте коммиты в новой ветке, осуществляйте сборку и тестирование локально

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

Ọdịtụ a na-ahụkarị mgbe ule na-agba ọsọ na-akpaghị aka

  • Локально:
    • Постоянно или в ответ на соответствующие изменения кода;
    • При сохранении (для интерпретируемых или JIT-компилируемых языков);
    • N'oge mgbakọ (mgbe achọrọ nchịkọta);
    • При коммите;
    • Mgbe a na-ebipụta na ebe nchekwa ekekọrịtara.

  • Na ihe nkesa na-ewu ma ọ bụ wuo gburugburu:
    • Mgbe ebipụtara koodu na ngalaba/ebe nchekwa nkeonwe.
    • A na-anwale koodu dị na eri a.
    • Тестируется потенциальный результат слияния (обычно с master).
    • Dị ka usoro ntinye aka na-aga n'ihu / pipeline nnyefe na-aga n'ihu

Dị ka ọ na-adịkarị, ka ụlọ nyocha na-agba ọsọ ọsọ, ka ị na-enwe ike imeli ya. Nkesa ogbo nwere ike ịdị ka nke a.

  • Быстрые модульные тесты — при сборке, в конвейере CI
  • Медленные модульные тесты, быстрые компонентные и интеграционные тесты — при коммите, в конвейере CI
  • Медленные компонентные и интеграционные тесты — в конвейере CI
  • Nnwale nchekwa, nnwale ibu na ule ndị ọzọ na-ewe ma ọ bụ dị oke ọnụ - na pipeline CI / CD, mana naanị n'ụdị ụfọdụ / ọkwa / ọkpọkọ nke ụlọ, dịka ọmụmaatụ, mgbe ị na-akwado onye ntọhapụ ntọhapụ ma ọ bụ mgbe ọ na-agba ọsọ.

️ Ọrụ

Я предлагаю сначала запустить тесты вручную, используя команду npm test. После этого давайте добавим git hook для запуска наших тестов при коммите. Есть одна загвоздка: Git hooks не считаются частью репозитория и поэтому не могут быть клонированы из GitHub вместе с остальными материалами курса. Чтобы установить hook, вам нужно запустить install_hook.sh ma ọ bụ detuo faịlụ ahụ repo/hooks/pre-commit в локальный каталог .git/hooks/.
При коммите вы увидите, что выполняются тесты, и они проверяют, присутствуют ли в списке определенные ключевые слова.

  1. Запустите тесты вручную, выполнив команду npm test na folda nchekwa akwụkwọ gị. Chọpụta na emechaala ule a.
  2. Tọọ nko (ịkwado tupu emechaa) site n'ịgba ọsọ install_hook.sh.
  3. Закоммитьте изменения в локальный репозиторий.
  4. Gbaa mbọ hụ na agbagoro ule tupu emee.

Ebe nchekwa gị kwesịrị ịdị ka nke a ma emechaa usoro ndị a.
Ọnọdụ ndị a na-ahụkarị na ntinye aka na-aga n'ihu

Egwuregwu

# Установите pre-commit hook выполнив install_hook.sh.  

# Закоммитьте изменения в локальный репозиторий. Используйте "Add first CI steps" в качестве сообщения при коммите.
git add ci.md ci.test.js
git commit -m "Add first CI steps"

# Убедитесь, что тесты запускаются перед коммитом.  

Bipụta koodu gaa na ebe nchekwa dịpụrụ adịpụ ma ọ bụ alaka ụlọ ọrụ dịpụrụ adịpụ

Завершив работать локально, разработчики обычно делают свой код общедоступным, чтобы его можно было в конечном итоге интегрировать с общим. С помощью GitHub это обычно достигается публикацией работы либо в персональной копии репозитория(personal fork, форк), либо в личной ветке.

  • При использовании форков разработчик клонирует удаленный общий репозиторий, создавая его личную удаленную копию, также известную как форк. После этого он клонирует этот личной репозиторий, чтобы работать с ним локально. Когда работа завершена и коммиты созданы, он помещает их в свой форк, где они доступны другим и могут быть интегрированы в общий репозиторий. Этот подход обычно используется в проектах с открытым исходным кодом на GitHub. Он также используется в моем расширенном курсе [Team Work and CI with Git] (http://devops.redpill.solutions/).
  • Ụzọ ọzọ bụ iji naanị otu ebe nchekwa dịpụrụ adịpụ wee gụọ alaka ụlọ ọrụ master совместно используемого репозитория "защищенной". В этом сценарии отдельные разработчики публикуют свой код в ветки удаленного репозитория, чтобы другие могли этот код посмотреть, если все в порядке, объединить с master ebe nchekwa òkè.

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

Ka anyị bipụta koodu anyị.

️ Ọrụ

  • Bipụta mgbanwe na alaka ụlọ ọrụ dịpụrụ adịpụ nke nwere otu aha dị ka alaka ụlọ ọrụ gị na-arụ ọrụ

Egwuregwu

git push --set-upstream origin feature

Mepụta arịrịọ ịdọrọ

Создайте pull request с названием Nyochaa nzọụkwụ... Wụnye feature dị ka "isi alaka" na master dị ka "alaka isi".

Убедитесь, что вы установили master n'ime ya ndụdụ ebe nchekwa в качестве "base branch", я не буду отвечать на запросы на изменения в репозиторий с материалами курса.

На сленге GitHub "base branch" — это ветка, на которой вы основываете свою работу, а "head branch" — это ветка, содержащая предлагаемые изменения.

Kwurịtara mgbanwe ndị a, tinye nkwa ọhụrụ ka mkparịta ụka na-aga n'ihu

Mbupu arịrịọ (PR)

Mbupu arịrịọ (PR) — это способ обсудить и задокументировать код, а также провести проверку(code review) кода. Pull request названы в честь общего способа интеграции отдельных изменений в общий код. Обычно человек клонирует удаленный официальный репозиторий проекта и работает над кодом локально. После этого он помещает код в свой личный удаленный репозиторий и просит ответственных за официальный репозиторий забрать(Dọọ) koodu ya n'ime ebe nchekwa mpaghara ha, ebe ha na-enyocha ma nwee ike jikọta(jikota) ya. A na-ejikwa aha ndị ọzọ mara echiche a, dịka ọmụmaatụ, jikota arịrịọ.

На самом деле вам не обязательно использовать функцию pull request GitHub или аналогичных платформ. Команды разработчиков могут использовать другие способы связи, включая личное общение, голосовые звонки или электронную почту, но есть всё же ряд причин использовать такие pull requests в стиле обсуждения на форуме. Вот некоторые из них:

  • mkparịta ụka a haziri ahazi metụtara mgbanwe koodu kpọmkwem;
  • dị ka ebe a na-elele nzaghachi na-arụ ọrụ na-aga n'ihu site na ma autotesters na ndị ọgbọ;
  • formalization nke koodu nyocha;
  • чтобы позже можно было выяснить причины и соображения, стоящие за тем или иным фрагментом кода.

Na-emekarị ị na-emepụta arịrịọ ịdọrọ mgbe ịchọrọ ịkparịta ihe ma ọ bụ nweta nzaghachi. Dịka ọmụmaatụ, ọ bụrụ na ị na-arụ ọrụ na atụmatụ enwere ike itinye n'ọrụ n'ọtụtụ ụzọ, ị nwere ike ịmepụta arịrịọ ịdọrọ tupu ịde akara mbụ nke koodu iji kesaa echiche gị wee kparịta atụmatụ gị na ndị ọrụ gị. Ọ bụrụ na ọrụ ahụ dị mfe karị, a na-emepe arịrịọ ịdọrọ mgbe emechara ihe, mee ya, ma nwee ike ikwurịta ya. N'ọnọdụ ụfọdụ, ị nwere ike ịmepe PR naanị maka njikwa mma: iji mee ule akpaghị aka ma ọ bụ malite nyocha koodu. Ihe ọ bụla ị kpebiri, echefula ịkpọ @kpọ aha ndị ị chọrọ nkwado ha na arịrịọ gị.

Обычно при создании PR вы делаете следующее.

  • Gosipụta ihe ị tụrụ aro ka ịgbanwe na ebe.
  • Пишете описание, объясняющее цель изменений. Вы можете захотеть:
    • добавить что-нибудь важное, что не является очевидным из кода, или что-нибудь полезное для понимания контекста, например соответствующие #баги и номера коммитов;
    • @kpọọ onye ọ bụla ịchọrọ ịmalite iso ya na-arụ ọrụ, ma ọ bụ ị nwere ike @ kpọtụrụ ha na nkwupụta ma emechaa;
    • Rịọ ndị ọrụ ibe ka ha nyere aka na ihe ma ọ bụ lelee ihe akọwapụtara.

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

Biko chere ka emechara ule a. Ị nwere ike ịhụ ọkwa nke ule na ala nke mkparịta ụka PR na GitHub interface. Gaa n'ihu mgbe emechara ule.

️ Добавьте замечание о произвольности списка шагов CI

Ndepụta ejiri mee ihe na nkuzi a bụ aka ike na nke onwe ya, anyị kwesịrị itinye ndetu banyere nke a.

️ Задание: создание pull request для данного примечения

  1. Gbanwee na alaka ụlọ ọrụ master.
  2. Создайте ветку с именем bugfix.
  3. Tinye ederede ndetu na njedebe nke faịlụ ahụ ci.md.
    > **GitHub flow** is sometimes used as a nickname to refer to a flavor of trunk-based development  
    when code is deployed straight from feature branches. This list is just an interpretation  
    that I use in my [DevOps courses](http://redpill.solutions).  
    The official tutorial is [here](https://guides.github.com/introduction/flow/).
  4. Mee mgbanwe ndị ahụ.
  5. Опубликуйте ветку bugfix в удалённый репозиторий.
  6. Mepụta arịrịọ ịdọrọ aha Adding a remark ya na alaka isi bugfix na alaka isimaster.

Убедитесь, что вы установили master n'ime ya ndụdụ ebe nchekwa в качестве "base branch", я не буду отвечать на запросы на изменения в репозиторий с материалами курса.

Nke a bụ ihe ebe nchekwa gị kwesịrị ịdị ka.
Ọnọdụ ndị a na-ahụkarị na ntinye aka na-aga n'ihu

Egwuregwu

# Переключитесь на ветку master. Создайте ветку bugfix.
git checkout master

# Создайте ветку bugfix-remark.
git checkout -b bugfix

# Добавьте текст примечания внизу ci.md.

# Закоммитьте изменения
git add ci.md
git commit -m "Add a remark about the list being opinionated"

# Опубликуйте ветку bugfix в удалённый репозиторий.
git push --set-upstream origin bugfix

# Создайте pull request при помощи интерфейса GitHub как описано выше

Kwado arịrịọ ịdọrọ "Tinye nkwupụta"

️ Ọrụ

  1. Mepụta arịrịọ ịdọrọ.
  2. Pịa "Jikota arịrịọ ịdọrọ".
  3. Pịa "Kwenye njikọ."
  4. Pịa "Hichapụ alaka", anyị adịghịzi mkpa ya.

Nke a bụ eserese ngosi nke mmekọ mgbe njikọta.
Ọnọdụ ndị a na-ahụkarị na ntinye aka na-aga n'ihu

️ Продолжайте работать и добавлять тесты

Imekọ ihe ọnụ na arịrịọ ịdọrọ na-ebutekarị ọrụ ọzọ. Nke a na-abụkarị nsonaazụ koodu nyocha ma ọ bụ mkparịta ụka, mana na usoro anyị anyị ga-eṅomi nke a site na ịgbakwunye ihe ọhụrụ na ndepụta nke usoro CI anyị.

Mwekota na-aga n'ihu na-agụnye ụfọdụ mkpuchi ule. Ihe achọrọ mkpuchi ule na-adịgasị iche, a na-ahụkarị ya n'ime akwụkwọ a na-akpọ ihe dịka "atụmatụ ntinye aka". Anyị ga-eme ka ọ dị mfe ma tinye ule maka ahịrị ọ bụla na ndetu anyị.

При выполнении заданий сначала попробуйте закоммитить тесты. Если вы правильно установили pre-commit nko na mbụ, ule agbakwunyere ọhụrụ ga-agba ọsọ, ọ ga-ada, ọ nweghịkwa ihe a ga-eme. Mara na otu a ka anyị siri mara na ule anyị na-anwale ihe n'ezie. N'ụzọ na-akpali mmasị, ọ bụrụ na anyị malite na koodu tupu ule ahụ, ịgafe ule nwere ike ịpụta na koodu ahụ na-arụ ọrụ dịka a tụrụ anya ya, ma ọ bụ na ule ndị ahụ anaghị anwale ihe ọ bụla. Ọzọkwa, ọ bụrụ na anyị edebeghị ule ahụ na mbụ, anyị nwere ike chefuola ha kpamkpam, ebe ọ nweghị ihe gaara echetara anyị ya.

Nnwale akwalitela mmepe (TDD)

TDD рекомендует писать тесты перед кодом. Обычный процесс работы с использованием TDD выглядит так.

  1. Tinye ule.
  2. Запустите все тесты и убедитесь, что новый тест не проходит успешно.
  3. Напишите код.
  4. Gbaa ule, hụ na ule niile gafere.
  5. Проведите рефакторинг кода.
  6. Tinyegharịa.

Поскольку результаты работы тестов, которые не были пройдены успешно, обычно отображается красным, а выполненные успешно — зеленым, цикл также известен как "красный-зеленый-рефакторинг"(red-green-refactor).

️ Ọrụ

Сначала попробуйте закоммитить тесты и дать им завершиться неуспешно, затем добавьте и закоммитьте сам текст списка шагов CI. Вы увидите, что тесты проходят ("зеленые").
Wee bipụta koodu ọhụrụ ahụ na ebe nchekwa dịpụrụ adịpụ wee lelee ule ndị a na-agba na interface GitHub na ala nke mkparịta ụka a na-adọta na mmelite ọkwa PR.

  1. Gbanwee na alaka ụlọ ọrụ feature.
  2. Tinye ule ndị a na ci.test.js после последнего вызова it (...);.

    it('5. Merge/rebase commits from master. Make tests pass on the merge result.', () => {
      expect(/.*merge.*commits.*testss+pass.*/ig.test(fileContents)).toBe(true);
    });
    
    it('6. Deploy from the feature branch to production.', () => {
      expect(/.*Deploy.*tos+production.*/ig.test(fileContents)).toBe(true);
    });
    
    it('7. If everything is good in production for some period of time, merge changes to master.', () => {
      expect(/.*merge.*tos+master.*/ig.test(fileContents)).toBe(true);
    });

  3. Попробуйте закоммитить тесты. Если pre-commit nko arụnyere, mgbalị ime ga-ada.
  4. Mgbe ahụ tinye ederede a na ci.md.
    5. Merge/rebase commits from master. Make tests pass on the merge result.  
    6. Deploy from the feature branch with a sneaky bug to production.
    7. If everything is good in production for some period of time, merge changes to master. 
  5. Внесите и закоммитьте изменения локально.
  6. Bipute mgbanwe na alaka ụlọ ọrụ feature.

I kwesịrị inwe ihe dị ka nke a ugbu a
Ọnọdụ ndị a na-ahụkarị na ntinye aka na-aga n'ihu

Egwuregwu


# Переключительна ветку feature
git checkout feature

# Добавить тесты в ci.test.js как описано выше

# Добавьте в индекс ci.test.js чтобы позже закоммитить
git add ci.test.js

# Попытайтесь закоммитить тесты. Если pre-commit hook установлены, коммит не произойдёт.
git commit

# Теперь добавьте текст в ci.md как описано выше

# Внесите изменения и закоммитьте их
git add ci.md
git commit -m "Add the remaining CI steps"

# Опубликуйте изменения в ветку feature
git push

Jikọta esemokwu

Gaa na Arịrịọ Gbanwee Nyochaa nzọụkwụ.

Несмотря на то, что мы не сделали ничего плохого, и тесты для нашего кода прошли успешно, мы все еще не можем осуществить слияние ветки feature и master. Это потому, что другая ветка bugfix e jikọtara ya na master пока мы работали над этим PR.
Nke a na-emepụta ọnọdụ ebe alaka ụlọ ọrụ dịpụrụ adịpụ master имеет более новую версию, чем та, на которой мы основывали ветку feature. N'ihi nke a, anyị enweghị ike iweghachite isi master ruo na njedebe nke eri feature. N'okwu a, anyị kwesịrị ijikọ ma ọ bụ tinye nkwa feature rebase master. GitHub на самом деле может выполнять автоматическое слияние, если нет конфликтов. Увы, в нашей ситуации обе ветки имеют конкурирующие изменения в файле ci.md. Эта ситуация известна как конфликт при слиянии(merge conflict), и нам нужно разрешить ее вручную.

Jikọọ ma ọ bụ rebase

Jikota

  • Na-emepụta ntinye mgbakwunye mgbakwunye ma chekwaa akụkọ ọrụ.
    • Сохраняет исходные коммиты веток с исходными отметками времени и авторами.
    • Na-echekwa SHA nke nkwa na njikọ ha na mkparịta ụka arịrịọ mgbanwe.
  • Требует однократного разрешения конфликтов.
  • Делает историю нелинейной.
    • Akụkọ ahụ nwere ike isi ike ịgụ ya n'ihi nnukwu ngalaba (nke na-echetara eriri IDE).
    • Na-eme ka nbipu akpaaka sie ike karịa, dịka ọmụmaatụ. git bisect менее полезным — он только найдет коммит слияния.

Na-akwụghachi

  • Replays na-eme site na ngalaba dị ugbu a n'elu alaka ntọala otu otu.
    • A na-emepụta nkwa ọhụrụ na SHA ọhụrụ, na-eme ka ihe ndị ahụ dị na GitHub kwekọọ na arịrịọ mbụ ịdọrọ, mana ọ bụghị nkwupụta kwekọrọ.
    • Enwere ike ịmegharị ma gbanwee n'ime usoro a, ma ọ bụ ọbụna jikọta n'ime otu.
  • Enwere ike idozi ọtụtụ esemokwu.
  • Позволяет поддерживать линейную историю.
    • Akụkọ ahụ nwere ike ịdị mfe ịgụ ma ọ bụrụhaala na ọ dị ogologo karịa n'enweghị ihe kpatara ya.
    • Ndozi akpaaka na nchọpụta nsogbu dị ntakịrị mfe: na-eme ka o kwe omume git bisect, nwere ike ime ka ntughari akpaka dokwuo anya ma bụrụkwa amụma.
  • Na-achọ ibipụta alaka ụlọ ọrụ nwere nkwagharị akwagharị nwere ọkọlọtọ --force mgbe ejiri arịrịọ ịdọrọ.

Na-emekarị, ndị otu na-ekweta ka ha na-eji otu atụmatụ mgbe ọ bụla ha kwesịrị ijikọ mgbanwe. Nke a nwere ike ịbụ njikọ "dị ọcha" ma ọ bụ "dị ọcha" ime n'elu, ma ọ bụ ihe dị n'etiti, dị ka ime nkwa n'elu mmekọrịta(git rebase -i) mpaghara maka alaka ndị anaghị ebipụta ya na ebe nchekwa ọha, mana jikọta maka alaka "ọhaneze".

Здесь мы будем использовать слияние.

️ Ọrụ

  1. Gbaa mbọ hụ na koodu ahụ dị na ngalaba mpaghara master emelitere site na ebe nchekwa dịpụrụ adịpụ.
  2. Gbanwee na alaka ụlọ ọrụ feature.
  3. Инициируйте слияние с веткой master. Esemokwu jikọrọ ọnụ n'ihi mgbanwe asọmpi na ci.md.
  4. Разрешите конфликт так, чтобы в тексте остался и наш список шагов CI, и замечание о нем.
  5. Опубликуйте коммит слияния в удаленную ветку feature.
  6. Lelee ọkwa nke arịrịọ ịdọrọ na GitHub UI wee chere ruo mgbe edoziri njikọ ahụ.

Egwuregwu

# Убедитесь, что код в локальное ветке `master` обновлён из удалённого репозитория.
git checkout master
git pull

# Переключитесь на ветку feature
git checkout feature

# Инициируйте слияние с веткой master 
git merge master

# A merge conflict related to concurrent changes to ci.md will be reported
# => Auto-merging ci.md
#    CONFLICT (content): Merge conflict in ci.md
#    Automatic merge failed; fix conflicts and then commit the result.

# Разрешите конфликт так, чтобы и наш список шагов CI, и замечание о нем остались в тексте.
# отредактируйте ci.md чтоб он не содержал маркеров конфликта слияния
git add ci.md
git merge --continue
# при коммите можете оставить сообщение по умолчанию

# Опубликуйте коммит слияния в удаленную ветку feature.
git push

# Проверьте статус запроса на изменения в пользовательском интерфейсе GitHub, дождитесь пока слияние не будет разрешено.

Ezigbo ọrụ!

Вы закончили работу со списком, и теперь вам нужно утвердить pull request в master.

Ọrụ ️: Kwadoro arịrịọ ịdọrọ "nyocha nzọụkwụ"

  1. Mepee arịrịọ ịdọrọ.
  2. Pịa "Jikota arịrịọ ịdọrọ".
  3. Pịa "Kwenye njikọ."
  4. Pịa "Hichapụ alaka" ebe ọ bụ na anyị achọghịzi ya.

Nke a bụ ebe nchekwa gị ugbu a
Ọnọdụ ndị a na-ahụkarị na ntinye aka na-aga n'ihu

Njehie ngwaahịa

A na-ekwu na "enwere ike iji ule gosi na e nwere mmejọ, ma ọ dịghị mgbe ọ ga-egosi na ha anọghị." N'agbanyeghị na anyị nwere ule na ha egosighi anyị mmejọ ọ bụla, ahụhụ dị aghụghọ batara n'imepụta.

N'ime ọnọdụ dị ka nke a, anyị kwesịrị ịkpachara anya:

  • ihe a na-etinye na mmepụta;
  • koodu na eri master na njehie, nke ndị mmepe nwere ike ịmalite ọrụ ọhụrụ.

M ga-atụgharị azụ ma ọ bụ dozie ya na ụdị ọzọ?

Ịtụgharị azụ bụ usoro nke ibuga ụdị mbụ amaara nke ọma na mmepụta na ịtụgharịghachi omume nke nwere njehie ahụ. "Idozi n'ihu" bụ mgbakwunye nke ndozi na master и развертывание новой версии как можно скорее. Поскольку API и схемы баз данных меняются по мере развертывания кода в производственной среде, при непрерывной поставке и наличии хорошего покрытия тестами, откатывание, как правило, намного сложнее и рискованнее, чем исправление в следующей версии.

Ebe ọ bụ na ịghaghachi azụ enweghị ihe ize ndụ ọ bụla n'ọnọdụ anyị, anyị ga-aga n'ụzọ a, n'ihi na ọ na-enye anyị ohere

  • dozie njehie na ngwaahịa ozugbo enwere ike;
  • tinye koodu n'ime master сразу пригодным для начала новой работы.

️ Ọrụ

  1. Gbanwee na alaka ụlọ ọrụ master na mpaghara.
  2. Melite ebe nchekwa mpaghara site na ebe nchekwa dịpụrụ adịpụ.
  3. Отмените коммит слияния PR Nyochaa nzọụkwụ в master.
  4. Опубликовать изменения в удалённый репозиторий.

Nke a bụ akụkọ ihe mere eme nke ebe nchekwa nwere njikọ aka eweghachiri
Ọnọdụ ndị a na-ahụkarị na ntinye aka na-aga n'ihu

Egwuregwu

# Переключитесь на ветку master.
git checkout master

# Обновите локальный репозиторий из удалённого репозитория.
git pull

# Отмените коммит слияния PR Steps review в master.
# Мы отменяем коммит слияния, поэтому нам нужно выбрать ветку истории, которую мы захотим оставить
git show HEAD

# предположим, что коммит, который был последним в ветке master до слияния, был отображён предыдущей командой первым
git revert HEAD -m 1
# можете не менять сообщения коммитов

# Опубликуйте изменения в удалённый репозиторий
git push

️ Самопроверка

Jide n'aka na ci.md больше не содержит текста "sneaky bug" после отмены коммита слияния.

Исправить список шагов CI и вернуть его в master

Мы полностью отменили коммит слияния ветки feature. Ozi ọma ahụ bụ na anyị enweghị njehie ugbu a master. Плохая новость в том, что исчез и наш драгоценный список шагов непрерывной интеграции. Итак, в идеале, нам нужно применить исправление к коммитам из feature ma weghachi ha master вместе с исправлением.

Мы можем подойти к задаче по-разному:

  • weghachi nkwa nke na-emezi njikọ feature с master;
  • перенести коммиты из бывшей feature.

Разные команды разработчиков в данном случае используют разные подходы, мы же перенесём полезные коммиты в отдельную ветку и создадим отдельный pull request для этой новой ветки.

️ Ọrụ

  1. Создайте ветку под названием feature-fix ma gbanwee gaa na ya.
  2. Nyefee akwụkwọ anamachọihe niile site na ngalaba mbụ feature в новую ветку. Разрешите конфликты слияния, которые возникли при переносе.

    Ọnọdụ ndị a na-ahụkarị na ntinye aka na-aga n'ihu

  3. Добавьте регрессионный тест в ci.test.js:

    it('does not contain the sneaky bug', () => {
    expect( /.*sneakys+bug.*/gi.test(fileContents)).toBe(false);
    });

  4. Gbaa ule na mpaghara ka ijide n'aka na ha adaghị.
  5. Wepu ederede "site na mperi sneaky" na ci.md.
  6. Добавьте в индекс изменения тестов и изменения в списке шагов и закоммитьте их.
  7. Опубликуйте ветку в удалённый репозиторий.

Ị kwesịrị ị nweta ihe dị ka nke a:
Ọnọdụ ndị a na-ahụkarị na ntinye aka na-aga n'ihu

Egwuregwu

# Создайте ветку под названием feature-fix и переключитесь на нее.
git checkout -b feature-fix

# Перенесите все коммиты из бывшей ветки feature в новую ветку. Разрешите конфликты слияния, которые возникли при переносе.
# используйте историю чтобы узнать хэши коммитов:
# - предшествующего коммиту с первой частью списка: C0
# - добавляющего последние элементы списка: C2
git log --oneline --graph
git cherry-pick C0..C2
# разрешите конфликты слияния
# - отредактируйте ci.md и/или ci.test.js
# - добавьте файлы в индекс
# - выполните "git cherry-pick --continue", можете не менять сообщение коммита

# Добавьте регрессионный тест в ci.test.js
# Запустите тесты локально, чтобы убедиться, что они не завершаются успешно.

# Удалите текст " with a sneaky bug" в ci.md.

# Добавьте в индекс изменения тестов и в списке шагов и закоммитьте их.
git add ci.md ci.test.js
git commit -m "Fix the bug in steps list"

# Опубликуйте ветку в удалённый репозиторий.
git push --set-upstream origin feature-fix

Mepụta arịrịọ ịdọrọ.

Создайте pull request с названием Idozi njirimara... Wụnye feature-fix как "head branch", а master dị ka "alaka isi".
Biko chere ka emechara ule. Ị nwere ike ịhụ ọkwa nke ule na ala nke mkparịta ụka PR.

Убедитесь, что вы установили master n'ime ya ndụdụ ebe nchekwa в качестве "base branch", я не буду отвечать на запросы на изменения в репозиторий с материалами курса.

Kwado arịrịọ ịdọrọ "Idozi atụmatụ ahụ"

Daalụ maka mgbazi! Biko kwado mgbanwe ndị a master site na ịdọrọ arịrịọ.

️ Ọrụ

  1. Pịa "Jikota arịrịọ ịdọrọ".
  2. Pịa "Kwenye njikọ."
  3. Pịa "Hichapụ alaka" ebe ọ bụ na anyị achọghịzi ya.

Nke a bụ ihe ị kwesịrị ịnwe ugbu a.
Ọnọdụ ndị a na-ahụkarị na ntinye aka na-aga n'ihu

Ekele!

Вы выполнили все действия, которые люди обычно совершают в процессе непрерывной интеграции.

Если вы заметили какие-либо проблемы с курсом или знаете как его улучшить, создайте issue в репозитории с материалами курса. Nke a N'ezie nwekwara интерактивная версия iji GitHub Learning Lab dị ka ikpo okwu.

isi: www.habr.com

Tinye a comment