Интегратсияи доимӣ, ё CI, як таҷрибаи техникӣ аст, ки дар он ҳар як узви даста ҳадди аққал як маротиба дар як рӯз рамзи худро ба як анбори умумӣ муттаҳид мекунад ва рамзи натиҷавӣ ҳадди аққал бидуни хато сохта мешавад.
Дар бораи ин истилоҳ ихтилофот вуҷуд дорад
Нуқтаи баҳс басомади ҳамгироӣ мебошад. Баъзеҳо мегӯянд, ки якҷоя кардани код танҳо як маротиба дар як рӯз кофӣ нест, ки воқеан пайваста муттаҳид шавад. Намунае аз дастае оварда шудааст, ки дар он ҳама саҳар рамзи тоза мегиранд ва як маротиба бегоҳ онро муттаҳид мекунанд. Гарчанде ки ин як эътирози оқилона аст, ба таври умум боварӣ дорад, ки таърифи якрӯза дар як рӯз оқилона амалӣ, мушаххас ва барои дастаҳои андозаҳои гуногун мувофиқ аст.
Эътирози дигар ин аст, ки C++ дигар забони ягонае нест, ки дар таҳия истифода мешавад ва танҳо талаб кардани анҷумани бидуни хато ҳамчун роҳи тасдиқ заиф аст. Баъзе маҷмӯи санҷишҳо (масалан, санҷишҳои воҳиди ба таври маҳаллӣ иҷрошуда) низ бояд бомуваффақият анҷом дода шаванд. Дар айни замон, ҷомеа ба ин талабот ҳаракат мекунад ва дар оянда "созиш + санҷишҳои воҳидҳо" эҳтимол ба як таҷрибаи маъмулӣ табдил ёбад, агар ин аллакай вуҷуд надошта бошад.
Интегратсияи доимӣ гуногун аз интиқоли доимӣ (Интиқоли муттасил, CD), зеро он пас аз ҳар як давраи ҳамгироӣ номзади озодро талаб намекунад.
Рӯйхати қадамҳое, ки мо дар давоми курс истифода мебарем
Рамзи охиринро кашед. Филиал аз master. Ба кор шуруъ кунед.
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);
});
Матнро бо 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 как описано выше
Пас аз иҷрои ин қадамҳо, анбори шумо бояд чунин бошад.
Фармонҳо
# Установите 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 анбори муштарак.
️ Дар бораи тасодуфии рӯйхати қадамҳои CI қайд илова кунед
Рӯйхати дар ин курс истифодашуда худсарона ва субъективӣ аст, мо бояд дар ин бора ёддошт илова кунем.
️ Вазифа: барои ин шарҳ дархости ҷалб эҷод кунед
Гузариш ба филиал master.
Сохтани филиал бо номи bugfix.
Матни ёддоштро ба охири файл илова кунед 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/).
Тағйиротро иҷро кунед.
Наворро нашр кунед bugfix ба анбори дурдаст.
Эҷоди дархости ҷалб бо номи Илова кардани шарҳ бо шохаи сар bugfix ва филиали асосй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 как описано выше
Азбаски натиҷаҳои санҷишҳои ноком одатан бо ранги сурх нишон дода мешаванд ва онҳое, ки гузаштаанд, одатан бо ранги сабз нишон дода мешаванд, давра инчунин ҳамчун рефактори сурх-сабз маълум аст.
️Вазифа
Аввалан, кӯшиш кунед, ки санҷишҳоро анҷом диҳед ва ба нокомии онҳо иҷозат диҳед, пас матни худи рӯйхати қадамҳои CI -ро илова кунед ва иҷро кунед. Шумо хоҳед дид, ки санҷишҳо мегузаранд ("сабз").
Сипас рамзи навро дар анбори дурдаст нашр кунед ва бубинед, ки санҷишҳо дар интерфейси GitHub дар поёни муҳокимаи дархости ҷалб ва навсозии ҳолати PR иҷро мешаванд.
Гузариш ба филиал feature.
Ин санҷишҳоро ба 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);
});
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.
Тағйиротро ба таври маҳаллӣ ворид кунед ва иҷро кунед.
Интишори тағирот дар филиал 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. Ин вазъият ҳамчун ихтилофи якҷоя маълум аст ва мо бояд онро дастӣ ҳал кунем.
Якҷоя кунед ё аз нав барқарор кунед
Якҷоягӣ кунед
Уҳдадории иловагии якҷоякунӣ эҷод мекунад ва таърихи корро захира мекунад.
Уҳдадориҳои аслии филиалҳоро бо тамғаҳои вақт ва муаллифони аслии онҳо нигоҳ медорад.
Боварӣ ҳосил кунед, ки код дар филиали маҳаллӣ аст master аз анбори дурдаст навсозӣ шудааст.
Гузариш ба филиал feature.
Оғози якҷояшавӣ бо филиал master. Муноқишаи якҷоякунӣ аз сабаби тағироти рақобатӣ дар ci.md.
Мушкилотро ҳал кунед, то ҳам рӯйхати қадамҳои CI ва ҳам ёддошт дар бораи он дар матн боқӣ монад.
Уҳдадории якҷояро ба филиали дурдаст нашр кунед feature.
Ҳолати дархости кашиданро дар 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.
# Переключитесь на ветку 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-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