Jenkins Pipeline+Maven+Gitlab持续集成构建问题集锦
目录
- 1、全局配置一定要写正确,之前where git 给的地址时E:\Git\cmd\git.exe一直报错,其实Windows真正的git.exe在bin目录下
- 2、Windows环境的pipeline调用mvn 需要写成这样
- 3、出现 fatal: Authentication failed for 'http://***.git/'
- 4、出现下图not found
- 5、settings.xml文件配置放置位置
问题
1、全局配置一定要写正确,之前where git 给的地址时E:\Git\cmd\git.exe一直报错,其实Windows真正的git.exe在bin目录下
如果是Linux中,使用whereis git查看git安装地址,一般都在/usr/bin/git
2、Windows环境的pipeline调用mvn 需要写成这样
bat 'D:\\chromeDownload\\apache-maven-3.6.0-bin\\apache-maven-3.6.0\\bin\\mvn install'
node { stage('Pull Code'){ git branch: 'master', credentialsId: 'gitlab_account', url: 'http://********.git' } stage('Code Check') { echo "敬请期待!" } stage('Unit Test') { echo "敬请期待!" } stage('Compile') { echo '编译开始' bat 'D:\\chromeDownload\\apache-maven-3.6.0-bin\\apache-maven-3.6.0\\bin\\mvn install' } stage('Build Images') { echo '敬请期待!' } stage('Backup'){ echo '旧版本软件包已经备份' } stage('Deploy'){ echo '敬请期待!' } stage('Integration Testing') { echo "敬请期待!" } stage('UI Automated Testing') { echo "敬请期待!" } stage('Send Testing Report') { echo "敬请期待!" } }
Linux下脚本
node { stage('Pull Code'){ git branch: 'master', credentialsId: 'git_account', url: 'http://********.git' } stage('Code Check') { echo "代码检查!" } stage('Unit Test') { echo "单元测试 !" } stage('Compile') { echo '编译开始' sh "/var/tools/apache-maven-3.3.9/bin/mvn install" } stage('Build Images') { echo '敬请期待!' } stage('Backup'){ echo '旧版本软件包已经备份' } stage('Delete Old war'){ echo "删除老的包" } stage('Deploy'){ echo '部署!' } stage('Integration Testing') { echo "敬请期待!" } stage('UI Automated Testing') { echo "敬请期待!" } stage('Send Testing Report') { echo "敬请期待!" } }
3、出现 fatal: Authentication failed for 'http://***.git/'
ERROR: Error cloning remote repo 'origin' hudson.plugins.git.GitException: Command "/usr/bin/git fetch --tags --progress http*****.git +refs/heads/*:refs/remotes/origin/*" returned status code 128: stdout: stderr: remote: HTTP Basic: Access denied fatal: Authentication failed for 'http://***.git/'
刚开始怀疑是执行Jenkins机器没有把公钥放在gitlab上,其实不是这个原因。
明显是权限账号问题,检查凭证,是不是账号密码输入错误了,或者pipeline中的脚本 credentialsId 写错了(我就犯了这么低级的错误,哈哈哈)
4、出现下图not found
[Pipeline] } [Pipeline] // stage [Pipeline] stage [Pipeline] { (Code Check) [Pipeline] echo 代码检查! [Pipeline] } [Pipeline] // stage [Pipeline] stage [Pipeline] { (Unit Test) [Pipeline] echo 单元测试 ! [Pipeline] } [Pipeline] // stage [Pipeline] stage [Pipeline] { (Compile) [Pipeline] echo 编译开始 [Pipeline] sh + /home/tools/apache-maven-3.3.9/bin/mvn install /var/jenkins_home/workspace/wechatcapi@tmp/durable-4f4430f6/script.sh: 1: /var/jenkins_home/workspace/wechatcapi@tmp/durable-4f4430f6/script.sh: /home/tools/apache-maven-3.3.9/bin/mvn: not found [Pipeline] } [Pipeline] // stage [Pipeline] } [Pipeline] // node [Pipeline] End of Pipeline ERROR: script returned exit code 127 Finished: FAILURE
原因:是因为缺少插件:Pipeline Maven Integration (此原因已排除,读者忽略,仅做记录 )
实际原因:pipeline中脚本要指定容器中mvn地址,而不是宿主机的
stage('Compile') { echo '编译开始' sh "/var/tools/apache-maven-3.3.9/bin/mvn clean" }
这里用了容器的mvn但是容器中还缺少环境变量配置:
vi /etc/profile 又提示:
bash: vi: command not found
安装vi 又提示没有权限
jenkins@443d62de8949:/var/tools$ apt-get install vi E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied) E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?
解决方法:进入容器时使用root账户进入
sudo docker exec -it -u root e36f /bin/bash
先更新源:
apt-get update
apt-get upgrade
再安装vi
apt-get install vi
如果安装vi不行,那就安装vim
apt-get install vim
5.docker安装Jenkins报错is not a directory on the Jenkins master(but perhaps it exists on some agents)
尽量不要使用docker安装Jenkins!!!,有很多的坑。
1.安装docker并启动
2.下载Jenkins的docker镜像
docker pull jenkinsci/blueocean
3.启动镜像
docker run \
-u root \
--rm \
-d \
-p 8080:8080 \
-p 50000:50000 \
-v jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/blueocean
4.访问Jenkins,并初始化配置
localhost:8080,需要解锁Jenkins
需要输入密码,密码的位置已经告诉我们了,但是在服务器上是没有这个路径的,需要进入容器内部来获取
查看运行的docker容器,会看到Jenkins的id:docker ps
进入镜像内,-it后填查到的id号:docker exec -it xxxxxx bash
获取密码:cat /var/jenkins_home/secrets/initialAdminPassword
填入网页即可
自定义Jenkins,我选择了推荐的插件
配置配置git、jdk、maven
此时问题开始出现,配置报错maven home不存在,其实本机是存在的。
xxxx is not a directory on the Jenkins master(but perhaps it exists on some agents)
java home也是一样的报错。
解决:
需要将本地的maven和java挂载到Jenkins容器,重新启动安装jenkins:
新建一个Jenkins_home挂载目录
mkdir /var/jenkins_home
注意挂载目录授权
sudo chown -R 1000 /var/jenkins_home
启动:
-v命令进行挂载,其中冒号前面的是本机的目录,将本机的javahome和mavenhome的路径,挂载到Jenkins容器上,冒号后面是容器上的目录,可以写跟本机目录相同。
docker run \
-u root \
--rm \
-d \
-p 8080:8080 \
-p 50000:50000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/java/jdk1.8.0_181/bin/java:/usr/java/jdk1.8.0_181/bin/java \
-v /usr/java/jdk1.8.0_181:/usr/java/jdk1.8.0_181 \
-v /usr/local/maven:/usr/local/maven \
-v /var/jenkins_home:/var/jenkins_home \
jenkinsci/blueocean
这样启动后就本地的容器中/var/jenkins_home 目录下的内容就会存入本机的/var/jenkins_home下,密码也可以从这个目录下获取而不用进入容器内部。
这样解决了大部分问题,其他的还是有一些问题的,所以尽量不要用docker启动Jenkins。
6、settings.xml文件配置放置位置
可以看到有两个.m2目录,正确的地方是/var/jenkins_home/.m2这个目录下放置settings.xml文件,同时记得修改settings文件中地址:<localRepository>/var/jenkins_home/.m2</localRepository>
root@e36f8029c9f2:~/.m2# find / -name .m2 /root/.m2 /var/jenkins_home/.m2