注意:

使用 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 环境。

目标

任务 1:设置 OCI DevOps 代码资料档案库

  1. 登录到 OCI 控制台,导航到 Developer Services(开发人员服务)DevOpsProjects(项目)并创建一个 DevOps 项目,该项目将保存 CI/CD 工作流中的所有资源。

  2. 创建代码资料档案库并上载 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"

创建 shell 构件

有关语法和其他参数的更多信息,请参见命令规范文档。稍后我们将向此脚本添加更多详细信息。

任务 3:创建部署管道

部署管道用于部署构件。

  1. 创建部署管道和类型为 Shell 的阶段。

    创建 shell 阶段

  2. 单击选择对象,然后选择在任务 2 中创建的对象。选择满足要求的配置网络配置

    选择构件

    注:策略:在创建阶段时,将链接建议策略的列表,请确保添加它们。此外,我们的部署管道将与 OCI 资源管理器和 OCI 通知进行交互,因此请确保为您的动态组提供对 ons-topicsorm-stacksorm-jobs 的访问权限。有关每个服务的完整权限列表的更多信息,请参见 Policy Reference

任务 4:创建构建管道

尽管我们不会构建任何构件,但我们仍然需要构建管道来触发部署管道。

  1. 创建一个构建管道和一个触发器部署类型的阶段。

    创建构建阶段

  2. 单击选择部署管道,然后选择您在任务 3 中创建的管道。

    选择部署管道

任务 5:创建触发器

我们需要创建一个在代码推送时调用的触发器。

  1. 导航到触发器,然后单击创建触发器

  2. 创建触发器页中,输入以下信息。

    • 源连接:输入 OCI 代码存储库
    • 选择代码资料档案库:选择在任务 1 中创建的资料档案库。
  3. 单击添加操作并输入以下信息。

    • 构建管道:选择在任务 4 中创建的构建管道。
    • 事件:选择推送
    • 构建运行条件:根据您的用例输入。在此示例中,我们将输入以下信息。
      • 源分支:输入 main
      • 要包括的文件:输入 main.tf

    创建触发器

任务 6:测试流

下面是我们在此教程中一直跟进的工作流。

  1. 代码推送。
  2. 触发器。
  3. 构建管道。
  4. 部署管道。
  5. Shell 脚本运行 echo "Running RM apply command"

在向 shell 脚本添加更多复杂性之前,请确认工作流的工作。

  1. 推送新代码。

    推送代码

  2. 确认已触发构建管道。

    正在构建

  3. 确认已触发部署管道。

    正在部署

  4. 确认 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 脚本,请执行以下步骤:

  1. 创建作业。

    我们将进行的第一个调用是 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

  2. 获取作业状态。

    我们需要检查作业是成功还是失败。为此,我们将 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

  3. 分析作业状态。

    添加逻辑以根据作业是成功 (0) 还是失败 (1) 更改退出代码。

    if [ $job_state == SUCCEEDED ]; then
      echo "Resource Manager job succeeded"
      exit 0
    else
      echo "Resource Manager job failed"
      exit 1
    fi
    
  4. 聚合前面的步骤并添加一些额外的输出语句后,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:端到端测试

您的完整体系结构和流应如下所示:

流程图

确认体系结构的工作。

  1. 推送新代码。

    推送代码

  2. 确认 shell 脚本已成功运行。

    Shell 成功

  3. 确认已成功应用 Terraform。

    已更新通知主题

后续步骤

此教程演示如何使用 OCI DevOps 自动执行 OCI Resource Manager 堆栈部署。这是一个简单的例子,显示了基本流程。我们鼓励您学习所学的概念并基于这些概念进行构建,根据您的用例量身定制这些概念,并将它们整合到现有的 CI/CD 管道中。

确认

更多学习资源

浏览 docs.oracle.com/learn 上的其他实验室,或者访问 Oracle Learning YouTube 渠道上的更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 成为 Oracle Learning Explorer。

有关产品文档,请访问 Oracle 帮助中心