• Devops之构建工具实践


    目录

    本节实践

    1. 实践:maven构建流水线(测试成功)-2022.5.18
    2. 实践:gradle构建流水线(测试成功)-2022.5.18
    3. 实践:go项目构建流水线(测试成功)-2022.5.19
    4. 实践:npm项目构建流水线(测试成功)-2022.5.19
    5. 实践:Jenkins共享库封装(测试成功)-2022.5.20
    6. 实践:GitLab模板库(测试成功)-2022.5.20

    实验环境

    jenkins/jenkins:2.332.2-centos7-jdk8
    gitlab-ce:14.9.3-ce.0
    
    • 1
    • 2

    实验软件

    链接:https://pan.baidu.com/s/1u6LAk1I6SQSe4_4vkQ3xWg?pwd=0hro
    提取码:0hro
    2022.5.21-构建工具实践-code

    1. Java项目构建工具

    初始化一个springboot项目 https://start.spring.io/ (也可以下载一个ide)
    如果打不开也可以使用:https://start.aliyun.com/bootstrap.html

    后端:
    目前Java用的最多的就是Maven了;
    Gradle的性能比Maven是要强一些;(有时候,安卓打包也会用到这个Gradle)
    现在基本很少用Ant了,新项目用的是Gradle;
    前端:
    nodeJs工具:react,vue

    1.1 Maven

    官网:http://maven.apache.org/download.cgi
    Maven是一个项目的构建依赖管理工具。通常项目的根目录会存在一个pom.xml文件(该文件用于定义项目的依赖包信息和构建配置)

    🍀 在调流水线的时候,遇到很多Maven构建失败的问题。大家都去找Jenkins的问题,但最后发现是Maven这个工具出现了一些问题(使用时可能参数调错了)。Maven在构建代码的时候,经常会出现构建失败,编译不通过现象。Maven跑测试的时候也可能会报错。这个和你的项目也可能有关系,比如你项目的类找不到了,那可能也会报错了。也就是说,后续在排错时,不仅要考虑工具问题,也要考虑代码本身层面的因素。

    一个spring boot项目其实有很多依赖。

    💘 实践:maven构建流水线(测试成功)-2022.5.18
    ![](https://img-blog.csdnimg.cn/img_convert/0ab8d60725ae2e96ea732bb41e617f96.png)

    1.项目生成

    生成一个标准的maven项目:

    • 项目类型: Maven Project
    • 语言: Java
    • SpringBoot: 2.4.4 (版本)
    • Metadata
      • Group : 组信息
      • Artifact:包名称
      • Packging: 包格式(Jar、War)
    • Dependencies: 定义项目依赖(最后都会写入Pom.xml)

    🍂 自己实际配置过程:
    下载代码包

    • 打开链接:
      如果打不开也可以使用:https://start.aliyun.com/bootstrap.html

    • 按如下进行配置:

      选择一个spring web组件,再添加一个spring mvc示例:

    • 配置完成后,下载代码:

      代码下载完成 后,可以用vscode打开,看下项目代码结构:

    2.配置环境

    🍂 (1)安装maven
    本次在gitlanci-runner上下载maven:(后面的环境为gitlab runner和jenkins agent都在一台机器上)

    先在上面安装好java环境
    如何安装java,请查看我的另一篇文章!
    [[02 实战:linux下jdk环境安装(二进制包方式)-泽阳-2022.4.16(博客分享)]]

    https://blog.csdn.net/weixin_39246554/article/details/124221560

    • 配置环境:
    ###下载代码
    [root@gitlab-runner ~]#wget https://mirrors.bfsu.edu.cn/apache/maven/maven-3/3.8.5/binaries/apache-maven-3.8.5-bin.zip --no-check-certificate
    [root@gitlab-runner ~]#ll -h apache-maven-3.8.5-bin.zip 
    -rw-r--r-- 1 root root 8.4M Mar  5 23:51 apache-maven-3.8.5-bin.zip
    [root@gitlab-runner ~]#unzip apache-maven-3.8.5-bin.zip
    [root@gitlab-runner ~]#mv apache-maven-3.8.5 /usr/local/
    [root@gitlab-runner ~]#cd /usr/local/apache-maven-3.8.5/
    [root@gitlab-runner apache-maven-3.8.5]#pwd
    /usr/local/apache-maven-3.8.5
    
    ###配置环境
    [root@gitlab-runner apache-maven-3.8.5]#vim /etc/profile
    ……
    export M2_HOME=/usr/local/apache-maven-3.8.5
    export PATH=$M2_HOME/bin:$PATH
    [root@gitlab-runner apache-maven-3.8.5]#source /etc/profile
    
    ###验证
    [root@gitlab-runner apache-maven-3.8.5]#mvn -v
    Apache Maven 3.8.5 (3599d3414f046de2324203b78ddcf9b5e4388aa0)
    Maven home: /usr/local/apache-maven-3.8.5
    Java version: 1.8.0_322, vendor: Temurin, runtime: /usr/local/jdk8u322-b06/jre
    Default locale: en_US, platform encoding: UTF-8
    OS name: "linux", version: "3.10.0-957.el7.x86_64", arch: "amd64", family: "unix"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    🍀 注意:这里容易混淆的一点是,pom.xml和maven里settings.xml之间的关系:

    1.项目的根目录会存在一个pom.xml文件:(该文件用于定义项目的依赖包信息和构建配置);
    2.maven软件包里的settings.xml:是管理maven的;(后期会该改个配置文件)

    (2)将代码上传到gitlab

    • 本次新建一个项目
      名称叫:devops4-maven-service

    • 在本地git端将项目代码上传到刚才创建的项目里:

    hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/demo/demo
    $ pwd
    /c/Users/hg/Desktop/demo/demo
    
    hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/demo/demo
    $ ls
    HELP.md  README.md  mvnw*  mvnw.cmd  pom.xml  src/
    
    ###初始化仓库
    hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/demo/demo
    $ git init
    Initialized empty Git repository in C:/Users/hg/Desktop/demo/demo/.git/
    
    hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/demo/demo (master)
    $ git remote add origin http://172.29.9.101/devops4/devops4-maven-service.git
    
    hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/demo/demo (master)
    $ git add .
    
    hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/demo/demo (master)
    $ git commit -m "Initial commit"
    
    #推送代码到仓库
    hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/demo/demo (master)
    $ git push -u origin master #以master分支推送
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 到gitlab查看推送上来的代码:

      发现已经推送上来了。

    3.常用命令

    • mvn clean 清理构建目录
    • mvn clean package 打包
    • mvn clean install 打包部署
    • mvn clean test 单元测试
    • mvn clean package -f …/pom.xml -f指定pom位置\
    • mvn clean package -DskipTests / -Dmaven.test.skip=true 跳过单测
    • mvn deploy 发布包到制品库

    配置阿里maven源 、 本地仓库;(配置方法见下面部分!)

    4.Jenkins集成

    🍀 源课件内容:

    stage("build"){
        steps {
            script{
                sh "mvn clean package"
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    更加严谨的方式:使用绝对路径

    def buildTools = ["maven": "/usr/local/apache-maven-3.8.1"]
    
    
    
    pipeline {
    	agent { label  "build" }	
    
    	stages {
    		stage("GetCode"){
    			steps{
    				script{
    					println("下载代码 --> 分支: ${env.branchName}")
     					checkout([$class: 'GitSCM', branches: [[name: "${env.branchName}"]],
     							 extensions: [], 
     							 userRemoteConfigs: [[credentialsId: 'b874381c-20e9-4578-be9d-f1f691c25b23', 
     							 						url: "${env.gitHttpURL}"]]])
    				}
    			}
    			
    		}
    
    		stage("Build"){
    			steps {
    				script {
    
    					//sh "/usr/local/apache-maven-3.8.1/bin/mvn clean package"
    					sh "${buildTools["maven"]}/bin/mvn clean package"
    				}
    			}
    		}
    
    		stage("UnitTest"){
    			steps{
    				script{
    					sh "${buildTools["maven"]}/bin/mvn test"
    
    				}
    			}
    			post {
    				success {
    					script{
    						junit 'target/surefire-reports/*.xml'
    					}
    				}
    			}
    		}
    
    	}
    
    	post {
    		always {
    			script{
    				echo "always......"
    
    			}
    		}
    
    		success {
    			script {
    				echo "success....."
    			}
    		}
    	}
    
    }
    
    
    def EmailUser(userEmail,status){
     	emailext body: """
                <!DOCTYPE html> 
                <html> 
                <head> 
                <meta charset="UTF-8"> 
                </head> 
                <body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4" offset="0"> 
                    <img src="http://192.168.1.200:8080/static/0eef74bf/images/headshot.png">
                    <table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">   
                        <tr> 
                            <td><br /> 
                                <b><font color="#0B610B">构建信息</font></b> 
                            </td> 
                        </tr> 
                        <tr> 
                            <td> 
                                <ul> 
                                    <li>项目名称:${JOB_NAME}</li>         
                                    <li>构建编号:${BUILD_ID}</li> 
                                    <li>构建状态: ${status} </li>                         
                                    <li>项目地址:<a href="${BUILD_URL}">${BUILD_URL}</a></li>    
                                    <li>构建日志:<a href="${BUILD_URL}console">${BUILD_URL}console</a></li> 
                                </ul> 
                            </td> 
                        </tr> 
                        <tr>  
                    </table> 
                </body> 
                </html>  """,
                subject: "Jenkins-${JOB_NAME}项目构建信息 ",
                to: userEmail
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    pipeline {
        agent {
            label "build"
        }
        
        parameters {
            string defaultValue: 'http://192.168.1.200/devops4/devops4-maven-service.git', name: 'srcUrl'
            string defaultValue: 'master', name: 'branchName'
        }
        
        
        stages{
            stage('CheckOut') {
                steps {
                    script{
                        
                        checkout([$class: 'GitSCM', 
                                  branches: [[name: "${params.branchName}"]], 
                                  extensions: [], 
                                  userRemoteConfigs: [[credentialsId: '62a3150f-38f8-4c9d-9334-79072b1d75cc', 
                                                       url: "${params.srcUrl}"]]])
                    }
                }
            }
            
            stage("Build"){
                steps {
                    script {
                        //sh "/data/devops4/tools/apache-maven-3.8.5/bin/mvn clean package "
                        sh "/data/devops4/tools/gradle-7.4.2/bin/gradle build"
                    }
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    🍂 自己实践过程:

    • 新创建一个流水线:
      名称和gitlab上项目名称一样:devops4-maven-service

    • 这里直接写流水线,代码可以用上节课的代码:
      生成并编写代码:

    pipeline {
    	agent {
    		label "build"
    	}
    
    	parameters {
    	  string defaultValue: 'http://172.29.9.101/devops4/devops4-maven-service.git', name: 'srcUrl', trim: true
    	  string defaultValue: 'master', name: 'branchName', trim: true
    	}
    
    	stages {
    		  stage('CheckOut') {
                steps {
                    script {
                        checkout([$class: 'GitSCM', 
                            branches: [[name: "${params.branchName}"]], 
                            extensions: [], 
                            userRemoteConfigs: [[credentialsId: '54df701e-d369-4f69-85c6-7209d45c283b', 
                                                        url: "${params.srcUrl}"]]])
                    }
                }
            }
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    • 构建流水线:

      可以看到,构建成功。

    • 继续编写代码:
      把打包命令放进去:
      注意下:因为是在jenkins的slave节点构建的,因此salve节点也要安装maven工具的!(安装方法见上文)

    运行查看构建效果:

    pipeline {
        agent {
            label "build"
        }
    
        parameters {
          string defaultValue: 'http://172.29.9.101/devops4/devops4-maven-service.git', name: 'srcUrl', trim: true
          string defaultValue: 'master', name: 'branchName', trim: true
        }
    
        stages {
            stage('CheckOut') {
                steps {
                    script {
                        checkout([$class: 'GitSCM', 
                            branches: [[name: "${params.branchName}"]], 
                            extensions: [], 
                            userRemoteConfigs: [[credentialsId: '54df701e-d369-4f69-85c6-7209d45c283b', 
                                                        url: "${params.srcUrl}"]]])
                    }
                }
            }
    
            stage('Build') {
                steps {
                    script {
                        sh "mvn clean package"
                    }
                }
            }
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33


    奇怪,为什么这里报没mvn命令呢?

    • 这里给mvn命令添加上绝对路径:
    pipeline {
        agent {
            label "build"
        }
    
        parameters {
          string defaultValue: 'http://172.29.9.101/devops4/devops4-maven-service.git', name: 'srcUrl', trim: true
          string defaultValue: 'master', name: 'branchName', trim: true
        }
    
        stages {
            stage('CheckOut') {
                steps {
                    script {
                        checkout([$class: 'GitSCM', 
                            branches: [[name: "${params.branchName}"]], 
                            extensions: [], 
                            userRemoteConfigs: [[credentialsId: '54df701e-d369-4f69-85c6-7209d45c283b', 
                                                        url: "${params.srcUrl}"]]])
                    }
                }
            }
    
            stage('Build') {
                steps {
                    script {
                        sh "/usr/local/apache-maven-3.8.5/bin/mvn clean package"
                    }
                }
            }
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33


    再次运行流水线,观察效果:
    发现此时,mvn打包就是从官网拉取依赖包了,很慢的:

    我们可以进到构建目录看下效果:

    [root@devops ~]#cd  /opt/jenkins/workspace/devops4-maven-service
    [root@devops devops4-maven-service]#ls
    mvnw  mvnw.cmd  pom.xml  README.md  src  target
    [root@devops devops4-maven-service]#ls target/
    classes  generated-sources  generated-test-sources  maven-status  test-classes #target目录下应该有个jar包的,但是本次侯建失败了就没看到
    
    [root@devops devops4-maven-service]#ls ~/.m2/
    repository #mvn构建时产生的缓存
    [root@devops devops4-maven-service]#ls ~/.m2/repository/
    backport-util-concurrent  ch  classworlds  com  commons-cli  commons-io  io  jakarta  junit  net  org
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 因此这里修改下mvn里的镜像源地址为阿里的:
      https://developer.aliyun.com/mirror/maven?spm=a2c6h.13651102.0.0.14df1b11toLu0x
    <mirror>
        <id>aliyunmaven</id>
        <mirrorOf>*</mirrorOf>
        <name>阿里云公共仓库</name>
        <url>https://maven.aliyun.com/repository/public</url>
    </mirror>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    开始配置:

    [root@devops devops4-maven-service]#which mvn
    /usr/local/apache-maven-3.8.5/bin/mvn
    [root@devops devops4-maven-service]#cd /usr/local/apache-maven-3.8.5
    [root@devops apache-maven-3.8.5]#ls
    bin  boot  conf  lib  LICENSE  NOTICE  README.txt
    [root@devops apache-maven-3.8.5]#cd conf/
    [root@devops conf]#ls
    logging  settings.xml  toolchains.xml
    [root@devops conf]#vim settings.xml 
    <mirror>
        <id>aliyunmaven</id>
        <mirrorOf>*</mirrorOf>
        <name>阿里云公共仓库</name>
        <url>https://maven.aliyun.com/repository/public</url>
    </mirror>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    • 构建并观察效果:


    可以看到产生了一个jar包:

    构建成功。

    因此:强烈推荐使用mvn的完整路径!

    • 这里再次构建下,观察下编译构建时间:

      为什么这次构建真没快呢?–>是因为maven使用了上次构建的本地缓存:

    5.gitlabCI集成

    • 创建.gitlabci-yml文件,编写流水线代码:
    stages:
      - build
      - test
    
    variables:
      GIT_CHECKOUT: "false" 
      RUNNER_TAG: "maven"
    
    pipelineInit:
      stage: .pre
      tags:
        - "${RUNNER_TAG}"
      variables:
        GIT_CHECKOUT: "true" 
      script:
        - ls -l 
    
    cibuild:
      tags:
        - "${RUNNER_TAG}"
      stage: build
      script:
        - /usr/local/apache-maven-3.8.5/bin/mvn clean package
    
    citest1:
      tags:
        - "${RUNNER_TAG}"
      stage: test
      script:
        - /usr/local/apache-maven-3.8.5/bin/mvn test
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    • 确认下runner上有maven标签:

    • 因为前面jenkins的slave节点和gitlabci-runner不是同一个节点,因此这里还需要把maven环境的源修改为阿里源,然后构建:
      修改方法见jenkins构建部分:

    可以看到,能够成功构建了。

    • 这边再跑一次流水线,观察下构建速度:


    这次构建就没有下载包了,速度很快,这是因为使用了maven缓存:

    注意:gitlabCI-runner的用户是gitlab-runner,因此缓存位置要清楚。

    🍀 配置maven全局缓存:

    • 此时有必要配置下maven的全局缓存了:
      1.占用磁盘空间 2.你的编译构建时间加长了
      我们先创建下全局缓存配置,再把gitlab-runner用户的缓存移动到全局缓存,再观察小构建速度:
    [root@gitlab-runner ~]#mkdir -p /data/maven_build_cache
    [root@gitlab-runner ~]#mv /home/gitlab-runner/.m2/repository/* /data/maven_build_cache/
    
    
    [root@gitlab-runner ~]#vim  /usr/local/apache-maven-3.8.5/conf/settings.xml
    ……
    <localRepository>/data/maven_build_cache</localRepository>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7


    可以看到,配置的全局缓存起作用了:

    测试完成。😘

    1.2 Gradle

    💘 实践:gradle构建流水线(测试成功)-2022.5.18
    ![](https://img-blog.csdnimg.cn/img_convert/ab6db2dac7d21e4f534e93f979f060f1.png)

    1.项目生成

    • 项目代码生成:
      官网:https://gradle.org/releases/ Gradle基于Groovy,具有更灵活更强大的构建系统,能帮助我们构建更复杂的项目。

    注意:同一个项目用gradle要比maven构建时间要快一些!

    初始化一个springboot项目 https://start.spring.io/ (也可以下载一个ide)
    如果打不开也可以使用:https://start.aliyun.com/bootstrap.html

    • 上传项目代码到GitLab仓库中:
      本次我们再gitlab上新建一个仓库:devops4-gradle-service

      然后将刚才生成的代码上传到gitlab devops4-gradle-service仓库里:
    hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/gradle/demo
    $ pwd
    /c/Users/hg/Desktop/gradle/demo
    
    hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/gradle/demo
    $ ls
    HELP.md  build.gradle  gradle/  gradlew*  gradlew.bat  settings.gradle  src/
    
    hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/gradle/demo
    $ git init
    Initialized empty Git repository in C:/Users/hg/Desktop/gradle/demo/.git/
    
    hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/gradle/demo (master)
    $  git remote add origin http://172.29.9.101/devops4/devops4-gradle-service.git
    
    hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/gradle/demo (master)
    $ git add .
    hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/gradle/demo (master)
    $ git commit -m "Initial commit"
    hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/gradle/demo (master)
    
    $ git push origin master
    Username for 'http://172.29.9.101': root
    Counting objects: 26, done.
    Delta compression using up to 8 threads.
    Compressing objects: 100% (15/15), done.
    Writing objects: 100% (26/26), 59.36 KiB | 4.24 MiB/s, done.
    Total 26 (delta 0), reused 0 (delta 0)
    To http://172.29.9.101/devops4/devops4-gradle-service.git
     * [new branch]      master -> master
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    上传完成后到gitlab查看:

    2.配置环境

    • 下载gradle安装包:
      https://gradle.org/releases/

      直接下载即可。

    • 配置gradle环境:
      因为本人jenkins slave节点和gitlabci-runner节点是2台机器,这里如下配置都要在其上面配置:(以下只展示在jenkins slave节点上的配置过程)

    #将安装包上传到linux服务器:
    [root@devops ~]#ll -h gradle-7.4.2-bin.zip 
    -rw-r--r-- 1 root root 111M May 18 16:42 gradle-7.4.2-bin.zip
    [root@devops ~]#unzip gradle-7.4.2-bin.zip -d /usr/local/
    
    #配置:
    [root@devops ~]#vim /etc/profile
    ……
    export GRADLE_HOME=/usr/local/gradle-7.4.2/
    export PATH=$GRADLE_HOME/bin:$PATH
    [root@devops ~]#source /etc/profile
    
    #验证:
    [root@devops ~]#gradle -v
    
    ------------------------------------------------------------
    Gradle 7.4.2
    ------------------------------------------------------------
    
    Build time:   2022-03-31 15:25:29 UTC
    Revision:     540473b8118064efcc264694cbcaa4b677f61041
    
    Kotlin:       1.5.31
    Groovy:       3.0.9
    Ant:          Apache Ant(TM) version 1.10.11 compiled on July 10 2021
    JVM:          1.8.0_322 (Temurin 25.322-b06)
    OS:           Linux 3.10.0-957.el7.x86_64 amd64
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    3.常用命令

    • gradle build 构建项目
    • gradle build -x test 构建项目跳过测试
    • gradle clean 清空构建目录

    4.Jenkins集成

    🍂 老师源代码:

    stage("build"){
        steps{
            script {
                 sh "gradle clean && gradle build "
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    pipeline {
        agent {
            label "build"
        }
    
        parameters {
          string defaultValue: 'http://192.168.1.200/devops4/devops4-gradle-service.git', name: 'srcUrl'
          string defaultValue: 'master', name: 'branchName'
        }
    
    
        stages{
            stage('CheckOut') {
                steps {
                    script{
                    
                        
                    }
                }
            }
    
            stage("Build"){
                steps {
                    script {
                        //sh "/data/devops4/tools/apache-maven-3.8.5/bin/mvn clean package "
                        sh "/data/devops4/tools/gradle-7.4.2/bin/gradle build"
                    }
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    🍂 自己实际测试过程:

    • jenkins上创建一个流水线:devops4-gradle-service

    • 这里修改下gradle里的镜像源地址为阿里的:
      https://developer.aliyun.com/mirror/maven?spm=a2c6h.13651102.0.0.14df1b11toLu0x

    allprojects {
        repositories {
            maven { url 'https://maven.aliyun.com/repository/public/' }
            mavenLocal()
            mavenCentral()
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    本次直接在gitlab上gradle项目的gradle.build文件里配置即可:

    然后提交。

    • 编写流水线代码:
    pipeline {
        agent {
            label "build"
        }
    
        parameters {
          string defaultValue: 'http://172.29.9.101/devops4/devops4-gradle-service.git', name: 'srcUrl', trim: true
          string defaultValue: 'master', name: 'branchName', trim: true
        }
    
        stages {
            stage('CheckOut') {
                steps {
                    script {
                        checkout([$class: 'GitSCM', 
                            branches: [[name: "${params.branchName}"]], 
                            extensions: [], 
                            userRemoteConfigs: [[credentialsId: '54df701e-d369-4f69-85c6-7209d45c283b', 
                                                        url: "${params.srcUrl}"]]])
                    }
                }
            }
    
            stage('Build') {
                steps {
                    script {
                        // sh "/usr/local/apache-maven-3.8.5/bin/mvn clean package"
                        sh "/usr/local/gradle-7.4.2/bin/gradle build"
                    }
                }
            }
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    • 构建运行:

    5.gitlabCI集成

    • 我们先给gitlabci-runner打一个叫做gradle的tag:

    • 在项目里创建一个.gitlabci.yml文件,编写代码,并提交,观察构建效果:
    stages:
      - build
      - test
    
    variables:
      GIT_CHECKOUT: "false" 
      RUNNER_TAG: "gradle"
    
    pipelineInit:
      stage: .pre
      tags:
        - "${RUNNER_TAG}"
      variables:
        GIT_CHECKOUT: "true" 
      script:
        - ls -l 
    
    cibuild:
      tags:
        - "${RUNNER_TAG}"
      stage: build
      script:
        - /usr/local/gradle-7.4.2/bin/gradle build
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23


    能够看到,构建成功了。

    1.3 Ant(扩展)

    官网:https://ant.apache.org/bindownload.cgi Ant现在用的比较少了,也是一个项目构建依赖管理工具,使用xml的文件保存配置(build.xml)

    安装配置:

    wget 
    tar
    
    export 
    export 
    
    source 
    
    ant -version
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    常用命令:

    ant
    ant -f ../build.xml
    
    • 1
    • 2

    Jenkins集成:

    stage("build"){
        steps{
            script {
                 sh "ant -f build.xml"
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2. Go项目构建工具

    🍀 Go配置环境
    见我的另外2篇文章:
    1.本地路径:
    [[01 实战:windows上基于vscode的golang环境搭建(博客分享-测试成功)-kk-2022.4.28]]

    [[04 实战:centos上安装Go软件(博客分享-成功测试)-kk-2022.5.18]]

    2.csdn路径:
    https://blog.csdn.net/weixin_39246554/article/details/124495828
    https://blog.csdn.net/weixin_39246554/article/details/124507926

    💘 实践:Go项目构建流水线(测试成功)-2022.5.19
    🍂 jenkins集成 * gitlab上创建一个`devops4-golang-service`的项目,然后把本地demo.go代码推送到仓库: ![](https://img-blog.csdnimg.cn/img_convert/edf5ec44ee1aa20a73f843d7dfcb4395.png) demo.go代码: ```go package main

    import (
    “fmt”
    )

    func main() {
    fmt.Println(“hello world!”)
    }

    推送过程:
    ```bash
    hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/golang/demo
    $ pwd
    /c/Users/hg/Desktop/golang/demo
    
    hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/golang/demo
    $ ls
    demo.go
    
    hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/golang/demo
    $ git init
    Initialized empty Git repository in C:/Users/hg/Desktop/golang/demo/.git/
    
    hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/golang/demo (master)
    $ git add .
    
    hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/golang/demo (master)
    $ git commit -am"init commit"
    [master (root-commit) 900a326] init commit
     1 file changed, 9 insertions(+)
     create mode 100644 demo.go
    
    hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/golang/demo (master)
    $  git remote add origin http://172.29.9.101/devops4/devops4-golang-service.git
    
    hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/golang/demo (master)
    $  git push origin master
    Username for 'http://172.29.9.101': root
    Counting objects: 3, done.
    Delta compression using up to 8 threads.
    Compressing objects: 100% (2/2), done.
    Writing objects: 100% (3/3), 273 bytes | 136.00 KiB/s, done.
    Total 3 (delta 0), reused 0 (delta 0)
    To http://172.29.9.101/devops4/devops4-golang-service.git
     * [new branch]      master -> master
    
    hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/golang/demo (master)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    在gitlab上查看:

    • jenkins上新建一个叫做devops4-golang-service的流水线:

    • 编写jenkinsfile流水线:

      完整代码:

    pipeline {
        agent {
            label "build"
        }
    
        parameters {
          string defaultValue: 'http://172.29.9.101/devops4/devops4-golang-service.git', name: 'srcUrl', trim: true
          string defaultValue: 'master', name: 'branchName', trim: true
        }
    
        stages {
            stage('CheckOut') {
                steps {
                    script {
                        checkout([$class: 'GitSCM', 
                            branches: [[name: "${params.branchName}"]], 
                            extensions: [], 
                            userRemoteConfigs: [[credentialsId: '54df701e-d369-4f69-85c6-7209d45c283b', 
                                                        url: "${params.srcUrl}"]]])
                    }
                }
            }
    
            stage('Build') {
                steps {
                    script {
                        sh "/usr/local/go/bin/go build demo.go"
                    }
                }
            }
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 构建效果:

      在工作目录也可以看到产生的的demo二进制文件:

    🍀 gitlabCI集成
    在gitlab上新建一个.gitlab-ci.yml文件,并编写代码,提交测试:

    完整代码:

    stages:
      - build
      - test
    
    variables:
      GIT_CHECKOUT: "false" 
      RUNNER_TAG: "go"
    
    pipelineInit:
      stage: .pre
      tags:
        - "${RUNNER_TAG}"
      variables:
        GIT_CHECKOUT: "true" 
      script:
        - ls -l 
    
    cibuild:
      tags:
        - "${RUNNER_TAG}"
      stage: build
      script:
        - /usr/local/go/bin/go build demo.go
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    提交后观看效果:

    测试结束。😘

    3. 前端项目构建工具

    💘 实践:npm项目构建流水线(测试成功)-2022.5.19
    ### 1.npm 官网:[https://nodejs.org/en/download/](https://nodejs.org/en/download/ #### 1.配置环境 * 老样子,自己要在jenkins agent和gitlabCI-runner上都要安装好环境: ```bash (1)下载安装包 [root@devops ~]#wget https://mirrors.bfsu.edu.cn/nodejs-release/v16.15.0/node-v16.15.0-linux-x64.tar.gz --no-check-certificate [root@devops ~]#ll -h node-v16.15.0-linux-x64.tar.gz -rw-r--r-- 1 root root 32M Apr 27 06:15 node-v16.15.0-linux-x64.tar.gz

    (2)配置
    [root@devops ~]#tar xf node-v16.15.0-linux-x64.tar.gz -C /usr/local/
    [root@devops ~]#vim /etc/profile
    ……
    export NODE_HOME=/usr/local/node-v16.15.0-linux-x64
    export PATH= N O D E H O M E / b i n : NODE_HOME/bin: NODEHOME/bin:PATH
    [root@devops ~]#source /etc/profile

    (3)验证
    [root@devops ~]#npm -v
    8.5.5

    #### 2.项目生成
    💧 老师源代码:
    通过下面的命令,初始化一个vue项目:
    ```bash
    # npm install -g vue-cli
    + vue@2.6.12
    added 1 package from 1 contributor in 3.342s
    # vue-init  webpack vuedemo
    
    ? Project name vuedemo
    ? Project description A Vue.js project
    ? Author adminuser <2560350642@qq.com>
    ? Vue build standalone
    ? Install vue-router? No
    ? Use ESLint to lint your code? No
    ? Set up unit tests No
    ? Setup e2e tests with Nightwatch? No
    ? Should we run `npm install` for you after the project has been created? (recommended) npm
    
       vue-cli · Generated "vuedemo".
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    💧 自己测试过程:

    • 生成项目代码:
    [root@devops ~]#mkdir npm
    [root@devops ~]#cd npm/
    [root@devops npm]#npm install -g vue-cli
    [root@devops npm]#vue-init  webpack vuedemo
    
    • 1
    • 2
    • 3
    • 4

    • 将代码上传到gitlab:
      在gitlab上新建一个devops4-npm-ui工程:
    [root@devops vuedemo]#git config --global user.email "2675263825@qq.com"
    [root@devops vuedemo]#git config --global user.name "hg"
    
    [root@devops npm]#cd vuedemo/
    [root@devops vuedemo]#ls
    build  config  index.html  node_modules  package.json  package-lock.json  README.md  src  static
    
    [root@devops vuedemo]#git init
    Initialized empty Git repository in /root/npm/vuedemo/.git/
    [root@devops vuedemo]#git remote add origin http://172.29.9.101/devops4/devops4-npm-ui.git
    [root@devops vuedemo]#git add .
    [root@devops vuedemo]#git commit -m "Initial commit"
    [root@devops vuedemo]#git push origin master
    Username for 'http://172.29.9.101': root
    Password for 'http://root@172.29.9.101': 
    Counting objects: 31, done.
    Delta compression using up to 2 threads.
    Compressing objects: 100% (27/27), done.
    Writing objects: 100% (31/31), 211.92 KiB | 0 bytes/s, done.
    Total 31 (delta 0), reused 0 (delta 0)
    To http://172.29.9.101/devops4/devops4-npm-ui.git
     * [new branch]      master -> master
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    来到gitlab上查看代码:

    3.常用命令

    npm install <moduleName> -g   包安装到全局
    npm list:查看当前已安装的包。
    npm config set registry https://registry.npm.taobao.org   设置淘宝源
    npm config set cache  "/opt/npmcache/"   设置缓存路径
    
    • 1
    • 2
    • 3
    • 4

    💧 注意:淘宝npm源不维护了(本次使用默认源就好)

    4.Jenkins和GitlabCI集成

    💧 Jenkins集成
    来到jenkins,创建一个devops4-npm-ui项目,编写jenkins流水线代码,运行并观察效果:
    代码:

    pipeline {
        agent {
            label "build"
        }
    
        parameters {
          string defaultValue: 'http://172.29.9.101/devops4/devops4-npm-ui.git', name: 'srcUrl', trim: true
          string defaultValue: 'master', name: 'branchName', trim: true
        }
    
        stages {
            stage('CheckOut') {
                steps {
                    script {
                        checkout([$class: 'GitSCM', 
                            branches: [[name: "${params.branchName}"]], 
                            extensions: [], 
                            userRemoteConfigs: [[credentialsId: '54df701e-d369-4f69-85c6-7209d45c283b', 
                                                        url: "${params.srcUrl}"]]])
                    }
                }
            }
    
            stage('Build') {
                steps {
                    script {
                        // sh "/usr/local/apache-maven-3.8.5/bin/mvn clean package"
                        sh "/usr/local/node-v16.15.0-linux-x64/bin/npm install && /usr/local/node-v16.15.0-linux-x64/bin/npm run build"
                    }
                }
            }
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    构建并观察效果:

    💧 GitlabCI集成
    创建一个gitlab-ci.yml文件,编写代码,提交并观察效果:

    • 这里需要注意下:
      此时,runner tag为build,有2个runner符合要求:
    stages:
      - build
      - test
    
    variables:
      GIT_CHECKOUT: "false" 
      RUNNER_TAG: "build"
    
    pipelineInit:
      stage: .pre
      tags:
        - "${RUNNER_TAG}"
      variables:
        GIT_CHECKOUT: "true" 
      script:
        - ls -l 
    
    cibuild:
      tags:
        - "${RUNNER_TAG}"
      stage: build
      script:
        - /usr/local/node-v16.15.0-linux-x64/bin/npm install
        - /usr/local/node-v16.15.0-linux-x64/bin/npm run build
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    以上代码构建后可能存在问题:

    因此这里方便演示,将tag改为npm,然后再次提交构建,观察效果:

    stages:
      - build
      - test
    
    variables:
      GIT_CHECKOUT: "false" 
      RUNNER_TAG: "npm"
    
    pipelineInit:
      stage: .pre
      tags:
        - "${RUNNER_TAG}"
      variables:
        GIT_CHECKOUT: "true" 
      script:
        - ls -l 
    
    cibuild:
      tags:
        - "${RUNNER_TAG}"
      stage: build
      script:
        - /usr/local/node-v16.15.0-linux-x64/bin/npm install
        - /usr/local/node-v16.15.0-linux-x64/bin/npm run build
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24


    可以看到,流水线构建成功。

    2.yarn 【荐】

    yarn,facebook取代npm的包管理工具,速度快。Yarn 缓存包,无需重复下载。 并行下载,安装速度快。

    1.配置环境

    npm install -g yarn
    yarn info
    
    • 1
    • 2

    2.常用命令

    • yarn / yarn install
    • yarn clean
    • yarn config set cache-folder “/opt/yarncache”

    代码:

    yarn config set registry https://registry.npm.taobao.org
    yarn config set sass_binary_site "https://npm.taobao.org/mirrors/node-sass/"
    
    • 1
    • 2

    注意:本次yarn流水线集成部分省略,都一样。

    4. Jenkins共享库封装 【重点】

    💘 实践:Jenkins共享库封装(测试成功)-2022.5.20
    🍀 问题背景 每个项目都需要创建一条流水线,很多代码都是重用的; 因此,需要使用Jenkins共享库/GitlabCI模板库 方式来解决!
    1、创建共享库
    2、配置共享库
    3、创建作业核进行调试
    
    • 1
    • 2
    • 3

    1.创建共享库

    • 在jenkins上创建一个devops4的视图:

      然后,接下来这个devops4下的所有项目统一由一个Jenkinsfile来管理:

    • 在gitlab创建一个叫做devops4-jenkinslib-service的项目:

      创建它的目录结构:
      把这个项目用wed ide打开:
      创建src/org/devops目录:
      创建Jenksfile文件:
      具体目录结构如下:

    • 将代码下载步骤封装到共享库:
      org/devops/Checkout.groovy
    // 下载代码
    package org.devops
    
    def GetCode(srcUrl, branchName){
        checkout([$class: 'GitSCM', 
        branches: [[name: branchName]], 
        extensions: [], 
        userRemoteConfigs: [[credentialsId: '54df701e-d369-4f69-85c6-7209d45c283b', 
                                    url: srcUrl]]])
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    注意:这里的凭据是gitlab代码仓库里的gitlab账号信息,然后通过jenkins代码生成器生成的,最后是写在代码里的!

    • 将前后端等等各种工具的构建封装到共享库:
      org/devops/Build.groovy
      注意:
      本次构建工具都是用完整路径;
      这里也可以采用map方式,本次就先使用简单点的方式测试:

      实际,生产环境里,可能maven项目构建时可能存在很多不同的参数传递的:
    package org.devops
    
    def MavenBuild(){
        sh "/usr/local/apache-maven-3.8.5/bin/mvn clean package"
    }
    
    def GradleBuild(){
        sh "/usr/local/gradle-7.4.2/bin/gradle build"
    }
    
    def NpmBuild(){
        sh "/usr/local/node-v16.15.0-linux-x64/bin/npm install && /usr/local/node-v16.15.0-linux-x64/bin/npm run build"
    }
    
    def YarnBuild(){
        sh "yarn"
    }
    
    def CodeBuild(type){
        switch(type){
            case "maven":
                MavenBuild()
                break;
            case "gradle":
                GradleBuild()
                break;
            case "npm":
                NpmBuild()
                break;
            case "yarn":
                YarnBuild()
                break;
            default:
                error "No such tools ... [maven/ant/gradle/npm/yarn/go]"
                break
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 将前后端等等各种工具的单元测试封装到共享库;
      org/devops/UnitTest.groovy
      注意:以前我们把settings.xml文件放在代码库里,现在直接用构建机器上的就好,用全局那个。
    package org.devops
    
    //Maven
    def MavenTest(){
        sh "mvn test "
        junit 'target/surefire-reports/*.xml'
    }
    
    //Gradle
    def GradleTest(){
       sh "gradle test"
       junit 'build/test-results/test/*.xml'
    }
    
    //Ant
    //def AntBuild(configPath="./build.xml"){
    //    sh "ant -f ${configPath}"
    //}
    
    //Golang
    def GoTest(){
        sh " go test"
    }
    
    //Npm
    def NpmTest(){
        sh "npm test"
    }
    
    //Yarn
    def YarnTest(){
        sh "yarn test "
    }
    
    //Main
    def CodeTest(type){
        switch(type){
            case "maven":
                MavenTest()
                break;
            case "gradle":
                GradleTest()
                break;
            default:
                println("No such tools ... [maven/ant/gradle/npm/yarn/go]")
                break
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    此时库文件都创建好了,现在就剩编写Jenkinsfile了:

    • 这里需要注意下:
      原来Jenkinsfile这里的参数不能写死在代码里,而是要拿出来放在jenkinsfile的ui那里,因为每个项目的srcUrl和branchName都不一样:

      我们来找一个之前的项目,要特别配置下这个参数:
      注意:这里的仓库地址就是自己写好的代码仓库地址及分支:


    因为之前跑过流水线,所以这个job里已经存在配置了,没的话要自己添加下!

    • 我们找一个规律吧:

    • 进行如下配置:


    最终Jenkinsfile完整代码如下:

    @Library("mylib@main") _     //加载共享库
    import org.devops.*						// 导入库
    
    def checkout = new Checkout()    //New实例化
    def build = new Build()
    def unittest = new UnitTest()
    
    env.buildType = "${JOB_NAME}".split("-")[1]
    
    //流水线
    pipeline {
        agent { label "build" }
    
        options {
            skipDefaultCheckout true
        }
    
        stages{
            stage("Checkout"){
                steps{
                    script {
                        println("GetCode")
                        checkout.GetCode("${env.srcUrl}", "${env.branchName}")
                    }
                }
            }
    
            stage("Build"){
                steps{
                    script{
                        println("Build")
                        build.CodeBuild("${env.buildType}")
                       
                    }
                }
            }
    
            stage("UnitTest"){
                steps{
                    script{
                        unittest.CodeTest("${env.buildType}")
                    }
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    进行提交一下:

    2.配置共享库

    复制一下这个仓库的链接:
    http://172.29.9.101/devops4/devops4-jenkinslib-service.git

    进入Jenkins 设置, 定义共享库名称 mylib 默认的版本 main 。设置共享库的Git地址 [http://192.168.1.200/devops4/devops4-jenkinslib-service.git](http://192.168.1.200/devops02/jenkinslib.git) , 设置共享库的凭据。(如果没有提前创建好凭据,需要先去创建好然后再重新配置这个页面。)

    全局配置那里,搜索下share:

    注意:这里的仓库地址就是jenkins共享库的地址!

    这里也是要加一个凭据的:凭据就是gitlab的账号!(gitlab共享库账号)

    3.创建作业进行调试

    • 来到jenkins之前的那个maven项目,先测试一下maven:
      填写如下相关信息:
      这里的仓库地址就是jenkins共享库的地址,凭据就是gitlab账号:

    • 注意:一般要求job name要有一定的规范,如果不规范的话,就要在这里的jenkins ui里添加 一个类型或命令:(是后面那种情况)

    • 开始构建:

    观察现象:

    可以看到是构建是已经成功了,但是提示没有测试报告,我们来看下原因:


    发现target目录真没有这个文件,这里直接把测试部分注销掉,然后再次提交,并再次构建,观察效果:

    构建成功:

    • mavenok了,这里再测试下gradle:
      按和上面maven一样的构建方法,这里观察下构建效果:

    • 注意:一般我们是把这个devops流水线搭建起来,给开发使用,开发改的最多的地方就是jenkins这里的master分支,及要执行的构建类型了。
      每次构建成功后,这里的构建参数就不见了,需要我们再次配置下:


    此时就出现了参数化构建选项了:

    4.改进

    • 这里总还是很奇怪,需要改进下:
      因为根据项目名称去命名基本是不可能的:
      先来配置下jenkins的这个gradle项目,添加一个选项参数:

    • 再来修改下代码:
      这里的代码直接不用了:

      修改完,提交就好:

    • 此时,已gradle项目为例,进行构建:

      可以看到,构建成功:

    🍀 我们来看更加灵活的一种解决方法:
    现在还有一个问题就是:
    当你的构建参数比较多的时候,开发要执行的命令不规范,比如我再构建之前要执行一些其他的命令:
    此时,我们该怎么办呢?

    我们给开发一个shell命令,他自己去写:
    你想怎么打包就怎么打包,你自己写:

    但是,此时我们的平台就要有个命令的检查机制了:
    例如:他来一个rm命令,虽然也没事儿,但可能也会把构建节点给搞坏了!
    如果是容器也没啥问题:

    这种方式就非常灵活了:

    • 本次gradle这里就改为gradle build

    • 再到gitlab上修改下代码:

    比这个要灵活很多了:

    如下环境:
    平台提供了一个流水线的能力,去创建流水线是开发的同事去创建的,他会去选一些参数,例如构建类型,打包命令是什么,都是由开发同事去填的。填完之后会对应的在jenkins上生成这样一个job,最后devops平台在点构建的时候,它无非也是调用jenkins去构建的。

    • 可以看到gradel项目构建成功:

    • 最后,也把maven项目按如上方法改造下:

    最终完整的Jenkinsfile文件:

    @Library("mylib@main") _     //加载共享库
    import org.devops.*						// 导入库
    
    def checkout = new Checkout()    //New实例化
    def build = new Build()
    def unittest = new UnitTest()
    
    //env.buildType = "${JOB_NAME}".split("-")[1]
    
    //流水线
    pipeline {
        agent { label "build" }
    
        options {
            skipDefaultCheckout true
        }
    
        stages{
            stage("Checkout"){
                steps{
                    script {
                        println("GetCode")
                        checkout.GetCode("${env.srcUrl}", "${env.branchName}")
                    }
                }
            }
    
            stage("Build"){
                steps{
                    script{
                        println("Build")
                        //build.CodeBuild("${env.buildType}")
                        sh "${env.buildShell}"
                    }
                }
            }
    
            /*stage("UnitTest"){
                steps{
                    script{
                        unittest.CodeTest("${env.buildType}")
                    }
                }
            }*/
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    测试结束。😘

    5. GitLab模板库 【重点】

    💘 实践:GitLab模板库(测试成功)-2022.5.20
    注意后面为了通用,需要在项目中添加一个`build.sh`脚本, 里面存放构建相关的命令; ![](https://img-blog.csdnimg.cn/img_convert/e4fb8bea92582ab68fb7ebb9f3802b91.png) ### 1.配置模板库 * 在gitlab上创建一个叫做`devops4-gitlablib-service`的库: ![](https://img-blog.csdnimg.cn/img_convert/613c6cd6a377f535e78053a421719dd9.png)

    jobs/CI.yaml

    .pipelineInit:
      tags:
        - "${RUNNER_TAG}"
      stage: .pre
      variables:
        GIT_CHECKOUT: "true"   ##局部开启作业的代码下载
      script:
        - ls -l 
    
    .cibuild:
      tags:
        - "${RUNNER_TAG}"
      stage: build
      script:
        - echo "${BUILD_SHELL}"
        - ${BUILD_SHELL}
      artifacts:
         paths:
          - ${ARTIFACT_PATH}
    
    .citest:
      tags:
        - "${RUNNER_TAG}"
      stage: test
      script:
        - echo "${TEST_SHELL}"
        - ${TEST_SHELL}
      artifacts:
        reports:
          junit: ${TEST_REPORTS}
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    gitlabci.yaml

    include:
      - project: 'devops4/devops4-gitlablib-service'
        ref: main
        file: 
          - '/jobs/CI.yaml'
    
    workflow:
      rules:
        - if: $CI_PIPELINE_SOURCE == "web"
          when: always
        - if: $CI_COMMIT_BEFORE_SHA == "0000000000000000000000000000000000000000"
          when: never
        - when: always
    
    variables:
      GIT_CHECKOUT: "false"   ## 全局关闭作业代码下载
      BUILD_SHELL: "sh -x build.sh"  ## 构建命令
      # TEST_SHELL: "mvn test "                        ## 测试命令
      # ARTIFACT_PATH: "target/*jar"      ## 制品路径
      # TEST_REPORTS: "target/surefire-reports/TEST-*.xml" ##测试报告
      RUNNER_TAG: "builder"
    
    stages:
      - build
      - test
    
    pipelineInit:
      extends: 
        - .pipelineInit
    
    cibuild:
      extends:
        - .cibuild
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    2.项目使用CI

    • 此时给一个runner打一个tag:

    打开gitlab-ci.yml文件的raw格式:
    http://172.29.9.101/devops4/devops4-gitlablib-service/-/raw/main/.gitlab-ci.yml

    • 但是:注意,这个项目必须是公开的,因为它不支持认证访问!

    • 这里用maven项目测试:

    • 可以看到构建成功:


    测试结束。😘

    推荐文章

    https://mp.weixin.qq.com/s/ZgvPsHFRCgDogZDDCNHAGQ

    关于我

    我的博客主旨:

    • 排版美观,语言精炼;
    • 文档即手册,步骤明细,拒绝埋坑,提供源码;
    • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!
    1. 微信二维码
      x2675263825 (舍得), qq:2675263825。
      image-20211002091450217
    2. 微信公众号
      《云原生架构师实战》
      image-20211002141739664
    3. csdn
      https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421
      image-20211002092344616
    4. 博客
      www.onlyyou520.com
      image-20220513150311181
    5. 开源干货
      语雀:https://www.yuque.com/go/doc/73723298?#
      image-20220520080306203
    6. 知乎
      https://www.zhihu.com/people/foryouone

    最后

    好了,关于本次就到这里了,感谢大家阅读,最后贴上我女神的photo,祝大家生活快乐,每天都过的有意义哦,我们下期见!
    image-20211108223350304

  • 相关阅读:
    校正叠加(calibrated stacking)方法—技术
    [ConvNet]卷积神经网络概念解析
    C语言 extern “C“的作用
    net-java-php-python-大学生互助旅游网站修改计算机毕业设计程序
    运算符重载
    C++_pen_友元
    进程(详解)
    微信小程序实现连续签到七天
    自动过滤邮件(过滤器+标签)
    程序员的自我修养读后感
  • 原文地址:https://blog.csdn.net/weixin_39246554/article/details/124899020