使用 CodeDeploy 代理 - Amazon CodeDeploy
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

使用 CodeDeploy 代理

Amazon CodeDeploy 代理是一个软件包,在实例上安装和配置该软件包后,即可在 CodeDeploy 部署中使用该实例。

注意

仅当您部署到 EC2/本地计算平台时,才需要 CodeDeploy 代理。使用 Amazon ECS 或 Amazon Lambda 计算平台的部署不需要该代理。

安装该代理时,将在实例上放置一个配置文件。此文件用于指定代理的工作方式。此配置文件指定 Amazon CodeDeploy 在与实例交互时要使用的目录路径和其他设置。可以更改此文件中的某些配置选项。有关使用 CodeDeploy 代理配置文件的信息,请参阅CodeDeploy 代理配置参考

有关使用 CodeDeploy 代理的更多信息(例如,安装、更新和验证版本的步骤),请参阅管理 CodeDeploy 代理操作

CodeDeploy 代理支持的操作系统

支持的 Amazon EC2 AMI 操作系统

已在以下 Amazon EC2 AMI 操作系统上测试 CodeDeploy 代理:

  • Amazon Linux 2023(ARM、x86)

  • Amazon Linux 2(ARM、x86)

  • Microsoft Windows Server 2022、2019

  • Red Hat Enterprise Linux (RHEL) 8.x、7.x

  • Ubuntu Server 22.04 LTS、20.04 LTS、18.04 LTS、16.04 LTS

CodeDeploy 代理可以作为开源系统来满足您的需求。它可与其他 Amazon EC2 AMI 操作系统配合使用。有关更多信息,请转至 GitHub 中的 CodeDeploy 代理存储库。

注意

支持的 CodeDeploy 代理的最低版本为 1.5.0。Amazon Linux 2023 或 Windows Server 2022 不支持 CodeDeploy 代理 1.5.0。

支持的本地操作系统

已在以下本地操作系统上测试 CodeDeploy 代理:

  • Microsoft Windows Server 2022、2019

  • Red Hat Enterprise Linux (RHEL) 7.x

  • Ubuntu Server 22.04 LTS、20.04 LTS、18.04 LTS 和 16.04 LTS

CodeDeploy 代理可以作为开源系统来满足您的需求。它可与其他本地实例操作系统配合使用。有关更多信息,请转至 GitHub 中的 CodeDeploy 代理存储库。

CodeDeploy 代理的通信协议和端口

CodeDeploy 代理通过端口 443 使用 HTTPS 进行出站通信。

当 CodeDeploy 代理在 EC2 实例上运行时,它将使用 EC2 元数据终端节点来检索实例相关信息。了解有关限制和授予实例元数据服务访问权限的更多信息。

CodeDeploy 代理的版本历史记录

您的实例必须运行支持的 CodeDeploy 代理版本。当前支持的最低版本为 1.5.0。

注意

建议使用最新版本的 CodeDeploy 代理。如果遇到问题,请在联系 Amazon Support 之前更新至最新版本。有关升级信息,请参阅更新 CodeDeploy 代理

下表列出了 CodeDeploy 代理的所有版本,以及每个版本所含的功能和增强功能。

版本 发行日期 详细信息

1.6.0

2023 年 3 月 30 日

新增:对 Ruby 3.1、3.2 的支持。

新增:对 Amazon Linux 2023 的支持。

新增:对 Windows Server 2022 的支持。

已更改:Windows Server 实例的 verbose 默认设置现在为 false。要继续在 Windows 的日志文件中打印调试消息,必须将 verbose 设置为 true

已删除:对 Windows Server 2016 和 Windows Server 2012 R2 的支持。

已删除:对 Amazon Linux 2018.03.x 的支持。

1.5.0

2023 年 3 月 3 日

新增:对 Ruby 3 的支持。

新增:对 Ubuntu 22.04 的支持。

已修复:在启动后不久重新启动 CodeDeploy 代理会导致代理挂起的问题。

已更改:如果代理服务在运行钩子脚本时意外重启,CodeDeploy 代理现在会在代理启动时导致主机部署失败。此修复可让您避免在重试部署前等待 70 分钟的超时时间。

弃用通知:CodeDeploy 代理 1.5.0 是最后一个支持 Windows Server 2016 和 Windows Server 2012 R2 的版本。

已删除:Ubuntu 14.04 LTS、Windows Server 2008 R2 和 Windows Server 2008 R2 32 位上对 CodeDeploy 代理的支持。

1.4.1

2022 年 12 月 6 日

已修复:与日志记录相关的安全漏洞。

增强:改进了轮询主机命令时的日志记录。

1.4.0

2022 年 8 月 31 日

新增:对 Red Hat Enterprise Linux 8 的支持。

新增:Windows 版 CodeDeploy 代理上对长文件路径的支持。要启用长文件路径,您需要设置相应的 Windows 注册表项,然后重新启动代理。有关更多信息,请参阅长文件路径会导致“没有这样的文件或目录”错误

已修复:磁盘已满时解压缩操作出现问题。CodeDeploy 代理现在能检测到表示磁盘已满的解压缩退出代码 50,移除部分解压缩的文件,并引发异常以便向 CodeDeploy 服务器发布失败信息。该错误消息显示为生命周期事件错误消息,主机级部署将停止,而不会卡住或超时。

已修复:会导致代理失败的问题。

已修复:钩子在边缘争用条件下超时的问题。没有脚本的钩子现在将继续运行,并且不会再导致失败或超时。

已更改:CodeDeploy 代理的 bin 目录中的 update 脚本由于不再使用而已被删除。

已更改:适用于 Windows Server 的 CodeDeploy 代理现在捆绑了 Ruby 2.7。

已更改:添加了新的环境变量,供钩子脚本使用,具体取决于部署包的来源(Amazon S3 还是 GitHub)。

有关更多信息,请参阅挂钩的环境变量可用性

重要

弃用通知:CodeDeploy 代理 1.4.0 是最后一个包含适用于 32 位 Windows Server 的安装程序的版本。

弃用通知:CodeDeploy 代理 1.4.0 是最后一个支持 Windows Server 2008 R2 的版本。

已删除:对以下 Amazon EC2 AMI 上的 CodeDeploy 代理的支持:Amazon Linux 2014.09、2016.03、2016.09 和 2017.03。

1.3.2

2021 年 5 月 6 日

重要

CodeDeploy 代理 1.3.2 解决了 CVE-2018-1000201,该漏洞会影响运行该代理的 Windows 主机。CVE 引用了 ruby-ffi,它是 CodeDeploy 代理的依赖项。如果您的代理与 Amazon EC2 Systems Manager (SSM) 一起安装并且设置为自动更新,则无需执行任何操作。否则,需要采取措施来手动更新代理。要升级代理,请按照在 Windows 服务器上更新 CodeDeploy 代理中的说明进行操作。

已修复:在 Ubuntu 20.04 及更高版本上安装 CodeDeploy 代理时出现问题。

已修复:由于未正确处理相对路径,在提取压缩文件时出现间歇性问题。

新增:对 Windows 实例的 Amazon PrivateLink 和 VPC 终端节点的支持。

新增:AppSpec 文件改进,如下所述。

  • 现在,您可以在创建本地部署时为 AppSpec 文件指定自定义文件名。有关更多信息,请参阅创建本地部署

  • AppSpec 文件现在可以有 .yaml 文件扩展名。

  • 现在,您可以在 AppSpec 文件中使用新的可选 file_exists_behavior 设置覆盖已部署的文件。有关更多信息,请参阅AppSpec “文件” 部分(仅限 EC2/本地部署)

已升级:CodeDeploy 现在使用适用于 Ruby 3.0 的 Amazon SDK。

1.3.1

2020 年 12 月 22 日

已修复:导致本地实例无法启动的 1.3.0 问题。

1.3.0

2020 年 11 月 10 日

重要

此版本已被弃用。

已修复:删除了不再使用的过期证书。

已修复:从 Amazon Systems Manager 使用的代理卸载脚本中删除了提示消息,从而可以更轻松地将主机或实例集降级到代理的先前版本。

1.2.1

2020 年 9 月 23 日

已更改:将 Amazon SDK for Ruby 依赖项从 v2 升级到 v3。

新增:对 IMDSv2 的支持。包括在 IMDSv2 http 请求失败时静默回退到 IMDSv1 的功能。

已更改:更新了安全补丁的 Rake 和 Rubyzip 依赖项。

已修复:确保代理启动时,空的 PID 文件将返回状态 No CodeDeploy Agent Running 并清理 PID 文件。

1.1.2

2020 年 8 月 4 日

新增:对 Ubuntu Server 19.10 和 20.04 的支持。

注意:版本 19.10 生命周期已结束,Ubuntu 或 CodeDeploy 不再支持。

新增:改进了 Linux 和 Ubuntu 的内存效率,可以更及时地释放预留内存。

新增:与 Windows Server“静默清理”的兼容性,这会导致代理在某些情况下无响应。

新增:在清理过程中忽略非空目录,以避免部署失败。

新增:对洛杉矶 (LA) Amazon Local Zone 的支持。

新增:从实例元数据中提取可用区以提供与 Amazon Local Zones 的兼容性。

新增:用户现在可以在子目录中提供存档,无需将其存储在根目录中。

新增:检测到 Rubyzip 存在的、可能导致内存泄漏的问题。更新了 unzip 命令,使其在使用 Rubyzip 之前首先尝试使用系统安装的 unzip 实用程序。

新增:enable_auth_policy: 作为代理配置设置。

已更改:现在将忽略解压缩警告,因此部署将继续进行。

1.1.0

2020 年 6 月 30 日

已更改:CodeDeploy 代理的版本控制现在遵循 Ruby 标准版本控制约定。

新增:安装和更新命令的新参数,允许从命令行安装特定代理版本。

已删除:删除了 Linux 和 Ubuntu 的 CodeDeploy 代理自动更新程序。要配置 CodeDeploy 代理的自动更新,请参阅使用 Amazon Systems Manager 安装 CodeDeploy 代理

1.0.1.1597

2018 年 11 月 15 日

增强功能:CodeDeploy 支持 Ubuntu 18.04。

增强功能:CodeDeploy 支持 Ruby 2.5。

增强功能:CodeDeploy 支持 FIPS 终端节点。有关联邦信息处理标准端点的更多信息,请参阅 FIPS 140-2 概述。有关可用于 CodeBuild 的终端节点,请参阅 CodeDeploy 区域和终端节点

1.0.1.1518

2018 年 6 月 12 日

增强功能:修复了一个问题,该问题导致 CodeDeploy 代理在接受轮询请求的同时关闭时出错。

增强功能:添加了一项部署跟踪功能,可防止 CodeDeploy 代理在部署进行当中关闭。

增强功能:改进了删除文件时的性能。

1.0.1.1458

2018 年 3 月 6 日

注意:此版本不再受支持。如果您使用此版本,您的部署可能会失败。

增强功能:改进了证书验证,以支持更多受信任的机构。

增强功能:修复了当部署包含 BeforeInstall 生命周期事件时导致本地 CLI 失败的问题。

增强功能:修复了在更新 CodeDeploy 代理时,可能导致活动部署失败的问题。

1.0.1.1352

2017 年 11 月 16 日

注意:此版本不再受支持。如果您使用此版本,您的部署可能会失败。

功能:引入了一项新功能,用于在安装了 CodeDeploy 代理的本地计算机或实例上测试和调试 EC2/本地部署。

1.0.1.1106

2017 年 5 月 16 日

注意:此版本不再受支持。如果您使用此版本,您的部署可能会失败。

功能:引入了对处理目标位置上的不作为来自最新成功部署的应用程序修订的一部分的内容的新支持。针对现有内容的部署选项现在包括保留内容、覆盖内容或使部署失败。

增强功能:使 CodeDeploy 代理与版本 2.9.2 Amazon SDK for Ruby (aws-sdk-core 2.9.2) 兼容。

1.0.1.1095

2017 年 3 月 29 日

注意:此版本不再受支持。如果您使用此版本,您的部署可能会失败。

增强功能:在中国(北京)区域中引入了对 CodeDeploy 代理的支持。

增强功能:生命周期事件挂钩进行调用时,允许 Puppet 在 Windows Server 实例上运行。

增强功能:改进对 untar 操作的处理。

1.0.1.1067 2017 年 1 月 6 日

注意:此版本不再受支持。如果您使用此版本,您的部署可能会失败。

增强功能:修改了很多错误消息,以包含导致部署故障的更具体的原因。

增强功能:修复了导致 CodeDeploy 代理无法在一些部署中指定要部署的正确应用程序版本的问题。

增强功能:恢复在 untar 操作之前和之后使用 pushdpopd

1.0.1.1045 2016 年 11 月 21 日

注意:此版本不再受支持。如果您使用此版本,您的部署可能会失败。

增强功能:使 CodeDeploy 代理与版本 2.6.11 Amazon SDK for Ruby (aws-sdk-core 2.6.11) 兼容。

1.0.1.1037 2016 年 10 月 19 日

注意:此版本不再受支持。如果您使用此版本,您的部署可能会失败。

更新了用于 Amazon Linux、RHEL 和 Ubuntu Server 实例的 CodeDeploy 代理,进行了以下更改。对于 Windows Server 实例,最新版本仍为 1.0.1.998。

增强功能:该代理现在可以确定哪个 Ruby 版本安装在实例上,以使它可以使用该版本调用 codedeploy-agent 脚本。

1.0.1.1011.1 2016 年 8 月 17 日

注意:此版本不再受支持。如果您使用此版本,您的部署可能会失败。

增强功能:删除了由于外壳支持问题而在 1.0.1.1011 版中引入的更改。此版本代理在功能上与 2016 年 7 月 11 日发布的 1.0.1.998 版相同。

1.0.1.1011 2016 年 8 月 15 日

注意:此版本不再受支持。如果您使用此版本,您的部署可能会失败。

更新了用于 Amazon Linux、RHEL 和 Ubuntu Server 实例的 CodeDeploy 代理,进行了以下更改。对于 Windows Server 实例,最新版本仍为 1.0.1.998。

功能:增加了在使用 systemd 初始化系统的操作系统上使用 bash shell 调用 CodeDeploy 代理的支持。

增强功能:在 CodeDeploy 代理和 CodeDeploy 代理更新程序中启用了对所有 Ruby 2.x 版本的支持。更新的 CodeDeploy 代理不再单纯依赖 Ruby 2.0。(CodeDeploy 代理安装程序的 deb 和 rpm 版本仍然需要 Ruby 2.0。)
1.0.1.998 2016 年 7 月 11 日

注意:此版本不再受支持。如果您使用此版本,您的部署可能会失败。

增强功能:修复了对使用 root 用户以外的用户配置文件运行 CodeDeploy 代理的支持。名为 USER 的变量将被替换为 CODEDEPLOY_USER,以避免与环境变量发生冲突。

1.0.1.966 2016 年 6 月 16 日

注意:此版本不再受支持。如果您使用此版本,您的部署可能会失败。

功能:引入了对使用 root 用户以外的用户配置文件运行 CodeDeploy 代理的支持。

增强功能:修复了对指定您希望 CodeDeploy 代理为部署组存档的应用程序修订数量的支持。

增强功能:使 CodeDeploy 代理与版本 2.3 Amazon SDK for Ruby (aws-sdk-core 2.3) 兼容。

增强功能:修复了与部署期间的 UTF-8 编码有关的问题。

增强功能:提高了标识进程名称时的准确性。

1.0.1.950 2016 年 3 月 24 日

注意:此版本不再受支持。如果您使用此版本,您的部署可能会失败。

功能:添加了安装代理支持。

增强功能:更新了安装脚本,如果已安装最新版本,则不会下载 CodeDeploy 代理。

1.0.1.934 2016 年 2 月 11 日

注意:此版本不再受支持。如果您使用此版本,您的部署可能会失败。

功能:引入了对指定您要 CodeDeploy 代理为部署组存档的应用程序修订数量的支持。

1.0.1.880 2016 年 1 月 11 日

注意:此版本不再受支持,可能会导致部署失败。

增强功能:使 CodeDeploy 代理与版本 2.2 Amazon SDK for Ruby (aws-sdk-core 2.2) 兼容。版本 2.1.2 仍受支持。

1.0.1.854 2015 年 11 月 17 日

注意:此版本不再受支持。如果您使用此版本,您的部署可能会失败。

功能:引入了对 SHA-256 哈希算法的支持。

功能:在 .version 文件中引入了版本跟踪支持。

功能:通过使用环境变量使部署组 ID 可用。

增强:增加了对使用 Amazon CloudWatch Logs 监控 CodeDeploy 代理日志的支持。

有关相关信息,请参阅下列内容:

有关 CodeDeploy 代理版本的历史记录,请参阅 GitHub 上的版本存储库

管理 CodeDeploy 流程

默认情况下,CodeDeploy 代理的所有 Linux 发行版(rpm 和 deb)都使用 systemd 来管理代理进程。

但是,rpm 和 deb 发行版都附带了位于 /etc/init.d/codedeploy-agent 的启动脚本。根据您使用的发行版,在使用 sudo service codedeploy-agent restart 这样的命令时,可能会运行 /etc/init.d 中的脚本来启动代理进程,而不是允许 systemd 管理该进程。在 /etc/init.d 上运行脚本是不可取的。

为防止出现此问题,对于支持 systemd 的系统,我们建议使用 systemctl 实用程序进行任何代理操作,而不是使用 service 命令。

例如,要重新启动 CodeDeploy 代理,请使用 sudo systemctl restart codedeploy-agent,而不是 service 实用程序中的等效命令。

应用程序修订和日志文件清理

CodeDeploy 代理将修订和日志文件存档在实例上。CodeDeploy 代理将清理这些构件以节省磁盘空间。

应用程序修订部署日志:可以使用代理配置文件中的 :max_revisions: 选项,通过输入任何正整数来指定要存档的应用程序修订的数目。CodeDeploy 还对这些修订的日志文件进行存档。所有其他文件将被删除,但上次成功部署的日志文件除外。该日志文件将始终保留,即使失败的部署数量超过保留的修订数量也是如此。如果不指定任何值,则除了当前部署的修订之外,CodeDeploy 还将保留五个最新修订。

CodeDeploy 日志:对于 Amazon Linux、Ubuntu Server 和 RHEL 实例,CodeDeploy 代理会轮换 /var/log/aws/codedeploy-agent 文件夹下的日志文件。日志文件将在每天 00:00:00(实例时间)轮换。日志文件会在七天后删除。已轮换日志文件的命名模式是 codedeploy-agent.YYYYMMDD.log

由 CodeDeploy 代理安装的文件

CodeDeploy 代理在实例上的根目录中存储修订、部署历史记录和部署脚本。该目录的默认名称和位置是:

对于 Amazon Linux、Ubuntu Server 和 RHEL 实例为 '/opt/codedeploy-agent/deployment-root'

对于 Windows Server 实例为 'C:\ProgramData\Amazon\CodeDeploy'

您可以使用 CodeDeploy 代理配置文件中的 root_dir 设置来配置该目录的名称和位置。有关更多信息,请参阅CodeDeploy 代理配置参考

下面是根目录下文件和目录结构的示例。该结构假定有 N 个部署组,每个部署组包含 N 个部署。

|--deployment-root/ |-- deployment group 1 ID | |-- deployment 1 ID | | |-- Contents and logs of the deployment's revision | |-- deployment 2 ID | | |-- Contents and logs of the deployment's revision | |-- deployment N ID | | |-- Contents and logs of the deployment's revision |-- deployment group 2 ID | |-- deployment 1 ID | | |-- bundle.tar | | |-- deployment-archive | | | | -- contents of the deployment's revision | | |-- logs | | | | -- scripts.log | |-- deployment 2 ID | | |-- bundle.tar | | |-- deployment-archive | | | | -- contents of the deployment's revision | | |-- logs | | | | -- scripts.log | |-- deployment N ID | | |-- bundle.tar | | |-- deployment-archive | | | | -- contents of the deployment's revision | | |-- logs | | | | -- scripts.log |-- deployment group N ID | |-- deployment 1 ID | | |-- Contents and logs of the deployment's revision | |-- deployment 2 ID | | |-- Contents and logs of the deployment's revision | |-- deployment N ID | | |-- Contents and logs of the deployment's revision |-- deployment-instructions | |-- [deployment group 1 ID]_cleanup | |-- [deployment group 2 ID]_cleanup | |-- [deployment group N ID]_cleanup | |-- [deployment group 1 ID]_install.json | |-- [deployment group 2 ID]_install.json | |-- [deployment group N ID]_install.json | |-- [deployment group 1 ID]_last_successful_install | |-- [deployment group 2 ID]_last_successful_install | |-- [deployment group N ID]_last_successful_install | |-- [deployment group 1 ID]_most_recent_install | |-- [deployment group 2 ID]_most_recent_install | |-- [deployment group N ID]_most_recent_install |-- deployment-logs | |-- codedeploy-agent-deployments.log

  • Deployment Group ID 文件夹代表您的每个部署组。部署组目录的名称是其 ID (例如,acde1916-9099-7caf-fd21-012345abcdef)。每个部署组目录都包含该部署组中每次尝试的部署的一个子目录。

    您可以使用 batch-get-deployments 命令查找部署组 ID。

  • Deployment ID 文件夹代表部署组中的每个部署。每个部署目录的名称都是其 ID。每个文件夹都包含:

    • bundle.tar,一个压缩文件,其中包含部署修订的内容。如果要查看修订,请使用 zip 解压实用程序。

    • deployment-archive,一个目录,其中包含部署修订的内容。

    • logs,一个包含 scripts.log 文件的目录。此文件列出部署的 AppSpec 文件中指定的所有脚本的输出。

    如果要查找某个部署的文件夹,但不知道其部署 ID 或部署组 ID,则可以使用 Amazon CodeDeploy 控制台或 Amazon CLI 来查找它们。有关更多信息,请参阅查看CodeDeploy部署详情

    部署组中可以存档的默认最大部署数为五个。达到该数量后,将来的部署将被存档,最旧的存档将被删除。您可以使用 CodeDeploy 代理配置文件中的 max_revisions 设置来更改该默认值。有关更多信息,请参阅CodeDeploy 代理配置参考

    注意

    如果您想恢复已存档部署使用的硬盘空间,请将 max_revisions 设置更新为较低的数量,例如 1 或 2。下一次部署将删除已存档的部署,以便数量等于您指定的数量。

  • deployment-instructions 包含每个部署组的四个文本文件:

    • [Deployment Group ID]-cleanup,一个文本文件,其中包含部署期间运行的每个命令的撤消版本。示例文件名为 acde1916-9099-7caf-fd21-012345abcdef-cleanup

    • [Deployment Group ID]-install.json,在最近的部署过程中创建的 JSON 文件。它包含部署期间运行的命令。示例文件名为 acde1916-9099-7caf-fd21-012345abcdef-install.json

    • [Deployment Group ID]_last_successfull_install,一个文本文件,其中列出了上次成功部署的存档目录。该文件在 CodeDeploy 代理将部署应用程序中的所有文件复制到实例时创建。它由 CodeDeploy 代理在下次部署期间使用,旨在确定要运行的 ApplicationStopBeforeInstall 脚本。示例文件名为 acde1916-9099-7caf-fd21-012345abcdef_last_successfull_install

    • [Deployment Group ID]_most_recent_install,一个文本文件,其中列出了最近一次部署的存档目录的名称。该文件在部署中的文件成功下载时创建。[deployment group ID]_last_successfull_install 文件在该文件之后创建,即下载的文件被复制到其最终目的地时。示例文件名为 acde1916-9099-7caf-fd21-012345abcdef_most_recent_install

  • deployment-logs 包含以下日志文件:

    • codedeploy-agent.yyyymmdd.log 文件按天创建,只要当天发生部署活动,就会创建该文件。每个日志文件都包含有关当天部署的信息。这些日志文件可能对调试权限问题等很有用。日志文件最初名为 codedeploy-agent.log。第二天,其部署日期将被插入到文件名中。例如,如果今天是 2018 年 1 月 3 日,您可以在 codedeploy-agent.log 中看到有关今天的所有部署的信息。明天,也就是 2018 年 1 月 4 日,日志文件将重命名为 codedeploy-agent.20180103.log

    • codedeploy-agent-deployments.log 编译每个部署的 scripts.log 文件的内容。scripts.log 文件位于每个 logs 文件夹下的 Deployment ID 子文件夹中。此文件中的条目前面带有部署 ID。例如,“[d-ABCDEF123]LifecycleEvent - BeforeInstall”可能是在 ID 为 d-ABCDEF123 的部署期间写入的。当 codedeploy-agent-deployments.log 达到其最大大小时,CodeDeploy 代理将继续向其中写入内容,同时删除旧内容。