亚马逊AWS官方博客

使用 AWS CodeArtifact 的软件程序包管理

软件构件存储库及其相关程序包管理程序是开发的关键组成部分。在需要库的时间点使用程序包管理程序下载与应用软件的预构建库同时简化了开发和构建流程。可供使用的程序包存储库有很多种,例如,Maven Centralnpm 公有注册表PyPi (Python Package Index),等等。使用各种构件存储库使想要小心控制其应用程序的软件依赖项的两种版本,并对其进行访问的组织面临着部分挑战。任何对依赖项的更改都需要受到控制,以试着杜绝未被发现而且可被利用的漏洞趁机进入组织的应用程序。通过使用集中式存储库,组织可以更轻松地管理访问权限控制和版本更改,让团队在更新程序包版本时,对于新版本的使用已获得其 IT 主管批准更有信心。较大型的组织可能会转用传统的构件存储库软件以克服此类挑战,但这些产品有可能在安装、配置、维护和扩展方面引入其他挑战。对于较小型组织,传统构件存储库软件的价格和维护工作可能令人望而却步。

AWS CodeArtifact 现已全面推出,它是一项面向开发人员和组织的完全托管构件存储库服务,可帮助安全存储与分享在其开发、构建和部署流程中使用的软件程序包。今天,CodeArtifact 可与热门的构建工具和程序包管理程序搭配使用,例如,MavenGradle (Java)、npmyarn (Javascript),以及 piptwine (Python),未来还将支持更多。当新的程序包被提取或发布到您的存储库时,CodeArtifact 会自动扩展,而作为一项完全托管的服务,您不需要为 CodeArtifact 安装或维护基础设施。此外,CodeArtifact 还是 Polyglot 构件存储库,也就是说,它可以存储任何受支持类型的构件程序包。例如,单个 CodeArtifact 存储库可被配置为在一个地点同时存储来自 MavennpmPython 存储库的程序包。

CodeArtifact 存储库采用以域为单位的组织方式。我们建议您为所在组织使用单个域,然后向其添加存储库。例如,您可以选择为不同的团队使用不同的存储库。要将程序包发布到您的存储库,或从外部存储库提取程序包,您可以简单地使用您的开发人员习惯使用的程序包管理程序工具。让我们来看一下如何开始使用。

开始使用 CodeArtifact

要开始使用 CodeArtifact,首先,我需要为我的组织创建一个域,它会对我的存储库进行汇总。域被用来执行实际的程序包和元数据存储,即使我在存储库中使用它们。这可以带来一项好处,即,单个程序包资产,如特定的 npm 程序包,只会在每个域中存储一次,而不管它可能会在多少个存储库中出现。在 CodeArtifact 控制台中,我可以从左侧导航窗格选择,或者在此处单击创建存储库,以便创建一个域,该操作是创建我的首个存储库的一部分。

首先,我会为我的存储库命名,并提供一段可选描述,然后我可以选择将我的存储库连接到多个上游存储库。在对不存在于我的存储库中的程序包发起请求时,CodeArtifact 将从这些上游存储库中为我提取相应的程序包,然后将其缓存到我的 CodeArtifact 存储库中。请注意,CodeArtifact 存储库也可被当作其他 CodeArtifact 存储库的上游。例如在这里,我将要从 npm 公有注册表PyPi 提取程序包。CodeArtifact 将引用以我的名义创建的存储库,将这些外部连接当作 npm-storepypi-store 进行管理。

单击下一步,然后我会选择,或者通过选择该域所属的账户来创建一个域,并且为它命名。请注意,CodeArtifact 会使用单个 AWS Key Management Service (KMS) 密钥对域中的全部资产和元数据进行加密。在这里,我会使用服务为我创建的密钥,但我也可以选择使用自己的。

在单击下一步以后,我便可以对我的设置进行最后检查,我可以在检查时确认来自我所选的上游存储库的程序包流与我的预期完全一样。单击创建存储库以结束该流程,在这个例子中将创建域、我的存储库,以及另外两个作为上游的存储库。

在这个简单的设置流程之后,我的域及其初始存储库都被配置为从 npmPyPi 提取上游,而且它们现在随时可以保存软件构件程序包,我也可以在必要时添加更多存储库。不过,在这个例子中,我的下一步是要为我的上游存储库,亦即具有 CodeArtifact 存储库访问权限的 npmpip 配置程序包管理程序,具体见下文所述。

配置程序包管理程序

我可以在文档中找到配置各种程序包管理程序的步骤,但更方便的是,当我选择我的存储库时,控制台会为我提供所需的说明。我要先从 npm 开始,首先,我可以通过选择我的 npm-pypi-example-repository并单击查看连接说明来访问相关说明。

在弹出的对话框中,我要选择想要配置的程序包管理程序,然后我将看到相关的说明。我可以选择使用 AWS 命令行界面 (CLI) 来管理整个流程(针对 npmpiptwine),或者我也可以使用 CLI 命令获取令牌,然后运行 npm 命令将该令牌附加到存储库参考。

无论使用什么程序包管理程序,或遵守哪些说明,此类命令只会将授权令牌附加到存储库的程序包管理程序配置,而且该令牌在 12 个小时内有效。这样我就不会忘记刷新该令牌,我已经想出办法将相关命令添加到我的启动配置文件,从而实现了在每天开始时自动刷新我的令牌。

按照相同的指南,我会再次使用 AWS CLI 方法对 pip 进行类似的配置:

C:\> aws codeartifact login --tool pip --repository npm-pypi-example-repository --domain my-example-domain --domain-owner ACCOUNT_ID
Writing to C:\Users\steve\AppData\Roaming\pip\pip.ini
Successfully logged in to codeartifact for pypi

就这么简单! 现在,我已经准备好为我的 Node.js 和 Python 应用程序中的依赖项开始使用单个存储库。我所添加的,现在不在存储库中的任何依赖项都取自指定的上游存储库,并被添加到我的 CodeArtifact 存储库。

我们以几个简单的测试来结束这篇文章。首先,在更改到空目录以后,我会执行简单的 npm install 命令,以便在这个例子中安装 AWS Cloud Development Kit

npm install -g aws-cdk

CodeArtifact 控制台中选择存储库,我可以看到 AWS Cloud Development Kit 的程序包及其依赖项现已从上游 npm 公有注册表存储库下载,并被添加到我的存储库。

我刚才提到过,CodeArtifact 是 Polyglot 存储库,能够存储任何受支持类型的程序包。现在,我们来添加一个 Python 程序包,在这个例子中是 Pillow,它是非常受欢迎的图像处理库。

> pip3 install Pillow
Looking in indexes: https://aws:****@my-example-domain-123456789012.d.codeartifact.us-west-2.amazonaws.com/pypi/npm-pypi-example-repository/simple/
Collecting Pillow
  Downloading https://my-example-domain-123456789012.d.codeartifact.us-west-2.amazonaws.com/pypi/npm-pypi-example-repository/simple/pillow/7.1.2/Pillow-7.1.2-cp38-cp38-win_amd64.whl (2.0 MB)
     |████████████████████████████████| 2.0 MB 819 kB/s
Installing collected packages: Pillow
Successfully installed Pillow-7.1.2

在控制台中,我可以看到 Python 程序包就在我之前添加的 npm 程序包的旁边。

虽然在验证操作时我使用的是控制台,但我也可以使用 CLI 命令。例如,要列出存储库程序包,我可以运行以下命令:

aws codeartifact list-packages --domain my-example-domain --repository npm-pypi-example-repository

您可以想到,还有其他命令也可被用来帮助使用域、存储库,以及它们所包含的程序包。

可用性

AWS CodeArtifact 现已在法兰克福、爱尔兰、孟买、弗吉尼亚北部、俄亥俄、俄勒冈、新加坡、瑞典、悉尼和东京区域全面推出。在太平洋标准时间 6 月 12 日中午关注 Twitch.tv/awsLinkedIn Live,我们将向您展示如何开始使用 CodeArtifact

– Steve