

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

# 将包发布到 Amazon S3 conda 频道
<a name="publish-packages-s3-channel"></a>

您可以将 conda 包发布到亚马逊简单存储服务 (Amazon S3) 存储桶，这样 AWS Deadline Cloud（Deadline Cloud）工作人员就可以安装它们来运行作业。该`rattler-build publish`命令在 Amazon S3 上的使用方式与使用本地文件系统通道的方式相同。该命令可以生成配方并发布结果，也可以发布您已经构建的包文件。在这两种情况下，该命令都会将包上传到存储桶，并一步为频道编制索引。

该`rattler-build publish`命令 AWS 使用标准凭证链进行身份验证，因此它像使用任何 AWS 工具一样使用您的 AWS 配置。有关配置凭据的更多信息，请参阅 *AWS Command Line Interface (AWS CLI) 用户指南*中的[配置和凭据文件设置](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html)。

## 先决条件
<a name="publish-s3-prereqs"></a>

在将包发布到 Amazon S3 之前，请完成以下先决条件：
+ **pixi 和 rattler-build — 从 pixi.sh** [安装 pixi，然后安装。](https://pixi.sh) `rattler-build`

  ```
  pixi global install rattler-build
  ```
+ **git** — 克隆示例存储库所必需的。在Windows，[git f](https://gitforwindows.org/) or Windows 还提供了一个`bash`外壳，这是一些Windows示例配方所需要的。
+ **亚马逊 S3 存储桶** — 用作 conda 通道的亚马逊 S3 存储桶。您可以使用 Deadline Cloud 场中的任务附件存储桶，也可以创建单独的存储桶。
+ **AWS 凭证**-使用`aws configure`命令或命令在您的工作站上配置凭据。`aws login`有关更多信息，请参阅 *AWS Command Line Interface 用户指南*中的[设置 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-quickstart.html)。
+ **IAM 权限** —（可选）要缩小您的证书所拥有的权限范围，您可以使用 AWS Identity and Access Management (IAM) 策略，该策略仅授予对 Amazon S3 存储桶和您使用的频道前缀的以下权限（例如，`/Conda/*`）：
  + `s3:GetObject`
  + `s3:PutObject`
  + `s3:DeleteObject`
  + `s3:ListBucket`
  + `s3:GetBucketLocation`

## 将包裹发布到 Amazon S3 频道
<a name="publish-s3-procedure"></a>

与`s3://`目标`rattler-build publish`一起使用，将包发布到您的 Amazon S3 conda 频道。如果存储桶中不存在该频道，则会自动`rattler-build`初始化该频道。在开始之前，请确保您已完成[先决条件](#publish-s3-prereqs)。

以下示例发布了 Deadline [Cloud](https://github.com/aws-deadline/deadline-cloud-samples) 示例存储库中的 Blender 4.5 示例配方GitHub。您可以替换样本存储库中的其他食谱，也可以使用自己的食谱。

**注意**  
大型应用程序可能需要数十 GB 的可用磁盘空间来存放源存档、提取的文件和生成输出。请确保使用具有足够可用空间的磁盘，用于软件包生成输出。

**将包发布到 Amazon S3 频道**

1. 克隆截止日期云示例存储库。

   ```
   git clone https://github.com/aws-deadline/deadline-cloud-samples.git
   ```

1. 切换到 `conda_recipes` 目录。

   ```
   cd deadline-cloud-samples/conda_recipes
   ```

1. 运行如下命令。将 {{amzn-s3-demo-bucket}}替换为存储桶名称。

   ```
   rattler-build publish blender-4.5/recipe/recipe.yaml --to s3://amzn-s3-demo-bucket/Conda/Default --build-number=+1
   ```

   前`/Conda/Default`缀组织存储桶内的频道。您可以使用不同的前缀，但该前缀在引用该频道的所有命令和队列配置中必须一致。

**关于内部版本号**  
该`--build-number=+1`选项会根据目标频道中已有的版本号自动选择下一个内部版本号。最佳做法是永远不要覆盖频道中的软件包。如果软件包在其他情况下会有相同的文件名，请务必使用新的内部版本号进行构建。当你构建到制作频道或过渡频道时，使用可以`--build-number=+1`实现这一点。  
如果要直接控制内部版本号，则可以使用特定值对其进行设置，例如`--build-number=7`。如果省略该选项，则`rattler-build`使用`recipe.yaml`文件中定义的内部版本号。

如果你的包配方依赖于来自特定渠道（例如 [conda-forge](https://conda-forge.org/)）的软件包，请`-c conda-forge`添加到命令中。

您也可以发布已经生成的包文件，例如，来自本地版本的`.conda`文件。将 {{amzn-s3-demo-bucket}}替换为存储桶名称。

```
rattler-build publish output/linux-64/blender-4.5.0-hb0f4dca_0.conda \
    --to s3://amzn-s3-demo-bucket/Conda/Default
```

## 初始化频道或重新索引频道
<a name="publish-s3-init-reindex"></a>

当您使用`rattler-build publish`发布包时，如果频道尚不存在，则该命令会自动初始化该频道。在大多数情况下，您无需手动初始化频道或重新索引频道。

在以下情况下，您可能需要手动初始化频道或重新索引频道：
+ 例如，您希望在发布任何包之前创建一个空频道，以验证您的 Deadline Cloud 队列环境是否可以连接到该频道。
+ 您直接使用 Amazon S3 工具上传或删除`.conda`文件`rattler-build publish`，而不是使用，并且频道索引已过期。

### 初始化空频道
<a name="publish-s3-init-empty"></a>

要初始化空频道，请创建一个`repodata.json`文件并将其上传到频道前缀的`noarch`子目录。将 {{amzn-s3-demo-bucket}}替换为存储桶名称。

```
echo '{"info":{"subdir":"noarch"},"packages":{},"packages.conda":{},"removed":[],"repodata_version":1}' > empty_channel_repodata.json
aws s3api put-object --body empty_channel_repodata.json --key Conda/Default/noarch/repodata.json --bucket {{amzn-s3-demo-bucket}}
```

前`/Conda/Default`缀必须与您的队列环境使用的频道前缀匹配。初始化频道后，您可以使用将包发布到频道`rattler-build publish`。

### 为频道重新编制索引
<a name="publish-s3-reindex"></a>

如果频道索引已过期，则`rattler-index`使用从频道中的包文件中重建索引。首先，安装`rattler-index`。

```
pixi global install rattler-index
```

然后重新索引频道。将 {{amzn-s3-demo-bucket}}替换为存储桶名称。

```
rattler-index s3 s3://amzn-s3-demo-bucket/Conda/Default
```

## 测试软件包
<a name="publish-s3-test"></a>

发布软件包后，创建一个临时 pixi 项目以验证软件包是否正常运行。该项目通过 Amazon S3 渠道安装软件包。

**测试软件包**

1. 创建临时测试目录并使用 Amazon S3 通道初始化一个 pixi 项目。将 {{amzn-s3-demo-bucket}}替换为存储桶名称。

   ```
   mkdir package-test-env
   cd package-test-env
   pixi init --channel s3://amzn-s3-demo-bucket/Conda/Default
   ```

1. 将软件包添加到项目中。

   ```
   pixi add blender=4.5
   ```

1. 验证软件包是否正常运行。

   ```
   pixi run blender --version
   ```

   该[https://pixi.sh/latest/reference/cli/pixi/run/](https://pixi.sh/latest/reference/cli/pixi/run/)命令激活项目目录的 conda 环境，并在其中运行指定的命令。环境保留在项目目录中，因此您可以从其他终端使用相同的`pixi run`命令。

## 从频道中移除软件包
<a name="publish-s3-remove-packages"></a>

避免从用于生产的渠道中删除软件包，因为锁文件通过哈希引用特定的软件包。删除软件包会阻止从这些锁文件中重新创建环境。对于开发和测试频道，您可以移除特定软件包，方法是从存储桶中删除该`.conda`文件，然后重新索引该频道。

删除包文件，然后重新索引频道。将 {{amzn-s3-demo-bucket}}替换为存储桶名称。

```
aws s3 rm s3://amzn-s3-demo-bucket/Conda/Default/linux-64/blender-4.5.0-hb0f4dca_1.conda
```

删除文件后，重新索引频道以更新频道元数据。有关说明，请参阅为[频道重新编制索引。](#publish-s3-reindex)

Package 文件存储在平台特定的子目录中`linux-64`，例如、`win-64`或。`osx-arm64`要列出子目录中的软件包，请运行以下命令。

```
aws s3 ls s3://amzn-s3-demo-bucket/Conda/Default/linux-64/
```

## 清理
<a name="publish-s3-cleanup"></a>

测试完成后，移除测试项目目录。

**清理测试资源**
+ 移除测试项目目录。

  在 Linux and 上macOS，运行以下命令。

  ```
  rm -rf package-test-env
  ```

  在 Windows (cmd) 上，运行以下命令。

  ```
  rmdir /s /q package-test-env
  ```

## 调试版本
<a name="publish-s3-debug"></a>

如果构建失败，则`rattler-build`保留构建目录以便您可以进行调查。运行以下命令在构建环境中打开一个交互式 shell，其中所有环境变量都与生成期间一样设置。

```
rattler-build debug shell
```

在调试 shell 中，您可以修改文件、运行单独的构建命令以及添加依赖关系以隔离问题。有关更多信息，请参阅 rattler-build 文档中的[调试构建](https://rattler-build.prefix.dev/latest/debugging_builds/)。

## 为其他平台构建软件包
<a name="publish-s3-cross-platform"></a>

该`rattler-build publish`命令为运行该命令的工作站的操作系统生成软件包。如果您的 Deadline Cloud 队列使用的操作系统与您的工作站不同，或者您的软件包有其他主机要求，则您可以选择以下选项：
+ `rattler-build publish`在与目标操作系统匹配的主机上运行。例如，使用Linux正在运行的亚马逊弹性计算云 (Amazon EC2) 实例为Linux队列构建软件包。
+ 使用 Deadline Cloud 软件包生成队列在目标平台上自动构建。请参见[创建包生成队列](automate-package-builds.md#s3-channel-create-queue)。
+ （高级）使用交叉编译为不同于工作站的不同平台构建软件包。有关更多信息，请参阅 rattler-[build 文档中的交叉编译](https://rattler-build.prefix.dev/latest/compilers/#cross-compilation)。

## 后续步骤
<a name="publish-s3-next-steps"></a>

将包发布到 Amazon S3 conda 频道后，将您的 Deadline Cloud 队列配置为使用该频道：
+ [为自定义 conda 包配置生产队列权限](configure-jobs-s3-channel.md#s3-channel-configure-permissions) — 向您的生产队列授予对 Amazon S3 conda 频道的只读访问权限。
+ [向队列环境添加 conda 通道-配置队列环境](configure-jobs-s3-channel.md#s3-channel-add-channel)以安装来自 Amazon S3 conda 通道的软件包。