Jenkins 在 docker 容器外存储工作区

Jenkins store workspace outside docker container

所以我有一个 Jenkins 主从设置,其中主设备启动一个 docker 容器(在从属 VM 上)并在该容器内构建作业,然后在完成后销毁该容器。这一切都是通过 Jenkins 的 Docker plugin.

完成的

一切都运行顺利,但唯一的问题是,在作业完成后(失败的作业)我无法查看工作区(因为容器不见了)。我收到以下错误:

我已经尝试将 "volume" 从主机(从 VM)附加到容器以将文件也存储在外部(这是有效的,因为如下所示,我可以看到主机上的文件)和然后尝试将其映射到主虚拟机:

这是我对特定 docker 图像模板的设置:

非常感谢任何帮助!

编辑:我已经成功地让工作空间存储在主机上。但是,当构建完成后,我仍然遇到同样的错误(错误:没有工作空间)。我不知道如何让 Jenkins 查找主机上的文件而不是容器上的文件。

好的,所以我解决这个问题的方法是从从属容器 docker 容器中挂载一个目录,然后使用 NFS(说明如下所示)我已经挂载了那个从属docker 容器到 jenkins master 上。

所以我的配置如下所示:

我按照这个答案将目录挂载为 NFS:

https://superuser.com/questions/300662/how-to-mount-a-folder-from-a-linux-machine-on-another-linux-machine/300703#300703

需要注意的是,该答案中提供的 IP 地址(您必须输入 /etc/exports)是本地计算机(或我的情况是詹金斯大师)ip地址。

希望这个回答对您有所帮助!

我遇到了同样的问题,以上 post 帮助我找出了我的环境配置中的错误。但是我花了一段时间才理解这句话的逻辑:

Ok, so the way I've solved this problem was to mount a dir on the container from the slave docker container, then using NFS (Instructions are shown below) I've mounted the that slave docker container onto Jenkins master.

所以我决定澄清一下,再写一些解释示例...

这是我的工作环境:

  1. Jenkins master 运行ning on Ubuntu 16.04 server, IP: 192.168.1.111
  2. Jenkins Slave Build Server 运行ning on Ubuntu 16.04 server, IP: 192.168.1.112
  3. Docker 启用构建服务器(用于启动 docker 容器),运行 在 Ubuntu 16.04 服务器上,IP:192.168.1.114。

问题陈述:"Workspace" 在 docker 容器上 运行ning 项目时,在 Jenkins 界面下不可用。

目标:能够在 Jenkins 界面以及 Jenkins master/slave 和 docker 主机服务器上浏览 "Workspace"。

好吧,我的问题始于不同的问题,这让我找到了这个 post 并弄清楚我的环境配置出了什么问题...

让我们假设您的工作环境 Jenkins/Docker 正确配置了 Jenkins Docker 插件。对于第一个 运行 我没有在 Jenkins Docker 插件的 "Container settings..." 选项下配置任何东西。一切顺利 - 工作成功完成,显然我无法浏览正在工作的工作 space,因为 Jenkins Docker 插件设计在完成工作后破坏了 docker 容器。到目前为止一切顺利...我需要保存 docker 工作 space 以便能够在作业失败时查看文件或修复一些问题。为此,我使用 Jenkins Docker 插件中的 "Container settings..." 选项中的 "Volumes" 将 host/path 从主机映射到容器的 container/path:

我再次 运行 同样的工作,但在 Jenkins 中失败并显示以下错误消息:

在花了一些时间了解 Jenkins Docker 插件的工作原理后,我发现上述错误的原因是 [=110] 上的 Docker 主机服务器 (192.168.1.114) 的权限错误=] 自动创建的文件夹:

因此,从这里我们必须为该文件夹分配 "Other" 组写入权限。将 jenknis@192.168.1.114 用户设置为 workspace 文件夹的所有者是不够的,因为我们需要 jenkins@192.168.1.111 用户能够在 192.168.1.114 服务器的 workspace 文件夹下创建子文件夹. (在我的例子中,我在 Jenkins 主服务器上有 jenkins 用户 - 192.168.1.111 和 jenkins 用户以及 Docker 主机服务器 - 192.168.1.114)。 为了帮助解释所有分组和字母的含义,请看一下上面屏幕截图中模式的特写:

ssh jenkins@192.168.1.114
cd /home/jenkins
sudo chmod o+w workspace

现在一切正常了:Jenkins 启动 docker 容器,当 docker 运行ning 时,Jenkins 界面中可用的工作space:

但是作业完成后它就消失了...

有些人可以说这里没问题,因为容器中的所有文件现在都保存在 docker 主机服务器上的 workspace 目录下(我们映射文件夹在 Jenkins Docker 插件设置)...这是对的!所有文件都在这里: /home/jenkins/workspace/"JobName"/ 在 Docker 主机服务器 (192.168.1.114) 但在某些情况下,人们希望能够直接从 Jenkins 界面浏览工作 space...

所以,从这里开始,我遵循了 Fadi post 中的 link - 如何设置 NFS 共享。

提醒,目标是:能够直接从 Jenkins 界面浏览 docker 工作 space... 我在 docker 主机服务器 (192.168.1.114) 上做了什么:

1. sudo apt-get install nfs-kernel-server nfs-common
2. sudo nano /etc/exports
  # Share docker slave containers workspace with Jenkins master
  /home/jenkins/workspace 192.168.1.111(rw,sync,no_subtree_check,no_root_squash) 
3. sudo exportfs -ra
4. sudo /etc/init.d/nfs-kernel-server restart

这将允许挂载 Docker 主机服务器 (192.168.1.114) /home/jenkins/workspace Jenkins 主服务器 (192.168.1.111) 上的文件夹

在 Jenkins 主服务器上:

1. sudo apt-get install nfs-client nfs-common
2. sudo mount -o soft,intr,rsize=8192,wsize=8192 192.168.1.114:/home/jenkins/workspace/ /home/jenkins/workspace/<JobName/

现在,192.168.1.114:/home/jenkins/workspace 文件夹已安装并在 Jenkins master 的 /home/jenkins/workspace/"JobName"/ 文件夹下可见。

到目前为止一切顺利...我再次 运行 工作并面临相同的行为:当 docker 仍然 运行ning - 用户可以浏览工作space 来自 Jenkins 界面,但是当工作完成时,我得到同样的错误“... no workspace”。尽管我现在可以在 Jenkins 主服务器本身上浏览作业文件,但它仍然不是我想要的...
顺便说一句,如果你需要在 Jenkins 主服务器上卸载 workspace 目录,请使用以下命令:

sudo umount -f -l /home/jenkins/workspace/<<mountpoint>>

了解有关 NFS 的更多信息:

How to configure an NFS server and mount NFS shares on Ubuntu 14.10

此问题的解决方法是在 Jenkins 上安装 Multijob Plugin,并向 Jenkins 添加将使用多作业插件选项的新作业:

在我的例子中,我还 t运行 将所有 docker 相关作业转移到从属构建服务器 (192.168.1.112) 上的 运行。所以在这台服务器上我安装了 NFS 相关人员,就像在 Jenkins Master Server 上一样,并在 Docker host Server (192.168.1.114):

上添加了一些人员
ssh jenkins@192.168.1.114
sudo nano edit /etc/exports
# Share docker slave containers workspace with build-server
/home/jenkins/workspace 192.168.1.112(rw,sync,no_subtree_check,no_root_squash)

另外在 Jenkins Slave (192.168.1.112) 服务器上我有 运行 以下内容:

1. sudo apt-get install nfs-client nfs-common
2. sudo mount -o soft,intr,rsize=8192,wsize=8192 192.168.1.114:/home/jenkins/workspace/ /home/jenkins/workspace/<JobName/

完成上述配置后,我在 Jenkins 上 运行 新工作,终于得到了我想要的:我可以直接从 Jenkins 界面使用 Workspace 选项。

久违了post...希望对您有所帮助。