使用 Cloud Build 为 Salesforce 构建无服务器 DevOps 流水线

Last reviewed 2021-02-22 UTC

本教程介绍如何使用 Salesforce Developer Experience (SFDX) 和 Cloud Build 为 Salesforce 构建无服务器的持续集成/持续部署 (CI/CD) 流水线。Cloud Build 流水线使用容器化技术。流水线将构建作为一系列构建步骤运行,其中每个构建步骤都在 Docker 容器中运行。您无需预先配置服务器,流水线可以根据负载扩容和缩容,提供快速、一致的自动化构建。

本教程适用于负责在组织中设计、开发和维护 DevOps 工作流的人员。这些角色可能包括架构师、DevOps 团队和工程师。本文档的各小节介绍了不同角色对应的流水线部分。例如,一部分针对管理员和 DevOps 负责人,而另一部分则针对 Salesforce 开发者。

本文档假设您熟悉 Salesforce DX、Salesforce CLI、Git、GitHub、Docker、Google Cloud 产品(例如 Cloud Build)和容器化概念。另外还假设您拥有 GitHub 账号。

软件开发生命周期可能有很大差异;本教程假设您遵循敏捷发布方法。

目标

  • 设置 Salesforce Developer Experience。
  • 设置 Git 分支策略。
  • 配置 Cloud Build。
  • 使用 Google Cloud Build 工具和 GitHub 运行 Salesforce 的 CI/CD 流水线。

费用

本教程使用 Google Cloud 的以下收费组件:

请使用价格计算器根据您的预计使用情况来估算费用。

您可能还会产生 Salesforce 费用。在本教程中,您将使用 Salesforce Developer Edition 组织,这可能是免费的。如需了解详情,请参阅关于 Developer Edition 的 Salesforce 页面。

准备工作

  1. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  2. 确保您的 Google Cloud 项目已启用结算功能

  3. 启用 Cloud Build API。

    启用 API

  4. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

  5. 确保您拥有可以担任 Dev Hub 组织角色的 Salesforce 账号。如果您没有组织,可以在 Salesforce 开发者网站上创建一个 Developer Edition 账号。

完成本教程后,您可以删除所创建的资源以避免继续计费。如需了解详情,请参阅清理

架构

下图展示了您将在本教程中创建的 CI/CD 工作流的架构。在此架构中,项目按版本进行组织。想要开发某项功能的开发者在发布分支中创建新的功能分支。

流水线架构,显示创建分支、发出拉取请求并将更改合并到主分支的流程。多个步骤会触发 Cloud Build 作业。

该图展示了以下流程:

  1. 开发者针对正在开发的功能在 GitHub 中创建功能分支。
  2. 开发者在 Salesforce 暂存组织中完成开发工作并运行单元测试。
  3. 开发者提交开发工作并推送到其源代码库(在本教程中为 GitHub)。
  4. 开发者创建拉取请求以将其工作合并到版本分支中。
  5. 创建拉取请求会自动触发 Cloud Build 作业以运行测试。
  6. 负责人员(通常是团队负责人)审核并批准拉取请求,以将开发工作合并到版本分支中。
  7. 与版本分支的合并会自动触发 Cloud Build 作业,以将代码库部署到 QA 或其他 Salesforce 环境。
  8. (可选)在 QA 环境中执行手动测试和审核。
  9. 负责人员创建拉取请求以将代码合并到 main 分支。
  10. main 分支发出的拉取请求触发 Cloud Build 作业,将代码部署到生产环境。

想要开发项目的开发者首先需要从企业源代码控制工具(在本教程中为 GitHub)克隆项目代码库。下图以图表形式表示此策略。

分支策略显示为一组版本,其中一个分支拆分为多个功能分支,然后分别合并回版本分支,然后从版本分支合并到主分支。

如图所示,分支策略包括以下部分:

  1. 一个主分支。主分支中的代码反映了在生产环境中运行的代码的当前版本。
  2. 一个版本分支。版本分支是相对更长期有效的分支(与功能分支相比),它协调与某个版本相关的所有更改和代码。组织会为每个新版本创建新的版本分支。
  3. 一个或多个功能分支。功能分支有助于将进行中的工作与主分支中最新版本的代码隔离开来。通常,多个功能分支构成一个版本分支。开发者创建用于问题修复的功能分支是一种良好的做法。

开发者克隆项目代码库后,会在本地机器上或 Salesforce 暂存组织中进行开发。他们可以使用暂存组织针对所做的更改进行单元测试。如果单元测试通过,开发者提交代码并推送到源代码库。然后,他们生成拉取请求,以便将其代码合并到父版本分支中。

拉取请求会自动触发执行以下操作的 Cloud Build 作业:

  • 创建一个新的暂存组织来运行单元测试。
  • 使用测试结果更新拉取请求。

此时,团队负责人和产品负责人可以审核拉取请求。如果请求获得批准,更改会合并到版本分支中。

根据您的软件开发生命周期,您可以增加与版本分支的合并触发的其他自动化步骤。自动化步骤的示例包括将经验证的代码部署到更高阶段的沙盒,例如质量保证或系统集成测试沙盒。

您还可以使用 Cloud Functions、Cloud Run 或其他 Google Cloud 工具配置 Cloud Build 发送构建通知并执行其他操作。(本教程未对这些额外操作进行介绍。)此方法使您可以灵活定制流水线,使其适应您企业的 DevOps 框架。

为简单起见,在本教程中,您将示例代码库部署到单个 Salesforce 组织 (Dev Hub)。构建用于生产的 CI/CD 流水线时,您将使用上文显示的架构,并自动执行软件开发生命周期中的沙盒部署。

通常参与软件开发的角色

每个组织各不相同,具有各自的角色和团队。下表列出了通常与本教程中介绍的类似流水线进行交互的关键人物(角色)。

不同角色的人员在 Salesforce 流水线设置中承担不同的职责。因此,本教程有两个路径。一个路径针对管理员和 DevOps 负责人,另一个路径针对开发者。

角色 需求管理代表的职责
管理员或 DevOps 负责人
  • 设置 Dev Hub 组织。
  • 生成使用户能够从 Salesforce CLI 连接到 Dev Hub 组织的证书。
  • 使用 DevOps 流水线在所有部署了代码的 Salesforce 环境中创建关联的应用
  • 在 Dev Hub 组织中设置开发者账号。
  • 设置 DevOps 流水线和所有必需的触发器。
  • 初始化源代码库。
  • 设置 Cloud Build 触发器。
Salesforce 开发者
  • 克隆源代码库。
  • 设置 Salesforce CLI 以进行开发。
  • 对一个版本中的功能进行开发和单元测试。
  • 功能开发完成后,生成拉取请求以将功能合并到版本分支。
QA 负责人
  • 审核并批准拉取请求,以将开发者的工作合并到版本分支中。
版本负责人
  • 管理和批准合并到主分支的拉取请求,从而将代码提升到生产环境。

Salesforce 管理员和 DevOps 负责人的流水线设置任务

本部分介绍管理员和 DevOps 团队在设置 CI/CD 工作流时需要执行的任务。

启用 Dev Hub 组织

  1. 登录您的 Salesforce 生产组织。
  2. Setup 标签页的 Quick Find 框中,输入 Dev Hub,然后选择 Dev Hub

    Salesforce Dev Hub 页面。

  3. 启用 Dev Hub。

    通过此步骤,您可以建立一个暂存组织。您可以使用暂存组织将教程中的示例代码部署到 Salesforce Developer Edition 组织。

创建证书和密钥对

启用 Dev Hub 组织后,您需要生成一个证书和密钥对,用于向 Salesforce Dev Hub 组织进行身份验证。您在后续步骤中配置 Cloud Build 时将使用此证书和密钥对。

对于生产 CI/CD 流水线,您需要生成其他证书以向 Salesforce 沙盒进行身份验证。(本教程中不需要创建这些额外证书。)为每个环境生成证书和密钥对时,请确保为其指定易于识别的名称,如以下示例所示:

  • 生产(Dev Hub 组织):salesforce.keysalesforce.crt您将在后面的步骤中使用这些名称。
  • 质量保证沙盒 (QA):salesforce_qa.keysalesforce_qa.crt
  • 集成开发沙盒 (IDEV):salesforce_dev.keysalesforce_dev.crt

要生成证书和密钥对,请按以下步骤操作:

  1. 在 Cloud Shell 中生成证书和密钥对,供 Cloud Build 从 Salesforce CLI 向您的 Salesforce Dev Hub 组织进行身份验证:

    openssl req -x509 -sha256 -nodes -days 36500 -newkey \
    rsa:2048 -keyout salesforce.key -out \
    salesforce.crt
    

    系统会提示您输入详细信息来标识证书。在本教程中,这些值不重要,因此请按 Enter 接受默认值。

    请注意,在该命令中使用 salesforce.keysalesforce.crt 的名称,因为您是为 Dev Hub 组织创建证书和密钥对。

  2. 点击更多,然后选择下载文件

  3. 完全限定文件路径框中,输入以下文件名,然后点击下载

    salesforce.crt
    

    此步骤会将生成的证书下载到您的本地机器中。在下一部分中,您需要将证书上传到 Salesforce 组织。

在 Salesforce 中创建关联的应用

在本部分中,您将创建一个关联的应用,Cloud Build 可用它来部署 Salesforce 代码。在本教程中,您仅将代码部署到 Dev Hub 组织。在生产环境中,您将代码部署到每个沙盒以及您希望 Cloud Build 为 DevOps 流水线部署 Salesforce 代码的生产组织。

在此过程中,您将使用上一部分中生成的证书和密钥对。证书是在 Cloud Shell 会话中向 Salesforce Dev Hub 组织(Salesforce 沙盒)验证 Salesforce 客户端的公钥。该证书还用于验证 Cloud Build 以进行自动部署。

以下过程中某些步骤的详情取决于您使用的 Salesforce 版本。请确保为选定的环境使用正确的证书和密钥对。

  1. 如果您使用的是 Salesforce Lighting Experience,请使用应用管理器创建关联的应用。在 Salesforce 组织的 Setup 中,执行以下操作:

    1. Quick Find 框中,输入 App
    2. 选择 App Manager
    3. 点击 New Connected App

    如果您使用的是 Salesforce Classic,请在 Salesforce 组织的 Setup 中执行以下操作:

    1. Quick Find 框中,输入 Apps
    2. Build > Create 下,选择 Apps
    3. Connected Apps 下,点击 New
  2. 输入 Google Cloud DevOps 作为应用的名称。

    这会将 Google_Cloud_DevOps 填充到 API Name 框中。

  3. 输入联系人电子邮件信息以及适合您应用的其他任何信息。

  4. 选择 Enable OAuth Settings(启用 OAuth 设置)。

  5. 对于 Callback URL 值,输入以下网址:

    http://localhost:1717/OauthRedirect
    
  6. 要启用使用数字签名的选项,请点击 Choose File,然后选择您之前下载的 salesforce.crt 文件。

  7. 将以下 OAuth 范围添加到 Selected OAuth Scopes

    • Access and manage your data (api)(访问和管理您的数据(api))
    • Perform requests on your behalf at any time (refresh_token, offline_access)(随时代表您执行请求(refresh_token, offline_access))
    • Provide access to your data via the web (web)(允许通过网络访问您的数据(网络))

    用于选择 OAuth 范围的对话框选择器。

  8. 点击 Save,然后点击 Continue

  9. 记下 API 部分中显示的 Consumer Key 值;稍后设置 Cloud Build 清单时将需要此信息。

    如果您是在生产环境中,那么每个部署环境都有一个密钥。

  10. 点击 Manage,然后点击 Edit Policies

  11. Permitted users(允许的用户)设置为 Admin Approved Users are Pre-Authorized(管理员批准的用户已获得预先授权),并确认选择。

  12. 将 IP 放宽设置设为 Relax IP Restrictions(放宽 IP 限制)。

  13. 点击保存

  14. 点击 Manage Profiles,然后选择 System Administrator 选项。

    完成此步骤后,使用此配置文件的用户便可以登录 Salesforce CLI。

  15. 点击保存

初始化 Google Cloud 环境

  1. 在 Cloud Shell 中,设置您创建或选择用作默认项目的项目:

    gcloud config set project PROJECT_ID
    

    PROJECT_ID 替换为您的 Google Cloud 项目的 ID。

  2. 区域和可用区分配设置:

    gcloud config set compute/region us-central1
    gcloud config set compute/zone us-central1-a
    

    本教程使用 us-central1 作为区域,使用 us-central1-a 作为可用区。

  3. 将当前 Google 项目 ID 导出到名为 GCP_PROJECT_NUMBER 的环境变量:

    export GCP_PROJECT_NUMBER=$(gcloud projects describe $DEVSHELL_PROJECT_ID --format='value(projectNumber)')
    

将 Salesforce 密钥上传到 Cloud Storage

  1. 在 Cloud Shell 中,在构建项目中创建 Cloud Storage 存储分区以存储 Salesforce 私钥文件:

    gsutil mb -p ${DEVSHELL_PROJECT_ID} -l us-central1 \
        gs://salesforce-ref-${DEVSHELL_PROJECT_ID}
    

    存储分区必须具有全局唯一名称。此命令会创建一个包含 Google Cloud 项目 ID 的存储桶名称。

  2. 将您在启用 Dev Hub 组织部分中生成的 Salesforce 私钥复制到新的 Cloud Storage 存储分区:

    gsutil cp salesforce.key gs://salesforce-ref-${DEVSHELL_PROJECT_ID}
    

创建 GitHub 代码库

  1. 在 Cloud Shell 中,克隆与本教程关联的代码库:

    git clone https://github.com/GoogleCloudPlatform/salesforce-serverless-cicd-cloudbuild
    
  2. 创建一个名为 DEV_REPO_NAME新 GitHub 代码库

    DEV_REPO_NAME 替换为您要在本地分配给代码库的名称。

    这是开发者从中拉取代码或向其推送代码的代码库。在本教程中,您将在自己的 GitHub 账号中创建此代码库。

  3. 转到克隆的代码库:

    cd salesforce-serverless-cicd-cloudbuild
    
  4. 将开发者 GitHub 代码库添加为远程代码库:

    git remote add github DEV_REPO_NAME
    

配置 Cloud Build

在本部分中,您将完成在开发者生成拉取请求以将工作合并到版本分支时触发 Cloud Build 作业所需的设置步骤。

您需要为本教程中创建的 CI/CD 流水线设置两个触发器:

  • 当开发者创建拉取请求以将代码合并到版本分支时运行 Cloud Build 作业的触发器。此触发器的典型用途是运行单元测试。
  • 当拉取请求合并到版本分支时运行 Cloud Build 作业的触发器。此触发器的典型用途是将更改部署到目标沙盒(在本教程中为 Dev Hub)。

构建包含 Salesforce DX 的基础映像

Cloud Build 将构建作为一组步骤运行,其中每个步骤都在 Docker 容器中运行。您将构建一个包含 Salesforce CLI 的基础 Docker 容器映像,Cloud Build 使用 Salesforce CLI 命令来运行作业。

  1. 在 Cloud Shell 中,为需要构建的映像创建一个 Dockerfile:

    cat <<EOF > Dockerfile
    FROM debian:buster
    RUN apt-get update && \
    apt-get install -y wget xz-utils
    RUN wget https://developer.salesforce.com/media/salesforce-cli/sfdx-linux-amd64.tar.xz && \
    mkdir sfdx && \
    tar xJf sfdx-linux-amd64.tar.xz -C sfdx --strip-components 1 && \
    ./sfdx/install
    ENTRYPOINT [ "sfdx" ]
    EOF
    
  2. 将 Docker 映像的名称导出到名为 SFDX_BASE_IMAGE 的环境变量中:

    export SFDX_BASE_IMAGE="gcr.io/${DEVSHELL_PROJECT_ID}/salesforcedx-base-image:1"
    
  3. 使用 Cloud Build 构建容器并将映像发布到 Container Registry:

    gcloud builds submit --tag ${SFDX_BASE_IMAGE}
    

配置 Cloud Build 作业

您可以通过修改 cloudbuild.yaml 文件来定义 Cloud Build 作业。

  1. 在 Cloud Shell 中,创建 cloudbuild.yaml 文件,以定义当 Cloud Build 将代码部署到 Salesforce Dev Hub 组织时要运行的作业步骤:

    cat <<EOF > cloudbuild.yaml
    steps:
    - name: gcr.io/cloud-builders/gsutil
      args: ['cp', 'gs://\${_BUCKET_NAME}/salesforce.key', 'salesforce.key']
    - name: "${SFDX_BASE_IMAGE}"
      args:
      - force:auth:jwt:grant
      - --setdefaultusername
      - -u
      - \${_SF_USERNAME}
      - -f
      - ./salesforce.key
      - -i
      - \${_CONSUMER_KEY}
    - name: "${SFDX_BASE_IMAGE}"
      args: ['force:source:deploy', '-p', './force-app/']
    substitutions:
      _BUCKET_NAME: __BUCKET_NAME__
      _SF_USERNAME: __USERNAME__
      _CONSUMER_KEY: __CONSUMER_KEY__
    EOF
    

    该文件将 Cloud Build 配置为执行以下任务:

    1. 下载 Cloud Build 用于向 Dev Hub 组织进行身份验证的 salesforce.key 文件。
    2. 启动安装了 Salesforce CLI 的 Docker 容器,然后使用 JWT 授权连接到 Dev Hub 组织。Cloud Build 使用配置参数,例如使用方密钥和 Cloud Build 触发器定义中的 Salesforce 用户名。
    3. 将开发者推送的代码部署到 Dev Hub 组织或生产 CI/CD 流水线中的另一个目标沙盒。
  2. 创建另一个名为 cloudbuild_pr.yaml 的文件,以定义当 Cloud Build 将拉取请求中的代码部署到临时 Salesforce 暂存组织或测试沙盒时要运行的作业步骤:

    cat <<EOF > cloudbuild_pr.yaml
    steps:
    - name: gcr.io/cloud-builders/gsutil
      args: ['cp', 'gs://\${_BUCKET_NAME}/salesforce.key', 'salesforce.key']
    - name: "${SFDX_BASE_IMAGE}"
      args:
      - force:auth:jwt:grant
      - -u
      - \${_SF_USERNAME}
      - -f
      - ./salesforce.key
      - -i
      - \${_CONSUMER_KEY}
    - name: "${SFDX_BASE_IMAGE}"
      args:
      - force:org:create
      - --setdefaultusername
      - --definitionfile
      - config/project-scratch-def.json
      - --targetdevhubusername
      - \${_SF_USERNAME}
      - --setalias
      - testing org
    - name: "${SFDX_BASE_IMAGE}"
      args: ['force:source:push']
    - name: "${SFDX_BASE_IMAGE}"
      args: ['force:apex:test:run', '--resultformat', 'tap', '--codecoverage']
    - name: "${SFDX_BASE_IMAGE}"
      args: ['force:org:delete', '--noprompt']
    substitutions:
      _BUCKET_NAME: __BUCKET_NAME__
      _SF_USERNAME: __USERNAME__
      _CONSUMER_KEY: __CONSUMER_KEY__
    EOF
    

    该文件将 Cloud Build 配置为执行以下任务:

    1. 下载 Cloud Build 用于向 Dev Hub 组织进行身份验证的 salesforce.key 文件。
    2. 启动安装了 Salesforce DX CLI 的 Docker 容器,并使用 JWT 授权连接到 Dev Hub 组织。Cloud Build 使用配置参数,例如使用方密钥和 Cloud Build 触发器定义中的 Salesforce 用户名。
    3. 创建一个新的暂存组织,以部署开发者代码来进行自动化测试。
    4. 在暂存组织中运行 Apex 文本。
    5. 输出 Apex 文本结果,此结果在 GitHub 拉取请求摘要中提供。
    6. 删除临时暂存组织。

将代码库推送到 GitHub

  1. 在 Cloud Shell 中,将新的 cloudbuild yaml 文件和 Dockerfile 添加到代码库,并将这些文件推送到 DEV_REPO_NAME 代码库的主分支。出现提示时,登录 GitHub。

    git add .
    git commit -m "Added cloud build configuration"
    git push github main
    
  2. 创建一个版本分支,开发者可以从其中拉取代码或将代码推送到其中。在本教程中,将该分支命名为 release-sample

    git checkout -b release-sample
    
  3. 将分支推送到 GitHub:

    git push github release-sample
    

将 GitHub 代码库连接到 Cloud Build

  1. 转到 GitHub 市场的 Cloud Build 应用页面
  2. 向下滚动并点击 Setup with Google Cloud Build。在出现提示时登录 GitHub。
  3. 将 GitHub 代码库连接到 Cloud Build:
    1. 选择 Only select repositories
    2. Select repositories 列表中,选择 repository
  4. 点击安装
  5. 登录 Google Cloud。

    此时会显示授权页面,系统会提示您授权 Google Cloud Build 应用连接到 Google Cloud。

  6. 点击授权 Google Cloud Build by GoogleCloudBuild

    系统会将您重定向至 Google Cloud 控制台。

  7. 选择您的 Google Cloud 项目。

  8. 如果您同意这些条款,请接受条款,然后点击下一步

  9. 选择代码库页面中,选择 DEV_REPO_NAME GitHub 代码库。

  10. 点击连接代码库

  11. 点击创建推送触发器

更新 Cloud Build 触发器定义

您可以定义您在上一部分中点击创建推送触发器时创建的新触发器的详细信息。

  1. 在 Google Cloud 控制台中,打开 Cloud Build 触发器页面。

    转到 Cloud Build 触发器页面

  2. 点击新触发器的 菜单,然后点击修改

  3. 名称设置为 pull-request-to-release-branch

  4. 将说明更改为 Run unit tests when a pull request is created from a feature branch

  5. 事件更改为拉取请求(仅限 GitHub 应用)

  6. 对于来源,在基本分支文本框中,输入以下表达式:

    ^release.*
    
  7. 对于配置,选择 Cloud Build 配置文件(yaml 或 json),然后在文本框中输入 cloudbuild_pr.yaml

  8. 替代变量下,创建三个变量。对于每个变量,执行以下操作:

    1. 点击添加一项
    2. 按下表中所列内容设置变量字段:

      变量
      _BUCKET_NAME Salesforce 密钥文件的 Cloud Storage 存储桶名称,格式如下:

      salesforce-ref-PROJECT_ID

      PROJECT_ID 替换为 Google Cloud 项目的 ID。
      _CONSUMER_KEY 您在 Salesforce Dev Hub 组织中创建的关联应用中的使用方密钥。
      _SF_USERNAME Dev Hub 组织的 Salesforce 用户名。
  9. 点击保存

    请勿关闭此页面。您将在下一步骤中继续使用此页面。

创建第二个 Cloud Build 触发器

下一步是创建另一个触发器,以在提交到版本分支后启动 Cloud Build 作业。此触发器会调用 Cloud Build 作业,将更改推送到 Dev Hub 组织。在 DevOps 流水线中,您必须确保仅授权人员和进程能够向版本分支提交更改。

  1. Cloud Build 触发器页面中,点击创建触发器以创建新触发器。
  2. 名称设置为 commits-to-release-branch
  3. 对于触发器类型,选择推送到分支
  4. 代码库列表中,选择您的 GitHub Salesforce 代码库。
  5. 分支(正则表达式) (Branch (regex)) 文本框中,输入以下表达式:

    ^release.*
    
  6. 对于构建配置,选择 Cloud Build 配置文件并输入 cloudbuild.yaml

  7. 替代变量下,创建三个变量。对于每个变量,执行以下操作:

    1. 点击添加一项
    2. 按下表中所列内容设置变量字段。

      变量
      _BUCKET_NAME 输入 Salesforce 密钥文件的存储桶名称,格式如下:

      salesforce-ref-PROJECT_ID

      PROJECT_ID 替换为 Google Cloud 项目的 ID。
      _CONSUMER_KEY 您在 Salesforce Dev Hub 组织中创建的关联应用中的使用方密钥。
      _SF_USERNAME Dev Hub 组织的 Salesforce 用户名。
  8. 点击保存

添加允许 Cloud Build 读取 Salesforce 密钥的权限

  • 在 Cloud Shell 中,向您的 Cloud Build 服务账号添加权限,以允许该账号从您创建的 Cloud Storage 存储分区中读取 Salesforce 密钥:

    gsutil iam ch serviceAccount:$GCP_PROJECT_NUMBER@cloudbuild.gserviceaccount.com:objectViewer \
        gs://salesforce-ref-${DEVSHELL_PROJECT_ID}
    

Salesforce 开发者的流水线设置任务

本部分中介绍的任务针对 Salesforce 开发者。

如果您执行了本教程上文针对管理员和负责人的部分中的步骤,请确保使用一组不同的凭据来运行本部分中的步骤。

Salesforce DX CLI 安装步骤可能会因使用的操作系统而异。本部分中的步骤介绍了 Debian Linux 的步骤。如需了解 macOS 和 Windows 的说明,请参阅 Salesforce 文档中的安装 Salesforce CLI

设置 Salesforce DX CLI

在本部分中,您将安装 Salesforce CLI 并为其设置授权。

  1. 在本地机器(而不是 Cloud Shell)中,转到主目录:

    cd $HOME
    
  2. 安装 xz-utilswget 工具:

    sudo apt-get install --assume-yes xz-utils wget
    
  3. 安装 Salesforce CLI:

    wget https://developer.salesforce.com/media/salesforce-cli/sfdx-linux-amd64.tar.xz
    
  4. 创建 sfdx 目录:

    mkdir sfdx
    
  5. 解压缩下载的 tar 文件:

    tar xJf sfdx-linux-amd64.tar.xz -C sfdx --strip-components 1
    
  6. 安装 CLI:

    ./sfdx/install
    

    Salesforce CLI 安装在 /usr/local/bin/sfdx 中。

  7. 验证 CLI 是否已正确设置:

    sfdx
    

    输出内容类似如下:

    VERSION
    sfdx-cli/7.8.1-8f830784cc linux-x64 node-v10.15.3
    
    USAGE
    $ sfdx [COMMAND]
    
    COMMANDS
    commands  list all the commands
    force     tools for the Salesforce developer
    help      display help for sfdx
    plugins   add/remove/create CLI plug-ins
    update    update the sfdx CLI
    which     show which plugin a command is in
    
    TOPICS
    Run help for each topic below to view subcommands
    
    commands  list all the commands
    force     tools for the Salesforce developer
    plugins   add/remove/create CLI plug-ins
    

将本地开发环境连接到 Salesforce Dev Hub 组织

  1. 在本地机器上,使用开发者角色的凭据登录 Salesforce 组织:

    sfdx force:auth:web:login --setalias YOUR_HUB_ORG
    

    YOUR_HUB_ORG 替换为您的 Dev Hub 组织的别名。

    此命令会在本地机器上打开网络浏览器,因此您无法在已连接的虚拟机上运行它。

克隆 GitHub 代码库

  1. 克隆您的 Salesforce 管理员创建的 GitHub 代码库:

    git clone DEV_REPO_NAME -o github
    
  2. 转到克隆的代码库的目录:

    cd DEV_REPO_NAME
    

将 Salesforce 代码库和元数据推送到暂存组织

在本部分中,您将代码库和元数据推送到暂存组织进行单元测试。

  1. 在本地机器上,将 Dev Hub 用户名导出到名为 SALESFORCE_USERNAME 的环境变量:

    export SALESFORCE_USERNAME=YOUR_DEVHUB_USERNAME
    

    YOUR_DEVHUB_USERNAME 替换为您之前设置的用户名。

  2. 创建一个暂存组织来测试您为本教程克隆的代码库:

    sfdx force:org:create \
        --setdefaultusername \
        --definitionfile config/project-scratch-def.json \
        --targetdevhubusername ${SALESFORCE_USERNAME} \
        --setalias feature-test-scratch-org
    
  3. 将元数据和代码推送到暂存组织:

    sfdx force:source:push
    
  4. 为暂存组织生成网址,然后在浏览器窗口中导航到该网址:

    sfdx force:org:open
    

通常,项目生命周期的下一步是运行单元测试并验证开发的功能。在本教程中您不需要这样做,因为您使用的是已预验证的示例代码。

将代码推送到源代码库

  1. 在本地机器上,创建一个名为 feature-1 的新分支:

    git checkout -b feature-1
    
  2. 将更改推送到源代码库:

    git add .
    git commit -m "Feature 1 changes"
    git push github feature-1
    

    在本教程中,您将 GitHub 用作源代码工具。

测试部署

此部分介绍用于验证创建的触发器是否正常运行的测试。Salesforce 管理员创建的代码库包含一个示例测试类。

  1. 在本地机器(而不是 Cloud Shell)中,创建一个新的 Gitit 分支:

    git checkout -b feature-1
    
  2. 使用文本编辑器打开以下文件:

    ./force-app/main/default/classes/SampleTest.cls
    
  3. 要使测试失败,请在 System.assertEquals 语句中将值 101 更改为 102。进行更改后保存文件,但使其保持打开状态,因为您稍后会再次更改它。

    @isTest
    public class SampleTest {
    static testmethod void testAddOne() {
        Test.startTest();
        System.assertEquals(Sample.addOne(100), 102); // Change to 102 from 101
        Test.stopTest();
      }
    }
    
  4. 将更改添加并提交到功能分支:

    git add .
    git commit -m "Changed test case"
    git push github feature-1
    
  5. 创建拉取请求,以将代码合并到版本示例分支。

    一个新的 Cloud Build 作业会被触发。但是,由于单元测试失败,因此作业失败。

  6. 如需查看构建的状态,请打开 Cloud Build 页面。

    转到 Cloud Build 页面

  7. 转到 Cloud Build 页面的历史记录部分。

    您会看到此作业的以下构建日志,其中显示测试断言失败。

    Step #4: not ok 1 SampleTest.testAddOne
    Step #4: # System.AssertException: Assertion Failed: Expected: 101, Actual: 102
    Step #4: # Class.SampleTest.testAddOne: line 24, column 1
    Step #4: # Run "sfdx force:apex:test:report -i 7076300001gEzne --resultformat <format>" to retrieve test results in a different format.
    [. . .]
    Finished Step #4
    ERROR
    ERROR: build step 4 "gcr.io/serverless-devops-sf/salesforcedx-base-image:1" failed: step exited with non-zero status: 100
    
  8. 要使测试通过,请在 ./force-app/main/default/classes/SampleTest.cls 文件中将值 102 更改回 101

    @isTest
    public class SampleTest {
    static testmethod void testAddOne() {
        Test.startTest();
        System.assertEquals(Sample.addOne(100), 101); //Change back to 101 from 102
        Test.stopTest();
      }
    }
    
  9. 将更改添加并提交到功能分支:

    git add .
    git commit -m "Changed test case to make it pass"
    git push github feature-1
    

    提交操作会触发 Cloud Build 作业。

  10. 作业完成后,审核 GitHub 中的拉取请求并将其合并到 release-sample 分支。

    在生产工作流中,通常仅 DevOps 负责人和管理员拥有合并拉取请求的权限。如需详细了解如何进行此设置,请参阅 GitHub 网站上的定义拉取请求的可合并性

  11. 在 Google Cloud 控制台中,查看在将拉取请求合并到版本示例分支时自动触发的 Cloud Build 作业。

  12. 作业完成后,登录 Dev Hub 组织。您可以以开发者或管理员的身份登录。

    此 Salesforce 组织中提供开发者的代码修改。如需进行查看,请转到 Setup 页面,然后在 Custom Code/Apex classes 下查找。

清理

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

删除项目

  1. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

删除 Salesforce 资源

您也可以删除为本教程创建的 Salesforce Developer Edition 组织和关联的暂存组织。

停用您的 Developer Edition 组织

  1. 转到 Salesforce Dev Hub 组织。
  2. 在 Setup 中的 Quick Find 框中,输入 Company,然后选择 Company Information
  3. 点击 Company Information(公司信息)。
  4. 点击 Deactivate Org(停用组织)按钮。

    停用组织的 Salesforce 页面。

删除暂存组织

  • 在 Cloud Shell 中,运行以下命令来删除 Salesforce 暂存组织:

    sfdx force:org:delete -u feature-test-scratch-org
    

删除 GitHub 代码库

转到 GitHub,然后删除您在个人账号中为本教程创建的代码库。

后续步骤

如需查看更多参考架构、图表和最佳实践,请浏览云架构中心