

亚马逊 CodeCatalyst 不再向新买家开放。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [如何从中迁移 CodeCatalyst](migration.md)。

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

# 教程：从程序包存储库中拉取
<a name="packages-tutorial"></a>

在本教程中，您将学习如何创建工作流程，该工作流程运行依赖项从[CodeCatalyst 包存储库](packages-concepts.md#packages-concepts-repository)中提取的应用程序。该应用程序是一个简单的 Node.js 应用程序，可在日志中输出 “Hello World” 消息。 CodeCatalyst 该应用程序具有一个依赖项：[lodash](https://www.npmjs.com/package/lodash) npm 程序包。`lodash` 程序包用于将 `hello-world` 字符串转换为 `Hello World`。您将使用此程序包的 4.17.20 版本。

设置应用程序和工作流程后，您可以配置 CodeCatalyst 为阻止其他版本`lodash`从公共外部注册表 ([npmj](https://www.npmjs.com/) s.com) 导入 CodeCatalyst 软件包存储库。之后，您可以测试是否已成功阻止其他版本的 `lodash`。

在本教程结束时，您应该对工作流程如何与内部和外部 CodeCatalyst的软件包存储库进行交互以检索软件包有了很好的了解。你还应该了解 npm、你的包存储库、你的工作流程和你的应用程序`package.json`文件之间发生的 behind-the-scenes交互。

**Topics**
+ [先决条件](#packages-tutorial-prereqs)
+ [步骤 1：创建源存储库](#packages-tutorial-source-repo)
+ [步骤 2：创建 CodeCatalyst 和网关软件包存储库](#packages-tutorial-package-repo)
+ [步骤 3：创建“Hello World”应用程序](#packages-tutorial-create-app)
+ [步骤 4：创建运行“Hello World”的工作流](#packages-tutorial-create-workflow)
+ [步骤 5：验证工作流](#packages-tutorial-verify)
+ [步骤 6：阻止来自 npmjs.com 的导入](#packages-tutorial-block)
+ [步骤 7：测试阻止功能](#packages-tutorial-test-block)
+ [清理](#packages-tutorial-cleanup)

## 先决条件
<a name="packages-tutorial-prereqs"></a>

开始前的准备工作：
+ 你需要一个 CodeCatalyst **空间**。有关更多信息，请参阅 [创建空间](spaces-create.md)。
+ 在你的 CodeCatalyst 空间里，你需要一个名为：

  ```
  codecatalyst-package-project
  ```

  使用**从头开始**选项来创建此项目。

  有关更多信息，请参阅 [在 Amazon 中创建一个空项目 CodeCatalyst](projects-create.md#projects-create-empty)。

## 步骤 1：创建源存储库
<a name="packages-tutorial-source-repo"></a>

在此步骤中，您将在中创建源存储库 CodeCatalyst。此存储库将存储教程的源文件，例如 `index.js` 和 `package.json` 文件。

有关源存储库的更多信息，请参阅[创建源存储库](source-repositories-create.md)。

**创建源存储库**

1. 打开 CodeCatalyst 控制台，[网址为 https://codecatalyst.aws/](https://codecatalyst.aws/)。

1. 导航到您的项目 `codecatalyst-package-project`。

1. 在导航窗格中，选择**代码**，然后选择**源存储库**。

1. 选择**添加存储库**，然后选择**创建存储库**。

1. 在**存储库名称**中，输入：

   ```
   hello-world-app
   ```

1. 选择**创建**。

## 步骤 2：创建 CodeCatalyst 和网关软件包存储库
<a name="packages-tutorial-package-repo"></a>

在此步骤中，您将在 CodeCatalyst 项目中创建包存储库，并将其连接到网关存储库（也包括在您的 CodeCatalyst 项目中）。稍后，您将本教程中的依赖项 `lodash` 从 npmjs.com 导入到这两个存储库中。

网关存储库是将你的软件包存储库连接到公共 npmjs.co CodeCatalyst m 的 “粘合剂”。

有关程序包存储库的更多信息，请参阅[在中发布和共享软件包 CodeCatalyst](packages.md)。

**注意**  
本教程使用*CodeCatalyst 软件包存储库*和*网关存储库*这两个术语来指您在以下过程中创建 CodeCatalyst 的两个存储库。

**创建 CodeCatalyst 软件包和网关存储库**

1. 在导航窗格中，选择**程序包**。

1. 选择**创建程序包存储库**。

1. 在**存储库名称**中，输入：

   ```
   codecatalyst-package-repository
   ```

1. 选择 **\$1 选择上游存储库**。

1. 选择**网关存储库**。

1. 在**npm-public-registry-gateway**框中，选择**创建**。

1. 选定**选择**。

1. 选择**创建**。

   CodeCatalyst 创建名为的软件包存储库`codecatalyst-package-repository`，该存储库已连接到网关存储库。网关存储库将连接到 npmjs.com 注册表。

## 步骤 3：创建“Hello World”应用程序
<a name="packages-tutorial-create-app"></a>

在此步骤中，您将创建一个 “Hello World” Node.js 应用程序并将其依赖关系 (`lodash`) 导入网关和 CodeCatalyst 软件包存储库。

要创建该应用程序，您需要一台安装了 Node.js 和相关 `npm` 客户端的开发机器。

本教程假设您将使用 CodeCatalyst 开发环境作为开发机器。尽管你不必使用 CodeCatalyst 开发环境，但还是推荐使用它，因为它提供了一个干净的工作环境，`npm`预装了 Node.js，而且在你完成本教程后很容易删除。有关 CodeCatalyst 开发环境的更多信息，请参阅[创建开发环境](devenvironment-create.md)。

按照以下说明启动 CodeCatalyst 开发环境并使用它来创建 “Hello World” 应用程序。

**启动 CodeCatalyst 开发环境**

1. 在导航窗格中，选择**代码**，然后选择**开发环境**。

1. 在顶部附近，选择**创建开发环境**，然后选择 **AWS Cloud9 (在浏览器中)**。

1. 确保**存储库**设置为 `hello-world-app`，并且**现有分支**设置为 `main`。选择**创建**。

   您的开发环境将在新的浏览器标签页中启动，并且您的存储库（`hello-world-app`）将克隆到其中。

1. 让两个 CodeCatalyst 浏览器选项卡保持打开状态，然后转到下一个步骤。

**创建“Hello World”Node.js 应用程序**

1. 转到您的开发环境。

1. 在终端提示符下，更改为 `hello-world-app` 源存储库根目录：

   ```
   cd hello-world-app
   ```

1. 初始化一个 Node.js 项目：

   ```
   npm init -y
   ```

   初始化过程将在 `hello-world-app` 的根目录中创建一个 `package.json` 文件。

1. 将开发环境中的 npm 客户端连接到你的 CodeCatalyst 包存储库：

   1. 切换到 CodeCatalyst 控制台。

   1. 在导航窗格中，选择**程序包**。

   1. 选择 `codecatalyst-package-repository`。

   1. 选择**连接到存储库**。

   1. 选择**创建令牌**。这将为您创建个人访问令牌（PAT）。

   1. 选择**复制**以复制命令。

   1. 切换到您的开发环境。

   1. 确保您位于 `hello-world-app` 目录中。

   1. 粘贴命令。其内容与以下内容类似：

      ```
      npm set registry=https://packages.us-west-2.codecatalyst.aws/npm/ExampleCompany/codecatalyst-package-project/codecatalyst-package-repository/ --location project
      npm set //packages.us-west-2.codecatalyst.aws/npm/ExampleCompany/codecatalyst-package-project/hello-world-app/:_authToken=username:token-secret
      ```

1. 导入 `lodash` 版本 4.17.20：

   ```
   npm install lodash@v4.17.20 --save --save-exact
   ```

   npm 按以下顺序在以下位置查找 `lodash` 版本 4.17.20：
   + 在开发环境中。它在该位置找不到此版本。
   + 在 CodeCatalyst 软件包存储库中。它在该位置找不到此版本。
   + 在网关存储库中。它在该位置找不到此版本。
   + 在 npmjs.com 中。它在该位置找到此版本。

   npm 导`lodash`入到网关存储库、 CodeCatalyst 软件包存储库和开发环境中。
**注意**  
如果你在第 4 步中没有将 npm 客户端连接到你的 CodeCatalyst 软件包存储库，那么 npm 本来可以`lodash`直接从 npmjs.com 中提取并且不会将包导入到任何一个存储库中。

   npm 还使用 `lodash` 依赖项更新 `package.json` 文件，并创建一个包含 `lodash` 其所有依赖项的 `node_modules` 目录。

1. 测试是否已将 `lodash` 成功导入开发环境中。输入：

   ```
   npm list
   ```

   这将显示以下消息，表示已成功导入：

   ```
   `-- lodash@4.17.20
   ```

1. （可选）打开`hello-world-app/package.json`并验证中的行是否***red bold***已添加：

   ```
   {
     "name": "hello-world-app",
     "version": "1.0.0",
     "description": "",
     "main": "index.js",
     "scripts": {
       "test": "echo \"Error: no test specified\" && exit 1"
     },
     "keywords": [],
     "author": "",
     "license": "ISC",
     dependencies": {
       "lodash": "4.17.20"
     }
   }
   ```

1. 在 `/hello-world-app` 中，创建一个名为 `index.js` 的包含以下内容的文件：
**提示**  
您可以使用开发环境中的侧面导航来创建此文件。

   ```
   // Importing lodash library
   const _ = require('lodash');
   
   // Input string
   const inputString = 'hello-world';
   
   // Transforming the string using lodash
   const transformedString = _.startCase(inputString.replace('-', ' '));
   
   // Outputting the transformed string to the console
   console.log(transformedString);
   ```

**测试 “lodash” 是否已导入到您的网关和 CodeCatalyst 软件包存储库中**

1. 切换到 CodeCatalyst 控制台。

1. 在导航窗格中，选择**程序包**。

1. 选择 **npm-public-registry-gateway**。

1. 确保已显示 `lodash`。**最新版本**列指示 `4.17.20`。

1. 对 `codecatalyst-package-repository` 重复此过程。您可能需要刷新浏览器窗口才能看到已导入的程序包。

**在开发环境中测试“Hello World”**

1. 切换到您的开发环境。

1. 确保您仍在 `hello-world-app` 目录中，然后运行应用程序：

   ```
   node index.js
   ```

   这将显示 `Hello World` 消息。Node.js 使用您在上一步中下载到开发环境的 `lodash` 程序包运行应用程序。

**忽略“node\$1modules”目录并提交“Hello World”**

1. 忽略 `node_modules` 目录。输入：

   ```
   echo "node_modules/" >> .gitignore
   ```

   最佳实践是避免提交此目录。此外，提交此目录会干扰本教程中的后续步骤。

1. 添加、提交和推送：

   ```
   git add .
   git commit -m "add the Hello World application"
   git push
   ```

   “Hello World”应用程序和项目文件将添加到源存储库中。

## 步骤 4：创建运行“Hello World”的工作流
<a name="packages-tutorial-create-workflow"></a>

在此步骤中，您将创建一个使用 `lodash` 依赖项运行“Hello World”应用程序的工作流。该工作流包含一个名为 `RunHelloWorldApp` 的*操作*或任务。`RunHelloWorldApp` 操作包括以下值得注意的命令和部分：
+ **`Packages`**

  此部分指出了操作在运行时必须连接到的 CodeCatalyst 包存储库的名称`npm install`。
+ **`- Run: npm install`** 

  此命令告知 npm 安装 `package.json` 文件中指定的依赖项。`package.json` 文件中指定的唯一依赖项是 `lodash`。npm 会在以下位置查找 `lodash`：
  + 在运行该操作的 Docker 映像中。它在该位置找不到此版本。
  + 在 CodeCatalyst 软件包存储库中。它在该位置找到此版本。

  npm 在找到 `lodash` 后，会将它导入到运行该操作的 Docker 映像中。
+ **`- Run: npm list`**

  此命令会打印出已下载到运行该操作的 Docker 映像的 `lodash` 的版本。
+ **`- Run: node index.js`**

  此命令使用 `package.json` 文件中指定的依赖项运行“Hello World”应用程序。

请注意，`RunHelloWorldApp` 操作是一个构建操作，如工作流顶部附近的 `aws/build@v1` 标识符所示。有关构建操作的更多信息，请参阅[使用工作流进行构建](build-workflow-actions.md)。

按照以下说明创建工作流程，从 CodeCatalyst 软件包存储库中提取`lodash`依赖关系，然后运行 “Hello World” 应用程序。

**创建工作流**

1. 切换到 CodeCatalyst 控制台。

1. 在导航窗格中，选择 **CI/CD**，然后选择**工作流**。

1. 选择**创建工作流**。

1. 对于**源存储库**，选择 `hello-world-app`。

1. 对于**分支**，选择 `main`。

   这将在选定的源存储库和分支中创建工作流定义文件。

1. 选择**创建**。

1. 在顶部附近选择 **YAML**。

1. 删除 YAML 示例代码。

1. 添加以下 YAML 代码：

   ```
   Name: codecatalyst-package-workflow
   SchemaVersion: "1.0"
   
   # Required - Define action configurations.
   Actions:
     RunHelloWorldApp:
       # Identifies the action. Do not modify this value.
       Identifier: aws/build@v1
       Compute:
         Type: Lambda
       Inputs:
         Sources:
           - WorkflowSource # This specifies your source repository. 
       Configuration:
         Steps:
           - Run: npm install
           - Run: npm list
           - Run: node index.js
         Container: # This specifies the Docker image that runs the action.
           Registry: CODECATALYST
           Image: CodeCatalystLinuxLambda_x86_64:2024_03
       Packages:
         NpmConfiguration:
           PackageRegistries:
             - PackagesRepository: codecatalyst-package-repository
   ```

   在前面的代码中，*codecatalyst-package-repository*替换为您在中创建的 CodeCatalyst 软件包存储库的名称[步骤 2：创建 CodeCatalyst 和网关软件包存储库](#packages-tutorial-package-repo)。

   有关此文件中的属性的信息，请参阅[构建和测试操作 YAML](build-action-ref.md)。

1. （可选）选择**验证**，确保 YAML 代码在提交之前有效。

1. 选择**提交**。

1. 在**提交工作流**对话框中，输入以下内容：

   1. 对于**工作流文件名**，保留默认值 `codecatalyst-package-workflow`。

   1. 对于**提交消息**，输入：

      ```
      add initial workflow file
      ```

   1. 对于**存储库**，选择 **hello-world-app**。

   1. 对于**分支名称**，选择**主**。

   1. 选择**提交**。

   现在，您已创建工作流。

**运行工作流**

1. 在您刚刚创建的工作流（`codecatalyst-package-workflow`）旁边，选择**操作**，然后选择**运行**。

   工作流运行将开始。

1. 在右侧顶部的绿色通知中，选择运行的链接。该链接看起来类似于 `View Run-1234`。

   此时将出现一个工作流程图，显示谁启动了运行和**RunHelloWorldApp**操作。

1. 选择**RunHelloWorldApp**操作框以查看操作的进度。

1. 运行完成后，转至[步骤 5：验证工作流](#packages-tutorial-verify)。

## 步骤 5：验证工作流
<a name="packages-tutorial-verify"></a>

在此步骤中，您将验证工作流是否已使用其 `lodash` 依赖项成功运行“Hello World”应用程序。

**验证“Hello World”应用程序是否已使用其依赖项运行**

1. 在工作流程图中，选中该**RunHelloWorldApp**复选框。

   这将显示日志消息列表。

1. 展开 `node index.js` 日志消息。

   这将显示以下消息：

   ```
   [Container] 2024/04/24 21:15:41.545650 Running command node index.js
   Hello World
   ```

   显示 `Hello Word`（而不是 `hello-world`）指明已成功使用 `lodash` 依赖项。

1. 展开 `npm list` 日志。

   这将显示一条与以下内容类似的消息：

   ```
   └── lodash@4.17.20
   ```

   此消息指示 `lodash` 版本 4.17.20 已下载到运行工作流操作的 Docker 映像。

## 步骤 6：阻止来自 npmjs.com 的导入
<a name="packages-tutorial-block"></a>

 现在 4.17.20 `lodash` 版本已存在于您的网关和 CodeCatalyst软件包存储库中，您可以阻止其他版本的导入。阻止可防止您意外导入可能包含恶意代码的更高（或更早）版本的 `lodash`。有关更多信息，请参阅[编辑程序包来源控制](package-origin-controls.md)和[依赖项替换攻击](package-origin-controls.md#dependency-substitution-attacks)。

按照以下说明操作，阻止将 `lodash` 导入到网关存储库中。当您在网关上阻止程序包时，它们也会在下游位置被阻止。

**阻止导入到网关存储库**

1. 在导航窗格中，选择**程序包**。

1. 选择 **npm-publish-registry-gateway**。

1. 选择 `lodash`。

1. 在顶部附近，选择**源控制**。

1. 在**上游**下，选择**阻止**。

1. 选择**保存**。

   现在，您已阻止从 npmjs.com 导入网关存储库（以及下游存储库和计算机）中。

## 步骤 7：测试阻止功能
<a name="packages-tutorial-test-block"></a>

在此部分中，您将验证您在 [步骤 6：阻止来自 npmjs.com 的导入](#packages-tutorial-block) 中设置的阻止是否有效。首先，将“Hello World”配置为 `lodash` 的请求版本 4.17.2**1**，而不是网关存储库中可用的版本，即 4.17.2**0**。然后，检查应用程序是否无法从 nmpjs.com 中拉取版本 4.17.21，这表示已成功阻止。作为最终测试，您需要解除阻止导入到网关存储库，并检查应用程序是否能成功拉取 `lodash` 的版本 4.17.21。

使用以下一组过程来测试阻止功能。

**开始前的准备工作**

1. 切换到您的开发环境。

1. 提取您之前使用 CodeCatalyst 控制台创建的`codecatalyst-package-workflow.yaml`文件：

   ```
   git pull
   ```

**将“Hello World”配置为“lodash”的请求版本 4.17.21**

1. 打开 `/hello-world-app/package.json`。

1. 将`lodash`版本更改为 4.17.21，如所示：***red bold***

   ```
   {
     "name": "hello-world-app",
     "version": "1.0.0",
     "description": "",
     "main": "index.js",
     "scripts": {
       "test": "echo \"Error: no test specified\" && exit 1"
     },
     "keywords": [],
     "author": "",
     "license": "ISC",
     "dependencies": {
       "lodash": "4.17.21"
     }
   }
   ```

   现在，`package.json`文件中的版本 (4.17.21) 与网关和 CodeCatalyst 软件包存储库中的版本 (4.17.20) 不匹配。

1. 添加、提交和推送：

   ```
   git add .
   git commit -m "update package.json to use lodash 4.17.21"
   git push
   ```

**测试“Hello World”是否无法拉取“lodash”的版本 4.17.21**

1. 在版本不匹配的情况下运行工作流：

   1. 切换到 CodeCatalyst 控制台。

   1. 在导航窗格中，选择 **CI/CD**，然后选择**工作流**。

   1. 在 `codecatalyst-package-workflow` 旁边，选择**操作**，然后选择**运行**。

      npm 会在 `package.json` 中查找依赖项，并看到“Hello World”需要 `lodash` 的版本 4.17.21。npm 按以下顺序在以下位置查找依赖项：
      + 在运行该操作的 Docker 映像中。它在该位置找不到此版本。
      + 在 CodeCatalyst 软件包存储库中。它在该位置找不到此版本。
      + 在网关存储库中。它在该位置找不到此版本。
      + 在 npmjs.com 中。它在该位置找到此版本。

      npm 在 npmjs.com 中找到版本 4.17.21 后，会尝试将它导入网关存储库中，但由于您将网关设置为阻止导入 `lodash`，因此无法执行导入。

      由于无法执行导入，因此工作流将失败。

1. 验证工作流是否已失败：

   1. 在右侧顶部的绿色通知中，选择运行的链接。该链接看起来类似于 `View Run-2345`。

   1. 在工作流程图中，选中该**RunHelloWorldApp**复选框。

   1. 展开 `npm install` 日志消息。

      这将显示以下消息：

      ```
      [Container] 2024/04/25 17:20:34.995591 Running command npm install
      npm ERR! code ETARGET
      npm ERR! notarget No matching version found for lodash@4.17.21.
      npm ERR! notarget In most cases you or one of your dependencies are requesting
      npm ERR! notarget a package version that doesn't exist.
      
      npm ERR! A complete log of this run can be found in: /tmp/.npm/_logs/2024-05-08T22_03_26_493Z-debug-0.log
      ```

      该错误表明找不到版本 4.17.21。这是预期结果，因为您已阻止导入。

**解除阻止来自 npmjs.com 的导入**

1. 在导航窗格中，选择**程序包**。

1. 选择 **npm-publish-registry-gateway**。

1. 选择 `lodash`。

1. 在顶部附近，选择**源控制**。

1. 在**上游**下，选择**允许**。

1. 选择**保存**。

   您现在已解除阻止导入 `lodash`。

   您的工作流现在可以导入 `lodash` 的版本 4.17.21。

**测试是否已解除阻止来自 npmjs.com 的导入**

1. 再次运行工作流。这次工作流应成功，因为现在应已能够导入版本 4.17.21。要再次运行工作流，请执行以下操作：

   1. 选择 **CI/CD**，然后选择**工作流**。

   1. 在 `codecatalyst-package-workflow` 旁边，选择**操作**，然后选择**运行**。

   1. 在右侧顶部的绿色通知中，选择运行的链接。该链接看起来类似于 `View Run-3456`。

      此时将出现一个工作流程图，显示谁启动了运行和**RunHelloWorldApp**操作。

   1. 选择**RunHelloWorldApp**操作框以查看操作的进度。

   1. 展开 `npm list` 日志消息，验证是否显示与以下内容类似的消息：

      ```
      └── lodash@4.17.21
      ```

      此消息指示已下载 `lodash` 版本 4.17.21。

1. 验证版本 4.17.21 是否已导入到您的 CodeCatalyst 和网关存储库中：

   1. 在导航窗格中，选择**程序包**。

   1. 选择 **npm-public-registry-gateway**。

   1. 查找 `lodash` 并确保版本为 `4.17.21`。
**注意**  
虽然此页面上未列出版本 4.17.20，但您可以通过选择 `lodash`，然后选择顶部附近的**版本**来找到该版本。

   1. 重复这些步骤以检查是否已将版本 4.17.21 导入 `codecatalyst-package-repository`。

## 清理
<a name="packages-tutorial-cleanup"></a>

清理本教程中使用的文件和服务以免被收取费用。

**清理程序包教程**

1. 删除 `codecatalyst-package-project`：

   1. 在 CodeCatalyst 控制台中，如果您尚未进入该`codecatalyst-package-project`项目，请转到该项目。

   1. 在导航窗格中，选择**项目设置**。

   1. 选择**删除项目**，输入 **delete**，然后选择**删除项目**。

      CodeCatalyst 删除所有项目资源，包括源存储库、网关存储库和 CodeCatalyst包存储库。也将删除开发环境。

1. 删除 PAT 令牌：

   1. 在右侧选择您的用户名，然后选择**我的设置**。

   1. 在**个人访问令牌**下，选择您在本教程中创建的令牌，然后选择**删除**。

在本教程中，您学习了如何创建一个工作流程，该工作流程运行从 CodeCatalyst 包存储库中提取其依赖关系的应用程序。您还学习了如何阻止和取消阻止软件包进入网关和 CodeCatalyst 软件包存储库。