使用 GitLab CI 通过 python 脚本部署到 FTP

Deploy to FTP via python script with GitLab CI

我是 GitLab 的新手。我正在构建我的第一个管道,以将我的 GitLab 项目的内容部署到具有 TLS 加密的 FTP 服务器。我已经使用 ftplib 编写了一个 Python 脚本来将文件上传到 FTP 服务器,当我 运行 它在我的本地 Windows 机器上时,它可以完美地工作.该脚本将项目的全部内容上传到 FTP 服务器上的文件夹。现在我试图通过调用项目的 .gitlab-ci.yml 文件中的脚本让它在 GitLab 上工作。脚本和 yml 文件都在我的 GitLab 项目的顶层。目前的设置非常简单:

image: python:latest

deploy:
    stage: deploy
    script: 
        - python ftpupload.py
    only:
        - main

但是,上传总是超时并出现以下错误消息:

  File "/usr/local/lib/python3.9/ftplib.py", line 156, in connect
    self.sock = socket.create_connection((self.host, self.port), self.timeout,
  File "/usr/local/lib/python3.9/socket.py", line 843, in create_connection
    raise err
  File "/usr/local/lib/python3.9/socket.py", line 831, in create_connection
    sock.connect(sa)
TimeoutError: [Errno 110] Connection timed out
Cleaning up file based variables
ERROR: Job failed: exit code 1

这是在 Python 脚本中建立连接的基本设置,该脚本在本地运行良好但在 GitLab 上失败:

class ReusedSslSocket(ssl.SSLSocket):
    def unwrap(self):
        pass


class MyFTP_TLS(ftplib.FTP_TLS):
    """Explicit FTPS, with shared TLS session"""
    def ntransfercmd(self, cmd, rest=None):
        conn, size = ftplib.FTP.ntransfercmd(self, cmd, rest)
        if self._prot_p:
            conn = self.context.wrap_socket(conn,
                                            server_hostname=self.host,
                                            session=self.sock.session)  # reuses TLS session            
            conn.__class__ = ReusedSslSocket  # we should not close reused ssl socket when file transfers finish
        return conn, size

session = MyFTP_TLS(server, username, password, timeout=None)
session.prot_p()

我知道我可以在 GitLab CI 中使用其他工具,例如 lftp 和 git-ftp,但我已经构建了很多将自定义功能添加到 Python 脚本中并希望使用它。如何在 GitLab CI 中成功部署脚本?预先感谢您的帮助!

这要求 GitLab Runner(执行管道)能够与您的 FTP 服务器建立 SFTP 连接。

Shared runners 可能被锁定为仅连接到 GitLab 服务器(以防止攻击媒介)。

要解决此问题,install your own runner and register 将其发送到您的 GitLab。