Jenkins Pipeline+Maven+Gitlab持续集成构建问题集锦

目录


问题

1、全局配置一定要写正确,之前where git 给的地址时E:Gitcmdgit.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
原文地址:https://www.cnblogs.com/mscm/p/13151995.html