亚马逊 CodeCatalyst 不再向新买家开放。现有客户可以继续正常使用该服务。有关更多信息,请参阅 如何从中迁移 CodeCatalyst。
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
教程:从程序包存储库中拉取
在本教程中,您将了解如何创建工作流,该工作流运行的应用程序的依赖项是从 CodeCatalyst 程序包存储库中拉取的。该应用程序是一个简单的 Node.js 应用程序,它向 CodeCatalyst 日志打印 “Hello World” 消息。该应用程序具有一个依赖项:lodashlodash 程序包用于将 hello-world 字符串转换为 Hello World。您将使用此程序包的 4.17.20 版本。
设置应用程序和工作流后,您可以将 CodeCatalyst 配置为阻止其他版本的 lodash 从公共外部注册表(npmjs.comlodash。
在本教程结束时,您应已清楚地了解工作流如何与 CodeCatalyst 内部和外部的程序包存储库进行交互来检索程序包。您还应了解 npm、程序包存储库、工作流和应用程序的 package.json 文件之间进行的后台交互。
主题
先决条件
开始前的准备工作:
-
您需要一个 CodeCatalyst 空间。有关更多信息,请参阅创建空间。
-
在您的 CodeCatalyst 空间中,您需要一个空项目,其名称为:
codecatalyst-package-project使用从头开始选项来创建此项目。
有关更多信息,请参阅 在 Amazon 中创建一个空项目 CodeCatalyst。
步骤 1:创建源存储库
在此步骤中,您将在 CodeCatalyst 中创建源存储库。此存储库将存储教程的源文件,例如 index.js 和 package.json 文件。
有关源存储库的更多信息,请参阅创建源存储库。
创建源存储库
通过访问 https://codecatalyst.aws/
打开 CodeCatalyst 控制台。 -
导航到您的项目
codecatalyst-package-project。 -
在导航窗格中,选择代码,然后选择源存储库。
-
选择添加存储库,然后选择创建存储库。
-
在存储库名称中,输入:
hello-world-app -
选择创建。
步骤 2:创建 CodeCatalyst 和网关程序包存储库
在此步骤中,您将在 CodeCatalyst 项目中创建一个程序包存储库,然后将它连接到该 CodeCatalyst 项目中的网关存储库。稍后,您将本教程中的依赖项 lodash 从 npmjs.com 导入到这两个存储库中。
网关存储库是将 CodeCatalyst 中的程序包存储库连接到公共 npmjs.com 的“胶粘剂”。
有关程序包存储库的更多信息,请参阅在中发布和共享软件包 CodeCatalyst。
注意
在本教程中,CodeCatalyst 程序包存储库和网关存储库这两个词是指您在以下过程中在 CodeCatalyst 中创建的两个存储库。
创建 CodeCatalyst 程序包和网关存储库
-
在导航窗格中,选择程序包。
-
选择创建程序包存储库。
-
在存储库名称中,输入:
codecatalyst-package-repository -
选择 + 选择上游存储库。
-
选择网关存储库。
-
在 npm-public-registry-gateway 框中,选择创建。
-
选定选择。
-
选择创建。
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 开发环境
-
在导航窗格中,选择代码,然后选择开发环境。
-
在顶部附近,选择创建开发环境,然后选择 AWS Cloud9 (在浏览器中)。
-
确保存储库设置为
hello-world-app,并且现有分支设置为main。选择创建。您的开发环境将在新的浏览器标签页中启动,并且您的存储库(
hello-world-app)将克隆到其中。 -
将 CodeCatalyst 浏览器标签页保持打开状态,然后转到下一个过程。
创建“Hello World”Node.js 应用程序
-
转到您的开发环境。
-
在终端提示符下,更改为
hello-world-app源存储库根目录:cd hello-world-app -
初始化一个 Node.js 项目:
npm init -y初始化过程将在
hello-world-app的根目录中创建一个package.json文件。 -
将开发环境中的 npm 客户端连接到 CodeCatalyst 程序包存储库:
-
切换到 CodeCatalyst 控制台。
-
在导航窗格中,选择程序包。
-
选择
codecatalyst-package-repository。 -
选择连接到存储库。
-
选择创建令牌。这将为您创建个人访问令牌(PAT)。
-
选择复制以复制命令。
-
切换到您的开发环境。
-
确保您位于
hello-world-app目录中。 -
粘贴命令。其内容与以下内容类似:
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
-
-
导入
lodash版本 4.17.20:npm install lodash@v4.17.20 --save --save-exactnpm 按以下顺序在以下位置查找
lodash版本 4.17.20:-
在开发环境中。它在该位置找不到此版本。
-
在 CodeCatalyst 程序包存储库中。它在该位置找不到此版本。
-
在网关存储库中。它在该位置找不到此版本。
-
在 npmjs.com 中。它在该位置找到此版本。
npm 将
lodash导入网关存储库、CodeCatalyst 程序包存储库和开发环境中。注意
如果您在步骤 4 中未将 npm 客户端连接到 CodeCatalyst 程序包存储库,则 npm 应已直接从 npmjs.com 中拉取
lodash,并且不会将程序包导入任一存储库。npm 还使用
lodash依赖项更新package.json文件,并创建一个包含lodash其所有依赖项的node_modules目录。 -
-
测试是否已将
lodash成功导入开发环境中。输入:npm list这将显示以下消息,表示已成功导入:
`-- lodash@4.17.20 -
(可选)打开
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"} } -
在
/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 程序包存储库中
-
切换到 CodeCatalyst 控制台。
-
在导航窗格中,选择程序包。
-
选择 npm-public-registry-gateway。
-
确保已显示
lodash。最新版本列指示4.17.20。 -
对
codecatalyst-package-repository重复此过程。您可能需要刷新浏览器窗口才能看到已导入的程序包。
在开发环境中测试“Hello World”
-
切换到您的开发环境。
-
确保您仍在
hello-world-app目录中,然后运行应用程序:node index.js这将显示
Hello World消息。Node.js 使用您在上一步中下载到开发环境的lodash程序包运行应用程序。
忽略“node_modules”目录并提交“Hello World”
-
忽略
node_modules目录。输入:echo "node_modules/" >> .gitignore最佳实践是避免提交此目录。此外,提交此目录会干扰本教程中的后续步骤。
-
添加、提交和推送:
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”应用程序。
创建工作流
-
切换到 CodeCatalyst 控制台。
-
在导航窗格中,选择 CI/CD,然后选择工作流。
-
选择创建工作流。
-
对于源存储库,选择
hello-world-app。 -
对于分支,选择
main。这将在选定的源存储库和分支中创建工作流定义文件。
-
选择创建。
-
在顶部附近选择 YAML。
-
删除 YAML 示例代码。
-
添加以下 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。
-
(可选)选择验证,确保 YAML 代码在提交之前有效。
-
选择提交。
-
在提交工作流对话框中,输入以下内容:
-
对于工作流文件名,保留默认值
codecatalyst-package-workflow。 -
对于提交消息,输入:
add initial workflow file -
对于存储库,选择 hello-world-app。
-
对于分支名称,选择主。
-
选择提交。
现在,您已创建工作流。
-
运行工作流
-
在您刚刚创建的工作流(
codecatalyst-package-workflow)旁边,选择操作,然后选择运行。工作流运行将开始。
-
在右侧顶部的绿色通知中,选择运行的链接。该链接看起来类似于
View Run-1234。这将显示一个工作流图表,其中显示谁启动了运行和 RunHelloWorldApp 操作。
-
选中 RunHelloWorldApp 操作框以查看操作的进度。
-
运行完成后,转至步骤 5:验证工作流。
步骤 5:验证工作流
在此步骤中,您将验证工作流是否已使用其 lodash 依赖项成功运行“Hello World”应用程序。
验证“Hello World”应用程序是否已使用其依赖项运行
-
在工作流图表中,选中 RunHelloWorldApp 框。
这将显示日志消息列表。
-
展开
node index.js日志消息。这将显示以下消息:
[Container] 2024/04/24 21:15:41.545650 Running command node index.js Hello World显示
Hello Word(而不是hello-world)指明已成功使用lodash依赖项。 -
展开
npm list日志。这将显示一条与以下内容类似的消息:
└── lodash@4.17.20此消息指示
lodash版本 4.17.20 已下载到运行工作流操作的 Docker 映像。
步骤 6:阻止来自 npmjs.com 的导入
现在,lodash 版本 4.17.20 已存在于网关和 CodeCatalyst 程序包存储库中,您可以阻止其他版本的导入。阻止可防止您意外导入可能包含恶意代码的更高(或更早)版本的 lodash。有关更多信息,请参阅编辑程序包来源控制和依赖项替换攻击。
按照以下说明操作,阻止将 lodash 导入到网关存储库中。当您在网关上阻止程序包时,它们也会在下游位置被阻止。
阻止导入到网关存储库
-
在导航窗格中,选择程序包。
-
选择 npm-publish-registry-gateway。
-
选择
lodash。 -
在顶部附近,选择源控制。
-
在上游下,选择阻止。
-
选择保存。
现在,您已阻止从 npmjs.com 导入网关存储库(以及下游存储库和计算机)中。
步骤 7:测试阻止功能
在此部分中,您将验证您在 步骤 6:阻止来自 npmjs.com 的导入 中设置的阻止是否有效。首先,将“Hello World”配置为 lodash 的请求版本 4.17.21,而不是网关存储库中可用的版本,即 4.17.20。然后,检查应用程序是否无法从 nmpjs.com 中拉取版本 4.17.21,这表示已成功阻止。作为最终测试,您需要解除阻止导入到网关存储库,并检查应用程序是否能成功拉取 lodash 的版本 4.17.21。
使用以下一组过程来测试阻止功能。
开始前的准备工作
-
切换到您的开发环境。
-
拉取您之前使用 CodeCatalyst 控制台创建的
codecatalyst-package-workflow.yaml文件:git pull
将“Hello World”配置为“lodash”的请求版本 4.17.21
-
打开
/hello-world-app/package.json。 -
将
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)不匹配。 -
添加、提交和推送:
git add . git commit -m "update package.json to use lodash 4.17.21" git push
测试“Hello World”是否无法拉取“lodash”的版本 4.17.21
-
在版本不匹配的情况下运行工作流:
-
切换到 CodeCatalyst 控制台。
-
在导航窗格中,选择 CI/CD,然后选择工作流。
-
在
codecatalyst-package-workflow旁边,选择操作,然后选择运行。npm 会在
package.json中查找依赖项,并看到“Hello World”需要lodash的版本 4.17.21。npm 按以下顺序在以下位置查找依赖项:-
在运行该操作的 Docker 映像中。它在该位置找不到此版本。
-
在 CodeCatalyst 程序包存储库中。它在该位置找不到此版本。
-
在网关存储库中。它在该位置找不到此版本。
-
在 npmjs.com 中。它在该位置找到此版本。
npm 在 npmjs.com 中找到版本 4.17.21 后,会尝试将它导入网关存储库中,但由于您将网关设置为阻止导入
lodash,因此无法执行导入。由于无法执行导入,因此工作流将失败。
-
-
-
验证工作流是否已失败:
-
在右侧顶部的绿色通知中,选择运行的链接。该链接看起来类似于
View Run-2345。 -
在工作流图表中,选中 RunHelloWorldApp 框。
-
展开
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 的导入
-
在导航窗格中,选择程序包。
-
选择 npm-publish-registry-gateway。
-
选择
lodash。 -
在顶部附近,选择源控制。
-
在上游下,选择允许。
-
选择保存。
您现在已解除阻止导入
lodash。您的工作流现在可以导入
lodash的版本 4.17.21。
测试是否已解除阻止来自 npmjs.com 的导入
-
再次运行工作流。这次工作流应成功,因为现在应已能够导入版本 4.17.21。要再次运行工作流,请执行以下操作:
-
选择 CI/CD,然后选择工作流。
-
在
codecatalyst-package-workflow旁边,选择操作,然后选择运行。 -
在右侧顶部的绿色通知中,选择运行的链接。该链接看起来类似于
View Run-3456。这将显示一个工作流图表,其中显示谁启动了运行和 RunHelloWorldApp 操作。
-
选中 RunHelloWorldApp 操作框以查看操作的进度。
-
展开
npm list日志消息,验证是否显示与以下内容类似的消息:└── lodash@4.17.21此消息指示已下载
lodash版本 4.17.21。
-
-
验证版本 4.17.21 是否已导入 CodeCatalyst 和网关存储库中:
-
在导航窗格中,选择程序包。
-
选择 npm-public-registry-gateway。
-
查找
lodash并确保版本为4.17.21。注意
虽然此页面上未列出版本 4.17.20,但您可以通过选择
lodash,然后选择顶部附近的版本来找到该版本。 -
重复这些步骤以检查是否已将版本 4.17.21 导入
codecatalyst-package-repository。
-
清理
清理本教程中使用的文件和服务以免被收取费用。
清理程序包教程
-
删除
codecatalyst-package-project:-
在 CodeCatalyst 控制台中,导航到
codecatalyst-package-project项目(如果您尚未这样做)。 -
在导航窗格中,选择项目设置。
-
选择删除项目,输入
delete,然后选择删除项目。CodeCatalyst 会删除所有项目资源,包括源、网关和 CodeCatalyst 程序包存储库。也将删除开发环境。
-
-
删除 PAT 令牌:
-
在右侧选择您的用户名,然后选择我的设置。
-
在个人访问令牌下,选择您在本教程中创建的令牌,然后选择删除。
-
在本教程中,您已了解如何创建工作流,该工作流运行的应用程序将从 CodeCatalyst 程序包存储库中拉取其依赖项。您还了解如何阻止和解除阻止程序包进入网关和 CodeCatalyst 程序包存储库。