教程:从软件包存储库中提取 - Amazon CodeCatalyst

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

教程:从软件包存储库中提取

在本教程中,您将学习如何创建工作流程,该工作流程运行依赖项从CodeCatalyst 包存储库中提取的应用程序。该应用程序是一个简单的 Node.js 应用程序,可在日志中输出 “Hello World” 消息。 CodeCatalyst 该应用程序只有一个依赖关系:l odash npm 软件包。该lodash包用于将hello-world字符串转换为Hello World。您将使用此软件包的 4.17.20 版本。

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

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

先决条件

开始前的准备工作:

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

  • 在你的 CodeCatalyst 空间里,你需要一个名为:

    codecatalyst-package-project

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

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

步骤 1:创建源存储库

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

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

创建源存储库
  1. 打开 CodeCatalyst 控制台,网址为 https://codecatalyst.aws/

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

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

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

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

    hello-world-app
  6. 选择创建

步骤 2:创建 CodeCatalyst 和网关软件包存储库

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

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

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

注意

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

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

  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” Node.js 应用程序并将其依赖关系 (lodash) 导入网关和 CodeCatalyst 软件包存储库。

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

本教程假设您将使用 CodeCatalyst 开发环境作为开发机器。尽管你不必使用 CodeCatalyst 开发环境,但还是推荐使用它,因为它提供了一个干净的工作环境,npm预装了 Node.js,而且在你完成本教程后很容易删除。有关 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

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

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

    1. 切换到 CodeCatalyst 控制台。

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

    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 按以下顺序在以下位置查找 4.17.20 lodash 版本:

    • 在开发环境中。它在这里找不到。

    • 在 CodeCatalyst 软件包存储库中。它在这里找不到。

    • 在网关存储库中。它在这里找不到。

    • 在 npmjs.com 中。它在这里找到了。

    npm 导lodash入到网关存储库、 CodeCatalyst 软件包存储库和开发环境中。

    注意

    如果你在第 4 步中没有将 npm 客户端连接到你的 CodeCatalyst 软件包存储库,那么 npm 本来可以lodash直接从 npmjs.com 中提取并且不会将包导入到任何一个存储库中。

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

  6. lodash已成功导入您的开发环境的测试。输入:

    npm list

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

    `-- lodash@4.17.20
  7. (可选)打开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" } }
  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. 在导航窗格中,选择 Packages (程序包)

  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” 的工作流程

在此步骤中,您将创建一个使用依赖项运行 “Hello World” 应用程序的工作流程。lodash该工作流程包括一个名为的操作或任务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

    此命令会打印出下载到运行该操作lodash的 Docker 镜像的版本。

  • - Run: node index.js

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

请注意,该RunHelloWorldApp操作是一个生成操作,如工作流程顶部附近的aws/build@v1标识符所示。有关生成操作的更多信息,请参阅使用工作流程进行构建

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

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

  2. 在导航窗格中,选择 C I/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 使用您在中创建的 CodeCatalyst 软件包存储库的名称步骤 2:创建 CodeCatalyst 和网关软件包存储库

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

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

  11. 选择 Commit (提交)

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

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

    2. 在 “提交消息” 中,输入:

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

    4. 在 “分支名称” 中,选择 “分支”。

    5. 选择 Commit (提交)

    现在,您已经创建了一个工作流程。

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

    工作流程运行开始。

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

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

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

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

步骤 5:验证工作流程

在此步骤中,您将验证工作流程是否成功运行了具有依赖关系的 “Hello World” 应用程序。lodash

验证 “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

    此消息表明 4.17.20 lodash 版本已下载到运行工作流程操作的 Docker 镜像。

第 6 步:阻止从 npmjs.com 导入

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

按照以下说明阻止向您的网关存储库导lodash入。当您在网关上屏蔽包裹时,它们也会在下游位置被屏蔽。

阻止向您的网关存储库导入
  1. 在导航窗格中,选择 Packages (程序包)

  2. 选择npm-publish-registry-gateway

  3. 选择lodash

  4. 在顶部附近,选择 O rigin 控件

  5. 在 “上游” 下,选择 “阻止”。

  6. 选择保存

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

步骤 7:测试屏蔽功能

在本节中,您将验证您在中设置的屏蔽第 6 步:阻止从 npmjs.com 导入是否有效。首先,将 “Hello World” 配置为请求版本 4.17.2 1lodash而不是网关存储库中可用的版本,即 4.17.2 0。然后,您检查应用程序是否无法从 nmpjs.com 提取版本 4.17.21,这表示成功阻止。作为最终测试,您需要解除对网关存储库的导入的封锁,并检查应用程序是否可以成功提取的 4.17.21 版本。lodash

使用以下一组程序来测试屏蔽功能。

开始前的准备工作
  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,如中所示 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) 不匹配。

  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. 在导航窗格中,选择 C I/CD,然后选择工作流程。

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

      npm 查找依赖关系,并看到 “Hello World” 需要版本 4.17.21。npm 按以下顺序在以下位置查找依赖关系:package.jsonlodash

      • 在 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. 在导航窗格中,选择 Packages (程序包)

  2. 选择npm-publish-registry-gateway

  3. 选择lodash

  4. 在顶部附近,选择 O rigin 控件

  5. 在 “上游” 下,选择 “允许”。

  6. 选择保存

    你现在已经解锁了的导入。lodash

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

测试从 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. 在导航窗格中,选择 Packages (程序包)

    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 软件包存储库。