我有一个 Gitlab 运行程序,它使用 Docker 执行器运行各种作业(主机是 Ubuntu 20,来宾是各种 Linux 映像)。运行者以非特权方式运行容器。
我被一个看似简单的需求所困扰 - 我需要在 Windows 计算机上部署一些工件,将目标路径公开为经过身份验证的共享 (
\\myserver\myapp
)。无非就是用源上的文件替换目标上的文件 - 一个简单的 rsync 就可以了。
Gitlab Runner 不允许在 CI 配置中指定安装(请参阅https://gitlab.com/gitlab-org/gitlab-runner/-/issues/28121),所以我尝试使用
mount.cifs
,但我发现默认情况下,Docker 不允许在容器内安装任何内容,除非以特权运行,我想避免这种情况。
我还尝试了使用
--cap-add
的建议,如在 Docker 容器中安装 SMB/CIFS 共享中所述,但它们似乎不足以满足我的主机的要求,可能还有其他所需的功能,我不知道如何识别他们。而且,这看起来比运行特权稍微不那么难看。
现在,我并不严格需要挂载远程文件夹 - 例如,如果有一个支持 SMB 的 rsync 命令,我会非常乐意使用它。不幸的是我无法在Windows机器上安装或运行任何东西(没有SSH,没有SCP,没有FTP),我必须使用文件共享机制。
您知道如何实现这一目标吗?
smbclient
将文件从 CIFS/Samba/SMB 共享复制到 CIFS/Samba/SMB 共享,而无需创建挂载:
smbclient '//myfileserver.domain.tld/sharename' --directory dir1/subdir1 -c 'put /path/to/local/file' -U '<USERNAME>%<PASSWORD>' -W <DOMAIN_WORKGROUP>
put
会将本地文件复制到远程共享,get
会将远程文件从共享复制到本地系统。
不幸的是,我无法在 Windows 机器上安装任何东西(没有 SSH、没有 SCP、没有 FTP)。
您可以简单地在 Go 中复制可执行文件(您可以在其他任何地方构建),监听端口,准备接收文件。
这个实现,例如:
file-receive.go
。它监听端口 8080(可以更改)并将文件内容复制到本地文件夹。
无需安装或设置:只需将 EXE 复制到目标计算机并运行即可。
从 GitLab 运行程序中,您可以'
curl
'将文件发送到远程 PC 计算机的端口 8080。
gitlab-org/gitlab-runner
问题 28121(“允许在服务和构建容器的作业级别上配置卷安装”)应针对 GitLab 16.9(2024 年 2 月)提供。