AWS CodeDeploy
User Guide (API 版本 2014-10-06)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

使用 AWS CodeDeploy 重新部署和回滚部署

AWS CodeDeploy 回滚部署的方式是将以前的应用程序部署版本重新部署为新的部署。这些回滚部署在技术上属于新部署,具有新的部署 ID,不同于之前部署的存储版本。

可以自动或手动回滚部署。

自动回滚

您可以对部署组或部署进行配置,使之在部署失败或达到您指定的监控阈值时自动回滚。在这种情况下,将会部署上一个已知良好的应用程序版本。您可以在创建应用程序或是创建或更新部署组时配置自动回滚。

创建新部署时,您还可以选择覆盖已为部署组指定的自动回滚配置。

注意

可使用 Amazon Simple Notification Service 在部署自动回滚时接收通知。有关信息,请参阅 Monitoring Deployments with Amazon SNS Event Notifications

有关配置自动回滚的更多信息,请参阅为部署组配置高级选项

手动回滚

如果您尚未设置自动回滚,可以通过以下方式手动回滚部署:创建一个使用以前部署的任何应用程序修订的新部署,然后根据步骤重新部署一个修订。如果应用程序进入了未知状态,您可能会这么做。您可以将应用程序重新部署为已知工作状态,而不是花大量的时间排查故障。有关更多信息,请参阅 使用 AWS CodeDeploy 创建部署

注意

如果您从部署组中删除某个实例,AWS CodeDeploy 不会卸载可能已安装在该实例上的任何内容。

回滚和重新部署工作流程

当启动自动回滚时,或在手动启动重新部署或手动回滚时,AWS CodeDeploy 首先尝试从每个参与实例中删除上次成功安装的所有文件。为此,AWS CodeDeploy 将检查下面的清除文件:

/opt/codedeploy-agent/deployment-root/deployment-instructions/deployment-group-ID-cleanup 文件 (对于 Amazon Linux、Ubuntu Server 和 RHEL 实例)

C:\ProgramData\Amazon\CodeDeploy\deployment-instructions\deployment-group-ID-cleanup 文件 (对于 Windows Server 实例)

如果清除文件存在,则 AWS CodeDeploy 将在开始新部署之前,使用它从实例中删除列出的所有文件。

例如,前面的两个文本文件和两个脚本文件已部署到运行 Windows Server 的 Amazon EC2 实例,并且这两个脚本在部署生命周期事件期间又创建了两个文本文件:

c:\temp\a.txt (previously deployed by AWS CodeDeploy) c:\temp\b.txt (previously deployed by AWS CodeDeploy) c:\temp\c.bat (previously deployed by AWS CodeDeploy) c:\temp\d.bat (previously deployed by AWS CodeDeploy) c:\temp\e.txt (previously created by c.bat) c:\temp\f.txt (previously created by d.bat)

清除文件将仅列出前面的两个文本文件和两个脚本文件:

c:\temp\a.txt c:\temp\b.txt c:\temp\c.bat c:\temp\d.bat

在新部署之前,AWS CodeDeploy 将仅删除前面的两个文本文件和两个脚本文件,并保持最后两个文本文件不变:

c:\temp\a.txt will be removed c:\temp\b.txt will be removed c:\temp\c.bat will be removed c:\temp\d.bat will be removed c:\temp\e.txt will remain c:\temp\f.txt will remain

作为此过程的一部分,AWS CodeDeploy 将不会在后续重新部署(无论是手动还是自动回滚)期间尝试还原或以其他方式协调在以前的部署中由任何脚本所执行的任何操作。例如,如果 c.batd.bat 文件包含不重新创建 e.txtf.txt 文件 (如果它们已存在) 的逻辑,则每当 AWS CodeDeploy 在后续部署中运行 c.batd.bat 时,旧版本的 e.txtf.txt 都将保持不变。您可以向 c.batd.bat 中添加逻辑,始终先检查并删除旧版本的 e.txtf.txt,然后再创建新文件。

回滚行为与现有内容

作为部署过程的一部分,AWS CodeDeploy 代理会从每个实例中删除由最新部署安装的所有文件。如果目标部署位置显示不是上一部署的一部分的文件,则可以选择 AWS CodeDeploy 在下一个部署期间对这些文件执行哪些操作:

  • Fail the deployment — 系统报告出错,并且部署状态更改为“失败”。

  • Overwrite the content — 来自应用程序修订的文件版本将替换实例上已有的版本。

  • Retain the content — 目标位置的文件将保留,并且应用程序修订中的版本不会复制到实例。

您可以选择保留要作为下一个部署的一部分的文件,而无需将这些文件添加到应用程序修订包中。例如,您可以将部署所需的文件直接上传到实例,但这些文件不会添加到应用程序修订包。或者,如果应用程序已在生产环境中,但您想首次使用 AWS CodeDeploy 来部署应用程序,则可将文件上传到实例。

对于回滚 (其中由于部署失败,将重新部署最新的已成功部署的应用程序修订),上次成功部署的内容处理选项将应用于回滚部署。

但是,如果已将失败的部署配置为覆盖,而不是保留文件,则回滚期间可能出现意外结果。具体而言,部署失败可能会导致删除您预期保留的文件。当回滚部署运行时,这些文件未在实例上。

在以下示例中,有三种部署。在第三次部署期间再次部署应用程序修订 1 时,第二次失败部署期间覆盖 (删除) 的任何文件不再可用 (无法保留):

部署

应用程序修订

内容覆盖选项

部署状态

行为和结果

部署 1

应用程序修订 1

保留

Succeeded

AWS CodeDeploy 在目标位置检测上一部署中未部署的文件。这些文件可能特意放置在该位置以成为当前部署的一部分。它们将保留并记录为当前部署包的一部分。

部署 2

应用程序修订 2

覆盖

已失败

在部署过程中,AWS CodeDeploy 将删除作为上一成功部署的一部分的所有文件。这包括在部署 1 期间保留的文件。

但是,部署是因不相关的原因导致失败的。

部署 3

应用程序修订 1

保留

由于已为部署或部署组启用自动回滚,因此,AWS CodeDeploy 将部署上一个已知正常的应用程序修订 (应用程序修订 1)。

不过,您希望在部署 1 中保留的文件已在部署 2 失败之前被删除,且无法由 AWS CodeDeploy 检索。您可以自行将这些文件添加到实例 (如果应用程序修订 1 需要这些文件),也可以创建新的应用程序修订。