教程:从程序包存储库中拉取 - Amazon CodeCatalyst

教程:从程序包存储库中拉取

在本教程中,您将了解如何创建工作流,该工作流运行的应用程序的依赖项是从 CodeCatalyst 程序包存储库中拉取的。该应用程序是一个简单的 Node.js 应用程序,它向 CodeCatalyst 日志打印 “Hello World” 消息。该应用程序具有一个依赖项:lodash npm 程序包。lodash 程序包用于将 hello-world 字符串转换为 Hello World。您将使用此程序包的 4.17.20 版本。

设置应用程序和工作流后,您可以将 CodeCatalyst 配置为阻止其他版本的 lodash 从公共外部注册表(npmjs.com)导入 CodeCatalyst 程序包存储库中。之后,您可以测试是否已成功阻止其他版本的 lodash

在本教程结束时,您应已清楚地了解工作流如何与 CodeCatalyst 内部和外部的程序包存储库进行交互来检索程序包。您还应了解 npm、程序包存储库、工作流和应用程序的 package.json 文件之间进行的后台交互。

先决条件

开始前的准备工作:

  • 您需要一个 CodeCatalyst 空间。有关更多信息,请参阅创建空间

  • 在您的 CodeCatalyst 空间中,您需要一个空项目,其名称为:

    codecatalyst-package-project

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

    有关更多信息,请参阅在 Amazon CodeCatalyst 中创建空项目

步骤 1:创建源存储库

在此步骤中,您将在 CodeCatalyst 中创建源存储库。此存储库将存储教程的源文件,例如 index.jspackage.json 文件。

有关源存储库的更多信息,请参阅创建源存储库

创建源存储库
  1. 通过访问 https://codecatalyst.aws/ 打开 CodeCatalyst 控制台。

  2. 导航到您的项目 codecatalyst-package-project

  3. 在导航窗格中,选择代码,然后选择源存储库

  4. 选择添加存储库,然后选择创建存储库

  5. 存储库名称中,输入:

    hello-world-app
  6. 选择创建

步骤 2:创建 CodeCatalyst 和网关程序包存储库

在此步骤中,您将在 CodeCatalyst 项目中创建一个程序包存储库,然后将它连接到该 CodeCatalyst 项目中的网关存储库。稍后,您将本教程中的依赖项 lodash 从 npmjs.com 导入到这两个存储库中。

网关存储库是将 CodeCatalyst 中的程序包存储库连接到公共 npmjs.com 的“胶粘剂”。

有关程序包存储库的更多信息,请参阅在 CodeCatalyst 中发布和共享软件包

注意

在本教程中,CodeCatalyst 程序包存储库网关存储库这两个词是指您在以下过程中在 CodeCatalyst 中创建的两个存储库。

创建 CodeCatalyst 程序包和网关存储库
  1. 在导航窗格中,选择程序包

  2. 选择创建程序包存储库

  3. 存储库名称中,输入:

    codecatalyst-package-repository
  4. 选择 + 选择上游存储库

  5. 选择网关存储库

  6. npm-public-registry-gateway 框中,选择创建

  7. 选定选择

  8. 选择创建

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

步骤 3:创建“Hello World”应用程序

在此步骤中,您创建一个“Hello World”应用程序并将其依赖项(lodash)导入网关和 CodeCatalyst 程序包存储库。

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

本教程假定您将 CodeCatalyst 开发环境用作开发机器。虽然您不必使用 CodeCatalyst 开发环境,但建议您使用该开发环境,因为它提供了一个干净的工作环境,预安装了 Node.js 和 npm,并且可让您在完成本教程后轻松删除。有关 CodeCatalyst 开发环境的更多信息,请参阅创建开发环境

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

启动 CodeCatalyst 开发环境
  1. 在导航窗格中,选择代码,然后选择开发环境

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

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

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

  4. 将 CodeCatalyst 浏览器标签页保持打开状态,然后转到下一个过程。

创建“Hello World”Node.js 应用程序
  1. 转到您的开发环境。

  2. 在终端提示符下,更改为 hello-world-app 源存储库根目录:

    cd hello-world-app
  3. 初始化一个 Node.js 项目:

    npm init -y

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

  4. 将开发环境中的 npm 客户端连接到 CodeCatalyst 程序包存储库:

    1. 切换到 CodeCatalyst 控制台。

    2. 在导航窗格中,选择程序包

    3. 选择 codecatalyst-package-repository

    4. 选择连接到存储库

    5. 选择创建令牌。这将为您创建个人访问令牌(PAT)。

    6. 选择复制以复制命令。

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

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

    9. 粘贴命令。其内容与以下内容类似:

      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
  5. 导入 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 应已直接从 npmjs.com 中拉取 lodash,并且不会将程序包导入任一存储库。

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

  6. 测试是否已将 lodash 成功导入开发环境中。输入:

    npm list

    这将显示以下消息,表示已成功导入:

    `-- lodash@4.17.20
  7. (可选)打开 hello-world-app/package.json 并验证是否添加了红色粗体行:

    { "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" } }
  8. /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 控制台。

  2. 在导航窗格中,选择程序包

  3. 选择 npm-public-registry-gateway

  4. 确保已显示 lodash最新版本列指示 4.17.20

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

在开发环境中测试“Hello World”
  1. 切换到您的开发环境。

  2. 确保您仍在 hello-world-app 目录中,然后运行应用程序:

    node index.js

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

忽略“node_modules”目录并提交“Hello World”
  1. 忽略 node_modules 目录。输入:

    echo "node_modules/" >> .gitignore

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

  2. 添加、提交和推送:

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

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

步骤 4:创建运行“Hello World”的工作流

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

  • Packages

    此部分指出该操作在运行 npm install 时必须连接到的 CodeCatalyst 程序包存储库的名称。

  • - 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 标识符所示。有关构建操作的更多信息,请参阅使用工作流进行构建

按照以下说明操作来创建一个工作流,该工作流从 CodeCatalyst 程序包存储库中拉取 lodash 依赖项,然后运行“Hello World”应用程序。

创建工作流
  1. 切换到 CodeCatalyst 控制台。

  2. 在导航窗格中,选择 CI/CD,然后选择工作流

  3. 选择创建工作流

  4. 对于源存储库,选择 hello-world-app

  5. 对于分支,选择 main

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

  6. 选择创建

  7. 在顶部附近选择 YAML

  8. 删除 YAML 示例代码。

  9. 添加以下 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 替换为您在步骤 2:创建 CodeCatalyst 和网关程序包存储库中创建的 CodeCatalyst 程序包存储库的名称。

    有关此文件中的属性的信息,请参阅构建和测试操作 YAML

  10. (可选)选择验证,确保 YAML 代码在提交之前有效。

  11. 选择提交

  12. 提交工作流对话框中,输入以下内容:

    1. 对于工作流文件名,保留默认值 codecatalyst-package-workflow

    2. 对于提交消息,输入:

      add initial workflow file
    3. 对于存储库,选择 hello-world-app

    4. 对于分支名称,选择

    5. 选择提交

    现在,您已创建工作流。

运行工作流
  1. 在您刚刚创建的工作流(codecatalyst-package-workflow)旁边,选择操作,然后选择运行

    工作流运行将开始。

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

    这将显示一个工作流图表,其中显示谁启动了运行和 RunHelloWorldApp 操作。

  3. 选中 RunHelloWorldApp 操作框以查看操作的进度。

  4. 运行完成后,转至步骤 5:验证工作流

步骤 5:验证工作流

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

验证“Hello World”应用程序是否已使用其依赖项运行
  1. 在工作流图表中,选中 RunHelloWorldApp 框。

    这将显示日志消息列表。

  2. 展开 node index.js 日志消息。

    这将显示以下消息:

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

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

  3. 展开 npm list 日志。

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

    └── lodash@4.17.20

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

步骤 6:阻止来自 npmjs.com 的导入

现在,lodash 版本 4.17.20 已存在于网关和 CodeCatalyst 程序包存储库中,您可以阻止其他版本的导入。阻止可防止您意外导入可能包含恶意代码的更高(或更早)版本的 lodash。有关更多信息,请参阅编辑程序包来源控制依赖项替换攻击

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

阻止导入到网关存储库
  1. 在导航窗格中,选择程序包

  2. 选择 npm-publish-registry-gateway

  3. 选择 lodash

  4. 在顶部附近,选择源控制

  5. 上游下,选择阻止

  6. 选择保存

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

步骤 7:测试阻止功能

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

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

开始前的准备工作
  1. 切换到您的开发环境。

  2. 拉取您之前使用 CodeCatalyst 控制台创建的 codecatalyst-package-workflow.yaml 文件:

    git pull
将“Hello World”配置为“lodash”的请求版本 4.17.21
  1. 打开 /hello-world-app/package.json

  2. lodash 版本更改为 4.17.21,如红色粗体所示:

    { "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)不匹配。

  3. 添加、提交和推送:

    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 控制台。

    2. 在导航窗格中,选择 CI/CD,然后选择工作流

    3. codecatalyst-package-workflow 旁边,选择操作,然后选择运行

      npm 会在 package.json 中查找依赖项,并看到“Hello World”需要 lodash 的版本 4.17.21。npm 按以下顺序在以下位置查找依赖项:

      • 在运行该操作的 Docker 映像中。它在该位置找不到此版本。

      • 在 CodeCatalyst 程序包存储库中。它在该位置找不到此版本。

      • 在网关存储库中。它在该位置找不到此版本。

      • 在 npmjs.com 中。它在该位置找到此版本。

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

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

  2. 验证工作流是否已失败:

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

    2. 在工作流图表中,选中 RunHelloWorldApp 框。

    3. 展开 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. 在导航窗格中,选择程序包

  2. 选择 npm-publish-registry-gateway

  3. 选择 lodash

  4. 在顶部附近,选择源控制

  5. 上游下,选择允许

  6. 选择保存

    您现在已解除阻止导入 lodash

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

测试是否已解除阻止来自 npmjs.com 的导入
  1. 再次运行工作流。这次工作流应成功,因为现在应已能够导入版本 4.17.21。要再次运行工作流,请执行以下操作:

    1. 选择 CI/CD,然后选择工作流

    2. codecatalyst-package-workflow 旁边,选择操作,然后选择运行

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

      这将显示一个工作流图表,其中显示谁启动了运行和 RunHelloWorldApp 操作。

    4. 选中 RunHelloWorldApp 操作框以查看操作的进度。

    5. 展开 npm list 日志消息,验证是否显示与以下内容类似的消息:

      └── lodash@4.17.21

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

  2. 验证版本 4.17.21 是否已导入 CodeCatalyst 和网关存储库中:

    1. 在导航窗格中,选择程序包

    2. 选择 npm-public-registry-gateway

    3. 查找 lodash 并确保版本为 4.17.21

      注意

      虽然此页面上未列出版本 4.17.20,但您可以通过选择 lodash,然后选择顶部附近的版本来找到该版本。

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

清理

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

清理程序包教程
  1. 删除 codecatalyst-package-project

    1. 在 CodeCatalyst 控制台中,导航到 codecatalyst-package-project 项目(如果您尚未这样做)。

    2. 在导航窗格中,选择项目设置

    3. 选择删除项目,输入 delete,然后选择删除项目

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

  2. 删除 PAT 令牌:

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

    2. 个人访问令牌下,选择您在本教程中创建的令牌,然后选择删除

在本教程中,您已了解如何创建工作流,该工作流运行的应用程序将从 CodeCatalyst 程序包存储库中拉取其依赖项。您还了解如何阻止和解除阻止程序包进入网关和 CodeCatalyst 程序包存储库。