Situasi has sareng integrasi kontinyu

Naha anjeun diajar paréntah Git tapi hoyong ngabayangkeun kumaha integrasi kontinyu (CI) tiasa dianggo dina kanyataan? Atawa meureun anjeun hoyong ngaoptimalkeun kagiatan sapopoé anjeun? Kursus ieu bakal masihan anjeun kaahlian praktis dina integrasi kontinyu nganggo gudang GitHub. Kursus ieu henteu dimaksudkeun pikeun janten wizard anu anjeun tiasa ngan saukur klik; sabalikna, anjeun bakal ngalakukeun tindakan anu sami anu leres-leres dilakukeun ku jalma-jalma di tempat kerja, dina cara anu sami anu aranjeunna lakukeun. Kuring bakal ngajelaskeun téori nalika anjeun ngalangkungan léngkah-léngkah anu aub.

Naon anu urang laksanakeun?

Nalika urang maju, urang laun-laun bakal nyiptakeun daptar léngkah-léngkah CI anu khas, anu mangrupikeun cara anu saé pikeun nginget daptar ieu. Dina basa sejen, urang bakal nyieun daptar lampah nu pamekar nyokot bari ngalakukeun integrasi kontinyu, ngalakukeun integrasi kontinyu. Urang ogé bakal ngagunakeun set basajan tina tés pikeun mawa prosés CI urang ngadeukeutan ka nyata.

GIF ieu sacara skematis nunjukkeun komitmen dina gudang anjeun nalika anjeun maju dina kursus. Sakumaha anjeun tiasa tingali, teu aya anu rumit di dieu sareng ngan ukur anu paling diperyogikeun.

Situasi has sareng integrasi kontinyu

Anjeun bakal ngaliwat skenario CI standar ieu:

  • Gawé dina fitur;
  • Aplikasi tés otomatis pikeun mastikeun kualitas;
  • Palaksanaan tugas prioritas;
  • Resolusi konflik nalika ngahijikeun cabang (ngahijikeun konflik);
  • Kasalahan lumangsung dina lingkungan produksi.

Naon anu anjeun badé diajar?

Anjeun bakal tiasa ngajawab patarosan di handap ieu:

  • Naon ari integrasi kontinyu (CI)?
  • Jenis tés otomatis naon anu dianggo dina CI, sareng ngaréspon kana tindakan naon anu dipicu?
  • Naon pamundut tarik sareng iraha diperyogikeun?
  • Naon Dupi Test Driven Development (TDD) sareng kumaha hubunganana sareng CI?
  • Naha kuring kedah ngahijikeun atanapi ngarobih deui parobihan?
  • Gulung deui atanapi ngalereskeun dina versi salajengna?

Mimitina kuring narjamahkeun hal-hal sapertos "permintaan tarik" dimana-mana, tapi hasilna kuring mutuskeun pikeun mulangkeun frasa dina basa Inggris di sababaraha tempat pikeun ngirangan tingkat kagilaan dina téks. Kuring sakapeung bakal ngagunakeun "programmer surzhik" kawas kecap pagawéan éndah "komit" dimana jalma sabenerna make eta jam gawé.

Naon integrasi kontinyu?

Integrasi kontinyu, atawa CI, mangrupakeun prakték teknis nu unggal anggota tim integrates kode maranéhna kana gudang umum sahenteuna sakali sapoé, sarta kode hasilna sahenteuna kudu diwangun tanpa kasalahan.

Aya disagreements ngeunaan istilah ieu

Titik contention nyaéta frékuénsi integrasi. Sababaraha pamadegan yén merging kode ngan sakali sapoé teu cukup pikeun sabenerna ngahijikeun terus. Hiji conto dirumuskeun tim mana dulur nyokot kode seger isuk-isuk sarta integrates eta sakali magrib. Sanaos ieu bantahan anu wajar, umumna dipercaya yén definisi sakali sadinten cukup praktis, khusus, sareng cocog pikeun tim anu ukuranana béda.

Bantahan sejen nyaeta C ++ geus euweuh hijina basa dipaké dina ngembangkeun, sarta ngan merlukeun assembly bébas kasalahan salaku cara validasi lemah. Sababaraha set tés (contona, unit tés dieksekusi sacara lokal) ogé kedah suksés réngsé. Dina waktos ayeuna, komunitas nuju nuju ngajantenkeun syarat ieu, sareng ka hareupna "ngawangun + tés unit" sigana bakal janten prakték umum, upami henteu acan.

Integrasi kontinyu béda tina pangiriman kontinyu (Pangiriman kontinyu, CD) dina éta teu merlukeun calon release sanggeus unggal siklus integrasi.

Daptar léngkah anu bakal kami anggo sapanjang kursus

  1. Tarik dina kode panganyarna. Jieun cabang tina master. Mimitian digawé.
  2. Jieun commits on cabang anyar Anjeun. Bangun sareng uji sacara lokal. Lulus? Pindah ka lengkah saterusna. Gagal? Ngalereskeun kasalahan atanapi tés sareng cobian deui.
  3. Nyorong ka gudang jauh anjeun atanapi cabang jauh.
  4. Jieun pamundut tarik. Ngabahas parobahanana, tambahkeun deui komitmen nalika diskusi diteruskeun. Jieun tés lulus dina cabang fitur.
  5. Ngagabung / rebase commits ti master. Jieun tés lulus dina hasil ngahiji.
  6. Nyebarkeun ti cabang fitur ka produksi.
  7. Lamun sagalana geus alus dina produksi pikeun sawatara waktu, ngagabung parobahan master.

Situasi has sareng integrasi kontinyu

️ Persiapan

Pastikeun Anjeun gaduh software katuhu

Pikeun nyandak kursus ieu anjeun peryogi Node.js и klien Git.

Anjeun tiasa nganggo klien Git naon waé, tapi kuring ngan ukur nyayogikeun paréntah pikeun garis paréntah.

Pastikeun anjeun gaduh klien Git dipasang anu ngadukung garis paréntah

Upami anjeun henteu acan gaduh klien Git anu ngadukung garis paréntah, anjeun tiasa mendakan petunjuk pamasangan di dieu.

Nyiapkeun gudang

Anjeun kedah nyiptakeun salinan pribadi (garpu) Repository template sareng kode pikeun kursus dina GitHub. Hayu urang satuju pikeun nelepon salinan pribadi ieu gudang tangtu.

Réngsé? Upami anjeun teu acan ngarobih setélan standar, gudang kursus anjeun paling dipikaresep disebat continuous-integration-team-scenarios-students, ayana dina akun GitHub anjeun sareng URL sapertos kieu

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

Kuring ngan saukur bakal nelepon alamat ieu <URL репозитория>.

Kurung sudut kawas <тут> bakal hartosna yén anjeun kedah ngagentos ekspresi sapertos kitu sareng nilai anu pas.

Pastikeun éta Tindakan GitHub kaasup pikeun gudang kursus ieu. Upami aranjeunna henteu diaktipkeun, punten aktipkeun ku ngaklik tombol ageung di tengah halaman, anu anjeun tiasa kéngingkeun ku ngaklik Aksi dina antarmuka GitHub.

Anjeun moal tiasa ngarengsekeun kursus nuturkeun paréntah kuring upami GitHub Actions henteu diaktipkeun.

Situasi has sareng integrasi kontinyu

Anjeun salawasna tiasa nganggo kamampuan GitHub pikeun ngajantenkeun Markdown pikeun ningali kaayaan daptar ayeuna anu kami buat di dieu

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

Ngeunaan jawaban

Sanaos cara anu pangsaéna pikeun ngarengsekeun kursus ieu nyaéta ngalakukeunana nyalira, anjeun tiasa ngalaman sababaraha kasusah.

Lamun ngarasa yén anjeun teu ngarti naon nu kudu jeung teu bisa neruskeun, anjeun tiasa ningali kana thread solution, nu aya dina gudang mimiti Anjeun.
Punten ulah ngahiji solution в master salila kursus. Anjeun tiasa nganggo cabang ieu pikeun terang naon anu kudu dilakukeun, atanapi pikeun ngabandingkeun kode anjeun sareng panulis, nganggo sadaya kamampuan anu masihan Git ka kami. Upami anjeun leungit lengkep, anjeun tiasa ngagentos cabang anjeun master dina dahan solution teras reset diréktori kerja anjeun kana léngkah kursus anu anjeun peryogikeun.

Anggo ieu ngan upami anjeun peryogi pisan

Jieun kode anjeun

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

Paréntah ieu

  • ngaganti ngaran master в master-backup;
  • ngaganti ngaran solution в master;
  • Checkout ka cabang anyar master jeung nulis ulang eusi diréktori gawé;
  • Jieun cabang "solusi" tina "master" (anu dipaké pikeun "solusi") bisi anjeun peryogi cabang "solusi" dina mangsa nu bakal datang.

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

Saatos léngkah ieu anjeun tiasa nganggo git log master pikeun terang naon komitmen anu anjeun peryogikeun.
Anjeun tiasa ngareset diréktori kerja anjeun ka komitmen ieu sapertos kieu:

git reset --hard <the SHA you need>

Upami anjeun bagja sareng hasilna, dina sababaraha waktos anjeun kedah nyebarkeun versi gudang anjeun ka gudang jauh. Tong hilap netepkeun sacara eksplisit cabang jauh nalika anjeun ngalakukeun ieu.

git push --force origin master

Punten dicatet yén kami nganggo git push --force. Ieu saperti teu mirip nu bakal hoyong ngalakukeun ieu pisan sering, tapi urang boga skenario pisan husus di dieu kalawan hiji pamaké Repository anu, sajaba, understands naon anu anjeunna lakukeun.

Ngamimitian damel

Situasi has sareng integrasi kontinyu

Hayu urang mimitian nyusun daptar léngkah CI. Biasana anjeun badé ngamimitian léngkah ieu ku mariksa versi kode pangénggalna tina gudang jauh, tapi kami henteu acan gaduh gudang lokal, janten urang clone tina anu jauh.

️ Tugas: ngapdet gudang lokal, jieun cabang tina master, ngamimitian digawé

  1. Kloning gudang kursus ti <URL репозитория>.
  2. Lumpat npm install dina diréktori gudang kursus; Kami peryogi éta pikeun masang Jest, anu kami anggo pikeun ngajalankeun tés.
  3. Jieun cabang jeung ngaran eta feature. Pindah ka thread ieu.
  4. Tambahkeun kodeu test ka ci.test.js antara komentar nanyakeun kuring ngalakukeun ieu.

    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. Tambahkeun téks kalayan 4 léngkah munggaran kana file 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.  

    Paréntah

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

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

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

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

Damel komitmen dina cabang énggal, ngawangun sareng uji sacara lokal

Kami badé nyetél tés pikeun dijalankeun sateuacan ngalakukeun, teras bunuh kodeu.

Skenario has nalika tés ngajalankeun otomatis

  • Lokal:
    • Terus-terusan atanapi ngaréspon kana parobahan kode anu luyu;
    • Dina nyimpen (pikeun basa diinterpretasi atanapi JIT-disusun);
    • Salila assembly (lamun kompilasi diperlukeun);
    • Dina komitmen;
    • Nalika nyebarkeun ka gudang anu dibagikeun.

  • Dina ngawangun server atanapi ngawangun lingkungan:
    • Nalika kode diterbitkeun kana cabang pribadi / gudang.
    • Kodeu dina thread ieu keur diuji.
    • Hasil poténsial tina ngahiji diuji (biasana nganggo master).
    • Salaku tahap integrasi kontinyu / pipa pangiriman kontinyu

Ilaharna, langkung gancang tés suite ngajalankeun, langkung sering anjeun mampuh ngajalankeunana. Sebaran panggung anu biasa sigana sapertos kieu.

  • Uji unit gancang - nalika ngawangun, dina pipa CI
  • Tes unit slow, komponén gancang sareng tes integrasi - dina komitmen, dina pipa CI
  • Komponén slow sarta tés integrasi - dina pipa CI
  • Uji kaamanan, uji beban sareng tés anu nyéépkeun waktos atanapi mahal - dina pipa CI / CD, tapi ngan ukur dina modeu / tahapan / jalur pipa anu tangtu, contona, nalika nyiapkeun calon pelepasan atanapi nalika ngajalankeun sacara manual.

️ Tugas

Abdi nyarankeun ngajalankeun tés sacara manual heula nganggo paréntah npm test. Saatos éta, hayu urang tambahkeun git hook pikeun ngajalankeun tés urang dina komitmen. Aya hiji tangkapan: Git kait henteu dianggap bagian tina gudang sahingga teu tiasa diklon tina GitHub sareng sesa bahan kursus. Pikeun masang hook anjeun kedah ngajalankeun install_hook.sh atanapi nyalin file repo/hooks/pre-commit kana diréktori lokal .git/hooks/.
Nalika anjeun komitmen, anjeun bakal ningali yén tés dijalankeun sareng aranjeunna pariksa ningali naha kecap konci anu tangtu aya dina daptar.

  1. Jalankeun tés sacara manual ku ngajalankeun paréntah npm test dina folder gudang kursus Anjeun. Pariksa yén tés parantos réngsé.
  2. Setel hiji commit hook (pre-commit hook) ku ngajalankeun install_hook.sh.
  3. Komitmen parobahan anjeun ka gudang lokal Anjeun.
  4. Pastikeun tés dijalankeun sateuacan ngalakukeun.

Repository anjeun kedah sapertos kieu saatos nuturkeun léngkah-léngkah ieu.
Situasi has sareng integrasi kontinyu

Paréntah

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

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

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

Nyebarkeun kode ka gudang jauh atawa cabang jauh

Sakali aranjeunna tos rengse digawé lokal, pamekar ilaharna nyieun kode maranéhna sadia pikeun umum sangkan ahirna bisa terpadu jeung publik. Kalayan GitHub, ieu biasana dihontal ku nyebarkeun karya kana salinan pribadi tina gudang (garpu pribadi) atanapi cabang pribadi.

  • Kalayan garpu, pamekar ngkloning gudang anu dibagi jauh, nyiptakeun salinan jauh pribadi, ogé katelah garpu. Éta teras clone gudang pribadi ieu pikeun dianggo sacara lokal. Nalika pagawéan parantos réngsé sareng commits dilakukeun, anjeunna nyorong kana garpu na, dimana aranjeunna sayogi pikeun batur sareng tiasa dihijikeun kana gudang umum. Pendekatan ieu biasana dianggo dina proyék open source dina GitHub. Éta ogé dianggo dina kursus canggih kuring [Gawé Tim sareng CI sareng Git] (http://devops.redpill.solutions/).
  • Pendekatan anu sanés nyaéta ngan ukur nganggo hiji gudang jauh sareng ngan ukur cacah cabangna master gudang dibagikeun "ditangtayungan". Dina skenario ieu, pamekar individu nyebarkeun kode maranéhna pikeun cabang gudang jauh ambéh batur bisa nempo kode ieu, lamun sagalana aya dina urutan, ngagabung jeung master gudang dibagikeun.

Dina kursus khusus ieu, urang bakal ngagunakeun alur kerja anu nganggo cabang.

Hayu urang nyebarkeun kode urang.

️ Tugas

  • Nyebarkeun parobihan kana cabang jauh sareng nami anu sami sareng cabang kerja anjeun

Paréntah

git push --set-upstream origin feature

Jieun pamundut tarik

Jieun pamundut tarikan kalawan judul Tinjauan léngkah. Masang feature kawas "cabang sirah" jeung master kawas "cabang dasar".

Pastikeun anjeun geus dipasang master di na garpu gudang Salaku "cabang dasar", abdi moal ngabales requests pikeun parobahan gudang bahan tangtu.

Dina lingo GitHub, "cabang dasar" nyaéta cabang dimana anjeun ngadasarkeun padamelan anjeun, sareng "cabang sirah" mangrupikeun cabang anu ngandung parobahan anu diusulkeun.

Ngabahas parobahan, tambahkeun komitmen anyar nalika diskusi diteruskeun

Permintaan Tarik (PR)

Permintaan Tarik (PR) mangrupa cara pikeun ngabahas sarta dokumén kode, ogé ngalaksanakeun review kode. Paménta tarik dingaranan cara umum ngahijikeun perobahan individu kana kodeu sakabéh. Ilaharna, hiji jalma kloning gudang resmi jauh proyék sarta dianggo dina kode lokal. Saatos ieu, anjeunna nempatkeun kodeu dina gudang jauh pribadina sareng naroskeun ka anu nanggung jawab kana gudang resmi pikeun nyandak (Betot) kode na kana repositories lokal maranéhanana, dimana aranjeunna marios jeung kamungkinan ngahijikeun (ngumpulkeun) milikna. Konsep ieu ogé dipikawanoh ku ngaran séjén, contona, pamundut ngahiji.

Anjeun saleresna henteu kedah nganggo fitur pamundut tarik GitHub atanapi platform anu sami. Tim pamekar tiasa nganggo metode komunikasi anu sanés, kalebet komunikasi tatap muka, telepon sora, atanapi email, tapi masih aya sababaraha alesan pikeun ngagunakeun pamundut tarik gaya forum. Ieu sababaraha di antarana:

  • diskusi diatur patali jeung parobahan kode husus;
  • salaku tempat pikeun nempo eupan balik ngeunaan karya-dina-kamajuan ti duanana autotesters jeung peers;
  • formalisasi ulasan kode;
  • ku kituna engké anjeun bisa manggihan alesan jeung tinimbangan balik sapotong kode ieu atawa éta.

Ilaharna anjeun nyieun pamundut tarikan mun anjeun kudu ngabahas hiji hal atawa meunang eupan balik. Contona, upami anjeun nuju ngerjakeun fitur anu tiasa dilaksanakeun dina langkung ti hiji cara, anjeun tiasa ngadamel pamundut tarik sateuacan nyerat baris kode anu munggaran pikeun ngabagi ideu sareng ngabahas rencana anjeun sareng kolaborator anjeun. Upami padamelan langkung saderhana, pamundut tarik dibuka nalika aya anu parantos dilakukeun, komitmen, sareng tiasa dibahas. Dina sababaraha skenario, Anjeun meureun hoyong muka PR ngan pikeun alesan kadali kualitas: ngajalankeun tés otomatis atawa initiate ulasan kode. Naon waé anu anjeun mutuskeun, tong hilap @nyebutkeun jalma-jalma anu anjeun pikahoyong persetujuan dina pamundut tarik anjeun.

Ilaharna, nalika nyieun PR, anjeun ngalakukeun ieu di handap.

  • Tunjukkeun naon anu anjeun badé robih sareng dimana.
  • Tulis pedaran ngajelaskeun tujuan parobahan. Anjeun meureun hoyong:
    • tambahkeun naon waé anu penting anu henteu écés tina kode, atanapi anu mangpaat pikeun ngartos kontéks, sapertos #bug anu relevan sareng nomer komitmen;
    • @sebutkeun saha waé anu anjeun hoyong ngamimitian damel, atanapi anjeun tiasa @sebutkeun aranjeunna dina koméntar engké;
    • menta kolega pikeun mantuan kalawan hal atawa pariksa dina hal husus.

Sakali anjeun muka PR, tés anu dikonpigurasikeun pikeun ngajalankeun dina kasus sapertos kitu dieksekusi. Dina kasus urang, ieu bakal set sarua tina tés nu urang ngajalankeun lokal, tapi dina proyék nyata meureun aya tés tambahan sarta cék.

Mangga antosan samentawis tés réngsé. Anjeun tiasa ningali status tés dina bagian handap diskusi PR dina panganteur GitHub. Teruskeun nalika tés réngsé.

️ Tambahkeun catetan ngeunaan acak tina daptar léngkah CI

Daptar anu dianggo dina kursus ieu sawenang-wenang sareng subjektif, urang kedah nambihan catetan ngeunaan ieu.

️ Tugas: jieun pamundut tarik pikeun koméntar ieu

  1. Pindah ka cabang master.
  2. Jieun cabang ngaranna bugfix.
  3. Tambahkeun téks catetan ka tungtung file 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. Komitmen parobahan.
  5. Nyebarkeun thread bugfix ka gudang jauh.
  6. Jieun pamundut tarikan ngaranna Nambahan koméntar kalawan dahan sirah bugfix jeung dahan dasarmaster.

Pastikeun anjeun geus dipasang master di na garpu gudang Salaku "cabang dasar", abdi moal ngabales requests pikeun parobahan gudang bahan tangtu.

Ieu kumaha gudang Anjeun kedah kasampak kawas.
Situasi has sareng integrasi kontinyu

Paréntah

# Переключитесь на ветку 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 как описано выше

Satuju paménta tarik "Nambahkeun komentar"

️ Tugas

  1. Jieun pamundut tarik.
  2. Pencét "Gabungkeun pamundut tarik".
  3. Klik "Konfirmasi ngahiji".
  4. Pencét "Pupus cabang", urang henteu peryogi deui.

Ieu diagram commits sanggeus ngahiji.
Situasi has sareng integrasi kontinyu

️ Terus damel sareng tambahkeun tés

Kolaborasi dina pamundut tarikan mindeng ngakibatkeun karya tambahan. Ieu biasana hasil tina tinjauan kode atanapi diskusi, tapi dina kursus kami urang badé modél ieu ku nambihan barang énggal kana daptar léngkah CI kami.

Integrasi kontinyu biasana ngalibatkeun sababaraha cakupan tés. Syarat sinyalna tés rupa-rupa sareng biasana aya dina dokumén anu disebut "pedoman kontribusi". Urang bakal tetep basajan tur nambahkeun hiji test pikeun tiap garis dina Daptar pariksa urang.

Nalika ngajalankeun tugas, cobian ngalaksanakeun tés heula. Lamun dipasang bener pre-commit hook saméméhna, tés karek ditambahkeun bakal ngajalankeun, bakal gagal, jeung euweuh bakal komitmen. Catet yén ieu kumaha urang terang yén tés urang leres-leres nguji hiji hal. Narikna, upami urang ngamimitian nganggo kode sateuacan tés, lulus tés tiasa hartosna yén kode éta jalan sakumaha anu diharapkeun, atanapi yén tés éta sanés nguji nanaon. Tambih Deui, upami urang henteu nyerat tés ti mimiti, urang panginten tiasa hilap sadayana, sabab teu aya anu ngingetkeun urang ngeunaan éta.

Pangembangan Didorong Uji (TDD)

TDD nyarankeun nulis tés saméméh kode. A workflow has maké TDD Sigana mah kieu.

  1. Tambahkeun tés.
  2. Jalankeun sadaya tés sareng pastikeun yén tés énggal gagal.
  3. Tulis kodeu.
  4. Jalankeun tés, pastikeun sadaya tés lulus.
  5. Refactor kode Anjeun.
  6. malikan deui.

Kusabab hasil tés anu gagal biasana dipidangkeun dina warna beureum, sareng anu lulus biasana ditingalikeun dina warna héjo, siklusna ogé katelah red-héjo-refactor.

️ Tugas

Mimiti, cobian ngalaksanakeun tés sareng ngantepkeun aranjeunna gagal, teras tambahkeun sareng bunuh téks daptar léngkah CI sorangan. Anjeun bakal ningali yén tés lulus ("héjo").
Teras nyebarkeun kodeu énggal ka gudang jauh sareng nonton tés dijalankeun dina antarmuka GitHub di handapeun diskusi pamundut tarik sareng pembaruan status PR.

  1. Pindah ka cabang feature.
  2. Tambahkeun tés ieu ka ci.test.js sanggeus panggero panungtungan 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. Coba ngalakukeun tés. Lamun pre-commit hook dipasang, usaha komitmen bakal gagal.
  4. Lajeng nambahkeun téks ieu ka 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. Jieun tur bunuh parobahan lokal.
  6. Pasang parobahan kana cabang feature.

Ayeuna anjeun kedah gaduh anu sapertos kieu
Situasi has sareng integrasi kontinyu

Paréntah


# Переключительна ветку 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

Ngagabung konflik

Pindah ka Robah Request Tinjauan léngkah.

Sanaos kami henteu ngalakukeun anu salah sareng tés pikeun kode kami lulus, kami tetep henteu tiasa ngahijikeun cabang feature и master. Ieu kusabab thread séjén bugfix ieu ngahiji jeung master bari urang keur dipake dina PR ieu.
Ieu nyiptakeun kaayaan dimana cabang jauh master gaduh versi anu langkung énggal tibatan anu kami dumasar kana cabangna feature. Kusabab ieu urang teu bisa ngan mundur HEAD master nepi ka tungtung benang feature. Dina kaayaan ieu, urang kedah ngagabung atanapi nerapkeun commits feature rebase master. GitHub sabenerna bisa ngalakukeun merges otomatis lamun euweuh konflik. Alas, dina kaayaan urang, duanana cabang boga competing parobahan dina file ci.md. Kaayaan ieu katelah konflik gabungan, sareng urang kedah ngabéréskeunana sacara manual.

Ngagabung atanapi rebase

ngumpulkeun

  • Nyiptakeun komitmen gabungan tambahan sareng nyimpen riwayat padamelan.
    • Ngawétkeun komitmen asli cabang sareng cap waktu asli sareng pangarangna.
    • Ngahemat SHA of commits na numbu ka aranjeunna dina diskusi pamundut robah.
  • Merlukeun resolusi konflik hiji-waktos.
  • Ngajadikeun carita non-linier.
    • Carita tiasa sesah dibaca kusabab jumlah cabang anu ageung (ngingetkeun kana kabel IDE).
    • Ngajadikeun debugging otomatis leuwih hese, f.eks. git bisect kirang mangpaat - éta ngan bakal manggihan merge commit.

Rebase

  • Replays commits ti cabang ayeuna dina luhureun cabang dasar hiji sanggeus sejen.
    • Komitmen anyar sareng SHA anyar dibangkitkeun, nyababkeun komitmen dina GitHub cocog sareng pamundut tarikan asli, tapi sanés koméntar anu saluyu.
    • Commits bisa recombined sarta dirobah dina prosés, atawa malah dihijikeun kana hiji.
  • Sababaraha konflik meureun perlu direngsekeun.
  • Ngidinan anjeun pikeun ngajaga carita linier.
    • Carita tiasa langkung gampil dibaca salami henteu panjang teuing tanpa alesan anu wajar.
    • debugging otomatis tur ngungkulan téh saeutik gampang: ngajadikeun eta mungkin git bisect, Bisa nyieun rollbacks otomatis jelas tur leuwih bisa diprediksi.
  • Merlukeun medarkeun cabang kalawan hijrah commits kalawan bandéra a --force lamun dipaké kalawan requests tarikan.

Biasana, tim satuju pikeun ngagunakeun strategi anu sami nalika aranjeunna kedah ngahijikeun parobihan. Ieu tiasa janten gabungan "murni" atanapi komitmen "murni" di luhur, atanapi anu di antawisna, sapertos ngalakukeun komitmen di luhur sacara interaktif (git rebase -i) sacara lokal pikeun cabang anu henteu diterbitkeun kana gudang umum, tapi ngagabung pikeun cabang "umum".

Di dieu urang bakal ngagunakeun merge.

️ Tugas

  1. Pastikeun kodeu aya dina cabang lokal master diropéa tina gudang jauh.
  2. Pindah ka cabang feature.
  3. Mimitian ngahiji sareng cabang master. A konflik ngagabung alatan competing parobahan dina ci.md.
  4. Ngabéréskeun konflik supados daptar léngkah CI sareng catetan ngeunaan éta tetep aya dina téks.
  5. Nyebarkeun komitmen gabungan ka cabang jauh feature.
  6. Pariksa status pamundut tarik dina GitHub UI sareng antosan dugi ka ngahiji direngsekeun.

Paréntah

# Убедитесь, что код в локальное ветке `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, дождитесь пока слияние не будет разрешено.

Sae pisan!

Anjeun parantos réngsé daptar sareng ayeuna anjeun kedah nyatujuan pamundut tarik master.

️ Tugas: Nyatujuan pamundut tarik "Tinjauan léngkah"

  1. Buka pamundut tarik.
  2. Pencét "Gabungkeun pamundut tarik".
  3. Klik "Konfirmasi ngahiji".
  4. Pencét "Pupus cabang" sabab urang henteu peryogi deui.

Ieu mangrupikeun gudang anjeun ayeuna
Situasi has sareng integrasi kontinyu

Kasalahan produk

Disebutkeun yén "uji coba tiasa dianggo pikeun nunjukkeun ayana kasalahan, tapi henteu pernah nunjukkeun henteuna." Sanaos urang ngagaduhan tés sareng aranjeunna henteu nunjukkeun kasalahan, bug insidious nyelap kana produksi.

Dina skenario sapertos kieu, urang kedah ngurus:

  • naon deployed dina produksi;
  • kode dina thread master kalawan kasalahan, ti mana pamekar bisa ngamimitian gawé anyar.

Naha kuring kedah gulung deui atanapi ngalereskeunana dina versi salajengna?

Balik deui nyaéta prosés nyebarkeun vérsi saméméhna anu dipikanyaho pikeun produksi sareng ngabalikeun komitmen anu ngandung kasalahan. "Ngalereskeun payun" nyaéta tambihan fix ka master jeung deploying versi anyar pas mungkin. Kusabab API sareng skéma database robih nalika kode disebarkeun ka produksi, kalayan pangiriman kontinyu sareng sinyalna tés anu saé, ngagulung deui biasana langkung sesah sareng picilakaeun tibatan ngalereskeunana dina versi salajengna.

Kusabab rolling deui teu mawa resiko naon bisi urang, urang bakal balik jalur ieu, sabab ngamungkinkeun urang

  • ngalereskeun kasalahan dina produk pas mungkin;
  • nyieun kode dina master geuwat cocog pikeun ngamimitian pakasaban anyar.

️ Tugas

  1. Pindah ka cabang master lokal.
  2. Apdet Repository lokal ti Repository jauh.
  3. Balikkeun komitmen gabungan PR Tinjauan léngkah в master.
  4. Nyebarkeun parobahan ka gudang jauh.

Ieu mangrupikeun sajarah gudang kalayan komit gabungan dibalikkeun
Situasi has sareng integrasi kontinyu

Paréntah

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

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

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

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

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

️ Uji diri

Pastikeun éta ci.md henteu deui ngandung téks "sneaky bug" saatos ngabalikeun komitmen gabungan.

Ngalereskeun daptar léngkah CI sareng balikkeun ka master

Kami parantos ngabalikeun commit gabungan cabang. feature. Warta anu saé nyaéta yén urang ayeuna teu aya kasalahan master. Warta goréng éta daptar adi kami tina léngkah integrasi kontinyu ogé musna. Janten, ideally, urang kedah nerapkeun fix ka commits ti feature sarta balikkeun aranjeunna ka master bareng jeung fix.

Urang tiasa ngadeukeutan masalah ku sababaraha cara:

  • balikkeun komitmen anu ngabatalkeun ngahiji feature с master;
  • move commits ti baheula feature.

tim ngembangkeun béda ngagunakeun pendekatan béda dina hal ieu, tapi urang bakal mindahkeun commits mangpaat ka cabang misah tur nyieun pamundut tarikan misah pikeun cabang anyar ieu.

️ Tugas

  1. Jieun thread disebut feature-fix sarta pindah ka dinya.
  2. Migrasi sagala commits ti cabang urut feature ka thread anyar. Ngabéréskeun konflik gabungan anu lumangsung salila migrasi.

    Situasi has sareng integrasi kontinyu

  3. Tambahkeun tés régrési kana ci.test.js:

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

  4. Jalankeun tés sacara lokal pikeun mastikeun yén éta henteu gagal.
  5. Hapus téks "kalayan bug sneaky" dina ci.md.
  6. Tambihkeun parobahan tés sareng parobihan daptar léngkah kana indéks sareng bunuh aranjeunna.
  7. Nyebarkeun cabang ka gudang jauh.

Anjeun kedah ngeureunkeun hal anu sami sareng ieu:
Situasi has sareng integrasi kontinyu

Paréntah

# Создайте ветку под названием 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

Jieun pamundut tarik.

Jieun pamundut tarikan kalawan judul Ngalereskeun fitur. Masang feature-fix kawas "cabang sirah" jeung master kawas "cabang dasar".
Mangga antosan samentawis tés réngsé. Anjeun tiasa ningali status tina tés di handap sawala PR.

Pastikeun anjeun geus dipasang master di na garpu gudang Salaku "cabang dasar", abdi moal ngabales requests pikeun parobahan gudang bahan tangtu.

Nyatujuan pamundut tarik "Ngalereskeun fitur"

Hatur nuhun koreksi! Mangga approve parobahan ka master tina pamundut tarik.

️ Tugas

  1. Pencét "Gabungkeun pamundut tarik".
  2. Klik "Konfirmasi ngahiji".
  3. Pencét "Pupus cabang" sabab urang henteu peryogi deui.

Ieu anu anjeun kedah gaduh ayeuna.
Situasi has sareng integrasi kontinyu

Wilujeng!

Anjeun parantos réngsé sadaya léngkah anu biasana dilakukeun ku jalma salami integrasi kontinyu.

Upami anjeun perhatikeun masalah naon waé atanapi terang kumaha ningkatkeun éta, punten jieun masalah dina repositories kalawan bahan kursus. Tangtu ieu ogé boga Vérsi interaktif ngagunakeun GitHub Learning Lab salaku platform.

sumber: www.habr.com

Tambahkeun komentar