教程:创建一个四阶段管道 - AWS CodePipeline

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

教程:创建一个四阶段管道

教程:创建一个简单的管道(S3 存储桶)教程:创建简单的管道(CodeCommit存储库)中创建了第一个管道后,接下来就可以开始创建更复杂的管道。本教程将引导你创建四阶段管道,该管道使用 GitHub存储库作为源代码,使用 Jenkins 生成服务器来生成项目,使用 CodeDeploy 应用程序将生成的代码部署到暂存服务器。下图显示最初的三阶段管道。

该图显示包含源操作的源阶段、包含 Jenkins 操作的构建阶段和包含部署操作的部署阶段。

创建管道后,您将编辑它以添加包含测试操作的阶段来测试代码,同样使用 Jenkins。

创建此管道之前,必须先配置所需的资源。例如,如果要为源代码使用 GitHub 存储库,则必须先创建存储库,然后才能将其添加到管道中。作为设置的一部分,本教程将引导你在EC2实例上设置 Jenkins 以进行演示。

重要

在此过程中,您在管道中添加的许多操作都涉及在创建管道之前需要创建的 AWS 资源。 AWS 源操作的资源必须始终在您创建管道的同一 AWS 区域创建。例如,如果您在美国东部(俄亥俄州)地区创建管道,则您的 CodeCommit 存储库必须位于美国东部(俄亥俄州)区域。

您可以在创建管道时添加跨区域操作。 AWS 跨区域操作的资源必须位于您计划执行操作的同一 AWS 区域。有关更多信息,请参阅 在中添加跨区域操作 CodePipeline

重要

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

在开始学习本教程之前,您应该已经完成入门 CodePipeline中的一般先决条件。

步骤 1:满足先决条件

要与 Jenkins 集成, AWS CodePipeline 需要您在要使用的任何 Jenkins 实例上安装适用于 Jenkins 的 CodePipeline 插件。 CodePipeline您还应该配置一个专门的IAM用户或角色,用于授予 Jenkins 项目和 CodePipeline之间的权限。集成 Jenkins 的最简单方法 CodePipeline 是在使用你为 Jenkins 集成创建的EC2实例角色的IAM实例上安装 Jenkins。为了使管道中的链接成功连接 Jenkins 操作,您必须在服务器或EC2实例上配置代理和防火墙设置,以允许入站连接到 Jenkins 项目使用的端口。在允许连接这些端口之前,请确保已将 Jenkins 配置为对用户进行身份验证并强制执行访问控制(例如,如果您已保护 Jenkins 仅使用HTTPS连接,则为 443 和 8443;如果允许连接,则为 80 和 8080)。HTTP有关更多信息,请参阅保护 Jenkins

注意

本教程使用代码示例,并配置将示例从 Haml 转换为的构建步骤。HTML您可以按照中的步骤从 GitHub 存储库下载开源示例代码将示例复制或克隆到 GitHub 存储库中。您将需要 GitHub 存储库中的整个示例,而不仅仅是.zip 文件。

本指南还假定:

  • 您熟悉安装和管理 Jenkins 以及创建 Jenkins 项目的过程。

  • 您已将适用于 Ruby 的 Rake 和 Haml Gem 安装在托管 Jenkins 项目的同一计算机或实例上。

  • 您已经设置了所需的系统环境变量,以便可以从终端或命令行运行 Rake 命令(例如,在 Windows 系统上,修改PATH变量以包含安装 Rake 的目录)。

将示例复制或克隆到 GitHub 存储库中

克隆示例并推送到 GitHub 存储库
  1. 从 GitHub 存储库下载示例代码,或将存储库克隆到本地计算机。有两个示例包:

  2. 在存储库中,选择 Fork,将示例存储库克隆到您的 Github 账户的存储库中。有关更多信息,请参阅GitHub文档

创建用于 Jenkins 集成的IAM角色

作为最佳实践,可以考虑启动一个EC2实例来托管 Jenkins 服务器,并使用IAM角色向该实例授予与 CodePipeline之交互所需的权限。

  1. 登录 AWS Management Console 并打开IAM控制台,网址为https://console.aws.amazon.com/iam/

  2. 在IAM控制台的导航窗格中,选择角色,然后选择创建角色

  3. 选择受信任实体的类型下,选择 AWS 服务。在 “选择将使用此角色的服务” 下,选择EC2。在 “选择您的用例” 下,选择EC2

  4. 选择下一步: 权限。在附加权限策略页面上,选择 AWSCodePipelineCustomActionAccess 托管策略,然后选择下一步: 标签。选择下一步:审核

  5. 在 “审阅” 页面的 “角色名称” 中,输入要专门为 Jenkins 集成创建的角色的名称(例如 JenkinsAccess),然后选择 “创建角色”。

创建要在其中安装 Jenkins 的EC2实例时,在步骤 3:配置实例详细信息中,请务必选择实例角色(例如 JenkinsAccess).

有关实例角色和亚马逊的更多信息EC2,请参阅 IAM A ma zon 的IAM角色EC2、使用角色向在亚马逊EC2实例上运行的应用程序授予权限,以及创建向委派权限的角色 AWS 服务

安装和配置 Jenkins 和适用于 Jenkins 的 CodePipeline 插件

安装 Jenkins 和适用于 Jenkins 的 CodePipeline 插件
  1. 创建一个EC2要在其中安装 Jenkins 的实例,在步骤 3:配置实例详细信息中,确保选择您创建的实例角色(例如,JenkinsAccess)。 有关创建EC2实例的更多信息,请参阅亚马逊EC2用户指南中的启动亚马逊EC2例。

    注意

    如果您已经有要使用的 Jenkins 资源,则可以这样做,但您必须创建一个特殊IAM用户,将AWSCodePipelineCustomActionAccess托管策略应用于该用户,然后在 Jenkins 资源上配置和使用该用户的访问凭证。如果您想使用 Jenkins 用户界面来提供凭据,请将 Jenkins 配置为仅允许。HTTPS有关更多信息,请参阅 故障排除 CodePipeline

  2. 在 EC2 实例上安装 Jenkins。有关更多信息,请参阅针对安装 Jenkins启动并访问 Jenkins 的 Jenkins 文档以及 产品和服务与 CodePipeline中的details of integration with Jenkins

  3. 启动 Jenkins,然后在主页上,选择管理 Jenkins

  4. 管理 Jenkins 页中,选择管理插件

  5. 选择可用选项卡,然后在筛选条件搜索框中,输入 AWS CodePipeline。从列表中选择 Jenkins 的CodePipeline 插件,然后选择立即下载并在重启后安装

  6. 正在安装插件/更新页中,选择当安装结束且无作业正在运行时重启 Jenkins

  7. 选择返回控制面板

  8. 在主页中,选择新项目

  9. 项目名称中,输入 Jenkins 项目的名称(例如 MyDemoProject)。 选择 Freestyle 项目,然后选择 “确定”

    注意

    请确保您的项目名称符合的要求 CodePipeline。有关更多信息,请参阅 中的配额 AWS CodePipeline

  10. 在项目的配置页中,选择如有必要,执行并发构建复选框。在源代码管理中,选择 AWS CodePipeline。如果您已在EC2实例上安装了 Jenkins,并使用您为 AWS CLI 与 Jenkins 之间的 CodePipeline 集成而创建的IAM用户的配置文件配置了,请将所有其他字段留空。

  11. 选择 “高级”,然后在 “提供者” 中输入操作提供者的名称 CodePipeline (例如,MyJenkinsProviderName)。 请确保此名称是唯一且易于记住的。在此教程的后面部分,当您向管道添加生成操作时,会用到这个名称,并且在添加测试操作时,会再次用到它。

    注意

    此操作名称必须符合中操作的命名要求 CodePipeline。有关更多信息,请参阅 中的配额 AWS CodePipeline

  12. 在 “生成触发器” 中,清除所有复选框,然后选择 “投票” SCM。在计划中,输入五个星号并用空格隔开,如下所示:

    * * * * *

    这 CodePipeline 每分钟进行一次民意调查。

  13. 构建中,选择添加构建步骤。选择执行 shell(亚马逊 Linux 或 Ubuntu 服务器)执行批处理命令(Windows 服务器),然后输入以下内容:RHEL

    rake
    注意

    确保您的环境配置有运行 rake 所需的变量和设置,否则,生成会失败。

  14. 选择 “添加生成后期操作”,然后选择 “AWS CodePipeline 发布者”。选择添加,然后在构建输出位置中,将位置留空。此配置是默认的,会在生成过程结束时创建一个压缩文件。

  15. 选择保存以保存您的 Jenkins 项目。

步骤 2:在中创建管道 CodePipeline

在这部分教程中,您将使用创建管道向导来创建管道。

创建 CodePipeline 自动发布流程
  1. 登录 AWS Management Console 并打开 CodePipeline 控制台,网址为 http://console.aws.amazon.com/codesuite/codepipeline/home

  2. 如有必要,请使用区域选择器将区域更改为您的管道资源所在的区域。例如,如果您在 us-east-2 中为上一教程创建了资源,请确保将区域选择器设置为“美国东部(俄亥俄州)”。

    有关可用区域和终端节点的更多信息 CodePipeline,请参阅终AWS CodePipeline 端节点和配额

  3. 欢迎页面、入门页面或管道页面上,选择创建管道

  4. 步骤 1:选择管道设置页面上,在管道名称中,输入管道的名称。

  5. 在本教程中,为管道类型选择 V1。也可以选择 V2;但请注意,不同管道类型具有不同的特性和价格。有关更多信息,请参阅 管道类型

  6. 服务角色中,选择新建服务角色 CodePipeline 以允许在中创建服务角色IAM。

  7. 高级设置中的各项设置保留为默认值,然后选择下一步

  8. 在 “步骤 2:添加源舞台” 页面上,在源提供程序中,选择GitHub

  9. 连接下,选择一个现有连接或创建一个新连接。要创建或管理 GitHub 源操作的连接,请参阅GitHub 连接

  10. 步骤 3: 添加构建阶段中,选择添加 Jenkins。在提供者名称中,输入您在 Jenkins CodePipeline 插件中提供的操作名称(例如 MyJenkinsProviderName)。 此名称必须与 Jenkins CodePipeline 插件中的名称完全匹配。在服务器中URL,输入安装了 URL Jenkins 的EC2实例的。在项目名称中,输入您在 Jenkins 中创建的项目的名称,例如 MyDemoProject,然后选择 “下一步”。

  11. 步骤 4:添加部署阶段中,重复使用您在中创建的 CodeDeploy 应用程序和部署组教程:创建一个简单的管道(S3 存储桶)。在部署提供商中,选择CodeDeploy。在应用程序名称中,输入 CodePipelineDemoApplication,或选择刷新按钮,然后从列表中选择应用程序名称。在部署组中,输入 CodePipelineDemoFleet 或者从列表中选择它,然后选择下一步

    注意

    您可以使用自己的 CodeDeploy 资源或创建新的资源,但可能会产生额外费用。

  12. 步骤 5:审核中,查看信息,然后选择创建管道

  13. 管道会自动启动示例并通过管道运行示例。当管道将 Haml 示例构建到部署中的每个 Amazon 实例并将其部署到每个 Amazon EC2 实例时,您可以查看进度以及成功HTML和失败消息。 CodeDeploy

步骤 3:向管道中添加另一个阶段

现在,您将添加一个测试阶段,然后向该阶段添加测试操作,该操作使用示例中包含的 Jenkins 测试来确定网页是否具有任何内容。该测试仅用于演示目的。

注意

如果您不想向管道中添加另一个阶段,则可以向管道的 Staging 阶段添加一个测试操作,该操作可以在部署操作之前或之后。

向管道中添加测试阶段

查找实例的 IP 地址

验证您将代码部署到的实例的 IP 地址
  1. 当管道状态显示为成功后,在 Staging 阶段的状态区域中,选择详细信息

  2. 部署详细信息部分,在实例 ID 中,选择成功部署的一个实例的实例 ID。

  3. 复制实例的 IP 地址(例如 192.168.0.4)。 你将在你的 Jenkins 测试中使用这个 IP 地址。

创建一个 Jenkins 项目用于测试部署

创建 Jenkins 项目
  1. 在您将 Jenkins 安装到的实例中,打开 Jenkins,然后从主页中选择新项目

  2. 项目名称中,输入 Jenkins 项目的名称(例如 MyTestProject)。 选择 Freestyle 项目,然后选择 “确定”

    注意

    确保您的项目名称符合 CodePipeline 要求。有关更多信息,请参阅 中的配额 AWS CodePipeline

  3. 在项目的配置页中,选择如有必要,执行并发构建复选框。在源代码管理中,选择 AWS CodePipeline。如果您已在EC2实例上安装了 Jenkins,并使用您为 AWS CLI 与 Jenkins 之间的 CodePipeline 集成而创建的IAM用户的配置文件配置了,请将所有其他字段留空。

    重要

    如果您正在配置 Jenkins 项目,但该项目未安装在 Amazon EC2 实例上,或者该项目安装在运行 Windows 操作系统的EC2实例上,请根据您的代理主机和端口设置填写所需的字段,并提供您为在 Jenkins 和之间集成而配置的IAM用户或角色的凭证。 CodePipeline

  4. 选择高级,然后在目录中,选择测试

  5. 在 Prov id er 中,输入与构建项目相同的名称(例如,MyJenkinsProviderName)。 在本教程的后面部分,当您将测试操作添加到管道中时,您将使用此名称。

    注意

    此名称必须符合操作的 CodePipeline 命名要求。有关更多信息,请参阅 中的配额 AWS CodePipeline

  6. 在 “生成触发器” 中,清除所有复选框,然后选择 “投票” SCM。在计划中,输入五个星号并用空格隔开,如下所示:

    * * * * *

    这 CodePipeline 每分钟进行一次民意调查。

  7. 构建中,选择添加构建步骤。如果您要部署到亚马逊 Linux 或 Ubuntu 服务器实例,请选择执行外壳。RHEL然后输入以下内容,其中 IP 地址是您之前复制的EC2实例的地址:

    TEST_IP_ADDRESS=192.168.0.4 rake test

    如果您要部署到 Windows Server 实例,请选择执行批处理命令,然后输入以下内容,其中 IP 地址是您之前复制的EC2实例的地址:

    set TEST_IP_ADDRESS=192.168.0.4 rake test
    注意

    测试假定为默认端口 80。如果您要指定一个不同的端口,请添加一个测试端口语句,如下所示:

    TEST_IP_ADDRESS=192.168.0.4 TEST_PORT=8000 rake test
  8. 选择 “添加生成后期操作”,然后选择 “AWS CodePipeline 发布者”。不要选择添加

  9. 选择保存以保存您的 Jenkins 项目。

创建第四个阶段

向您的管道添加一个包括 Jenkins 测试操作的阶段
  1. 登录 AWS Management Console 并打开 CodePipeline 控制台,网址为 http://console.aws.amazon.com/codesuite/codepipeline/home

  2. 名称中,选择您创建的管道的名称 MySecondPipeline。

  3. 在管道详细信息页中,选择编辑

  4. 编辑页面上,选择 + 阶段,紧随构建阶段之后添加一个阶段。

  5. 在新阶段的名称字段中,输入名称(例如 Testing),然后选择 + 添加操作组

  6. 操作名称中,输入 MyJenkinsTest-Action。 在测试提供者中,选择您在 Jenkins 中指定的提供商名称(例如,MyJenkinsProviderName)。 在项目名称中,输入您在 Jenkins 中创建的项目的名称(例如 MyTestProject)。 在输入工件中,从 Jenkins 版本中选择默认名称为的工件 BuildArtifact,然后选择 “完成”。

    注意

    由于 Jenkins 测试操作对 Jenkins 构建步骤中构建的应用程序起作用,请为输入构件使用构建构件来执行测试操作。

    有关输入和输出构件以及管道结构的更多信息,请参阅 CodePipeline 管道结构参考

  7. 编辑页中,选择保存管道更改。在保存管道更改对话框中,选择保存并继续

  8. 虽然新阶段已添加到您的管道中,但该阶段会显示为 No executions yet 状态,因为更改并不会触发管道的另一次运行。要通过修订后的管道运行示例,在管道详细信息页中,选择发布更改

    管道视图会显示管道中的阶段和操作以及经历这四个阶段的修订的状态。管道完成所有阶段需要的时间将取决于项目的大小、生成和测试操作的复杂程度以及其他因素。

步骤 4:清理资源

完成本教程之后,您应该删除管道及其使用的资源,以避免为继续使用这些资源付费。如果您不打算继续使用 CodePipeline,请删除管道,然后删除 CodeDeploy 应用程序及其关联的 Amazon EC2 实例,最后删除用于存储项目的 Amazon S3 存储桶。如果您不打算继续使用其他资源,例如 GitHub 存储库,则还应考虑是否删除它们。

清理本教程中使用的资源
  1. 在您本地的 Linux、macOS 或 Unix 计算机上打开终端会话或在您本地的 Windows 计算机上打开命令提示符,并运行 delete-pipeline 命令,删除您创建的管道。对于 MySecondPipeline,您可以输入以下命令:

    aws codepipeline delete-pipeline --name "MySecondPipeline"

    该命令不返回任何内容。

  2. 要清理 CodeDeploy 资源,请按照清理中的说明进行操作。

  3. 要清理您的实例资源,请删除安装了 Jenkins 的EC2实例。有关更多信息,请参阅清除您的实例

  4. 如果您不打算创建更多管道或 CodePipeline 再次使用,请删除用于存储管道项目的 Amazon S3 存储桶。要删除存储桶,请按照删除存储桶中的说明进行操作。

  5. 如果您不打算将其他资源再次用于该管道,请考虑根据该特定资源的指导删除这些资源。例如,如果要删除 GitHub 存储库,请按照在 GitHub 网站上删除存储库中的说明进行操作。