

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

# 教程：创建一个简单的管道（S3 存储桶）
<a name="tutorials-simple-s3"></a>

创建管道的最简单方法是在 AWS CodePipeline 控制台中使用**创建管道**向导。

在本教程中，您将创建一个两阶段管道，该管道使用受版本控制的 S3 源存储桶 CodeDeploy 并发布示例应用程序。

**注意**  
当 Amazon S3 是您的管道的源提供程序时，您可以将一个或多个源文件压缩到单个 .zip 文件中，然后将 .zip 文件上传到源桶。您也可以上传单个解压缩的文件；但是，需要 .zip 文件的下游操作将失败。

**重要**  
作为创建管道的一部分，客户提供的 S3 工件存储桶将 CodePipeline 用于项目。（这与用于 S3 源操作的存储桶不同。） 如果 S3 工件存储桶与您的管道账户位于不同的账户中，请确保 S3 工件存储桶归其所有 AWS 账户 ，该存储桶是安全且可靠的。

创建此简单管道后，您将另外添加一个阶段，禁用然后再启用阶段之间的过渡。

**重要**  
在此过程中，您在管道中添加的许多操作都涉及在创建管道之前需要创建的 AWS 资源。 AWS 源操作的资源必须始终在您创建管道的同一 AWS 区域创建。例如，如果您在美国东部（俄亥俄州）地区创建管道，则您的 CodeCommit 存储库必须位于美国东部（俄亥俄州）区域。  
您可以在创建管道时添加跨区域操作。 AWS 跨区域操作的资源必须位于您计划执行操作的同一 AWS 区域。有关更多信息，请参阅 [在中添加跨区域操作 CodePipeline](actions-create-cross-region.md)。

在开始之前，您应完成[入门 CodePipeline](getting-started-codepipeline.md)中的先决条件。

**Topics**
+ [步骤 1：为您的应用程序创建一个 S3 源存储桶](#s3-create-s3-bucket)
+ [第 2 步：创建 Amazon EC2 Windows 实例并安装 CodeDeploy 代理](#S3-create-instances)
+ [步骤 3：在中创建应用程序 CodeDeploy](#S3-create-deployment)
+ [第 4 步：在中创建您的第一个管道 CodePipeline](#s3-create-pipeline)
+ [（可选）步骤 5：在管道中添加另一个阶段](#s3-add-stage)
+ [（可选）步骤 6：禁用和启用阶段之间的过渡 CodePipeline](#s3-configure-transitions)
+ [步骤 7：清理资源](#s3-clean-up)

## 步骤 1：为您的应用程序创建一个 S3 源存储桶
<a name="s3-create-s3-bucket"></a>

您可以将源文件或应用程序存储在任何受版本控制的位置。在本教程中，您将为示例应用程序文件创建一个 S3 桶，并对该桶启用版本控制。启用版本控制后，您可将示例应用程序复制到该存储桶。

**创建 S3 存储桶**

1. 登录控制台，网址为 AWS 管理控制台。打开 S3 控制台。

1. 请选择**创建存储桶**。

1. 对于**存储桶名称**，输入您的存储桶的名称（例如 **awscodepipeline-demobucket-example-date**）。
**注意**  
由于 Amazon S3 中的所有桶名称必须是唯一的，因此请使用您自己的名称，而不是示例中显示的名称。您可以通过添加日期来更改示例名称。请记下该名称，因为您需要在本教程的其余部分中使用该名称。

   在**区域**中，选择您要在其中创建管道的区域（例如**美国西部(俄勒冈州)**），然后选择**创建桶**。

1. 创建存储桶后，系统会显示成功横幅。选择**转到存储桶详细信息**。

1. 在**属性**选项卡上，选择**版本控制**。选择**启用版本控制**，然后选择**保存**。

   启用版本控制后，Amazon S3 会在桶中存储每个对象的每个版本。

1. 在**权限**选项卡上，保留默认设置。有关 S3 存储桶和对象权限的更多信息，请参阅[在策略中指定权限](https://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html)。

1. 接下来，下载一个示例，并将该示例保存到本地计算机上的文件夹或目录中。

   1. 选择下列选项之一。如果要对 Windows Server 实例执行本教程中的步骤，请选择 `SampleApp_Windows.zip`。
      + 如果您想使用部署到亚马逊 Linux 实例 CodeDeploy，请在此处下载示例应用程序：[SampleApp\$1Linux.zip](samples/SampleApp_Linux.zip)。
      + 如果你想使用部署到 Windows 服务器实例 CodeDeploy，请在此处下载示例应用程序：[SampleApp\$1Windows.zip](samples/SampleApp_Windows.zip)。

      示例应用程序包含以下用于部署的文件 CodeDeploy：
      + `appspec.yml`— 应用程序规范文件（AppSpec文件）是一个 [YAML](http://www.yaml.org) 格式的文件， CodeDeploy 用于管理部署。有关该 AppSpec 文件的更多信息，请参阅*AWS CodeDeploy 用户指南*中的[CodeDeploy AppSpec 文件参考](https://docs.aws.amazon.com/codedeploy/latest/userguide/reference-appspec-file.html)。
      + `index.html` - 索引文件包含已部署的示例应用程序的主页。
      + `LICENSE.txt` - 许可证文件包含示例应用程序的许可证信息。
      + 脚本文件 - 示例应用程序使用脚本将文本文件写入实例上的某个位置。为多个 CodeDeploy 部署生命周期事件分别写入一个文件，如下所示：
        + （仅限 Linux 示例）`scripts` 文件夹 - 该文件夹包含以下 shell 脚本，用于安装依赖项以及启动和停止自动部署的示例应用程序：`install_dependencies`、`start_server` 和 `stop_server`。
        + （仅限 Windows 示例）`before-install.bat` - 此批处理脚本用于 `BeforeInstall` 部署生命周期事件，它将运行以删除此示例在先前部署中写入的旧文件，并在您的实例上创建一个位置用于写入新文件。

   1. 下载压缩（zipped）文件。不要解压缩该文件。

1. 在 Amazon S3 控制台中，为您的桶上传文件：

   1. 选择**上传**。

   1. 拖放文件或选择**添加文件**并通过浏览找到该文件。

   1. 选择**上传**。

## 第 2 步：创建 Amazon EC2 Windows 实例并安装 CodeDeploy 代理
<a name="S3-create-instances"></a>

**注意**  
本教程提供了创建 Amazon EC2 Windows 实例的示例步骤。有关创建 Amazon EC2 Linux 实例的示例步骤，请参阅[步骤 3：创建 Amazon EC2 Linux 实例并安装 CodeDeploy 代理](tutorials-simple-codecommit.md#codecommit-create-deployment)。当系统提示您输入要创建的实例数时，请指定 **2** 个实例。

在此步骤中，您将创建 Windows Server Amazon EC2 实例 以向其部署示例应用程序。作为此过程的一部分，您将创建一个实例角色，其策略允许在实例上安装和管理 CodeDeploy 代理。 CodeDeploy 代理是一个软件包，允许在 CodeDeploy 部署中使用实例。您还可以附加策略，允许实例获取 CodeDeploy 代理用于部署您的应用程序的文件，并允许该实例由 SSM 管理。

**创建实例角色**

1. 打开 IAM 控制台，网址为 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))。

1. 在控制台控制面板中，选择**角色**。

1. 选择**创建角色**。

1. 在**选择受信任实体的类型**下，选择 **AWS 服务**。在**选择使用案例**下，选择 **EC2**，然后选择**下一步: 权限**。

1. 搜索名为 **`AmazonEC2RoleforAWSCodeDeploy`** 的策略并将其选中。

1. 搜索名为 **`AmazonSSMManagedInstanceCore`** 的策略并将其选中。选择**下一步：标签**。

1. 选择**下一步：审核**。输入角色的名称（例如 **EC2InstanceRole**）。
**注意**  
记下您的角色名称以便在下一步中使用。在创建实例时选择此角色。

   选择**创建角色**。

**启动实例**

1. 打开位于 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 的 Amazon EC2 控制台。

1. 在侧面导航栏中，选择**实例**，然后从页面顶部选择**启动实例**。

1. 在**名称和标签**下，对于**名称**，输入 **MyCodePipelineDemo**。这会为实例分配标签**键** **Name** 和标签值 ****MyCodePipelineDemo****。稍后，您将创建一个将示例 CodeDeploy 应用程序部署到实例的应用程序。 CodeDeploy根据标签选择要部署的实例。

1. 在**应用程序和操作系统映像(Amazon 机器映像)** 下，选择 **Windows** 选项。（此 AMI 称为 **Microsoft Windows Server 2019 Base**，标记为“符合免费套餐条件”，可以在**快速入门**下找到。）

1. 在**实例类型**下，选择符合免费套餐条件的 `t2.micro` 类型作为实例的硬件配置。

1. 在**密钥对(登录)** 下，选择或创建密钥对。

   也可以选择**继续操作但不提供密钥对**。
**注意**  
在本教程中，您可以继续操作而不提供密钥对。要使用 SSH 连接到实例，请创建或使用密钥对。

1. 在**网络设置**下，执行以下操作：

   在**自动分配公有 IP** 中，确保状态为**启用**。
   + 在**分配安全组**旁边，选择**创建新安全组**。
   + 在 **SSH** 对应的行中，在**源**下选择**我的 IP**。
   + 选择**添加安全组**，选择 **HTTP**，然后在**源类型**下选择**我的 IP**。

1. 展开**高级详细信息**。在 **IAM 实例配置文件**中，选择您在上一过程中创建的 IAM 角色（例如 **EC2InstanceRole**）。

1. 在**摘要**下的**实例数**下，输入 `2`。

1. 选择**启动实例**。

1. 选择**查看所有实例**以关闭确认页面并返回控制台。

1. 您可以在**实例**页面上查看启动的状态。启动实例时，其初始状态为 `pending`。实例启动后，其状态变为 `running`，并且会收到一个公有 DNS 名称。（如果**公有 DNS** 列不显示，请选择**显示/隐藏**图标，然后选择**公有 DNS**。）

1. 可能需要花几分钟时间，实例才能准备好让您连接到它。检查您的实例是否通过了状态检查。您可以在**状态检查**列中查看此信息。

## 步骤 3：在中创建应用程序 CodeDeploy
<a name="S3-create-deployment"></a>

在中 CodeDeploy，*应用程序*是以名称形式表示要部署的代码的标识符。 CodeDeploy 使用此名称来确保在部署期间引用修订版、部署配置和部署组的正确组合。在本教程稍后创建管道时，您可以选择在此步骤中创建的 CodeDeploy 应用程序的名称。

您首先要创建一个 CodeDeploy 要使用的服务角色。如果已创建服务角色，则无需创建其他服务角色。

**创建 CodeDeploy 服务角色**

1. 打开 IAM 控制台，网址为 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))。

1. 在控制台控制面板中，选择**角色**。

1. 选择**创建角色**。

1. 在**选择受信任实体**下，选择 **AWS 服务**。在 **Use case**（使用案例）下，选择 **CodeDeploy**。**CodeDeploy**从列出的选项中进行选择。选择**下一步**。`AWSCodeDeployRole` 托管策略已附加到角色。

1. 选择**下一步**。

1. 输入角色的名称（例如 **CodeDeployRole**），然后选择**创建角色**。

**要在中创建应用程序 CodeDeploy**

1. 在 [https://console.aws.amazon.com/codede](https://console.aws.amazon.com/codedeploy) ploy 上打开 CodeDeploy 控制台。

1. 如果未出现 “**应用程序**” 页面，请在 AWS CodeDeploy 菜单上选择 “**应用程序**”。

1. 选择**创建应用程序**。

1. 在**应用程序名称**中，输入 `MyDemoApplication`。

1. 在 **Compute Platform（计算平台）**中，选择 **EC2/On-premises（EC2/本地）**。

1. 选择**创建应用程序**。

**要在中创建部署组 CodeDeploy**

1. 在显示应用程序的页面上，选择**创建部署组**。

1. 在 **Deployment group name（部署组名称）**中，输入 **MyDemoDeploymentGroup**。

1. 在**服务角色**中，选择您之前创建的服务角色。您使用的服务角色必须至少 AWS CodeDeploy 具有[创建服务角色](https://docs.aws.amazon.com/codedeploy/latest/userguide/getting-started-create-service-role.html)中所述的信任和权限 CodeDeploy。要获得服务角色 ARN，请参阅[获得服务角色 ARN（控制台）](https://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-create-service-role.html#getting-started-get-service-role-console)。

1. 在**部署类型**下，选择**就地**。

1. 在**环境配置**下，选择 **Amazon EC2 实例**。在**键**字段中选择**名称**，然后在**值**字段中输入 **MyCodePipelineDemo**。
**重要**  
在这里，您必须为**名称**键选择您在创建 EC2 实例时为该实例分配的值。如果您使用 **MyCodePipelineDemo** 以外的内容标记实例，则在此处，请务必使用该内容。

1. 在 “使用 S ** AWS ystems Manager 配置代理**” 下，选择 “**立即并安排更新**”。这将在实例上安装代理。Windows 实例已经配置了 SSM 代理，现在将使用该 CodeDeploy 代理进行更新。

1. 在**部署设置**下，选择 `CodeDeployDefault.OneAtaTime`。

1. 在**负载均衡器**下，确保未选中**启用负载均衡**框。您无需为此示例设置负载均衡器或选择目标组。取消选中此复选框后，不会显示负载均衡器选项。

1. 在**高级**部分中，保留默认值。

1. 选择 **Create deployment group（创建部署组）**。

## 第 4 步：在中创建您的第一个管道 CodePipeline
<a name="s3-create-pipeline"></a>

在这部分的教程中，您将创建管道。示例将自动通过管道运行。

**创建 CodePipeline 自动发布流程**

1. 登录 AWS 管理控制台 并打开 CodePipeline 控制台，[网址为 http://console.aws.amazon。 com/codesuite/codepipeline/home](https://console.aws.amazon.com/codesuite/codepipeline/home)。

1. 在**欢迎**页面、**入门**页面或**管道**页面上，选择**创建管道**。

1. 在**步骤 1：选择创建选项**页面上的**创建选项**下，选择**构建自定义管道**选项。选择**下一步**。

1. 在**步骤 2：选择管道设置**的**管道名称**中，输入 **MyFirstPipeline**。
**注意**  
如果您为管道选择另一个名称，请确保在本教程的剩下部分使用该名称替代 **MyFirstPipeline**。创建管道后，便无法再更改其名称。管道名称受一些限制的约束。有关更多信息，请参阅 [AWS CodePipeline 中的限额](limits.md)。

1. CodePipeline 提供 V1 和 V2 类型的管道，它们的特性和价格各不相同。在控制台中，您只能选择 V2 类型。有关更多信息，请参阅[管道类型](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipeline-types-planning.html?icmpid=docs_acp_help_panel)。有关定价的信息 CodePipeline，请参阅[定价](https://aws.amazon.com/codepipeline/pricing/)。

1. 在**服务角色**中，执行下列操作之一：
   + 选择 “**新建服务角色**” CodePipeline 以允许在 IAM 中创建新的服务角色。
   + 选择**现有服务角色**以使用已在 IAM 中创建的服务角色。在**角色名称**中，从列表中选择您的服务角色。

1. 将**高级设置**中的各项设置保留为默认值，然后选择**下一步**。

1. 在**步骤 3：添加源阶段**的**源提供程序**中，选择 **Amazon S3**。在**存储桶**中，输入您在[步骤 1：为您的应用程序创建一个 S3 源存储桶](#s3-create-s3-bucket)中创建的 S3 存储桶的名称。在**S3 对象键**中，输入带或不带文件路径的对象键。请记住加上文件的扩展名。例如，对于 `SampleApp_Windows.zip`，输入示例文件名，如以下示例所示：

   ```
   SampleApp_Windows.zip
   ```

   选择**下一步**。

   在**更改检测选项**下面，保留默认值。这 CodePipeline 允许使用 Amazon E CloudWatch vents 来检测源存储桶中的更改。

    选择**下一步**。

1. 在**步骤 4：添加构建阶段**中，选择**跳过构建阶段**，并通过再次选择**跳过**接受警告消息。选择**下一步**。

1. 在**步骤 5：添加测试阶段**中，选择**跳过测试阶段**，并通过再次选择**跳过**接受警告消息。

   选择**下一步**。

1. 在**步骤 6：添加部署阶段**中，在**部署提供程序**中，选择**CodeDeploy **。“**区域**” 字段默认为与您的管道 AWS 区域 相同。在**应用程序名称**中，输入 `MyDemoApplication`，或选择**刷新**按钮，然后从列表中选择应用程序名称。在**部署组**中，输入 **MyDemoDeploymentGroup** 或者从列表中选择它，然后选择**下一步**。
**注意**  
名称“Deploy”是在**步骤 4：添加部署阶段**步骤中创建的阶段的默认名称，就像“Source”是管道第一阶段的默认名称一样。

1. 在**步骤 7：查看**中，查看信息，然后选择**创建管道**。

1. 管道开始运行。当 CodePipeline 示例向部署中的每个 Amazon EC2 实例部署网页时，您可以查看进度以及成功和失败消息。 CodeDeploy

恭喜您！您刚刚在中创建了一个简单的管道 CodePipeline。管道具有两个阶段：
+ 一个名为 **Source** 的源阶段，此阶段会检测存储在 S3 存储桶中的受版本控制的示例应用程序中的更改，并将这些更改提取到管道中。
+ 一个 **Deploy** 阶段，该阶段使用 CodeDeploy 将这些更改部署到 EC2 实例。

现在，验证结果。

**验证您的管道是否已成功运行**

1. 查看管道的初始进度。每个阶段的状态将从**还没有任何执行**变为**正在进行**，然后变为 **成功**或**失败**。管道将在几分钟内完成首次运行。

1. 操作状态显示**成功**之后，在**部署**阶段的状态区域中，选择**详细信息**。这将打开 CodeDeploy 控制台。

1. 在**部署组**选项卡的**部署生命周期事件**下，选择一个实例 ID。此操作将打开 EC2 控制台。

1. 在**描述**选项卡上的**公有 DNS**中，复制地址，然后将其粘贴到 Web 浏览器的地址栏中。查看上传到 S3 存储桶的示例应用程序的索引页面。

   此网页为您上传到 S3 桶的示例应用程序显示。

有关阶段和操作以及管道如何工作的更多信息，请参阅[CodePipeline 概念 ](concepts.md)。

## （可选）步骤 5：在管道中添加另一个阶段
<a name="s3-add-stage"></a>

现在，使用 CodeDeploy 在管道中添加另一个阶段，以便从暂存服务器部署到生产服务器。首先，在中创建另一个部署组 CodeDeploy。 CodePipelineDemoApplication 然后，您添加一个包含使用此部署组的操作的阶段。要添加另一个阶段，您可以使用 CodePipeline 控制台或在 AWS CLI JSON 文件中检索和手动编辑管道的结构，然后运行**update-pipeline**命令使用您的更改更新管道。

**Topics**
+ [在中创建第二个部署组 CodeDeploy](#s3-add-stage-part-1)
+ [将部署组作为另一个阶段添加到管道中](#s3-add-stage-part-2)

### 在中创建第二个部署组 CodeDeploy
<a name="s3-add-stage-part-1"></a>

**注意**  
在这部分教程中，您将创建第二个部署组，但要将其部署到与之前相同的 Amazon EC2 实例。这仅用于演示目的。它被故意设计为无法向您显示错误是如何显示的。 CodePipeline

**要在中创建第二个部署组 CodeDeploy**

1. 在 [https://console.aws.amazon.com/codede](https://console.aws.amazon.com/codedeploy) ploy 上打开 CodeDeploy 控制台。

1. 选择**应用程序**，然后在应用程序列表中选择 `MyDemoApplication`。

1. 选择**部署组**选项卡，然后选择**创建部署组**。

1. 在**创建部署组**页面的**部署组名称**中，输入第二个部署组的名称（例如 **CodePipelineProductionFleet**）。

1. 在**服务角色**中，选择与初始部署相同的 CodeDeploy 服务角色（不是 CodePipeline 服务角色）。

1. 在**部署类型**下，选择**就地**。

1. 在**环境配置**下，选择 **Amazon EC2 实例**。在**键**框中选择**名称**，然后在**值**框中从列表中选择 `MyCodePipelineDemo`。保留**部署设置**的默认配置。

1. 在**部署配置**中，选择 `CodeDeployDefault.OneAtaTime`。

1. 在**负载均衡器**中，取消选择**启用负载均衡**。

1.  选择 **Create deployment group（创建部署组）**。

### 将部署组作为另一个阶段添加到管道中
<a name="s3-add-stage-part-2"></a>

有了另一个部署组后，就可以添加一个使用此部署组的阶段来部署到之前所使用的相同 EC2 实例。您可以使用 CodePipeline控制台或 AWS CLI 添加此阶段。

**Topics**
+ [创建第三个阶段（控制台）](#s3-add-stage-part-2-console)
+ [创建第三个阶段（CLI）](#s3-add-stage-part-2-cli)

#### 创建第三个阶段（控制台）
<a name="s3-add-stage-part-2-console"></a>

您可以使用 CodePipeline 控制台添加使用新部署组的新阶段。由于此部署组将部署到您已经使用的 EC2 实例，因此该阶段的部署操作会失败。

1. 登录 AWS 管理控制台 并打开 CodePipeline 控制台，[网址为 http://console.aws.amazon。 com/codesuite/codepipeline/home](https://console.aws.amazon.com/codesuite/codepipeline/home)。

1. 在 **Name (名称)** 中，选择您创建的管道名称 MyFirstPipeline。

1. 在管道详细信息页中，选择**编辑**。

1. 在**编辑**页面上，选择 **\$1 添加阶段**以紧随 Deploy 阶段之后添加一个阶段。  
![\[该图显示编辑屏幕上的 + 添加阶段按钮\]](http://docs.aws.amazon.com/zh_cn/codepipeline/latest/userguide/images/edit-pipeline-console-pol.png)

1. 在**添加阶段**的**阶段名称**中，输入 **Production**。选择**添加阶段**。

1. 在新阶段中，选择 **\$1 添加操作组**。

1. 在**编辑操作**的**操作名称**中，输入 **Deploy-Second-Deployment**。在 **“操作提供者”** 中的 “**部署**” 下，选择**CodeDeploy**。

1. 在该 CodeDeploy 部分的**应用程序名称**中，`MyDemoApplication`从下拉列表中进行选择，就像创建管道时一样。在**部署组**中，选择您刚刚创建的部署组 **CodePipelineProductionFleet**。在**输入构件**中，从源操作中选择输入构件。选择**保存**。

1. 在**编辑**页面上，选择**保存**。在**保存管道更改**中，选择**保存**。

1. 虽然新阶段已添加到您的管道中，但该阶段显示为 **No executions yet** 状态，因为没有发生触发管道再次运行的更改。您必须手动重新运行最新修订，以了解编辑后的管道的运行情况。在管道详细信息页面中，选择**发布更改**，然后在系统提示时选择**发布**。这会通过管道运行在源操作中指定的每个源位置中提供的最新修订。

   或者，要使用重新运行管道，请从本地 Linux、macOS 或 Unix 计算机上的终端或本地 Windows 计算机上的命令提示符处运行**start-pipeline-execution**该命令，指定管道的名称。 AWS CLI 这将第二次通过管道运行您的源存储桶中的应用程序。

   ```
   aws codepipeline start-pipeline-execution --name MyFirstPipeline
   ```

   该命令返回 `pipelineExecutionId` 对象。

1. 返回 CodePipeline 控制台，在管道列表中 **MyFirstPipeline**，选择打开视图页面。

   管道显示三个阶段以及项目经历这三个阶段时的状态。管道经历所有阶段可能需要 5 分钟的时间。您将看到前两个阶段的部署取得成功，正如之前一样，但 **Production** 阶段显示 **Deploy-Second-Deployment** 操作失败。

1. 在 **Deploy-Second-Deployment** 操作中，选择 **Details**。您将被重定向到 CodeDeploy 部署的页面。在这种情况下，操作失败是因为第一个实例组部署到所有 EC2 实例，导致第二个部署组没有实例可用。
**注意**  
此故障是特意设计的，是为了演示某个管道阶段出现故障会怎么样。

#### 创建第三个阶段（CLI）
<a name="s3-add-stage-part-2-cli"></a>

尽管使用 AWS CLI 向管道添加阶段比使用控制台更为复杂，但它可以更清楚地了解管道的结构。

**为管道创建第三个阶段**

1. 在本地 Linux、macOS 或 Unix 计算机上打开终端会话，或者在本地 Windows 计算机上打开命令提示符，运行 **get-pipeline** 命令，以显示您刚创建的管道的结构。对于 **MyFirstPipeline**，您可以键入以下命令：

   ```
   aws codepipeline get-pipeline --name "MyFirstPipeline"
   ```

   此命令返回的结构 MyFirstPipeline。输出的第一部分应类似于以下内容：

   ```
   {
       "pipeline": {
           "roleArn": "arn:aws:iam::80398EXAMPLE:role/AWS-CodePipeline-Service",
           "stages": [
       ...
   ```

   输出的最后部分包括管道元数据，应类似于以下内容：

   ```
       ...
           ],
           "artifactStore": {
               "type": "S3"
               "location": "amzn-s3-demo-bucket",
           },
           "name": "MyFirstPipeline",
           "version": 4
       },
       "metadata": {
           "pipelineArn": "arn:aws:codepipeline:us-east-2:80398EXAMPLE:MyFirstPipeline",
           "updated": 1501626591.112,
           "created": 1501626591.112
       }
   }
   ```

1. 将此结构复制并粘贴到纯文本编辑器中，并将文件保存为 **pipeline.json**。为了方便起见，请将此文件保存在运行 **aws codepipeline** 命令的相同目录中。
**注意**  
您可以使用 **get-pipeline** 命令将 JSON 直接添加到文件中，如下所示：  

   ```
   aws codepipeline get-pipeline --name MyFirstPipeline >pipeline.json
   ```

1. 将**部署**阶段部分复制并粘贴在前两个阶段之后。由于它是一个部署阶段，就像**部署**阶段一样，您可以将其用作第三个阶段的模板。

1. 更改阶段的名称和部署组详细信息。

   以下示例显示将在**部署**阶段结束后添加到 pipeline.json 文件的 JSON。使用新值编辑突出显示的元素。请记住，使用逗号分隔**部署**和**生产**阶段定义。

   ```
   ,
   {
       "name": "Production",
        "actions": [
           {
            "inputArtifacts": [
                {
                 "name": "MyApp"
                }
              ],
             "name": "Deploy-Second-Deployment",
             "actionTypeId": {
                 "category": "Deploy",
                 "owner": "AWS",
                 "version": "1",
                 "provider": "CodeDeploy"
                 },
            "outputArtifacts": [],
            "configuration": {
                 "ApplicationName": "CodePipelineDemoApplication",
                 "DeploymentGroupName": "CodePipelineProductionFleet"
                  },
            "runOrder": 1
           }
       ]
   }
   ```

1. 如果您要使用通过 **get-pipeline** 命令检索到的管道结构，则必须删除 JSON 文件中的 `metadata` 行。否则，**update-pipeline** 命令无法使用它。删除 `"metadata": { }` 行以及 `"created"`、`"pipelineARN"` 和 `"updated"` 字段。

   例如，从结构中删除以下各行：

   ```
   "metadata": {  
     "pipelineArn": "arn:aws:codepipeline:region:account-ID:pipeline-name",
     "created": "date",
     "updated": "date"
     }
   ```

   保存该文件。

1. 运行 **update-pipeline** 命令并指定管道 JSON 文件，类似于以下内容：

   ```
   aws codepipeline update-pipeline --cli-input-json file://pipeline.json
   ```

   该命令会返回更新后管道的整个结构。
**重要**  
务必在文件名前包含 `file://`。此命令中需要该项。

1.  运行 **start-pipeline-execution** 命令，并且指定管道的名称。这将第二次通过管道运行您的源存储桶中的应用程序。

   ```
   aws codepipeline start-pipeline-execution --name MyFirstPipeline
   ```

   该命令返回 `pipelineExecutionId` 对象。

1. 打开 CodePipeline 控制台并**MyFirstPipeline**从管道列表中进行选择。

   管道显示三个阶段以及项目经历这三个阶段时的状态。管道经历所有阶段可能需要 5 分钟的时间。虽然前两个阶段的部署取得成功，正如之前一样，但 **Production** 阶段显示 **Deploy-Second-Deployment** 操作失败。

1. 在 **Deploy-Second-Deployment** 操作中，选择 **Details** 以查看故障详细信息。您将被重定向到 CodeDeploy 部署的详细信息页面。在这种情况下，操作失败是因为第一个实例组部署到所有 EC2 实例，导致第二个部署组没有实例可用。
**注意**  
此故障是特意设计的，是为了演示某个管道阶段出现故障会怎么样。

## （可选）步骤 6：禁用和启用阶段之间的过渡 CodePipeline
<a name="s3-configure-transitions"></a>

您可以启用或禁用管道中阶段之间的过渡。禁用阶段之间的过渡允许您手动控制一个阶段和另一个阶段之间的过渡。例如，您可能希望运行管道的前两个阶段，但是禁用向第三阶段的过渡，直到您准备好部署到生产环境，或者您要排查该阶段的问题或故障。

**禁用和启用 CodePipeline 管道中各个阶段之间的过渡**

1. 打开 CodePipeline 控制台并**MyFirstPipeline**从管道列表中进行选择。

1. 在管道详细信息页面中，选择第二个阶段（**部署**）与您在上一部分中添加的第三个阶段（**生产**）之间的**禁用过渡**按钮。

1. 在**禁用过渡**中，键入禁用阶段过渡的原因，然后选择**禁用**。

   各个阶段之间的箭头显示一个图标和颜色变化，以及**启用过渡**按钮。  
![\[该图显示输入的禁用过渡的原因为“在我进行故障排除时禁用过渡”\]](http://docs.aws.amazon.com/zh_cn/codepipeline/latest/userguide/images/codepipeline-disabled-transition-pol.png)

1. 再次将示例应用程序上传到 S3 存储桶。由于存储桶启用了版本控制，因此这一更改将启动管道。

1. 返回管道详细信息页面，查看各个阶段的状态。管道视图会随之发生变化，以显示前两个阶段的进度和成功消息，但第三个阶段不会发生任何变化。此过程可能需要几分钟时间。

1. 通过选择两个阶段之间的**启用过渡**按钮，即可启用过渡。在 **Enable transition** 对话框中，选择 **Enable**。这一阶段将在几分钟内开始运行，并尝试处理已经历管道的前两个阶段的项目。
**注意**  
如果您希望第三阶段成功，请在启用过渡之前编辑 CodePipelineProductionFleet 部署组，并指定部署应用程序的另一组 EC2 实例。有关如何执行此操作的更多信息，请参阅[更改部署组设置](https://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-change-deployment-group-settings.html)。如果您创建更多的 EC2 实例，可能会产生额外成本。

## 步骤 7：清理资源
<a name="s3-clean-up"></a>

您可以将在本教程中创建的一些资源用于[教程：创建一个四阶段管道](tutorials-four-stage-pipeline.md)。例如，您可以重复使用 CodeDeploy 应用程序和部署。您可以使用提供者（例如）配置生成操作 CodeBuild，这是云中完全托管的生成服务。您还可以配置一个将提供方与生成服务器或系统结合使用的生成操作，例如 Jenkins。

但是，在完成本教程和任何其他教程之后，您应该删除管道及其使用的资源，以避免为继续使用这些资源付费。首先，删除管道，然后删除 CodeDeploy 应用程序及其关联的 Amazon EC2 实例，最后删除 S3 存储桶。

**清理本教程中使用的资源**

1. 要清理您的 CodePipeline 资源，请按照中[删除管道中的](pipelines-delete.md)说明进行操作 AWS CodePipeline。

1. 要清理 CodeDeploy 资源，请按照[清理资源（控制台）](https://docs.aws.amazon.com/codedeploy/latest/userguide/tutorials-wordpress-clean-up.html#tutorials-wordpress-clean-up-console)中的说明进行操作。

1. 要删除 S3 存储桶，请按照[删除或清空存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-or-empty-bucket.html)中的说明操作。如果您不打算创建更多管道，请删除为存储管道构件而创建的 S3 存储桶。有关此存储桶的更多信息，请参阅[CodePipeline 概念 ](concepts.md)。