让我们开始编译 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