jahudka/ftp-deploy

安装: 99

依赖: 0

建议者: 0

安全性: 0

星星: 0

关注者: 1

分支: 0

开放问题: 0

类型:项目

v1.0.0 2023-02-15 22:25 UTC

This package is auto-updated.

Last update: 2024-09-16 02:09:53 UTC


README

PHP增强FTP部署。此工具将通过FTP(S)上传您的文件到您的网站托管。但与逐个上传文件(在FTP上非常慢)不同,您的文件将以PHP自解压归档脚本的形式上传,然后在远程执行。

该工具首先上传一个辅助脚本,该脚本扫描配置的根目录并在远程端创建文件列表。然后它将此与本地文件列表进行比较,并编译出需要执行的操作列表,以使远程文件列表与本地文件列表匹配。根据此,工具构建一个包含所有必要数据和提取指令的归档文件。然后通过FTP上传该归档并在远程服务器上执行。

该工具假定您有一个可通过FTP(S)和HTTP访问的网站托管服务,并运行PHP版本8.0或更高版本。服务器上的PHP必须对FTP主机上的文件有写入权限。您显然还需要在部署将运行的服务器上安装PHP 8。

安装

FTP Deploy可通过Composer获得。您可以将它作为项目的开发依赖项本地安装,或按您喜欢的全局安装。

composer require jahudka/ftp-deploy
# or:
composer require --global jahudka/ftp-deploy

配置

FTP Deploy使用以下格式的YAML文件进行配置

host: ftp.host.com
port: 21
user: ftpuser
password: secret
localRoot: ./public
remoteRoot: /subdomains/www
publicDir: .
remoteRootRelativeToPublicDir: ~
baseUrl: http://site.com
files:
  - '!/static'

除了files外,所有配置选项也可以使用格式为DEPLOY_*的环境变量设置,例如DEPLOY_PUBLIC_DIR

  • port是可选的,默认为21
  • localRoot可以是相对路径;当在配置文件中指定时,它相对于配置文件解析,当使用环境变量指定时,它相对于当前工作目录解析。
  • remoteRoot始终转换为绝对路径;它从FTP目录的根目录解析。
  • publicDir是可选的,默认为.;如果指定了相对路径,则相对于remoteRoot解析。
  • remoteRootRelativeToPublicDir是可选的,默认情况下,它从解析的remoteRootpublicDir选项派生;但在某些稍微不寻常的场景中,如果publicDir是符号链接,可能无法正确解析,因此您可以指定它。
  • baseUrl必须是publicDir的完整绝对URL。
  • files是选择操作中任一侧文件的一组模式。有关详细信息,请参阅下面。

默认情况下,ftp-deploy在当前工作目录中查找配置文件,然后搜索文件系统树,直到达到包含composer.json文件的目录,或文件系统根。接受的配置文件名有:.ftpdeployrc.ftp-deploy.yml.ftp-deploy.yamlftp-deploy.ymlftp-deploy.yaml。您可以使用-c--config命令行选项指定自定义配置文件。

文件模式

形式上,文件模式符合以下语法

pattern := [<local|remote>:][!][path]

在构建文件列表时,对于每个文件,第一个匹配的模式确定文件是否包含或排除。如果没有模式匹配文件,则默认包含该文件。如果排除目录,则其内容将不进行遍历,因此没有模式可以在排除的目录内匹配(类似于rsync)。

默认情况下,模式用于匹配传输双方的文件。通过在模式前加上local:remote:,我们可以将此模式限制在单侧使用,这在例如排除本地缓存文件时非常有用,这将有效地清除远程缓存。

在上述位置以!开头的模式会导致匹配的文件被排除;否则,模式会导致匹配的文件被包含。由于默认策略是包含不匹配任何模式的文件,因此包含模式仅对那些可能被后续排除模式排除的文件有用。

/开头的path部分的模式被锚定在根目录;没有前导/的模式将在文件夹结构中的任何位置匹配,前提是它们的父目录没有被另一个模式排除。

部署

工具会尽最大努力在现有约束内使部署尽可能可逆和原子化。为此,部署分为四个阶段执行

  1. 提取
  • 创建新目录
  • 更新未更改权限的现有文件
  • 上传的文件被提取到临时文件中,并创建现有文件的备份
  • 在临时位置创建符号链接,并创建现有符号链接的备份
  1. 提交
  • 将提取的临时文件和临时符号链接移动到最终位置
  1. 移除
  • 计划删除的文件和目录被移除
  1. 清理
  • 在提取过程中创建的任何备份文件和符号链接被移除

如果部署在步骤1或2中失败,整个过程将被回滚

  • 任何被覆盖的文件和符号链接将从备份中恢复
  • 任何创建的目录将被移除
  • 任何权限已更改的文件或目录将被重置为其原始状态
  • 任何临时文件和未使用的备份将被移除

移除和清理过程中的失败将被记录,但不会导致部署被回滚。

FTP Deploy可以处理的情景

  • 远程文件不存在 -> 上传
  • 远程文件内容不同 -> 上传
  • 远程文件权限不同 -> chmod
  • 远程目录不存在 -> mkdir
  • 远程目录权限不同 -> chmod
  • 本地文件不存在 -> unlink
  • 本地目录不存在 -> rmdir

FTP Deploy无法处理的情景

  • 远程文件类型与本地不同(例如,目录与常规文件、符号链接与非符号链接等)- 但至少可以提前检测到,这样在发生这种情况时我们不会执行任何操作