Fad*_*adi 4 containers master-slave jenkins jenkins-plugins docker
所以我有一个 Jenkins Master-Slave 设置,其中 master 启动一个 docker 容器(在从 VM 上)并在该容器内构建作业,然后在完成后销毁容器。这一切都是通过 Jenkins 的 Docker插件完成的。
一切都运行顺利,但唯一的问题是,工作完成后(失败的工作)我无法查看工作区(因为容器不见了)。我收到以下错误:
我已经尝试将一个“卷”从主机(从虚拟机)附加到容器以将文件存储在外面(这样做是因为,如下所示,我可以看到主机上的文件),然后尝试将其映射到主虚拟机:
这是我对该特定 docker 图像模板的设置:
任何帮助是极大的赞赏!
编辑:我已经成功地将工作区存储在主机上。但是,构建完成后,我仍然遇到相同的错误(错误:没有工作区)。我不知道如何让 Jenkins 查找主机上而不是容器上的文件。
我遇到了同样的问题,上面的帖子帮助我弄清楚我的环境配置出了什么问题。但是我花了一段时间才理解这句话的逻辑:
好的,所以我解决这个问题的方法是从从属 docker 容器在容器上安装一个目录,然后使用 NFS(说明如下所示)我已经将该从属 docker 容器安装到 Jenkins 主控上。
所以我决定澄清它并写一些更多的解释示例......
这是我的工作环境:
问题陈述:在 docker 容器上运行项目时,Jenkins 界面下的“工作区”不可用。
目标:能够在 Jenkins 界面以及 Jenkins 主/从和 docker 主机服务器上浏览“工作区”。
好吧,我的问题始于不同的问题,这让我找到了这篇文章并找出我的环境配置出了什么问题......
让我们假设您有工作 Jenkins/Docker 环境和正确配置的 Jenkins Docker 插件。第一次运行时,我没有在 Jenkins Docker 插件中的“容器设置...”选项下配置任何内容。一切都很顺利 - 工作竞争成功,显然我无法浏览工作工作空间,因为 Jenkins Docker 插件的设计在完成工作后会破坏 docker 容器。到目前为止一切顺利......我需要节省 docker 工作空间,以便能够在作业失败时查看文件或修复一些问题。为此,我使用 Jenkins Docker 插件中“容器设置...”选项中的“卷”将主机/路径从主机映射到容器的容器/路径:
我再次运行了相同的作业,但在 Jenkins 中失败并显示以下错误消息:
在花了一些时间了解 Jenkins Docker 插件如何工作后,我发现上述错误的原因是 Docker 主机服务器(192.168.1.114)上自动创建的“workspace”文件夹上的权限错误:
因此,从这里我们必须为此文件夹分配“其他”组写入权限。将 jenknis@192.168.1.114 用户设置为工作区文件夹的所有者是不够的,因为我们需要 jenkins@192.168.1.111 用户能够在 192.168.1.114 服务器的工作区文件夹下创建子文件夹。(在我的情况下,我在 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
Run Code Online (Sandbox Code Playgroud)
现在一切正常:Jenkins 启动 docker 容器,当 docker 运行时,Jenkins 界面中的工作区可用:
但是工作完成后它就消失了......
有人可以说这里没有问题,因为容器中的所有文件,现在都保存在 docker 主机服务器上的工作区目录下(我们在 Jenkins Docker 插件设置下映射文件夹)......这是正确的!所有文件都在这里:
/home/jenkins/workspace/"JobName"/在 Docker Host Server (192.168.1.114) 但在某些情况下,人们希望能够直接从 Jenkins 界面浏览工作工作空间......
因此,从这里开始,我遵循了 Fadi 帖子中的链接 - 如何设置 NFS 共享。
提醒,目标是:能够直接从 Jenkins 界面浏览 docker 作业工作区......我在 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
Run Code Online (Sandbox Code Playgroud)
这将允许在 Jenkins 主服务器 (192.168.1.111) 上挂载 Docker 主机服务器 (192.168.1.114) /home/jenkins/workspace 文件夹
在 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/
Run Code Online (Sandbox Code Playgroud)
现在,192.168.1.114:/home/jenkins/workspace 文件夹已安装并在 Jenkins master 上的 /home/jenkins/workspace/"JobName"/ 文件夹下可见。
到目前为止一切顺利......我再次运行该作业并面临相同的行为:当 docker 仍在运行时 - 用户可以从 Jenkins 界面浏览工作区,但是当作业完成时,我收到相同的错误“......没有工作区” . 尽管我现在可以在 Jenkins 主服务器上浏览作业文件,但这仍然不是我们想要的......
顺便说一句,如果您需要在 Jenkins 主服务器上卸载工作区目录,请使用以下命令:
sudo umount -f -l /home/jenkins/workspace/<<mountpoint>>
Run Code Online (Sandbox Code Playgroud)
阅读有关 NFS 的更多信息:
如何在 Ubuntu 14.10 上配置 NFS 服务器并挂载 NFS 共享
此问题的解决方法是在 Jenkins 上安装Multijob Plugin,并向 Jenkins 添加将使用 Multijob Plugin 选项的新作业:
就我而言,我还将所有与 docker 相关的作业转移到从属构建服务器 (192.168.1.112) 上运行。所以在这台服务器上,我安装了 NFS 相关人员,就像在 Jenkins Master Server 上一样,并在 Docker 主机服务器 (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)
Run Code Online (Sandbox Code Playgroud)
另外在 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/
Run Code Online (Sandbox Code Playgroud)
完成上述配置后,我在 Jenkins 上运行了新的 Job 并最终得到了我想要的:我可以直接从 Jenkins 界面使用 Workspace 选项。
抱歉长篇幅...希望对你有帮助。
| 归档时间: |
|
| 查看次数: |
10199 次 |
| 最近记录: |