我是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()
我知道我可以在Python中使用其他工具,如lftp和git-ftp,但我已经在GitLab脚本中构建了许多自定义功能,并希望使用它。如何在GitLab CI中成功部署脚本?提前感谢您的帮助!
发布于 2021-10-25 21:00:30
这要求GitLab Runner (执行管道)能够与您的FTP服务器建立SFTP连接。
Shared runners可能被锁定为仅连接到GitLab服务器(以防止攻击载体)。
https://stackoverflow.com/questions/69669851
复制相似问题