教程:从程序包存储库中拉取
在本教程中,您将了解如何创建工作流,该工作流运行的应用程序的依赖项是从 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-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
目录。 -
-
测试是否已将
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 程序包存储库。