- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
本文,我们将向您展示如何配置一个流水线,该流水线将在 零停机 的情况下构建、测试和部署项目。零停机是一种部署技术,可让您在此过程中通过终端用户完全更新网站.
请确保在您服务器上安装SSH,因为我们需要使用SSH运行一些命令以修改部署.
在此,我们将使用一个静态 React 网站作为演示,您可以从: GitHub存储仓上获取示例源码 ,此存储仓基于 React快速上手文档 创建。( React 是一个用于构建用户界面的JavaScript库) 。
进入 Buddy 系统并新建一个项目。选择你的目标Git托管,在此我们使用 Buddy 系统自带的Git托管作为演示,当然您也可以使用其他的Git托管提供商:
流水线是在存储仓代码环境中运行并在特定条件下触发的一组操作(例如构建、测试或部署).
在这里,我们设置触发条件和要从中部署的分支。由于我们要全自动化,因此将触发模式设置为事件(自动)。我们使用的项目只有一个分支(master),因此保持默认:
现在, Buddy 将要求您向流水线添加操作。选择Node.js操作 – 我们将使用它作为构建的模板:
Buddy 使用具有 预配置环境的隔离容器 作为构建模板 。
您可以在此处配置构建详情,例如使用的Node版本和将在容器中运行的命令。您可以保留默认命令 - 只需在行末添加 npm run build :
npm install
npm test
npm run build
运行流水线以查看一切是否正常。第一步, Buddy 将从您的存储仓中提取最新更改并设置环境变量。在第二步中, Buddy 将下载所需的依赖项并将其缓存在容器中 - 存留在那以供将来执行,这样您就不必再次进行下载。您可以单击正在运行的执行并展开操作中的日志以了解详细信息:
执行完成后,将生成对流水线文件系统的构建。 文件系统 包含上次执行的修订版中存储仓的克隆、构建操作生成的工件以及手动上传的静态文件(例如配置文件)。您会注意到工件会标有一个小的宝石图标:
下一步是添加一个操作,该操作会将我们的构建上传到服务器。在这种情况下,作为示例我们将通过SSH部署到腾讯云服务器,我们推荐使用SFTP作为传输操作:
虽然示例使用SFTP与 腾讯云 ,但您也可以使用所需的任何服务器、私有云、专有云服务器,有如 阿里云 、 华为云 以及专有的Buddy操作集成 Azure 、 AWS 、 谷歌云 、 DigitalOcean 、 Heroku 、 Netlify 、 Vultr 、 Rackspace 等等。将来,我们还会集成更多便捷专有的Buddy操作云服务提供商集成。如果您是云服务提供商并欲提供Buddy操作集成,请通过此电子邮件联系我们: support@buddy.red 。
操作界面允许您配置部署详细信息:服务器的访问凭据、 Buddy 将从中上传文件路径以及服务器上的目标路径。您可以从多种身份验证方法中进行选择 - 我们始终建议使用 Buddy 的工作区密钥作为最安全的身份验证方法.
在示例中,网站将从存储仓中的 构建 目录(源路径)部署到服务器上的 /var/www/html/hello (远程路径):
单击 Test action 测试按钮以检查是否正确配置所有信息。 Buddy 将连接到服务器,上传测试文件,然后删除将测试文件删除。完成后保存设置单击 运行 流水线按钮或将某些内容推送到存储仓以触发流水线并将网站上传至服务器:
如果出现连接问题,请确保将 Buddy 用于部署的IP列入白名单 .
流水线现已完全正常运行:每当进行推送时, Buddy 都会提取更改、运行单元测试、准备构建并将其上传到服务器。现在是时候让我们升级流程了,以确保应用程序在部署期间不会遭受任何停机.
我们将应用一个简易的技巧:首先将应用程序上传到新创建的文件夹,然后在部署完成后将服务处理过程切换到新路径位置.
单击部署操作以编辑其详细信息,并将部署到的文件夹(远程路径)更改为 $BUDDY_EXECUTION_REVISION/ 。这将在每次执行时自动创建一个以当前部署的修订命名的新文件夹。如果您 在GitHub上使用我们的项目 ,完整路径将如下所示:
/var/www/html/$BUDDY_EXECUTION_REVISION
Buddy 将检测到远程路径已更改,并要求您采取措施。保持原样并单击继续 – 我们需要先在服务器上添加一些命令:
现在,我们将添加一个操作,该操作将连接到我们的服务器,并运行将在部署后将服务进程切换到新路径位置的命令。在操作名单中查找SSH:
该操作以与部署完全相同的方式定义:您需要提供身份验证方式、服务器凭据以及将在其中执行命令的目录(将此目录保留为默认值)。当然,我们也需要适当的命令。填写服务器详细信息并将以下内容粘贴到命令窗口中:
#kill current http-server process
kill $(lsof -t -i:80) || true
#run maintenance page
http-server -p 80 /var/www/html/$BUDDY_EXECUTION_REVISION > http.log 2>&1 &
第一个命令将终止当前服务进程。第二个将从部署操作创建的新位置运行.
该操作应如下所示:
推送代码到存储仓以触发流水线或手动运行该流水线,并检查执行日志是否正确传递:
恭喜 – 您已成功将零停机部署引入交付流程!🎉 。
请注意,此示例中的应用程序可以在几秒钟内完成部署,并且不需要绝对100%的正常上线运行时间。此方案最适合用于可能需要几分钟(甚至几小时)才能完成上传的复杂网站与程序部署.
在将网站部署到生产服务器之前,最好在暂存服务器上预览更改,并可能 运行一些端到端测试 。在本文的这一部分中,我们将重新配置流水线以从端口 3000 为网站提供服务,并将部署到生产环境 - 但仅在手动确认更改后.
第一步是添加另一个SSH操作,该操作将在服务器上创建新的服务进程。您可以使用操作添加界面上的 复制 选项,而不是从头开始配置所有内容:
复制时,将项目和流水线保留为默认值,但不要复制所有操作,而是仅选择SSH操作:
流水线中应有两个相同的SSH操作。单击第一个以编辑其详细信息并将端口从 80 更改为 3000 :
#kill current http-server process
kill $(lsof -t -i:3000) || true
#run maintenance page
http-server -p 3000 /var/www/html/$BUDDY_EXECUTION_REVISION > http.log 2>&1 &
完整的流水线应如下所示,第一个SSH操作设置为端口 3000 ,第二个设置为端口 80 :
为避免混淆,最好将两个SSH操作的默认名称重命名为两个带不同说明的名称,例如: 暂存服务器操作 和 生产服务器操作 。您可以在“概述”设置选项卡中执行此操作.
在每次推送时将网站部署到生产环境而不检查更改是一项有风险的业务。除非 测试完全涵盖 该过程并通过多个环境发布,否则强烈建议将 流水线触发模式切换为手动 ,或者在部署到生产环境之前添加手动确认步骤 - 最后一个是我们现在要做的:
单击最终发布步骤之前的 + 按钮,然后在操作列表中查找等待 审批 :
您可以在此处定义问题并将审批权限限制为选定的用户组:
现在,一旦运行流水线,它将自动停止并且在确认更改之前不会继续运行。但是怎么让审批人员知道有一个网站在等待他们的批准呢?
这时,我们将给他们发送提醒通知.
再次单击 + 按钮 - 这次是在批准操作之前。跳转到右列中的通知,然后选择您的首选服务:
在此示例中,我们将使用 Slack,因为它是用户中最受欢迎的通知服务.
每当您首次添加与第三方服务集成的操作时, Buddy 都会要求您配置集成详细信息。在此,您可以定义集成的权限范围,即谁可以修改其详细信息并添加需要它的流水线操作:
最后一步是接受所选应用程序的OAuth权限:
配置集成后,您可以指定消息。最好将 URL 粘贴到暂存网站,以便团队成员可以快速访问:
对网站进行一些更改并运行流水线。执行应在发布到生产环境之前停止:
您还应在所选服务中收到通知:
单击 批准 按钮以继续执行剩余操作并实时发布网站.
恭喜 – 您已成功为您的网站创建完整的暂存/生产交付流水线! 🎉 。
流水线现已完全正常运行。它无需停机即可交付应用程序,将网站上传到暂存服务器,通知团队有新版本等待审批,并在更改获得批准后将其发布到生产环境.
但是,如果在此过程中出现问题怎么办?例如,如果测试失败怎么办?好吧,首先要做的是通知相关人员。我们已经针对有能力的开发人员提供了有关新版本的通知操作。但是,在这种情况下,我们需要通知QA或Dev - 但前提是流水线遇到中断.
转到流水线总览,然后单击 于失败 标签按钮:
添加您选择的其他通知。编辑邮件并选择正确的频道/收件人:
是时候进入好玩的部分了 - 故意破坏您的网站。例如,让我们在 /src/App.test.js 搞坏一个import破坏:
推送更改以触发流水线。执行将在测试这一步骤上失败,除了最后的通知不会执行进一步的操作:
Buddy 有一个很酷的功能,让你直接从终端调试错误。请转到所需的执行进行访问,然后在失败的操作上单击“在终端中调试操作”:
Buddy 将启动容器备份,允许您在交互模式下运行命令并调试问题:
请注意,终端调试被视为正常执行。除非工作区中具有 并行性操作 ,否则任何后续执行都将进入列队排队执行.
本文介绍的做法涵盖了使用 Buddy 进行持续集成和部署的基础知识。就软件发布频率而言,仅应用部署自动化本身就是一个行业的改变者,极大地提高了效率和工作条件。流水线和可视化界面的灵活性,可让您在不参考文档的情况下即时添加和删除操作,而Docker容器可确保整个团队的环境保持一致.
总而言之, Buddy 更像是一个开发运维大舞台,您可以在其中创建自动化工作流程,就像建造房屋一样:选择您需要的材料,在必要时进行调整,怎么舒适怎么办。但不要认为仅仅虚有其表,因为 Buddy 与您迄今为止可能使用过的任何其他CI/CD工具一样强大 - 它只是降低了DevOps入门门槛,并把人们认为晦涩的DevOps变得简单易用.
最后此篇关于自动化运维:如何零停机构建与部署项目的文章就讲到这里了,如果你想了解更多关于自动化运维:如何零停机构建与部署项目的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我在 *.sql 文件中得到了我的数据库转储(表、函数、触发器等)。此时我正在通过 jenkins 部署它们,通过传递执行 shell 命令: sudo -u postgres psql -d my_
我正在使用网络部署 API 来部署网络包(.zip 文件,由 MSDeploy.exe 创建)以编程方式将包发布到服务器(在发布包之前我们需要做一些其他事情这就是为什么我们不使用 MSDeploy.e
我们正在使用 Web Deploy 3 的(几乎完全未记录的)“公共(public) API”来创建我们网站的 .zip 包,然后将其同步到服务器: DeploymentBaseOptions des
将 clojure 应用程序制作成可执行文件的最简单方法是什么,例如 http://rawr.rubyforge.org/ ruby 吗? (exe 和 app 文件也是) 最佳答案 使用 leini
是否可以下载 Android 源代码并针对任何设备进行编译? 我想做的是尝试 GSM 代码部分并编译操作系统并将其部署到我的摩托罗拉手机上。 谢谢! 最佳答案 是的,但这很难,因为大多数手机不共享驱动
我正在考虑用 c/c++ 编写需要在大多数个人计算机上运行的 nbody 样式模拟。本质上是一个 O(n^2) 粒子模拟器。 因为这需要相当用户友好,所以我希望有 1 个不需要用户安装任何东西的 Wi
需要了解 kubernetes 部署中 kube_deployment_status_replicas 和 kube_deployment_spec_replicas 指标的区别 最佳答案 简而言之,
我正在尝试使用分类器部署 Maven Artifact 。由于我需要源代码和 JAR(我从 GWT 使用它),我想获得 artifact-version-classifier.jar 和 artifa
我设置部署以将我的项目代码与存储我的网站的 FTP 服务器上的项目同步。 但是,每次尝试同步时,我总是必须登录。 我什至检查了记住,但它不起作用! 我正在使用最新的 PhpStorm 2017.1.4
我在 Visual Studio 2008 中开发了一个 ASP.NET 网站。现在我想在其他机器上部署它。我怎样才能做到这一点??就像我们为 Windows 应用程序制作安装包一样,我们可以为 AS
将 QT 框架添加到我的 .app 包中 我正在关注 Qt 站点上关于部署的文档。 我创建了一个名为 HTTPClient.app 的应用程序 我在 Contents 下创建了 Framework 文
这个问题不太可能对任何 future 的访客有帮助;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于互联网的全局受众。如需帮助使这个问题更广泛适用,visit the h
我正在研究改变我目前创建营销网站的策略。目前,我完全用 PHP 从头开始构建网站,使用一个简单的包含系统。所有代码(以及内容)都存储在文件(而不是数据库)中,允许我使用 Subversion 进行
我有一个长期运行的服务(在 while 1 循环中)并通过 GCloud pub/sub 处理有效负载,之后它将结果写入数据库。 该服务不需要监听任何端口。 Kind=Deployment 的声明性
似乎部署已停滞不前。我该如何进一步诊断? kubectl rollout status deployment/wordpress Waiting for rollout to finish: 2 ou
我正在Dart中使用前端的Angular和后端的Shelf构建一个客户端/服务器应用程序。当我执行pub build时,它会按预期生成Dart文件的javascript,但不会替换HTML文件中的Da
我在 Azure 部署中心的下拉列表中看不到我的所有 Github 组织存储库。 Azure 很久以前就已经被授权了,下拉列表正确地显示了所有的存储库,直到上周我在 DevOps 中玩游戏时,不得不再
我认为标题几乎说明了一切...对于 Deployd 来说是全新的,所以任何关于如何最好地实现这一点的指示都值得赞赏。 最佳答案 要获取用户创建的集合中的对象(我假设您使用的是 javascript 库
我有一个试图用于CD服务器的部署脚本,但是在编写bash脚本以完成一些所需的步骤(例如运行npm和迁移命令)时遇到了问题。 我将如何从该脚本进入容器bash,运行下面的命令,然后退出以完成对更改的提取
我想在使用 kubectl 时将参数传递给 Kubernetes 部署命令应用部署文件。 示例:在我的部署 .yaml 中,我有如下参数,我想在使用 kubectl apply - f .yaml 运
我是一名优秀的程序员,十分优秀!