【问题标题】:Jenkins tutorial maven project (with Docker) fails at Build stageJenkins 教程 maven 项目(使用 Docker)在构建阶段失败
【发布时间】:2018-06-29 21:03:16
【问题描述】:

我正在使用当前使用 Docker 的 Jenkins Maven 项目教程:

https://jenkins.io/doc/tutorials/build-a-java-app-with-maven/

我在构建阶段不断收到此错误:

[simple-java-maven-app] 运行shell脚本

sh:无法创建 /var/jenkins_home/workspace/simple-java-maven-app@tmp/durable-bae402a9/jenkins-log.txt: 不存在的目录

sh:无法创建 /var/jenkins_home/workspace/simple-java-maven-app@tmp/durable-bae402a9/jenkins-result.txt: 不存在的目录

我尝试在列出的目录上使用chmod -R 777chown -R nobodychown -R 1000 设置限制最少的权限,但似乎没有任何效果。

Docker 版本 17.12.0-ce 上的 jenkins 映像会发生这种情况,在 Windows 10 Professional 上构建 c97c6d6。

由于 Jenkins 网站上的 Maven 项目教程正在发生这种情况,我想知道有多少其他人遇到了这个问题。

【问题讨论】:

  • ls -la /var/jenkins_home/workspace/simple-java-maven-app@tmp/ 的输出是什么?
  • 那个目录是空的;这是输出: drwxrwxrwx 2 root root 4096 Jan 20 21:06 。 drwxrwxrwx 4 root root 4096 Jan 20 19:12 .. 我将权限设置为 jenkins:jenkins 和 nobody:nobody,然后在所有 /var 及其子文件夹上将其更改回 root:root
  • 你在教程的哪一步?您在本教程前面是否收到任何错误消息?如果有,是什么,在哪里?
  • “将初始流水线创建为 Jenkinsfile”的第 5 步,您实际上是在其中运行流水线。它在构建步骤失败。

标签: maven docker jenkins


【解决方案1】:

我在 MacOSX 上也遇到了同样的问题。 经过几个小时的研究,我终于找到了解决方案。

要解决此问题,重要的是要了解 Jenkins 位于容器内,并且当该容器内的 docker 代理与您的 docker 引擎通信时,它会提供与容器内匹配的挂载卷的路径。但是您的 docker 引擎是外部的。因此,为了让容器内部的路径正常工作,容器必须与主机中容器外部的路径匹配。

为了让工作正常,你需要改变两件事。

  • docker 运行参数
  • Jenkinsfile docker 代理参数

我自己用这个

docker run -d \
  --env "JENKINS_HOME=$HOME/Library/Jenkins" \
  --restart always \
  --name jenkins \
  -u root \
  -p 8080:8080 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v $HOME/Library/Jenkins:$HOME/Library/Jenkins \
  -v "$HOME":/home \
  jenkinsci/blueocean

在 Jenkins 文件中

更换代理部分

agent {
  docker {
    image 'maven:3-alpine'
    args '-v /root/.m2:/root/.m2'
  }

agent {
  docker {
    image 'maven:3-alpine'
    args '-v <host_home_path>/.m2:/root/.m2'
  }

【讨论】:

  • 弗雷德里克,感谢您的反馈。我认为这是在正确的轨道上,我认为这与短暂的 maven 容器有关,要么具有错误的路径映射,要么可能没有所需的权限。我确实尝试了您建议的映射值,但它似乎还没有解决我的问题(到目前为止),但是我在 Windows 10 上,也许我没有正确输入映射路径值。我会及时通知你。
  • 我不是 Windows 专家,也从未在 Windows 中使用过 docker。所以 windows 中的符号链接与 unix 系统上的方式不同。但是您可以尝试将嵌入式 ubuntu 与提供 bash 的 windows 10 一起使用,并且您可以像 unix 系统一样访问 NTFS。并且您像 Unix 系统一样管理一切。有朋友会投资 windows 并会告诉我。
【解决方案2】:

这个问题很可能是由于最近 Docker 行为发生了变化,Jenkins 中的 Docker Pipeline 插件不再正确处理。

没有过多的细节,这个问题导致 Jenkins 无法再识别它正在运行的容器,从而导致您在这些教程中遇到的错误(如上)。

昨天发布了 Docker Pipeline 插件的新版本 (1.15) (https://plugins.jenkins.io/docker-workflow)。

如果您在 Jenkins(在 Docker 中)实例上升级此插件(通过 Manage Jenkins > Manage Plugins),您会发现这些教程应该重新开始工作(如文档所述)。 p>

【讨论】:

    【解决方案3】:

    错误信息表示目录durable-bae402a9没有创建。

    回顾本教程,找到应该创建该目录的步骤,并进行必要的更改以确保其成功。

    【讨论】:

    • 每次流水线运行时都会“即时”创建该目录。显然,每次管道运行时,“durable-”后面的目录名称部分都会发生变化,所以我什至无法提前创建它。似乎任何尝试创建它的进程都可能没有适当的权限。我试图在它上面的每个目录上分配最宽松的 chmod (777) 和 chown (例如nobody:nobody) 值,但这似乎没有帮助。
    • 请查看应该创建目录“durable-”的任何进程的日志以获取线索。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 2016-10-30
    • 2019-10-10
    • 2021-10-29
    • 2012-12-07
    • 1970-01-01
    • 2022-11-22
    相关资源
    最近更新 更多