亚马逊AWS官方博客

将您的 Ruby gem 添加到 AWS CodeArtifact

Ruby 开发人员现在可以使用 AWS CodeArtifact 安全地存储并检索其 gem。CodeArtifact 与 gembundler 等标准开发人员工具集成在一起。

应用程序通常使用大量包为网络访问、加密或数据操作等常见任务提供可重用的代码,从而加快开发速度。开发人员还嵌入软件开发工具包(例如 AWS SDK),用于访问远程服务。这些包可能来自您的组织内部,也可能来自第三方,例如开源项目。管理包和依赖项是软件开发不可或缺的一部分。Java、C#、JavaScript、Swift 和 Python 等语言都有下载和解析依赖项的工具,而 Ruby 开发人员通常使用 gembundler

但是,使用第三方包会带来法律和安全问题。组织必须确保包许可证与其项目兼容,并且不侵犯知识产权。组织还必须验证所包含的代码是否安全且不会引入漏洞,这种策略被称为供应链攻击。为了应对这些挑战,组织通常使用私有包服务器。开发人员只能使用经过安全和法律团队审查的通过私有存储库提供的包。

CodeArtifact 是一项托管服务,允许在不管理底层基础设施的情况下将包安全地分配给内部开发人员团队。除了 npmPyPIMavenNuGetSwiftPM 和通用格式外,CodeArtifact 现在还支持 Ruby gem。

您可以使用 gembundler 等现有工具,从 AWS 云中的 CodeArtifact 存储库中发布和下载 Ruby gem 依赖项。将包存储在 CodeArtifact 中后,您可以在 Gemfile 中引用这些包。然后,在构建过程中,您的编译系统将从 CodeArtifact 存储库下载批准的包。

如何开始使用
想象一下,我正在开发一个包,要与组织中的其他开发团队共享。

在此演示中,我将向您展示如何准备环境,将包上传到存储库,以及如何使用该特定包版本作为我的项目的依赖项。我将重点介绍特定于 Ruby 包的步骤。您可以阅读我的同事 Steven 撰写的教程,了解如何开始使用 CodeArtifact

我使用的 AWS 账户已经配置了包存储库MyGemsRepo)和stormacq-test)。

CodeArtifact – Ruby 存储库

为了便于 Ruby 工具访问我的 CodeArtifact 存储库,我首先从 CodeArtifact 中收集身份验证令牌。

export CODEARTIFACT_AUTH_TOKEN=`aws codeartifact get-authorization-token \
                                     --domain stormacq-test              \
                                     --domain-owner 012345678912         \
                                     --query authorizationToken          \
                                     --output text`

export GEM_HOST_API_KEY="Bearer $CODEARTIFACT_AUTH_TOKEN"

请注意,身份验证令牌将在 12 小时后过期。我必须在 12 小时后重复此命令以获得新的令牌。

然后,我请求存储库端点。我传递了 domain 名和 domain owner(AWS 账户 ID)。注意 --format ruby 选项。

export RUBYGEMS_HOST=`aws codeartifact get-repository-endpoint  \
                           --domain stormacq-test               \
                           --domain-owner 012345678912          \
                           --format ruby                        \
                           --repository MyGemsRepo              \
                           --query repositoryEndpoint           \
                           --output text`

现在我有了存储库端点和身份验证令牌,gem 将使用这些环境变量值连接到我的私有包存储库。

我创建了一个非常简单的项目,构建,然后将其发送到包存储库。

CodeArtifact – 构建和推送自定义包

$ gem build hola.gemspec 

Successfully built RubyGem
  Name: hola-codeartifact
  Version: 0.0.0
  File: hola-codeartifact-0.0.0.gem
  
$ gem push hola-codeartifact-0.0.0.gem 
Pushing gem to https://stormacq-test-486652066693.d.codeartifact.us-west-2.amazonaws.com/ruby/MyGemsRepo...

我在控制台中验证该包是否可用。

CodeArtifact – Hola 包已经存在

现在该包已可用,我可以像往常一样在我的项目中使用该包。这涉及在我的计算机上配置本地 ~/.gemrc 文件。我按照控制台提供的说明进行操作,并确保将 ${CODEARTIFACT_AUTH_TOKEN} 替换为其实际值。

CodeArtifact – 连接存储库的控制台说明

正确配置 ~/.gemrc 后,我就可以照常安装 gem 了。这些 gem 将从我的私有 gem 存储库中下载。

$ gem install hola-codeartifact

Fetching hola-codeartifact-0.0.0.gem
Successfully installed hola-codeartifact-0.0.0
Parsing documentation for hola-codeartifact-0.0.0
Installing ri documentation for hola-codeartifact-0.0.0
Done installing documentation for hola-codeartifact after 0 seconds
1 gem installed

从上游安装
我还可以将我的存储库与上游来源相关联。当我请求 gem 时,存储库会自动从上游获取 gem。

要将存储库与 rubygems.org 关联起来,我使用控制台,或者键入

aws codeartifact  associate-external-connection \
                   --domain stormacq-test       \
                   --repository MyGemsRepo      \
                   --external-connection public:ruby-gems-org

{
    "repository": {
        "name": "MyGemsRepo",
        "administratorAccount": "012345678912",
        "domainName": "stormacq-test",
        "domainOwner": "012345678912",
        "arn": "arn:aws:codeartifact:us-west-2:012345678912:repository/stormacq-test/MyGemsRepo",
        "upstreams": [],
        "externalConnections": [
            {
                "externalConnectionName": "public:ruby-gems-org",
                "packageFormat": "ruby",
                "status": "AVAILABLE"
            }
        ],
        "createdTime": "2024-04-12T12:58:44.101000+02:00"
    }
}

关联后,我可以通过 CodeArtifact 拉取任何 gem。当本地包不可用时,系统会自动从上游获取包。

$ gem install rake 

Fetching rake-13.2.1.gem
Successfully installed rake-13.2.1
Parsing documentation for rake-13.2.1
Installing ri documentation for rake-13.2.1
Done installing documentation for rake after 0 seconds
1 gem installed

我使用控制台来验证我的存储库中现在是否有 rake 包。

注意事项
在上传您的第一个 Ruby 包之前,有几点需要注意。

定价和可用性
Ruby 包的 CodeArtifact 费用与已经获得支持的其他包格式的费用相同。CodeArtifact 账单取决于三个指标:存储空间(以每月 GB 为单位)、请求数量以及向互联网或其他 AWS 区域传输的数据。向同一区域的 AWS 服务传输数据不收费,这意味着您可以在 Amazon Elastic Compute Cloud(Amazon EC2)AWS CodeBuild 上运行持续集成和交付(CI/CD)作业,而无需为 CodeArtifact 数据传输付费。与往常一样,定价页面包含详细信息。

适用于 Ruby 的 CodeArtifact 包在所有 13 个提供 CodeArtifact 的区域提供。

立即构建您的 Ruby 应用程序并将您的私有包上传到 CodeArtifact!

— seb