

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用重新部署和回滚部署 CodeDeploy
<a name="deployments-rollback-and-redeploy"></a>

CodeDeploy 通过将先前部署的应用程序修订版重新部署为新部署来回滚部署。从技术上讲，这些回滚部署是新的部署，具有新的部署 IDs，而不是先前部署的还原版本。

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

**Topics**
+ [自动回滚](#deployments-rollback-and-redeploy-automatic-rollbacks)
+ [手动回滚](#deployments-rollback-and-redeploy-manual-rollbacks)
+ [回滚和重新部署工作流程](#deployments-rollback-and-redeploy-workflow)
+ [现有内容的回滚行为](#deployments-rollback-and-redeploy-content-options)

## 自动回滚
<a name="deployments-rollback-and-redeploy-automatic-rollbacks"></a>

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

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

**注意**  
可使用 Amazon Simple Notification Service 在部署自动回滚时接收通知。有关信息，请参阅[使用 Amazon SNS 事件通知监控部署](monitoring-sns-event-notifications.md)。

有关配置自动回滚的更多信息，请参阅[为部署组配置高级选项](deployment-groups-configure-advanced-options.md)。

## 手动回滚
<a name="deployments-rollback-and-redeploy-manual-rollbacks"></a>

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

**注意**  
如果您从部署组中移除实例，则 CodeDeploy 不会卸载该实例上可能已安装的任何内容。

## 回滚和重新部署工作流程
<a name="deployments-rollback-and-redeploy-workflow"></a>

启动自动回滚时，或者手动启动重新部署或手动回滚时， CodeDeploy 首先尝试从每个参与的实例中删除上次成功安装的所有文件。 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 实例） 

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

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

```
c:\temp\a.txt (previously deployed by CodeDeploy)
c:\temp\b.txt (previously deployed by CodeDeploy)
c:\temp\c.bat (previously deployed by CodeDeploy)
c:\temp\d.bat (previously deployed by 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
```

在新部署之前， 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
```

作为此过程的一部分，在后续重新部署（无论是手动还是自动回滚）期间，都 CodeDeploy 不会尝试恢复或以其他方式协调先前部署中任何脚本所采取的任何操作。例如，如果`c.bat`和`d.bat`文件包含不重新创建和文件（如果它们已经存在）的逻辑，那么无论何时 CodeDeploy 运行`c.bat`和后续部署`d.bat`中，`e.txt`和的旧版本都`f.txt`将保持不变。`e.txt` `f.txt`您可以向 `c.bat` 和 `d.bat` 中添加逻辑，始终先检查并删除旧版本的 `e.txt` 和 `f.txt`，然后再创建新文件。

## 现有内容的回滚行为
<a name="deployments-rollback-and-redeploy-content-options"></a>

作为部署过程的一部分， CodeDeploy 代理会从每个实例中删除最新部署安装的所有文件。如果不属于先前部署的文件出现在目标部署位置，则可以在下次部署期间选择 CodeDeploy 如何处理这些文件：
+ **使部署失败** - 系统报告出错，并且部署状态更改为“失败”。
+ **覆盖内容** - 来自应用程序修订的文件版本将替换实例上已有的版本。
+ **保留内容** - 目标位置的文件将保留，并且应用程序修订中的版本不会复制到实例。

您可以在创建部署时选择此行为。如果在控制台中创建部署，请参阅[创建 EC2/本地计算平台部署（控制台）](deployments-create-console.md)。如果使用创建部署 AWS CLI，请参阅[创建 EC2/本地计算平台部署（CLI）](deployments-create-cli.md)。

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

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

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

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


****  

|  部署  |  应用程序修订  |  内容覆盖选项  |  部署状态  |  行为和结果  | 
| --- | --- | --- | --- | --- | 
|  部署 1  |  应用程序修订 1  |  保留  |  成功  |  CodeDeploy 检测目标位置中未在先前部署中部署的文件。这些文件可能特意放置在该位置以成为当前部署的一部分。它们将保留并记录为当前部署包的一部分。  | 
|  部署 2  |  应用程序修订 2  |  覆盖  |  失败  |  在部署过程中， CodeDeploy 删除先前成功部署的所有文件。这包括在部署 1 期间保留的文件。 但是，部署是因不相关的原因导致失败的。  | 
|  部署 3  |  应用程序修订 1  |  保留  |    | 由于已为部署或部署组启用自动回滚，因此， CodeDeploy 将部署上一个已知正常的应用程序修订 (应用程序修订 1)。但是，您要在部署 1 中保留的文件在部署 2 失败之前已被删除，因此无法被检索 AWS CodeDeploy。您可以自行将这些文件添加到实例（如果应用程序修订 1 需要这些文件），也可以创建新的应用程序修订。 | 