开始做一些devops工程方面的工作,那必然第一个接触的就是Jenkins。
但是Jenkins的文档真是太坑了。
为了跑通一个官方例子,今天一下午全耗在这上了。索性最终是踩坑完毕。
下面总结下我遇到的几个坑。大家可及时跳过。
我实验的例子是官方的使用Maven构建Java应用程序
先说一下我部署Jenkins的方法。
docker run \
-u root \
-d \
-p 8080:8080 \
-p 50000:50000 \
-v jenkins-data:/var/jenkins_home \
-v /etc/localtime:/etc/localtime:ro \
-v /var/run/docker.sock:/var/run/docker.sock \
--name jenkins-blueocean \
--restart=always \
jenkinsci/blueocean
-v /etc/localtime:/etc/localtime:ro 作用是同步主机时区
-v /var/run/docker.sock:/var/run/docker.sock
表示Docker守护程序通过其监听的基于Unix的套接字。该映射允许 jenkinsci/blueocean 容器与Docker守护进程通信, 如果 jenkinsci/blueocean 容器需要实例化 其他Docker容器,则该守护进程是必需的。
或者不是通过volume,也可以直接挂载到服务器的目录上,这样查看文件比较方便
-v $HOME/jenkins_home:/var/jenkins_home
官方的例子是,将源码仓库下载到jenkins所在的服务器。
只要将git仓库下载到jenkin本地的路径下。jenkins可以识别这是一个git仓库进而构建它。
注意:使用docker部署的,所以填写的路径是jenkins容器里的路径。
我之前用-v $HOME/jenkins_home:/var/jenkins_home将/var/jenkins_home目录挂载出来了。
不用尝试了,会报错
Checkout of Git remote '/var/jenkins_home/GitHub/simple-java-maven-app' aborted because it references a local directory, which may be insecure. You can allow local checkouts anyway by setting the system property 'hudson.plugins.git.GitSCM.ALLOW_LOCAL_CHECKOUT' to true.
查了下,这个变量可以配置,具体怎么做我还没查到。
但是不想解决了,没什么意义。因为我们以后也不会用本地构建。都是从远程仓库拉代码的。
案例中给的Jenkinsfile使用的镜像版本是maven:3-alpine
agent {
docker {
image 'maven:3-alpine'
args '-v /root/.m2:/root/.m2'
}
}
但是在他的代码里
[3.5.4,)
所以会报错
Detected Maven Version: 3.5.0 is not in the allowed range [3.5.4,).
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
去dockerhub上找了个镜像image 'maven:3.6.1-alpine'
问题解决
3,没有权限权限
然后到了最后一步Deliver
按照官方的写法
stage('Deliver') {
steps {
sh './jenkins/scripts/deliver.sh'
}
}
结果报错
+ ./jenkins/scripts/deliver.sh
/var/jenkins_home/workspace/demo1@tmp/durable-aed01882/script.sh: line 1: ./jenkins/scripts/deliver.sh: Permission denied
script returned exit code 126
主要是这个问题困扰了我好久
在网上看到的解决方案,基本上都是改用户,改文件权限。我试了都不行。
因为我用docker启动的时候就指定了用户是root
并不是jenkins
然后我修改了下stage,加上了sleep(100)
让容器暂停下,不要很快的退出。
docker exec -it 9ee087b880b9 /bin/sh
进到容器里,我执行了下
sh ./jenkins/scripts/deliver.sh
是成功的,没问题啊。
然后又仔细看了下报错,原来jenkins是直接执行的
./jenkins/scripts/deliver.sh
并不是
sh ./jenkins/scripts/deliver.sh
原来如此啊。之前deliver.sh它并不是一个可执行文件,直接执行自然是不行的。
那么简单的只要改一下
stage('Deliver') {
steps {
sh 'sh ./jenkins/scripts/deliver.sh'
}
}
或者
stage('Deliver') {
steps {
sh 'chmod +x ./jenkins/scripts/deliver.sh'
sh './jenkins/scripts/deliver.sh'
}
}
成功。yes
最后说一句:
我错了,我不该看中文文档。
看英文的,英文的有更新,中文的太落后了。
留言与评论(共有 0 条评论) “” |