jahudka / ftp-deploy
Requires
- php: >=8.0
- ext-curl: *
- guzzlehttp/guzzle: ^7.5
- symfony/console: ^6.0
- symfony/process: ^6.0
- symfony/string: ^6.0
- symfony/yaml: ^6.0
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
是可选的,默认情况下,它从解析的remoteRoot
和publicDir
选项派生;但在某些稍微不寻常的场景中,如果publicDir
是符号链接,可能无法正确解析,因此您可以指定它。baseUrl
必须是publicDir
的完整绝对URL。files
是选择操作中任一侧文件的一组模式。有关详细信息,请参阅下面。
默认情况下,ftp-deploy
在当前工作目录中查找配置文件,然后搜索文件系统树,直到达到包含composer.json
文件的目录,或文件系统根。接受的配置文件名有:.ftpdeployrc
、.ftp-deploy.yml
、.ftp-deploy.yaml
、ftp-deploy.yml
和ftp-deploy.yaml
。您可以使用-c
或--config
命令行选项指定自定义配置文件。
文件模式
形式上,文件模式符合以下语法
pattern := [<local|remote>:][!][path]
在构建文件列表时,对于每个文件,第一个匹配的模式确定文件是否包含或排除。如果没有模式匹配文件,则默认包含该文件。如果排除目录,则其内容将不进行遍历,因此没有模式可以在排除的目录内匹配(类似于rsync
)。
默认情况下,模式用于匹配传输双方的文件。通过在模式前加上local:
或remote:
,我们可以将此模式限制在单侧使用,这在例如排除本地缓存文件时非常有用,这将有效地清除远程缓存。
在上述位置以!
开头的模式会导致匹配的文件被排除;否则,模式会导致匹配的文件被包含。由于默认策略是包含不匹配任何模式的文件,因此包含模式仅对那些可能被后续排除模式排除的文件有用。
以/
开头的path
部分的模式被锚定在根目录;没有前导/
的模式将在文件夹结构中的任何位置匹配,前提是它们的父目录没有被另一个模式排除。
部署
工具会尽最大努力在现有约束内使部署尽可能可逆和原子化。为此,部署分为四个阶段执行
- 提取
- 创建新目录
- 更新未更改权限的现有文件
- 上传的文件被提取到临时文件中,并创建现有文件的备份
- 在临时位置创建符号链接,并创建现有符号链接的备份
- 提交
- 将提取的临时文件和临时符号链接移动到最终位置
- 移除
- 计划删除的文件和目录被移除
- 清理
- 在提取过程中创建的任何备份文件和符号链接被移除
如果部署在步骤1或2中失败,整个过程将被回滚
- 任何被覆盖的文件和符号链接将从备份中恢复
- 任何创建的目录将被移除
- 任何权限已更改的文件或目录将被重置为其原始状态
- 任何临时文件和未使用的备份将被移除
移除和清理过程中的失败将被记录,但不会导致部署被回滚。
FTP Deploy可以处理的情景
- 远程文件不存在 -> 上传
- 远程文件内容不同 -> 上传
- 远程文件权限不同 -> chmod
- 远程目录不存在 -> mkdir
- 远程目录权限不同 -> chmod
- 本地文件不存在 -> unlink
- 本地目录不存在 -> rmdir
FTP Deploy无法处理的情景
- 远程文件类型与本地不同(例如,目录与常规文件、符号链接与非符号链接等)- 但至少可以提前检测到,这样在发生这种情况时我们不会执行任何操作