Ҳолатҳои маъмулӣ бо ҳамгироии доимӣ

Оё шумо фармонҳои Git-ро омӯхтаед, аммо мехоҳед тасаввур кунед, ки интегратсияи муттасил (CI) дар воқеият чӣ гуна кор мекунад? Ё шояд шумо мехоҳед фаъолияти ҳаррӯзаи худро оптимизатсия кунед? Ин курс ба шумо малакаҳои амалӣ дар ҳамгироии пайваста бо истифода аз анбори GitHub медиҳад. Ин курс барои як ҷодугаре пешбинӣ нашудааст, ки шумо метавонед онро клик кунед; баръакс, шумо ҳамон амалҳоеро, ки одамон воқеан дар ҷои кор мекунанд, ҳамон тавре иҷро мекунед, ки онҳо ин корро мекунанд. Вақте ки шумо қадамҳои марбутро мегузаред, ман назарияро шарҳ медиҳам.

Мо чӣ кор мекунем?

Вақте ки мо пешравӣ мекунем, мо тадриҷан рӯйхати қадамҳои маъмулии CI-ро эҷод мекунем, ки ин як роҳи олии дар хотир доштани ин рӯйхат аст. Ба ибораи дигар, мо рӯйхати амалҳоеро эҷод хоҳем кард, ки таҳиягарон ҳангоми ҳамгироии доимӣ ва ҳамгироии пайваста анҷом медиҳанд. Мо инчунин маҷмӯи оддии санҷишҳоро истифода мебарем, то раванди CI-и худро ба раванди воқеӣ наздиктар созем.

Ин GIF ба таври схематикӣ ӯҳдадориҳоро дар анбори шумо ҳангоми пешрафт дар курс нишон медиҳад. Тавре ки шумо мебинед, дар ин ҷо ҳеҷ чизи мураккаб нест ва танҳо чизи аз ҳама зарурӣ.

Ҳолатҳои маъмулӣ бо ҳамгироии доимӣ

Шумо аз сенарияҳои зерини стандартии CI мегузаред:

  • Кор дар як хусусият;
  • Истифодаи санҷишҳои автоматӣ барои таъмини сифат;
  • Иҷрои вазифаи аввалиндараҷа;
  • Ҳалли низоъ ҳангоми якҷоя кардани филиалҳо (якҷоя кардани низоъ);
  • Дар муҳити истеҳсолӣ хатогӣ рух медиҳад.

Шумо чӣ меомӯзед?

Шумо метавонед ба саволҳои зерин ҷавоб диҳед:

  • Интегратсияи муттасил (CI) чист?
  • Кадом намудҳои санҷишҳои автоматӣ дар CI истифода мешаванд ва дар посух ба кадом амалҳо онҳо оғоз мешаванд?
  • Дархостҳои ҷалб чист ва онҳо кай лозиманд?
  • Рушди озмоишӣ (TDD) чист ва он бо CI чӣ иртибот дорад?
  • Оё ман бояд тағиротҳоро якҷоя кунам ё аз нав асос кунам?
  • Баргардед ё дар версияи навбатӣ ислоҳ кунед?

Дар аввал ман дар ҳама ҷо чизҳоеро ба мисли "pull requests" тарҷума мекардам, аммо дар натиҷа тасмим гирифтам, ки дар баъзе ҷойҳо ибораҳоро ба забони англисӣ баргардонам, то дараҷаи девонаворӣ дар матн кам шавад. Ман баъзан "программист суржик" -ро ба мисли феъли олиҷаноби "commit" истифода мебарам, ки одамон воқеан онро дар ҷои кор истифода мебаранд.

Интегратсияи доимӣ чист?

Интегратсияи доимӣ, ё CI, як таҷрибаи техникӣ аст, ки дар он ҳар як узви даста ҳадди аққал як маротиба дар як рӯз рамзи худро ба як анбори умумӣ муттаҳид мекунад ва рамзи натиҷавӣ ҳадди аққал бидуни хато сохта мешавад.

Дар бораи ин истилоҳ ихтилофот вуҷуд дорад

Нуқтаи баҳс басомади ҳамгироӣ мебошад. Баъзеҳо мегӯянд, ки якҷоя кардани код танҳо як маротиба дар як рӯз кофӣ нест, ки воқеан пайваста муттаҳид шавад. Намунае аз дастае оварда шудааст, ки дар он ҳама саҳар рамзи тоза мегиранд ва як маротиба бегоҳ онро муттаҳид мекунанд. Гарчанде ки ин як эътирози оқилона аст, ба таври умум боварӣ дорад, ки таърифи якрӯза дар як рӯз оқилона амалӣ, мушаххас ва барои дастаҳои андозаҳои гуногун мувофиқ аст.

Эътирози дигар ин аст, ки C++ дигар забони ягонае нест, ки дар таҳия истифода мешавад ва танҳо талаб кардани анҷумани бидуни хато ҳамчун роҳи тасдиқ заиф аст. Баъзе маҷмӯи санҷишҳо (масалан, санҷишҳои воҳиди ба таври маҳаллӣ иҷрошуда) низ бояд бомуваффақият анҷом дода шаванд. Дар айни замон, ҷомеа ба ин талабот ҳаракат мекунад ва дар оянда "созиш + санҷишҳои воҳидҳо" эҳтимол ба як таҷрибаи маъмулӣ табдил ёбад, агар ин аллакай вуҷуд надошта бошад.

Интегратсияи доимӣ гуногун аз интиқоли доимӣ (Интиқоли муттасил, CD), зеро он пас аз ҳар як давраи ҳамгироӣ номзади озодро талаб намекунад.

Рӯйхати қадамҳое, ки мо дар давоми курс истифода мебарем

  1. Рамзи охиринро кашед. Филиал аз master. Ба кор шуруъ кунед.
  2. Дар филиали нави худ ӯҳдадориҳо эҷод кунед. Ба таври маҳаллӣ созед ва озмоиш кунед. Гузариш? Ба қадами оянда гузаред. Муваффақият? Хатогиҳо ё санҷишҳоро ислоҳ кунед ва дубора кӯшиш кунед.
  3. Ба анбори дурдаст ё филиали дурдасти худ тела диҳед.
  4. Эҷоди дархости ҷалб. Тағиротҳоро муҳокима кунед, ҳангоми идомаи муҳокима ӯҳдадориҳои бештар илова кунед. Санҷишҳоро дар шохаи хусусият гузаронед.
  5. Якҷоя кардан/аз нав баргардонидани ӯҳдадориҳо аз устод. Санҷишҳоро дар натиҷаи якҷояшавӣ гузаронед.
  6. Аз шохаи хусусият ба истеҳсолот ҷойгир кунед.
  7. Агар дар тӯли якчанд вақт ҳама чиз дар истеҳсолот хуб бошад, тағиротҳоро ба устод якҷоя кунед.

Ҳолатҳои маъмулӣ бо ҳамгироии доимӣ

️ Тайёрӣ

Боварӣ ҳосил кунед, ки шумо нармафзори дуруст доред

Барои гирифтани ин курс ба шумо лозим меояд Node.js и Мизоҷи Git.

Шумо метавонед ҳама гуна муштарии Git-ро истифода баред, аммо ман танҳо фармонҳоро барои сатри фармон медиҳам.

Боварӣ ҳосил кунед, ки шумо муштарии Git насб кардаед, ки сатри фармонро дастгирӣ мекунад

Агар шумо то ҳол муштарии Git надошта бошед, ки сатри фармонро дастгирӣ мекунад, шумо метавонед дастурҳои насбкуниро пайдо кунед дар ин ҷо.

Анборро омода кунед

Ба шумо лозим меояд, ки нусхаи шахсӣ (форк) эҷод кунед анбори шаблон бо рамзи курс дар GitHub. Биёед розй шавем, ки ин нусхаи шахсиро даъват кунем анбори курс.

Анҷом шуд? Агар шумо танзимоти пешфарзро тағир надода бошед, эҳтимолан анбори курси шумо номида мешавад continuous-integration-team-scenarios-students, он дар ҳисоби GitHub-и шумо ҷойгир аст ва URL чунин менамояд

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

Ман танҳо ба ин суроға занг мезанам <URL репозитория>.

Қавсҳои кунҷӣ ба монанди <тут> маънои онро дорад, ки шумо бояд чунин ифодаро бо арзиши мувофиқ иваз кунед.

Боварӣ ҳосил кунед, ки Амалҳои GitHub барои ин анбори курс дохил карда шудааст. Агар онҳо фаъол набошанд, лутфан онҳоро бо пахш кардани тугмаи калон дар мобайни саҳифа фаъол созед, ки шумо метавонед ба воситаи ангуштзании Амалҳо дар интерфейси GitHub дастрас шавед.

Агар амалҳои GitHub фаъол набошанд, шумо наметавонед курсро пас аз дастурҳои ман анҷом диҳед.

Ҳолатҳои маъмулӣ бо ҳамгироии доимӣ

Шумо ҳамеша метавонед қобилияти GitHub-ро барои нишон додани Markdown истифода баред, то ҳолати кунунии рӯйхатеро, ки мо дар ин ҷо тартиб медиҳем, бубинед.

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

Дар бораи ҷавобҳо

Гарчанде ки роҳи беҳтарини анҷом додани ин курс худатон анҷом додани он аст, шумо шояд баъзе мушкилот дошта бошед.

Агар шумо ҳис кунед, ки шумо чӣ кор карданро намефаҳмед ва идома дода наметавонед, шумо метавонед ба ришта нигаред solution, ки дар анбори ибтидоии шумост.
Лутфан якҷоя накунед solution в master дар давоми курс. Шумо метавонед аз ин шоха истифода баред, то бифаҳмед, ки чӣ кор кардан лозим аст ё рамзи худро бо коди муаллиф муқоиса кунед, бо истифода аз тамоми имкониятҳое, ки Git ба мо медиҳад. Агар шумо комилан гум шуда бошед, шумо метавонед филиали худро пурра иваз кунед master дар шоха solution ва сипас феҳристи кории худро ба қадами курси ба шумо лозима аз нав танзим кунед.

Инро танҳо дар ҳолате истифода баред, ки ба шумо воқеан лозим аст

Рамзи худро иҷро кунед

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

Ин фармонхо

  • номашро иваз кунед master в master-backup;
  • номашро иваз кунед solution в master;
  • чек ба филиали нав master ва мундариҷаи директорияи корӣ аз нав нависед;
  • Аз "мастер" (ки қаблан "ҳал" буд) як шохаи "ҳал" эҷод кунед, агар ба шумо дар оянда шохаи "ҳал" лозим шавад.

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

Пас аз ин қадамҳо шумо метавонед истифода баред git log master то бифаҳмед, ки кадом ӯҳдадорӣ ба шумо лозим аст.
Шумо метавонед феҳристи кории худро ба ин ӯҳдадорӣ аз нав танзим кунед:

git reset --hard <the SHA you need>

Агар шумо аз натиҷа қаноатманд бошед, дар баъзе мавридҳо ба шумо лозим меояд, ки версияи анбори худро дар як анбори дурдаст нашр кунед. Фаромӯш накунед, ки вақте ки шумо ин корро мекунед, ба таври возеҳ нишон додани филиали дурдастро фаромӯш накунед.

git push --force origin master

Лутфан қайд кунед, ки мо истифода мебарем git push --force. Аз эҳтимол дур нест, ки шумо ин корро зуд-зуд иҷро кардан хоҳед, аммо мо дар ин ҷо як сенарияи хеле мушаххас дорем, ки бо як корбари анбор, ки илова бар ин, чӣ кор карданашро мефаҳмад.

Оғози кор

Ҳолатҳои маъмулӣ бо ҳамгироии доимӣ

Биёед ба тартиб додани рӯйхати қадамҳои CI оғоз кунем. Одатан, шумо ин қадамро тавассути тафтиши версияи охирини код аз анбори дурдаст оғоз мекунед, аммо мо то ҳол анбори маҳаллӣ надорем, аз ин рӯ мо онро ба ҷои он аз дастгоҳи дурдаст клон мекунем.

️ Вазифа: навсозии анбори маҳаллӣ, эҷод кардани филиал аз master, ба кор шуруъ намоед

  1. Анбори курсро аз <URL репозитория>.
  2. Бидавед npm install дар феҳристи анбори курс; Мо онро барои насб кардани Jest лозим аст, ки мо онро барои гузаронидани санҷишҳо истифода мебарем.
  3. Филиал эҷод кунед ва онро номбар кунед feature. Ба ин ришта гузаред.
  4. Рамзи санҷишро ба ci.test.js дар байни шарҳҳо аз ман хоҳиш мекунанд, ки ин корро кунам.

    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. Матнро бо 4 қадами аввал ба файл илова кунед 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.  

    Фармонҳо

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

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

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

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

Дар филиали нав ӯҳдадориҳо эҷод кунед, дар маҳал созед ва озмоиш кунед

Мо озмоишҳоро пеш аз содир кардан насб мекунем ва сипас кодро иҷро мекунем.

Сенарияҳои маъмулӣ вақте ки санҷишҳо ба таври худкор иҷро мешаванд

  • Дар сатҳи маҳаллӣ:
    • Пайваста ё дар посух ба тағйироти мувофиқи код;
    • Дар бораи захиракунӣ (барои забонҳои тарҷумашуда ё JIT тартибдодашуда);
    • Ҳангоми васлкунӣ (вақте ки тартиб додан лозим аст);
    • Дар бораи ӯҳдадорӣ;
    • Ҳангоми нашр дар анбори муштарак.

  • Дар сервери сохта ё муҳити сохтани:
    • Вақте ки код ба филиал/анбори шахсӣ нашр мешавад.
    • Рамзи ин ришта санҷида мешавад.
    • Натиҷаи эҳтимолии якҷояшавӣ санҷида мешавад (одатан бо master).
    • Ҳамчун марҳилаи муттаҳидшавӣ / лӯлаи интиқоли муттасил

Одатан, маҷмӯи санҷиш ҳар қадар тезтар кор кунад, ҳамон қадар шумо метавонед онро иҷро кунед. Тақсимоти маъмулии марҳила метавонад чунин бошад.

  • Санҷишҳои фаврии воҳид - ҳангоми сохтмон, дар лӯлаи CI
  • Санҷишҳои воҳиди суст, санҷишҳои зуд ҷузъӣ ва ҳамгироӣ - иҷрошуда, дар лӯлаи CI
  • Санҷишҳои суст ва ҳамгироӣ - дар лӯлаи CI
  • Санҷиши амният, озмоиши сарборӣ ва дигар озмоишҳои вақт ва ё гаронбаҳо - дар лӯлаҳои CI/CD, аммо танҳо дар шеваҳои муайян/марҳила/қубурҳои сохтмон, масалан, ҳангоми омода кардани номзади релиз ё ҳангоми кор бо дастӣ.

️Вазифа

Ман тавсия медиҳам, ки санҷишҳоро аввал бо истифода аз фармон дастӣ иҷро кунед npm test. Пас аз ин, биёед git hook илова кунем, то санҷишҳои худро дар иҷрои вазифа иҷро кунем. Як далел вуҷуд дорад: қалмоқҳои Git ҷузъи анбор ҳисобида намешаванд ва аз ин рӯ наметавонанд аз GitHub дар якҷоягӣ бо боқимондаи маводи курс клон карда шаванд. Барои насб кардани қалмоқ, шумо бояд давед install_hook.sh ё файлро нусхабардорӣ кунед repo/hooks/pre-commit ба феҳристи маҳаллӣ .git/hooks/.
Вақте ки шумо содир мекунед, шумо хоҳед дид, ки санҷишҳо иҷро карда мешаванд ва онҳо тафтиш мекунанд, ки оё калимаҳои калидӣ дар рӯйхат мавҷуданд ё не.

  1. Санҷишҳоро тавассути иҷро кардани фармон дастӣ иҷро кунед npm test дар папкаи анбори курси шумо. Боварӣ ҳосил кунед, ки санҷишҳо анҷом дода шудаанд.
  2. Тавассути давидан як қалмоқеро (қалмоқро пешакӣ) таъин кунед install_hook.sh.
  3. Тағироти худро ба анбори маҳаллии худ ворид кунед.
  4. Боварӣ ҳосил кунед, ки пеш аз анҷом додани санҷишҳо гузаронида мешаванд.

Пас аз иҷрои ин қадамҳо, анбори шумо бояд чунин бошад.
Ҳолатҳои маъмулӣ бо ҳамгироии доимӣ

Фармонҳо

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

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

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

Рамзро дар анбори дурдаст ё филиали дурдаст нашр кунед

Пас аз он ки онҳо дар маҳал кор мекунанд, таҳиягарон маъмулан коди худро дастраси умум мекунанд, то ки он дар ниҳоят бо омма муттаҳид карда шавад. Бо GitHub, ин одатан тавассути интишори кор ба нусхаи шахсии анбор (форкҳои шахсӣ) ё филиали шахсӣ ба даст оварда мешавад.

  • Бо форкҳо, таҳиякунанда як анбори муштараки дурдастро клон мекунад ва як нусхаи дурдасти шахсии онро эҷод мекунад, ки ҳамчун фард низ маълум аст. Он гоҳ ин анбори шахсиро клон мекунад, то бо маҳаллӣ кор кунад. Вақте ки кор ба итмом мерасад ва ӯҳдадориҳо қабул карда мешаванд, вай онҳоро ба қуттии худ тела медиҳад, ки дар он ҷо онҳо барои дигарон дастрасанд ва метавонанд ба анбори умумӣ ворид карда шаванд. Ин равиш одатан дар лоиҳаҳои кушодаасос дар GitHub истифода мешавад. Он инчунин дар курси пешрафтаи ман истифода мешавад [Tam Work and CI with Git] (http://devops.redpill.solutions/).
  • Равиши дигар ин аст, ки танҳо як анбори дурдаст истифода баред ва танҳо филиалро ҳисоб кунед master анбори муштарак "муҳофизашуда". Дар ин сенария, таҳиягарони инфиродӣ рамзи худро дар шохаҳои анбори дурдаст нашр мекунанд, то дигарон ба ин код нигоҳ кунанд, агар ҳама чиз дар тартиб бошад, онро бо master анбори муштарак.

Дар ин курси мушаххас, мо ҷараёни кориро истифода хоҳем кард, ки шохаҳоро истифода мебарад.

Биёед коди худро нашр кунем.

️Вазифа

  • Тағиротро дар филиали дурдаст бо ҳамон ном бо филиали кории худ нашр кунед

Фармонҳо

git push --set-upstream origin feature

Эҷоди дархости ҷалб

Эҷоди дархости кашидан бо унвон Баррасии қадамҳо... Насб кунед feature монанди «шохаи сар» ва master ба монанди "шохаи базавӣ".

Боварӣ ҳосил кунед, ки шумо насб кардаед master дар вай репозиторийро кушоед Ҳамчун "филиали базавӣ" ман ба дархостҳо дар бораи тағир додани анбори маводи курс ҷавоб намедиҳам.

Дар lingo GitHub, "шохаи асосӣ" шохаест, ки шумо кори худро дар он асос мекунед ва "шохаи сарлавҳа" шохаест, ки тағйироти пешниҳодшударо дар бар мегирад.

Тағиротро муҳокима кунед, ҳангоми идомаи муҳокима ӯҳдадориҳои нав илова кунед

Дархости кашидан (PR)

Дархости кашидан (PR) як роҳи муҳокима ва ҳуҷҷатгузории код, инчунин гузаронидани баррасии код мебошад. Дархостҳои кашидан пас аз роҳи умумии ҳамгироии тағйироти инфиродӣ ба коди умумӣ номгузорӣ шудаанд. Одатан, шахс анбори расмии дурдасти лоиҳаро клон мекунад ва дар дохили код кор мекунад. Пас аз ин, вай кодро дар анбори дурдасти шахсии худ ҷойгир мекунад ва аз шахсони масъули анбори расмӣ талаб мекунад, ки гиранд(Кашидан) рамзи онро ба анборҳои маҳаллии худ, ки дар он ҷо баррасӣ ва эҳтимолан ҳамгироӣ мекунанд (якҷоя) вай. Ин мафҳум бо дигар номҳо низ маълум аст, масалан, дархости якҷоя.

Ба шумо аслан лозим нест, ки хусусияти дархости ҷалби GitHub ё платформаҳои шабеҳро истифода баред. Гурӯҳҳои рушд метавонанд усулҳои дигари муоширатро истифода баранд, аз ҷумла муоширати рӯ ба рӯ, зангҳои овозӣ ё почтаи электронӣ, аммо ҳанӯз ҳам як қатор сабабҳо барои истифодаи дархостҳои ҷалби форум вуҷуд доранд. Дар ин ҷо баъзе аз онҳо ҳастанд:

  • мубоҳисаҳои марбут ба тағйироти мушаххаси кодекс;
  • ҳамчун ҷой барои дидани фикру мулоҳизаҳо дар бораи коре, ки ҳам аз ҷониби худшиносон ва ҳам ҳамсолон доранд;
  • ба расмият даровардани баррасии кодекс;
  • то ки дертар сабабу мулодизадои паси ин ё он кодро фахмида тавонед.

Одатан, вақте ки шумо бояд чизеро муҳокима кунед ё фикру мулоҳиза гиред, шумо дархости ҷалб эҷод мекунед. Масалан, агар шумо дар болои хусусияте кор карда истода бошед, ки онро бо зиёда аз як роҳ амалӣ кардан мумкин аст, шумо метавонед пеш аз навиштани сатри якуми код дархости ҷалб эҷод кунед, то ғояҳои худро мубодила кунед ва нақшаҳои худро бо ҳамкорони худ муҳокима кунед. Агар кор соддатар бошад, дархости кашидан вақте кушода мешавад, ки чизе аллакай иҷро шудааст, содир шудааст ва метавонад муҳокима карда шавад. Дар баъзе сенарияҳо, шумо метавонед танҳо бо сабабҳои назорати сифат PR кушоед: санҷишҳои автоматикунонидашуда ё оғоз кардани баррасии код. Новобаста аз он ки шумо қарор қабул мекунед, фаромӯш накунед, ки дар дархости худ шахсонеро, ки тасдиқи онҳоро мехоҳед, @ зикр кунед.

Одатан, ҳангоми сохтани PR, шумо амалҳои зеринро иҷро мекунед.

  • Нишон диҳед, ки шумо чӣ гуна тағир доданро пешниҳод мекунед ва дар куҷо.
  • Тавсифро нависед, ки ҳадафи тағиротро шарҳ медиҳад. Шумо метавонед мехоҳед:
    • ҳама чизи муҳимеро, ки аз рамз маълум нест, илова кунед ё чизи муфид барои фаҳмидани контекст, ба монанди #bugs ва рақамҳои мувофиқ;
    • Ҳар касеро, ки мехоҳед бо он кор кардан мехоҳед, @mention кунед, ё шумо метавонед онҳоро дертар дар шарҳҳо @ зикр кунед;
    • аз ҳамкорон хоҳиш кунед, ки дар ягон чиз кӯмак кунанд ё ягон чизи мушаххасро тафтиш кунанд.

Вақте ки шумо PR-ро кушоед, санҷишҳое иҷро карда мешаванд, ки дар чунин ҳолатҳо иҷро карда мешаванд. Дар ҳолати мо, ин ҳамон маҷмӯи санҷишҳо хоҳад буд, ки мо дар маҳал гузаронидаем, аммо дар лоиҳаи воқеӣ шояд санҷишҳо ва санҷишҳои иловагӣ вуҷуд дошта бошанд.

Лутфан интизор шавед, ки санҷишҳо ба итмом расад. Шумо метавонед ҳолати санҷишҳоро дар поёни муҳокимаи PR дар интерфейси GitHub бубинед. Ҳангоми ба итмом расидани санҷишҳо идома диҳед.

️ Дар бораи тасодуфии рӯйхати қадамҳои CI қайд илова кунед

Рӯйхати дар ин курс истифодашуда худсарона ва субъективӣ аст, мо бояд дар ин бора ёддошт илова кунем.

️ Вазифа: барои ин шарҳ дархости ҷалб эҷод кунед

  1. Гузариш ба филиал master.
  2. Сохтани филиал бо номи bugfix.
  3. Матни ёддоштро ба охири файл илова кунед 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. Тағйиротро иҷро кунед.
  5. Наворро нашр кунед bugfix ба анбори дурдаст.
  6. Эҷоди дархости ҷалб бо номи Илова кардани шарҳ бо шохаи сар bugfix ва филиали асосйmaster.

Боварӣ ҳосил кунед, ки шумо насб кардаед master дар вай репозиторийро кушоед Ҳамчун "филиали базавӣ" ман ба дархостҳо дар бораи тағир додани анбори маводи курс ҷавоб намедиҳам.

Ин аст он чизе ки анбори шумо бояд монанд бошад.
Ҳолатҳои маъмулӣ бо ҳамгироии доимӣ

Фармонҳо

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

Тасдиқи дархости ҷалб "Илова кардани эрод"

️Вазифа

  1. Эҷоди дархости ҷалб.
  2. "Дархости ҷалб" -ро клик кунед.
  3. "Тасдиқи якҷоякунӣ" -ро клик кунед.
  4. "Нест кардани филиал" клик кунед, ба мо дигар лозим нест.

Ин диаграммаи ӯҳдадориҳо пас аз якҷоякунӣ мебошад.
Ҳолатҳои маъмулӣ бо ҳамгироии доимӣ

️ Кор кардан ва илова кардани санҷишҳоро идома диҳед

Ҳамкорӣ дар дархости ҷалб аксар вақт ба кори иловагӣ оварда мерасонад. Ин одатан натиҷаи баррасии рамз ё муҳокима аст, аммо дар курси мо мо инро тавассути илова кардани ҷузъҳои нав ба рӯйхати қадамҳои CI моделсозӣ мекунем.

Интегратсияи доимӣ одатан баъзе фарогирии санҷишро дар бар мегирад. Талаботи фарогирии санҷиш гуногунанд ва одатан дар ҳуҷҷате пайдо мешаванд, ки чизе ба монанди "дастурҳои саҳмгузорӣ" ном дорад. Мо онро оддӣ нигоҳ медорем ва дар рӯйхати санҷиши худ барои ҳар як сатр санҷиш илова мекунем.

Ҳангоми иҷро кардани супоришҳо, кӯшиш кунед, ки аввал санҷишҳоро иҷро кунед. Агар шумо дуруст насб карда бошед pre-commit пештар қалмоқе, санҷиши нав иловашуда иҷро мешавад, ноком мешавад ва ҳеҷ чиз содир карда намешавад. Аҳамият диҳед, ки ин аст, ки мо медонем, ки санҷишҳои мо воқеан чизеро месанҷанд. Ҷолиб он аст, ки агар мо пеш аз санҷишҳо бо код оғоз кунем, гузариши санҷишҳо метавонад маънои онро дошта бошад, ки код тавре интизор буд, кор мекард ё санҷишҳо воқеан ҳеҷ чизро санҷида нашудаанд. Илова бар ин, агар мо дар аввал санҷишҳоро нанавиштем, мо шояд онҳоро тамоман фаромӯш карда будем, зеро ҳеҷ чиз ба мо инро хотиррасон намекард.

Рушди озмоишӣ (TDD)

TDD пеш аз рамз навиштани санҷишҳоро тавсия медиҳад. Ҷараёни кори маъмулӣ бо истифода аз TDD чунин менамояд.

  1. Илова кардани санҷиш.
  2. Ҳама санҷишҳоро иҷро кунед ва боварӣ ҳосил кунед, ки санҷиши нав ноком мешавад.
  3. Рамзро нависед.
  4. Санҷишҳоро иҷро кунед, боварӣ ҳосил кунед, ки ҳама санҷишҳо мегузаранд.
  5. Рамзи худро аз нав кор кунед.
  6. Такрор кунед.

Азбаски натиҷаҳои санҷишҳои ноком одатан бо ранги сурх нишон дода мешаванд ва онҳое, ки гузаштаанд, одатан бо ранги сабз нишон дода мешаванд, давра инчунин ҳамчун рефактори сурх-сабз маълум аст.

️Вазифа

Аввалан, кӯшиш кунед, ки санҷишҳоро анҷом диҳед ва ба нокомии онҳо иҷозат диҳед, пас матни худи рӯйхати қадамҳои CI -ро илова кунед ва иҷро кунед. Шумо хоҳед дид, ки санҷишҳо мегузаранд ("сабз").
Сипас рамзи навро дар анбори дурдаст нашр кунед ва бубинед, ки санҷишҳо дар интерфейси GitHub дар поёни муҳокимаи дархости ҷалб ва навсозии ҳолати PR иҷро мешаванд.

  1. Гузариш ба филиал feature.
  2. Ин санҷишҳоро ба 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 қалмоқе насб шудааст, кӯшиши иҷро ноком мешавад.
  4. Сипас ин матнро ба 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. Интишори тағирот дар филиал feature.

Ҳоло шумо бояд чунин чизе дошта бошед
Ҳолатҳои маъмулӣ бо ҳамгироии доимӣ

Фармонҳо


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

Якҷоя кардани низоъ

Ба дархости тағирот равед Баррасии қадамҳо.

Гарчанде ки мо ягон кори нодуруст накардаем ва санҷишҳои рамзи мо гузаштанд, мо то ҳол филиалро якҷоя карда наметавонем. feature и master. Сабаб он аст, ки риштаи дигар bugfix бо муттаҳид карда шуд master дар ҳоле ки мо дар ин PR кор мекардем.
Ин вазъиятеро ба миён меорад, ки филиали дурдаст master дорои версияи навтар аз оне, ки мо дар асоси филиал асос ёфтааст feature. Аз ин сабаб мо наметавонем танҳо САРРО ба ақиб баргардонем master то охири ришта feature. Дар ин вазъият мо бояд ӯҳдадориҳоро якҷоя кунем ё татбиқ кунем feature бозсозӣ master. GitHub воқеан метавонад якҷоякунии автоматиро иҷро кунад, агар ягон ихтилоф вуҷуд надошта бошад. Афсӯс, ки дар вазъияти мо, ҳарду филиал дар файл тағиротҳои рақобатпазир доранд ci.md. Ин вазъият ҳамчун ихтилофи якҷоя маълум аст ва мо бояд онро дастӣ ҳал кунем.

Якҷоя кунед ё аз нав барқарор кунед

Якҷоягӣ кунед

  • Уҳдадории иловагии якҷоякунӣ эҷод мекунад ва таърихи корро захира мекунад.
    • Уҳдадориҳои аслии филиалҳоро бо тамғаҳои вақт ва муаллифони аслии онҳо нигоҳ медорад.
    • SHA-и ӯҳдадориҳо ва истинодҳо ба онҳо дар муҳокимаҳои дархости тағиротро захира мекунад.
  • Якбора ҳалли низоъро талаб мекунад.
  • Ҳикояро ғайрихаттӣ мегардонад.
    • Аз сабаби шумораи зиёди шохаҳо (кабели IDE-ро ба хотир меорад) хондани ҳикоя метавонад душвор бошад.
    • Ислоҳоти автоматиро мушкилтар мекунад, масалан. git bisect камтар фоиданок - он танҳо ӯҳдадории якҷояро пайдо мекунад.

Бозхондан

  • Бозикунии такрорӣ аз шохаи ҷорӣ дар болои шохаи пойгоҳ паси дигаре иҷро мешавад.
    • Уҳдадориҳои нав бо SHA-ҳои нав тавлид мешаванд, ки ӯҳдадориҳо дар GitHub ба дархостҳои аслии ҷалб мувофиқат мекунанд, аммо на ба шарҳҳои мувофиқ.
    • Уҳдадориҳоро дар ин раванд дубора муттаҳид кардан ва тағир додан ё ҳатто ба як муттаҳид кардан мумкин аст.
  • Мумкин аст, ки ихтилофоти зиёдеро ҳал кардан лозим ояд.
  • Ба шумо имкон медиҳад, ки ҳикояи хатиро нигоҳ доред.
    • Ҳикояро хондан осонтар аст, ба шарте ки он бе ягон сабаб хеле дароз набошад.
    • Ислоҳоти худкор ва ҳалли мушкилот каме осонтар аст: имкон медиҳад git bisect, метавонад бозгашти автоматиро равшантар ва пешгӯинашавандатар кунад.
  • Интишори филиалро бо ӯҳдадориҳои муҳоҷират бо парчам талаб мекунад --force вақте ки бо дархостҳои кашидан истифода мешавад.

Одатан, дастаҳо розӣ мешаванд, ки ҳамеша як стратегияро истифода баранд, вақте ки онҳо бояд тағиротро якҷоя кунанд. Ин метавонад якҷояшавии "пок" ё ӯҳдадории "пок" дар боло бошад ё чизе дар байни онҳо, ба монанди иҷрои интерактивӣ (git rebase -i) ба таври маҳаллӣ барои филиалҳо, ки дар анбори ҷамъиятӣ нашр нашудаанд, аммо барои филиалҳои "ҷамъиятӣ" муттаҳид мешаванд.

Дар ин ҷо мо якҷоя карданро истифода мебарем.

️Вазифа

  1. Боварӣ ҳосил кунед, ки код дар филиали маҳаллӣ аст master аз анбори дурдаст навсозӣ шудааст.
  2. Гузариш ба филиал feature.
  3. Оғози якҷояшавӣ бо филиал master. Муноқишаи якҷоякунӣ аз сабаби тағироти рақобатӣ дар ci.md.
  4. Мушкилотро ҳал кунед, то ҳам рӯйхати қадамҳои CI ва ҳам ёддошт дар бораи он дар матн боқӣ монад.
  5. Уҳдадории якҷояро ба филиали дурдаст нашр кунед feature.
  6. Ҳолати дархости кашиданро дар GitHub UI тафтиш кунед ва то ҳал шудани муттаҳидшавиро интизор шавед.

Фармонҳо

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

кори бузург!

Шумо бо рӯйхат анҷом додаед ва ҳоло шумо бояд дархости ҷалбро тасдиқ кунед master.

️ Вазифа: Тасдиқи дархости ҷалби "Баррасии қадамҳо"

  1. Дархостро кушоед.
  2. "Дархости ҷалб" -ро клик кунед.
  3. "Тасдиқи якҷоякунӣ" -ро клик кунед.
  4. "Нест кардани филиал" -ро клик кунед, зеро ба мо дигар лозим нест.

Ин дар айни замон анбори шумост
Ҳолатҳои маъмулӣ бо ҳамгироии доимӣ

Хатогии маҳсулот

Гуфта мешавад, ки "озмоиш метавонад барои нишон додани мавҷудияти хатоҳо истифода шавад, аммо ҳеҷ гоҳ набудани онҳоро нишон диҳад." Гарчанде ки мо озмоишҳо доштем ва онҳо ба мо ягон хато нишон надоданд, хатои маккорона ба истеҳсолот ворид шуд.

Дар чунин сенария, мо бояд ғамхорӣ кунем:

  • он чизе, ки дар истеҳсолот ҷойгир карда шудааст;
  • код дар ришта master бо хатое, ки аз он таҳиягарон метавонанд кори навро оғоз кунанд.

Оё ман бояд онро баргардонам ё онро дар версияи навбатӣ ислоҳ кунам?

Баргардонидан ин раванди ҷобаҷогузории версияи хуби қаблӣ дар истеҳсолот ва баргардонидани ӯҳдадориҳое мебошад, ки хатогиро дар бар мегиранд. "Ба пеш ислоҳ кардан" иловаи ислоҳ ба master ва ҳарчи зудтар ба кор андохтани версияи нав. Азбаски APIҳо ва схемаҳои пойгоҳи додаҳо ҳангоми ҷойгиркунии код дар истеҳсолот бо интиқоли пайваста ва фарогирии хуби санҷиш тағир меёбанд, бозгаштан одатан нисбат ба ислоҳи он дар версияи оянда хеле мушкилтар ва хатарноктар аст.

Азбаски бозгашт дар ҳолати мо хатаре надорад, мо ба ин роҳ меравем, зеро он ба мо имкон медиҳад

  • хатогиро дар маҳсулот ҳарчи зудтар ислоҳ кунед;
  • кодро ворид кунед master дархол барои ба кори нав шуруъ кардан мувофик аст.

️Вазифа

  1. Гузариш ба филиал master маҳаллӣ.
  2. Анбори маҳаллиро аз анбори дурдаст навсозӣ кунед.
  3. Баргардонидани ӯҳдадории якҷоякунии PR Баррасии қадамҳо в master.
  4. Тағиротро дар анбори дурдаст нашр кунед.

Ин таърихи анборест, ки ӯҳдадории якҷоякунӣ баргардонида шудааст
Ҳолатҳои маъмулӣ бо ҳамгироии доимӣ

Фармонҳо

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

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

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

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

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

️ Озмоиши худ

Боварӣ ҳосил кунед, ки ci.md пас аз баргардонидани ӯҳдадории якҷоякунӣ дигар матни "иштибоҳи махфӣ"-ро дар бар намегирад.

Рӯйхати қадамҳои CI-ро ислоҳ кунед ва онро ба устод баргардонед

Мо ӯҳдадории муттаҳидшавии филиалро комилан баргардонидем. feature. Хабари хуш ин аст, ки мо ҳоло хато надорем master. Хабари бад ин аст, ки рӯйхати гаронбаҳои қадамҳои пайвастаи мо низ нест шудааст. Пас, идеалӣ, мо бояд ислоҳро ба ӯҳдадориҳои аз feature ва ба онҳо баргардонед master дар баробари ислоҳ.

Мо метавонем ба мушкилот бо роҳҳои гуногун муносибат кунем:

  • баргардонидани ӯҳдадорӣ, ки муттаҳидшавиро бекор мекунад feature с master;
  • ҳаракат аз пештара ӯҳдадор мешавад feature.

Гурӯҳҳои гуногуни рушд дар ин ҳолат равишҳои гуногунро истифода мебаранд, аммо мо ӯҳдадориҳои муфидро ба як филиали алоҳида интиқол медиҳем ва барои ин филиали нав дархости ҷудогона эҷод мекунем.

️Вазифа

  1. Эҷоди ришта бо номи feature-fix ва ба он гузаред.
  2. Ҳама ӯҳдадориҳоро аз филиали собиқ интиқол диҳед feature ба риштаи нав. Ҳалли муноқишаҳои якҷоякунӣ, ки ҳангоми муҳоҷират ба амал омадаанд.

    Ҳолатҳои маъмулӣ бо ҳамгироии доимӣ

  3. Иловаи санҷиши регрессия ба ci.test.js:

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

  4. Санҷишҳоро ба таври маҳаллӣ иҷро кунед, то боварӣ ҳосил кунед, ки онҳо ноком намешаванд.
  5. Матни "бо хатои махфӣ"-ро дар ci.md.
  6. Ба индекс тағиротҳои санҷишӣ ва рӯйхати қадамҳоро илова кунед ва онҳоро иҷро кунед.
  7. Филиалро дар анбори дурдаст нашр кунед.

Шумо бояд бо чизе монанд ба ин хотима диҳед:
Ҳолатҳои маъмулӣ бо ҳамгироии доимӣ

Фармонҳо

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

Эҷоди дархости ҷалб.

Эҷоди дархости кашидан бо унвон Ислоҳи хусусият... Насб кунед feature-fix мисли «шохаи сар» ва master ба монанди "шохаи базавӣ".
Лутфан интизор шавед, ки санҷишҳо ба итмом расад. Шумо метавонед ҳолати санҷишҳоро дар поёни муҳокимаи PR бубинед.

Боварӣ ҳосил кунед, ки шумо насб кардаед master дар вай репозиторийро кушоед Ҳамчун "филиали базавӣ" ман ба дархостҳо дар бораи тағир додани анбори маводи курс ҷавоб намедиҳам.

Тасдиқи дархости кашидани "Ислоҳ кардани хусусият"

Ташаккур барои ислоҳ! Лутфан тағиротро ба тасвиб диҳед master аз дархости кашидан.

️Вазифа

  1. "Дархости ҷалб" -ро клик кунед.
  2. "Тасдиқи якҷоякунӣ" -ро клик кунед.
  3. "Нест кардани филиал" -ро клик кунед, зеро ба мо дигар лозим нест.

Ин аст он чизе ки шумо бояд дар айни замон дошта бошед.
Ҳолатҳои маъмулӣ бо ҳамгироии доимӣ

Табрикот!

Шумо тамоми қадамҳоеро, ки одамон одатан ҳангоми ҳамгироии муттасил иҷро мекунанд, анҷом додед.

Агар шумо ягон мушкилотро дар курс мушоҳида кунед ё донед, ки чӣ гуна онро беҳтар кардан лозим аст, лутфан дар он масъала эҷод кунед анборҳо бо маводи курс. Ин курс низ дорад версияи интерактивӣ бо истифода аз GitHub Learning Lab ҳамчун платформа.

Манбаъ: will.com

Илова Эзоҳ