Jenkins在docker容器外存储工作区

时间:2015-09-17 14:20:21

标签: jenkins docker containers jenkins-plugins master-slave

所以我有一个Jenkins Master-Slave设置,主设备旋转一个docker容器(在从VM上)并在该容器内构建作业然后在它完成后销毁容器。这一切都是通过Jenkins' Docker plugin

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

No Workspace Error

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

Host files

这是我对特定泊坞窗图片模板的设置:

Docker template

非常感谢任何帮助!

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

2 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,上面的帖子帮助我弄清楚我的环境配置有什么问题。但是我花了一段时间才理解这句话的逻辑:

  

好的,所以我解决这个问题的方法就是安装一个目录   来自slave docker容器的容器,然后使用NFS   (说明如下所示)我安装了该从机对接器   容器上詹金斯大师。

所以我决定澄清它并写一些更多的解释例子......

这是我的工作环境:

  1. Jenkins master在Ubuntu 16.04服务器上运行,IP:192.168.1.111
  2. 在Ubuntu 16.04服务器上运行的Jenkins Slave Build Server,IP:192.168.1.112
  3. Docker Enabled Build Server(用于启动docker容器),在Ubuntu 16.04服务器上运行,IP:192.168.1.114。
  4. 问题陈述:"工作区"在docker容器上运行项目时,在Jenkins界面下不可用。

    目标:能够浏览"工作区"在Jenkins界面下以及Jenkins主/从和Docker主机服务器上。

    好吧,我的问题始于不同的问题,这导致我找到这篇文章并找出我的环境配置出了什么问题......

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

    Configure "Volumes" in "Container settings..."

    我再次运行相同的作业,但在Jenkins中出现以下错误消息失败:

    Jenkins error message

    花了一些时间来了解Jenkins Docker Plugin是如何工作的,我发现上面出错的原因是Docker Host Server(192.168.1.114)上的错误权限"工作空间"自动创建的文件夹:

    Wrong Permission on workspace folder

    所以,从这里我们必须分配"其他"组写入此文件夹的权限。将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)。 为了帮助解释所有分组和字母的含义,请在上面的屏幕截图中查看该模式的特写:

    Linux Permissions

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

    现在一切正常了:Jenkins旋转了docker容器,当docker运行时,Jenkins界面中的Workspace可用:

    Workspace available on Jenkins Interface, when docker still running

    但是当工作结束时它就会消失......

    Error: no Workspace

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

    所以,从这里开始,我一直关注Fadi的帖子 - 如何设置NFS共享。

    提醒,目标是:能够直接从Jenkins界面浏览docker jobs workspace ... 我在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
    

    这将允许在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/
    

    现在,192.168.1.114:/ home / jenkins / workspace文件夹已挂载并显示在/ home / jenkins / workspace /&#34; JobName&#34; / Jenkins master上的文件夹中。

    到目前为止一切都那么好......我再次运行工作并面临同样的行为:当docker仍在运行时 - 用户可以从Jenkins界面浏览工作区,但是当作业完成时,我会得到相同的错误&# 34; ......没有工作空间&#34;。尽管我现在可以浏览Jenkins主服务器本身的作业文件,但它仍然不是所希望的...
    顺便说一句,如果您需要在Jenkins主服务器上卸载工作区目录,请使用以下命令:

    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,并向将使用Multijob插件选项的Jenkins添加新作业:

    MultiJob Settings in new Jenkins Job

    在我的情况下,我还将所有与docker相关的作业转移到Slave Build Server(192.168.1.112)上运行。所以在这台服务器上,我安装了NFS相关人员,就像在Jenkins主服务器上一样,并在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)
    

    另外在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上运行了新Job,最终得到了我想要的东西:我可以直接从Jenkins界面使用Workspace选项。

    People can browse docker container Workspace directly from Jenkins Interface when job finished

    很抱歉很长的帖子...我希望它对你有帮助。

答案 1 :(得分:2)

好的,所以我解决这个问题的方法是从slave docker容器上安装一个dir,然后使用NFS(下面显示的说明)我已将该slave docker容器安装到jenkins master上。

所以我的配置看起来像这样:

enter image description here

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

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

一个小小的注意事项是,该答案中提供的IP地址(您必须放入 / etc / exports )是本地计算机(或者在我的情况下是jenkins主计算机) IP地址。

我希望这个答案会帮助你!