讓我們開始編譯 CI 步驟清單。 通常,您會從遠端儲存庫檢查最新版本的程式碼來開始此步驟,但我們尚未有本機儲存庫,因此我們從遠端儲存庫複製它。
️ 任務:更新本機儲存庫,從中建立分支 master, 開始工作
從複製課程儲存庫 <URL репозитория>.
跑 npm install 在課程儲存庫目錄中; 我們需要它來安裝 Jest,我們用它來執行測試。
建立一個分支並命名 feature。 切換到這個線程。
添加測試代碼到 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);
});
將包含前 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 上的開源專案。 我的高級課程 [Team Work and CI with Git] 中也使用了它(http://devops.redpill.solutions/).
> **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/).
# Переключитесь на ветку 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 步驟清單新增項目來對此進行建模。
首先,嘗試提交測試並讓它們失敗,然後新增並提交 CI 步驟清單本身的文字。 您將看到測試正在通過(“綠色”)。
然後將新程式碼發佈到遠端儲存庫,並在拉取請求討論和 PR 狀態更新底部的 GitHub 介面中觀看測試運行情況。
切換到分支 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);
});
嘗試提交測試。 如果 pre-commit 安裝鉤子後,提交嘗試將失敗。
然後將此文字新增至 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.
在本地進行並提交更改。
將變更發佈到分支 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
通常,團隊同意在需要合併變更時始終使用相同的策略。 這可能是「純」合併或頂部「純」提交,或介於兩者之間,例如互動式地在頂部進行提交(git rebase -i) 本機用於未發佈到公用儲存庫的分支,但合併「公用」分支。
這裡我們將使用合併。
️任務
確保程式碼位於本地分支中 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 並儘快部署新版本。 由於 API 和資料庫架構會隨著程式碼部署到生產環境而變化,並且具有持續交付和良好的測試覆蓋率,因此回滾通常比在下一版本中修復它要困難得多,風險也更大。
由於回滾在我們的案例中不會帶來任何風險,因此我們將走這條路,因為它允許我們
盡快修復產品上的錯誤;
編寫程式碼 master 立即適合開始新工作。
️任務
切換到分支 master 本地
從遠端儲存庫更新本機儲存庫。
恢復 PR 合併提交 步驟回顧 в master.
將變更發佈到遠端儲存庫。
這是已恢復合併提交的儲存庫的歷史記錄
命令
# Переключитесь на ветку master.
git checkout master
# Обновите локальный репозиторий из удалённого репозитория.
git pull
# Отмените коммит слияния PR Steps review в master.
# Мы отменяем коммит слияния, поэтому нам нужно выбрать ветку истории, которую мы захотим оставить
git show HEAD
# предположим, что коммит, который был последним в ветке master до слияния, был отображён предыдущей командой первым
git revert HEAD -m 1
# можете не менять сообщения коммитов
# Опубликуйте изменения в удалённый репозиторий
git push
it('does not contain the sneaky bug', () => {
expect( /.*sneakys+bug.*/gi.test(fileContents)).toBe(false);
});
在本地運行測試以確保它們不會失敗。
刪除文字“有一個偷偷摸摸的錯誤” ci.md.
將測試變更和步驟清單變更新增至索引並提交。
將分支發佈到遠端儲存庫。
你最終應該得到類似這樣的結果:
命令
# Создайте ветку под названием 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