环境:
jenkins2的multibranch任务模式。
在jenkins的部署阶段,需要使用http来发送post给部署系统,发现出现:
“OSError: [Errno 13] Permission denied: ‘/.httpie’”的错误。
在测试机里执行相同的镜像,运行相同的指令,是ok的,那为什么出错呢?
原因在于测试机进去docker里面是root用户,jenkinsfile里的docker里面其实是jenkins用户(通过id指令可以发现id是1001),普通用户自然会存在权限的问题。。。
查看httpie的源码发现,这是http分析配置文件路径导致的。jenkins用户尝试在根目录下创建.httpie目录,当然失败。
解决方法有两个:
1. 最简单。jenkinsfile的inside里加入-u root,docker.image(xxx).inside(“-u root”),这样使用的是root账号而不是默认的jenkins账户
2. 自己在http的指令之前通过chmod a+w(dockerfile将某个路径chmod a+w,然后运行http之前cd到这个路径 sh “cd xxx && http yyyy),另外jenkins用户在自己的home目录/home/jenkins居然不可写,非常奇葩。。。
这个问题解决后,还有一个问题出现:
“http: error: Request body (from stdin or a file) and request data (key=value) cannot be mixed”
原因是jenkins对docker容器进行了一些stdin的操作,导致http会从stdin中读取一些你意想不到的数据。
最简单的解决方法:
http –ignore-stdin … 加入 –ignore-stdin 参数 即可忽略jenkins的stdin对http的影响。