You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

GitLab CI通过lftp部署至FTP/SFTP超时失败求助

Fixing LFTP Stalling in GitLab CI SFTP Deployment

Hey there! It sounds like your lftp job is hanging because it's waiting for interactive input—super typical in non-interactive CI environments where there's no human to click "yes" or enter credentials manually. Let's break down the fixes step by step:

1. Disable Interactive Prompts

The most common culprit is lftp asking to confirm the remote server's host key (that "Are you sure you want to connect?" prompt you see locally). In CI, there's no one to respond, so it hangs forever. Add these settings to skip all interactive checks:

  • set sftp:strict-host-key-checking no: Turns off host key verification prompts
  • set sftp:auto-confirm yes: Automatically approves any other prompts (like overwriting existing files)

2. Pass Credentials Securely (No Manual Input)

Never hardcode credentials! Use GitLab CI variables to store your FTP username and password, then pass them directly to lftp to avoid login prompts. Use the -u flag to inject credentials:

lftp -u $FTP_USER,$FTP_PASSWORD sftp://$FTP_HOST

3. Use a Batch Script for Commands

Instead of chaining commands on the CLI, use a here-document to list all your lftp actions in one go. This ensures everything runs sequentially without waiting for user input.

4. Enable Debug Logs to Diagnose Issues

If it's still hanging, add the -d flag to lftp to enable debug output. This will show exactly where the job gets stuck (e.g., authentication, directory access) in your CI logs, making it easier to pinpoint the problem.

Full Working .gitlab-ci.yml Example

Here's a complete deploy job that incorporates all these fixes:

deploy_to_ftp:
  stage: deploy
  before_script:
    # Install lftp if your runner doesn't have it pre-installed
    - apt-get update && apt-get install -y lftp
  script:
    - lftp -d -u $FTP_USER,$FTP_PASSWORD sftp://$FTP_HOST << EOF
        set sftp:strict-host-key-checking no
        set sftp:auto-confirm yes
        # Mirror local directory to remote: -R means reverse (local -> remote)
        mirror -R ./path/to/your/build /remote/server/target/directory
        # Always quit explicitly to end the lftp session cleanly
        quit
      EOF
  only:
    - main  # Run this job only on pushes to the main branch

Quick Verification Checks

  • Double-check that your GitLab CI variables (FTP_USER, FTP_PASSWORD, FTP_HOST) are correctly set in Settings > CI/CD > Variables (don't mark them as "Protected" unless your branch is also protected)
  • Confirm your GitLab runner can reach the FTP server's SFTP port (default 22) — firewall rules might be blocking the connection
  • Verify the local and remote paths in the mirror command are correct (typos here can cause silent failures or hangs)

内容的提问来源于stack exchange,提问作者Shaddow

火山引擎 最新活动