教程:创建一个四阶段管道
在教程:创建一个简单的管道(S3 存储桶)或教程:创建一个简单的管道(CodeCommit 存储库)中创建了第一个管道后,接下来就可以开始创建更复杂的管道。本教程将引导您创建一个四阶段管道,该管道使用 GitHub 存储库作为源位置,使用 Jenkins 编译服务器来构建项目,并使用 CodeDeploy 应用程序将内置代码部署到暂存服务器。下图显示最初的三阶段管道。
创建管道后,您将编辑它以添加包含测试操作的阶段来测试代码,同样使用 Jenkins。
创建此管道之前,必须先配置所需的资源。例如,如果要将 GitHub 存储库用于源代码,则必须先创建存储库,然后才能将其添加到管道中。作为设置的一部分,本教程将指导您在 EC2 实例上设置 Jenkins 以进行演示。
重要
在此过程中,您在管道中添加的许多操作都涉及在创建管道之前需要创建的 Amazon 资源。源操作的 Amazon 资源必须始终在您创建管道的同一 Amazon 区域中创建。例如,如果您在美国东部(俄亥俄州)区域中创建管道,则必须在美国东部(俄亥俄州)区域中创建 CodeCommit 存储库。
您可以在创建管道时添加跨区域操作。跨区域操作的 Amazon 资源必须位于您计划执行操作的同一 Amazon 区域中。有关更多信息,请参阅 在 CodePipeline 中添加跨区域操作。
重要
作为创建管道的一部分,CodePipeline 将使用客户提供的 S3 构件存储桶来存放构件。(这与用于 S3 源操作的存储桶不同。) 如果 S3 构件存储桶所在的账户与您的管道账户不同,请确保 S3 构件存储桶归 Amazon Web Services 账户所有,并且安全可靠。
在开始学习本教程之前,您应该已经完成开始使用 CodePipeline中的一般先决条件。
步骤 1:满足先决条件
要与 Jenkins 集成,Amazon CodePipeline 需要您在要与 CodePipeline 一起使用的任何 Jenkins 实例上安装适用于 Jenkins 的 CodePipeline 插件。您还应该配置一个专用 IAM 用户或角色,以用于 Jenkins 项目和 CodePipeline 之间的权限。若要集成 Jenkins 和 CodePipeline,最简单的方法就是将 Jenkins 安装在使用您为 Jenkins 集成创建的 IAM 实例角色的 EC2 实例上。为了使管道中 Jenkins 操作的链接能够成功连接,您必须在服务器或 EC2 实例上配置代理和防火墙设置,以允许与 Jenkins 项目使用的端口进行入站连接。在允许连接这些端口(例如,如果您已保护 Jenkins 以仅使用 HTTPS 连接,端口为 443 和 8443;如果您允许 HTTP 连接,端口为 80 和 8080)之前,请确保已将 Jenkins 配置为对用户进行身份验证并强制执行访问控制。有关更多信息,请参阅保护 Jenkins
注意
本教程使用一个代码示例并配置将该示例从 Haml 转换为 HTML 的生成步骤。您可以按照将示例复制或克隆到 GitHub 存储库中的步骤从 GitHub 存储库下载开源示例代码。您需要 GitHub 存储库中的整个示例,而不仅仅是 .zip 文件。
本指南还假定:
-
您熟悉安装和管理 Jenkins 以及创建 Jenkins 项目的过程。
-
您已将适用于 Ruby 的 Rake 和 Haml Gem 安装在托管 Jenkins 项目的同一计算机或实例上。
-
您已设置所需的系统环境变量,以便可以从终端或命令行运行 Rake 命令(例如,在 Windows 系统上,修改 PATH 变量以包括安装 Rake 的目录)。
将示例复制或克隆到 GitHub 存储库
克隆示例,并将其推送到 GitHub 存储库
-
从 GitHub 存储库中下载示例代码,或者将存储库克隆到您本地的电脑。有两个示例包:
-
如果您要将示例部署到 Amazon Linux、RHEL 或 Ubuntu Server 实例,请选择 codepipeline-jenkins-aws-codedeploy_linux.zip
。 -
如果您要将示例部署到 Windows Server 实例,请选择 CodePipeline-Jenkins-AWSCodeDeploy_Windows.zip
。
-
-
在存储库中,选择 Fork,将示例存储库克隆到您的 Github 账户的存储库中。有关更多信息,请参阅 GitHub 文档
。
创建 IAM 角色以用于 Jenkins 集成
作为最佳实践,请考虑启动 EC2 实例来托管 Jenkins 服务器,并使用 IAM 角色向实例授予与 CodePipeline 进行交互所需的权限。
登录 Amazon Web Services 管理控制台,然后通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/
。 -
在 IAM 控制台的导航窗格中,选择角色,然后选择创建角色。
-
在选择受信任实体的类型下,选择 Amazon Web Services 服务。在选择将使用此角色的服务下,选择 EC2。在选择您的使用案例下,选择 EC2。
-
选择下一步:权限。在附加权限策略页面上,选择
AWSCodePipelineCustomActionAccess托管策略,然后选择下一步: 标签。选择下一步:审核。 -
在审核页面上的角色名称中,输入专为 Jenkins 集成创建的角色的名称(例如,
JenkinsAccess),然后选择创建角色。
当您创建要在其中安装 Jenkins 的 EC2 实例时,请确保在步骤 3: 配置实例详细信息中选择该实例角色(例如,JenkinsAccess)。
有关实例角色和 Amazon EC2 的更多信息,请参阅适用于 Amazon EC2 的 IAM 角色、使用 IAM 角色为 Amazon EC2 实例上运行的应用程序授权和创建向 Amazon Web Services 服务 委托权限的角色。
安装和配置 Jenkins 以及适用于 Jenkins 的 CodePipeline 插件
安装 Jenkins 以及适用于 Jenkins 的 CodePipeline 插件
-
创建要在其中安装 Jenkins 的 EC2 实例,在步骤 3: 配置实例详细信息中,确保选择您所创建的实例角色(例如
JenkinsAccess)。有关创建 EC2 实例的更多信息,请参阅 Amazon EC2 用户指南 中的启动 Amazon EC2 实例。注意
如果您已经拥有您想要使用的 Jenkins 资源,您可以执行此操作,但是您必须创建一个专用的 IAM 用户,为该用户应用
AWSCodePipelineCustomActionAccess托管策略,然后在您的 Jenkins 资源上配置和使用该用户的访问凭证。如果您想使用 Jenkins UI 来提供凭证,请将 Jenkins 配置为仅允许 HTTPS。有关更多信息,请参阅 CodePipeline 故障排除。 -
在 EC2 实例上安装 Jenkins。有关更多信息,请参阅针对安装 Jenkins
和启动并访问 Jenkins 的 Jenkins 文档以及 与 CodePipeline 的产品和服务集成中的details of integration with Jenkins。 -
启动 Jenkins,然后在主页上,选择管理 Jenkins。
-
在管理 Jenkins 页中,选择管理插件。
-
选择可用选项卡,然后在筛选条件搜索框中,输入
Amazon CodePipeline。从列表中选择适用于 Jenkins 的 CodePipeline 插件,然后选择立即下载并在重新启动后安装。 -
在正在安装插件/更新页中,选择当安装结束且无作业正在运行时重启 Jenkins。
-
选择返回控制面板。
-
在主页中,选择新项目。
-
在项目名称中,输入 Jenkins 项目的名称(例如
MyDemoProject)。选择自由式项目,然后选择确定。注意
确保项目的名称符合 CodePipeline 要求。有关更多信息,请参阅 Amazon CodePipeline 中的限额。
-
在项目的配置页中,选择如有必要,执行并发构建复选框。在源代码管理中,选择 Amazon CodePipeline。如果您在 EC2 实例上安装了 Jenkins,并且使用您为 CodePipeline 与 Jenkins 之间的集成创建的 IAM 用户的配置文件配置了 Amazon CLI,请将其他所有字段留空。
-
选择高级,然后在提供程序中,按照 CodePipeline 中显示的内容输入操作的提供程序名称(例如
MyJenkinsProviderName)。确保此名称是唯一的且容易记住。在此教程的后面部分,当您向管道添加生成操作时,会用到这个名称,并且在添加测试操作时,会再次用到它。注意
此操作名称必须符合 CodePipeline 中的操作的命名要求。有关更多信息,请参阅 Amazon CodePipeline 中的限额。
-
在构建触发器中,清除所有复选框,然后选择轮询 SCM。在计划中,输入五个星号并用空格隔开,如下所示:
* * * * *这会每分钟轮询一次 CodePipeline。
-
在构建中,选择添加构建步骤。选择执行 Shell(Amazon Linux、RHEL 或 Ubuntu Server)执行批处理命令 (Windows Server),然后输入以下内容:
rake注意
确保您的环境配置有运行 rake 所需的变量和设置,否则,生成会失败。
-
选择添加构建后操作,然后选择 Amazon CodePipeline Publisher。选择添加,然后在构建输出位置中,将位置留空。此配置是默认的,会在生成过程结束时创建一个压缩文件。
-
选择保存以保存您的 Jenkins 项目。
步骤 2:在 CodePipeline 中创建管道
在这部分教程中,您将使用创建管道向导来创建管道。
创建 CodePipeline 自动发布流程
通过以下网址登录Amazon Web Services 管理控制台并打开 CodePipeline 控制台:http://console.aws.amazon.com/codesuite/codepipeline/home
。 -
如有必要,请使用区域选择器将区域更改为您的管道资源所在的区域。例如,如果您在
us-east-2中为上一教程创建了资源,请确保将区域选择器设置为“美国东部(俄亥俄州)”。有关适用于 CodePipeline 的区域和端点的更多信息,请参阅 Amazon CodePipeline 端点和配额。
-
在欢迎页面、入门页面或管道页面上,选择创建管道。
-
在步骤 1:选择创建选项页面上的创建选项下,选择构建自定义管道选项。选择下一步。
-
在步骤 2:选择管道设置页面上,在管道名称中,输入管道的名称。
-
CodePipeline 提供 V1 和 V2 类型的管道,它们在特性和价格上有所不同。在控制台中,您只能选择 V2 类型。有关更多信息,请参阅管道类型。有关 CodePipeline 的定价信息,请参阅定价
。 -
在服务角色中,选择新建服务角色,以允许 CodePipeline 在 IAM 中创建服务角色。
-
将高级设置中的各项设置保留为默认值,然后选择下一步。
-
在步骤 3:添加源阶段页面上,在源提供程序中,选择 GitHub。
-
在连接下,选择一个现有连接或创建一个新连接。要创建或管理 GitHub 源操作的连接,请参阅GitHub 连接。
-
在步骤 4:添加构建阶段中,选择添加 Jenkins。在提供程序名称中,输入在适用于 Jenkins 的 CodePipeline 插件中提供的操作名称(例如,
MyJenkinsProviderName)。此名称必须与适用于 Jenkins 的 CodePipeline 插件中的名称完全匹配。在服务器 URL 中,输入在其中安装 Jenkins 的 EC2 实例的 URL。在项目名称中,输入您在 Jenkins 中创建的项目的名称(例如MyDemoProject),然后选择下一步。 -
在步骤 5:添加测试阶段中,选择跳过测试阶段,并通过再次选择跳过接受警告消息。
选择下一步。
-
在步骤 6: 部署中,再次使用您在 教程:创建一个简单的管道(S3 存储桶) 中创建的 CodeDeploy 应用程序和部署组。在部署提供程序中,选择 CodeDeploy。在应用程序名称中,输入
CodePipelineDemoApplication,或选择刷新按钮,然后从列表中选择应用程序名称。在部署组中,输入CodePipelineDemoFleet或者从列表中选择它,然后选择下一步。注意
您可以使用自己的 CodeDeploy 资源或者创建新的资源,但您可能会产生额外的成本。
-
在步骤 7:审核中,查看信息,然后选择创建管道。
-
管道会自动启动示例并通过管道运行示例。当管道将 Haml 示例生成为 HTML,并以网页形式将其部署至 CodeDeploy 部署中的每个 Amazon EC2 实例时,您可以查看进度以及成功和失败消息。
步骤 3:向管道中添加另一个阶段
现在,您将添加一个测试阶段,然后向该阶段添加测试操作,该操作使用示例中包含的 Jenkins 测试来确定网页是否具有任何内容。该测试仅用于演示目的。
注意
如果您不想向管道中添加另一个阶段,则可以向管道的 Staging 阶段添加一个测试操作,该操作可以在部署操作之前或之后。
向管道中添加测试阶段
查找实例的 IP 地址
验证您将代码部署到的实例的 IP 地址
-
当管道状态显示为成功后,在 Staging 阶段的状态区域中,选择详细信息。
-
在部署详细信息部分,在实例 ID 中,选择成功部署的一个实例的实例 ID。
-
复制实例的 IP 地址(例如,
192.168.0.4)。您将在 Jenkins 测试中用到此 IP 地址。
创建一个 Jenkins 项目用于测试部署
创建 Jenkins 项目
-
在您将 Jenkins 安装到的实例中,打开 Jenkins,然后从主页中选择新项目。
-
在项目名称中,输入 Jenkins 项目的名称(例如
MyTestProject)。选择自由式项目,然后选择确定。注意
确保项目的名称符合 CodePipeline 要求。有关更多信息,请参阅 Amazon CodePipeline 中的限额。
-
在项目的配置页中,选择如有必要,执行并发构建复选框。在源代码管理中,选择 Amazon CodePipeline。如果您在 EC2 实例上安装了 Jenkins,并且使用您为 CodePipeline 与 Jenkins 之间的集成创建的 IAM 用户的配置文件配置了 Amazon CLI,请将其他所有字段留空。
重要
如果您要配置 Jenkins 项目,但此项目并未安装在 Amazon EC2 实例上,或者该项目安装在了运行 Windows 操作系统的 EC2 实例上,请按照代理主机和端口设置的要求填写字段,并提供您为 Jenkins 和 CodePipeline 之间的集成而配置的 IAM 用户的凭证。
-
选择高级,然后在目录中,选择测试。
-
在提供程序中,输入您用于构建项目的名称(例如
MyJenkinsProviderName)。在本教程的稍后部分,您在向您的管道添加测试操作时将用到此名称。注意
此名称必须符合 CodePipeline 的操作命名要求。有关更多信息,请参阅 Amazon CodePipeline 中的限额。
-
在构建触发器中,清除所有复选框,然后选择轮询 SCM。在计划中,输入五个星号并用空格隔开,如下所示:
* * * * *这会每分钟轮询一次 CodePipeline。
-
在构建中,选择添加构建步骤。如果要部署到 Amazon Linux、RHEL 或 Ubuntu Server 实例,请选择执行 Shell。然后输入以下内容,其中 IP 地址是您之前复制的 EC2 实例的地址:
TEST_IP_ADDRESS=192.168.0.4rake test如果您要部署到 Windows Server 实例,请选择执行批处理命令,然后输入以下内容,其中 IP 地址是指您前面复制的 EC2 实例的地址:
set TEST_IP_ADDRESS=192.168.0.4rake test注意
测试假定为默认端口 80。如果您要指定一个不同的端口,请添加一个测试端口语句,如下所示:
TEST_IP_ADDRESS=192.168.0.4TEST_PORT=8000rake test -
选择添加构建后操作,然后选择 Amazon CodePipeline Publisher。不要选择添加。
-
选择保存以保存您的 Jenkins 项目。
创建第四个阶段
向您的管道添加一个包括 Jenkins 测试操作的阶段
通过以下网址登录Amazon Web Services 管理控制台并打开 CodePipeline 控制台:http://console.aws.amazon.com/codesuite/codepipeline/home
。 -
在名称中,选择您创建的管道名称 MySecondPipeline。
-
在管道详细信息页中,选择编辑。
-
在编辑页面上,选择 + 阶段,紧随构建阶段之后添加一个阶段。
-
在新阶段的名称字段中,输入名称(例如
Testing),然后选择 + 添加操作组。 -
在操作名称中,输入
MyJenkinsTest-Action。在测试提供程序中,选择您在 Jenkins 中指定的提供程序名称(例如,MyJenkinsProviderName)。在项目名称中,输入您在 Jenkins 中创建的项目的名称(例如MyTestProject)。在输入构件中,从默认名称为BuildArtifact的 Jenkins 构建中选择构件,然后选择完成。注意
由于 Jenkins 测试操作对 Jenkins 构建步骤中构建的应用程序起作用,请为输入构件使用构建构件来执行测试操作。
有关输入和输出构件以及管道结构的更多信息,请参阅 CodePipeline 管道结构参考。
-
在编辑页中,选择保存管道更改。在保存管道更改对话框中,选择保存并继续。
-
虽然新阶段已添加到您的管道中,但该阶段会显示为 No executions yet 状态,因为更改并不会触发管道的另一次运行。要通过修订后的管道运行示例,在管道详细信息页中,选择发布更改。
管道视图会显示管道中的阶段和操作以及经历这四个阶段的修订的状态。管道完成所有阶段需要的时间将取决于项目的大小、生成和测试操作的复杂程度以及其他因素。
步骤 4:清理资源
完成本教程之后,您应该删除管道及其使用的资源,以避免为继续使用这些资源付费。如果您不打算继续使用 CodePipeline,请删除管道,然后删除 CodeDeploy 应用程序及其关联的 Amazon EC2 实例,最后删除用于存储构件的 Amazon S3 桶。您还应考虑是否删除其他不打算继续使用的资源,例如 GitHub 存储库。
清理本教程中使用的资源
-
在您本地的 Linux、macOS 或 Unix 计算机上打开终端会话或在您本地的 Windows 计算机上打开命令提示符,并运行 delete-pipeline 命令,删除您创建的管道。对于
MySecondPipeline,您可以输入以下命令:aws codepipeline delete-pipeline --name "MySecondPipeline"该命令不返回任何内容。
-
要清理您的 CodeDeploy 资源,请按照清理中的说明进行操作。
-
要清理实例资源,请删除您在其中安装 Jenkins 的 EC2 实例。有关更多信息,请参阅清除您的实例。
-
如果您不打算创建更多的管道或再次使用 CodePipeline,请删除用于为您的管道存储构件的 Amazon S3 桶。要删除存储桶,请按照删除存储桶中的说明进行操作。
-
如果您不打算将其他资源再次用于该管道,请考虑根据该特定资源的指导删除这些资源。例如,如果您想删除 GitHub 存储库,请按照 GitHub 网站上删除存储库
中的说明进行操作。