返回

GitHub Actions FTP部署:仅创建文件夹,不上传文件?原因解析及解决

vue.js

GitHub Actions FTP 部署仅创建文件夹,不上传文件问题解析

在使用 GitHub Actions 进行 FTP 部署时,常见一种现象:工作流程成功执行,目标服务器上却只建立了目录结构,文件却没有同步上传。本文将对此问题进行剖析,并给出可能的解决策略。

问题本质

这类问题根本原因在于 FTP 部署步骤,配置细节或依赖项缺失。表面看来,目录创建操作可以正常进行,表明 GitHub Actions 工作流已成功连接至 FTP 服务器,但后续的文件上传环节出现错误。原因常可归结于几个方面:

  1. 文件传输模式配置错误: FTP 支持多种传输模式,例如 ASCII 和二进制模式。 错误模式可能会导致上传文件内容错误,或传输失败。特别是上传非文本类型文件时(例如图片、二进制程序包),必须使用二进制传输。
  2. FTP-Deploy-Action 参数配置问题: GitHub Actions 中使用的一些 FTP 部署 Action 需要仔细配置才能确保所有文件正确上传。 例如 source 参数(如果没有使用),以及其它相关文件选择参数的误用。
  3. 服务器端文件系统权限限制: 有时,目标服务器上的文件权限设置可能禁止上传新文件,只允许创建新目录。这可能因目标服务器的设置而异。
  4. 路径设置问题: 若本地文件路径或者目标 FTP 服务器路径设置不正确,也会造成上传失败。 即使能够成功创建文件夹,也可能会导致文件传输到错误的路径或者没有正确读取文件路径。

解决策略与方案

解决 FTP 部署时仅创建文件夹不上传文件的问题,可以从以下几个角度出发进行排查和改进:

1. 指定正确的源文件目录

多数 FTP 部署 Action 允许通过参数指定需要上传的本地源目录。必须正确设置该路径,确保所有文件都能被部署。如果未能显式配置此项,一些 Action 默认会尝试部署根目录或者某个固定目录。

配置方法: 在 workflow 文件中,将FTP-Deploy-Action 的配置部分修改为如下形式,确保正确指定待上传的本地路径:

      - name: Deploying project
        uses: SamKirkland/FTP-Deploy-Action@4.3.2
        with:
          server: ${{ secrets.FTP_SERVER }}
          username: ${{ secrets.FTP_USERNAME }}
          password: ${{ secrets.FTP_PASSWORD }}
          remote-path: /public_html
          local-path: ./ # 当前目录所有文件
          exclude: |
            **/.git*
            **/.git*/** 
            node_modules/
            node_modules/**/*

在此代码片段中,我们新增了local-path 参数,将其设置为 ./ 指定了本地项目的所有内容为源文件。 同时设置了remote-path 参数,指定FTP服务器上的目标目录(例如 public_html 或您服务器上对应的根目录),确保上传路径正确。

2. 检查并设置文件传输模式

FTP 有 ASCII 和 BINARY 两种传输模式。ASCII 模式用于文本文件传输,而 BINARY 模式用于传输二进制文件 (图片, 压缩包等) ,多数情况下推荐使用 BINARY 模式。 某些FTP Action 会提供选项去指定模式。 如果不提供,可以检查 Action 的默认行为或者寻找能够提供传输模式配置选项的替代方案。

配置方法: 具体配置需要查看 FTP-Deploy-Action 是否提供 transfer-mode 或者类似参数。当前版本的此 Action 并未提供此配置项。 但是一些替代 Action,例如 actions-ftp-deploy, 支持传输模式选项,示例如下:

  - name: Deploy to FTP
    uses: ittych/actions-ftp-deploy@v1
    with:
      server: ${{ secrets.FTP_SERVER }}
      username: ${{ secrets.FTP_USERNAME }}
      password: ${{ secrets.FTP_PASSWORD }}
      port: 21  # 可选参数,FTP 默认端口 21
      source: './'  # 源文件目录
      dest: '/public_html/' # FTP 上的目标目录
      mode: 'binary'  # 指定传输模式
      exclude: |
            **/.git*
            **/.git*/** 
            node_modules/
            node_modules/**/*

上述代码片段演示了 actions-ftp-deploy 的用法,指定传输模式 binary 并正确配置源和目标目录。 请注意调整 dest 参数为你的 FTP 实际根目录。

3. 核实 FTP 服务器的文件写入权限

部分 FTP 服务器, 可能默认情况下, 用户只能创建文件夹, 而不能写入文件, 部署之前应确保 FTP 用户在指定部署目录下具备完整的文件读写权限。 您可以联系服务器管理员进行授权或者自己修改。 不同的服务器平台权限设置方式不一样, 一般可通过控制面板进行权限调整或者使用 SSH 终端进行命令修改。

修改方法: 此步骤较为复杂,涉及到对服务器操作。 一般的 cPanel 管理界面都提供 文件权限修改的功能, 您需要确保部署用户的写入权限已正确开启, 请务必谨慎操作, 错误的权限可能带来安全风险。 使用 SSH 修改文件权限需要通过以下命令进行:

# 例如, 修改 `/public_html` 目录及其子文件的所有权和权限为 'your-ftp-user':
chown -R your-ftp-user:your-ftp-user /public_html
chmod -R 755 /public_html

上述命令仅为示例,具体操作应该与您的服务器设置以及目录结构一致。 your-ftp-user 替换为你的 FTP 用户。 755 权限的含义为用户可以读取,写入和执行,而组成员和其它用户则只可读和执行。 您应根据实际情况选择更合适的权限模式。

4. 安全建议

使用 FTP 协议进行部署时,请注意以下安全事项:

  • 使用安全的 sftp 协议 (SSH File Transfer Protocol): FTP 协议本身不加密,请尽可能选择 SFTP (基于 SSH) 或 FTPS (基于 TLS/SSL) 这种加密传输的协议,而不是纯 FTP。 您可能需要更新 Workflow 文件和服务器设置, 来使用 sftp。
  • 使用环境变量: 将 FTP 用户名和密码保存在 GitHub Secrets 中。避免硬编码敏感信息到你的 workflow 定义中。
  • 限制访问范围: 将您的部署账号访问权限限制在特定文件夹下,不要授予过高权限。

解决 FTP 部署问题通常需要耐心,细致的排查与逐步尝试,通过核实上述参数,权限与传输模式设置,通常可以有效解决文件夹上传的问题。 请在执行任何操作前务必备份好服务器上的文件。