注意:
- 本教程需要访问 Oracle Cloud。要注册免费账户,请参阅开始使用 Oracle Cloud Infrastructure 免费套餐。
- 它对 Oracle Cloud Infrastructure 身份证明、租户和区间使用示例值。完成实验室后,请使用特定于云环境的那些值替换这些值。
使用 Oracle Cloud Infrastructure DevOps 实现 OCI Resource Manager 部署自动化
简介
Oracle Cloud Infrastructure (OCI) Resource Manager 是一项全托管式服务,可帮助团队管理和自动执行基础设施即代码 (IaC)。它支持团队协作完成 Terraform 配置,为各种操作定义权限,提供状态锁定来防止损坏,自动将所有状态文件存储在持久存储中,并负责配置 Terraform 提供程序。为了交付和部署所有软件(而不仅仅是 Terraform),我们提供了一个 OCI DevOps 平台,它是一个端到端的连续集成/连续交付 (CI/CD) 平台,适用于具有专用代码资料档案库、触发器、构建和部署管道等功能的开发人员。
OCI Resource Manager 内置了 Terraform 自动化功能,并与多个源代码控制系统集成,可实现基本的 CI/CD。在本教程中,我们将了解如何使用 OCI DevOps 通过在 Terraform 代码更改上自动重新部署 OCI Resource Manager 堆栈来扩展这些 CI/CD 功能。
流
该过程从用户将新的 Terraform 配置推送到代码资料档案库开始,这将触发构建和部署管道。这将导致创建使用 OCI 命令行界面 (CLI) 将 OCI 资源管理器堆栈与新配置一起应用的 shell 环境。
目标
- 在 Terraform 更改时自动重新部署 OCI 资源管理器堆栈。
任务 1:设置 OCI DevOps 代码资料档案库
-
登录到 OCI 控制台,导航到 Developer Services(开发人员服务)、DevOps 、 Projects(项目)并创建一个 DevOps 项目,该项目将保存 CI/CD 工作流中的所有资源。
-
创建代码资料档案库并上载 Terraform 配置。您可以使用大量的 Oracle 提供的模板。在本教程中,Terraform 只需更改 OCI 通知主题的说明。
resource "oci_ons_notification_topic" "test_notification_topic" { #Required compartment_id = <compartment_id> name = "RM_DevOps_Automation_Tutorial" #Optional description = "This is a test notification topic." }
任务 2:创建 Shell 构件
我们需要先创建部署管道中使用的构件。由于我们将执行 shell 脚本来运行 OCI CLI,因此请创建一个类型为 Command specification (命令规范)的对象。在本教程中,我们将使用对象源作为内嵌,并提供以下命令:
version: 0.1
component: command
timeoutInSeconds: 1200
steps:
- type: Command
timeoutinSeconds: 900
name: Invoke RMS
command: |
echo "Running RM apply command"
有关语法和其他参数的更多信息,请参见命令规范文档。稍后我们将向此脚本添加更多详细信息。
任务 3:创建部署管道
部署管道用于部署构件。
-
创建部署管道和类型为 Shell 的阶段。
-
单击选择对象,然后选择在任务 2 中创建的对象。选择满足要求的配置和网络配置。
注:策略:在创建阶段时,将链接建议策略的列表,请确保添加它们。此外,我们的部署管道将与 OCI 资源管理器和 OCI 通知进行交互,因此请确保为您的动态组提供对
ons-topics
、orm-stacks
和orm-jobs
的访问权限。有关每个服务的完整权限列表的更多信息,请参见 Policy Reference 。
任务 4:创建构建管道
尽管我们不会构建任何构件,但我们仍然需要构建管道来触发部署管道。
-
创建一个构建管道和一个触发器部署类型的阶段。
-
单击选择部署管道,然后选择您在任务 3 中创建的管道。
任务 5:创建触发器
我们需要创建一个在代码推送时调用的触发器。
-
导航到触发器,然后单击创建触发器。
-
在创建触发器页中,输入以下信息。
- 源连接:输入 OCI 代码存储库。
- 选择代码资料档案库:选择在任务 1 中创建的资料档案库。
-
单击添加操作并输入以下信息。
- 构建管道:选择在任务 4 中创建的构建管道。
- 事件:选择推送。
- 构建运行条件:根据您的用例输入。在此示例中,我们将输入以下信息。
- 源分支:输入 main 。
- 要包括的文件:输入 main.tf 。
任务 6:测试流
下面是我们在此教程中一直跟进的工作流。
- 代码推送。
- 触发器。
- 构建管道。
- 部署管道。
- Shell 脚本运行
echo "Running RM apply command"
。
在向 shell 脚本添加更多复杂性之前,请确认工作流的工作。
-
推送新代码。
-
确认已触发构建管道。
-
确认已触发部署管道。
-
确认 shell 脚本运行成功
一切都在按预期运行。最后一项任务是重新设计 shell 脚本以触发资源管理器堆栈。
任务 7:修改 Shell 脚本以触发资源管理器堆栈
Shell 阶段容器映像运行时包括 shell 解释器、shell 实用程序、CLI 以及更多工具。有关更多信息,请参见 Shell Container Image Runtime Details 。
我们将利用 OCI CLI 调用资源管理器。我们的 shell 脚本当前如下所示:
version: 0.1
component: command
timeoutInSeconds: 1200
steps:
- type: Command
timeoutinSeconds: 900
name: Invoke RMS
command: |
echo "Running RM apply command"
要修改 shell 脚本,请执行以下步骤:
-
创建作业。
我们将进行的第一个调用是
create-apply-job
。这将在资源管理器堆栈上创建一个应用作业。我们还将将作业的job_id
另存为变量,以便在下一步中引用作业。job_id=$(oci resource-manager job create-apply-job --stack-id <Stack OCID> --execution-plan-strategy AUTO_APPROVED --wait-for-state SUCCEEDED --wait-for-state FAILED --query data.id --raw-output)
有关更多信息,请参见 OCI CLI Command Reference:create-apply-job 。
-
获取作业状态。
我们需要检查作业是成功还是失败。为此,我们将
job_id
传递到job get
,这将返回作业的属性。具体来说,我们关注lifecycle-state
。job_state=$(oci resource-manager job get --job-id $job_id --raw-output --query 'data."lifecycle-state"')
有关更多信息,请参见 OCI CLI Command Reference:job get 。
-
分析作业状态。
添加逻辑以根据作业是成功 (0) 还是失败 (1) 更改退出代码。
if [ $job_state == SUCCEEDED ]; then echo "Resource Manager job succeeded" exit 0 else echo "Resource Manager job failed" exit 1 fi
-
聚合前面的步骤并添加一些额外的输出语句后,shell 脚本应如下所示:
version: 0.1 component: command timeoutInSeconds: 1200 steps: - type: Command timeoutinSeconds: 900 name: Invoke RMS command: | echo "Running RM apply command" job_id=$(oci resource-manager job create-apply-job --stack-id ocid1.ormstack.oc1.iad.amaaaaaann2vciya6arauok6db5epqnhlfdmbf5ee7td6gydzwvarzanaxyq --execution-plan-strategy AUTO_APPROVED --wait-for-state SUCCEEDED --wait-for-state FAILED --query data.id --raw-output) echo "RMS plan job id is:" echo $job_id job_state=$(oci resource-manager job get --job-id $job_id --raw-output --query 'data."lifecycle-state"') echo "Apply job lifecycle-state is:" echo $job_state if [ $job_state == SUCCEEDED ]; then echo "Resource Manager job succeeded" exit 0 else echo "Resource Manager job failed" exit 1 fi
注:这是一个显示基本功能的简单示例。您可以根据自己的要求定制该脚本。
任务 8:端到端测试
您的完整体系结构和流应如下所示:
确认体系结构的工作。
-
推送新代码。
-
确认 shell 脚本已成功运行。
-
确认已成功应用 Terraform。
后续步骤
此教程演示如何使用 OCI DevOps 自动执行 OCI Resource Manager 堆栈部署。这是一个简单的例子,显示了基本流程。我们鼓励您学习所学的概念并基于这些概念进行构建,根据您的用例量身定制这些概念,并将它们整合到现有的 CI/CD 管道中。
相关链接
确认
- Authors — Cody Brinkman(云架构师)、Qian Chen(OCI 开发人员工具和服务技术人员成员)和 Nandan Kandregula(OCI 开发人员工具和服务软件开发经理)
更多学习资源
浏览 docs.oracle.com/learn 上的其他实验室,或者访问 Oracle Learning YouTube 渠道上的更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 成为 Oracle Learning Explorer。
有关产品文档,请访问 Oracle 帮助中心。
Use Oracle Cloud Infrastructure DevOps to Automate OCI Resource Manager Deployments
G16605-01
October 2024