zoukankan      html  css  js  c++  java
  • 【Jenkins使用之六】jenkins集成Maven-编译、nexus-制品管理、清理工作空间

    环境
      CentOS Linux release 7.6.1810
      jdk1.8.0_65
      apache-tomcat-8.5.45
      Jenkins-2.235.5
      apache-maven-3.6.3
      git-2.9.5
      gradle-6.6.1
      SonarQube-7.8
      sonar-scanner-cli-4.2.0.1873

    拓扑:
      node1:安装GitLab、SonarQube
      node2:安装Jenkins、Git、maven

    一、maven配置

    1、安装Maven
    安装Maven:使用Maven进行编译,这里要配置setting.xml里的仓库地址,可以是内网的某个nexus,保证开发人员的代码依赖编译正确。

    参考:
    理解和创建proxy、hosted、group仓库 
    配置本地项目或maven下载、发布构件到Nexus 

    2、配置Maven
    配置setting.xml里的仓库地址,可以是内网的某个nexus,保证开发人员的代码依赖编译正确。

    <?xml version="1.0" encoding="UTF-8"?>
    <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
        
        <!--自定义maven本地仓库地址-->
        <localRepository>/data/repo</localRepository>
    
      <pluginGroups>
      </pluginGroups>
    
      <proxies>
      </proxies>
        
        <!--nexus服务器登录验证信息 上传构件时要用 和项目pom.xml里的distributionManagement配合使用  两个文件的 id 需要保持一致-->
      <servers>
            <server>
                <id>releases</id>
                <username>admin</username>
                <password>admin123</password>
            </server>
            <server>
                <id>snapshots</id>
                <username>admin</username>
                <password>admin123</password>
            </server>
      </servers>
      
        <!--仓库组的url地址  id和name自定义,mirrorOf的值设置为*,代表maven的所有访问请求都会指向到Nexus仓库组-->  
      <mirrors>
          <mirror> 
                <id>nexus-82.46</id> 
                <name>repo-82.46</name>
                <url>http://192.168.82.46:8081/repository/maven-public/</url> 
                <mirrorOf>*</mirrorOf> 
            </mirror> 
            <mirror>  
          <id>nexus-125.127</id>  
          <name>repo-125.127</name>
          <mirrorOf>central</mirrorOf>
          <url>http://192.168.125.127:8081/repository/maven-public/</url>  
        </mirror>
      </mirrors>
    
      <profiles>
            <profile> 
                <id>myprofile</id> 
                <repositories> 
                    <repository> 
                        <id>central</id> 
                        <url>http://192.168.82.46:8081/repository/maven-public/</url> 
                        <releases> 
                            <enabled>true</enabled> 
                        </releases> 
                        <snapshots> 
                            <enabled>true</enabled> 
                        </snapshots>
                    </repository> 
                </repositories>
                <pluginRepositories> 
                    <pluginRepository> 
                        <id>central</id> 
                        <url>http://192.168.82.46:8081/repository/maven-public/</url> 
                        <releases> 
                            <enabled>true</enabled> 
                        </releases> 
                        <snapshots> 
                            <enabled>false</enabled> 
                        </snapshots>
                    </pluginRepository> 
                </pluginRepositories>
                <activation>
            <activeByDefault>true</activeByDefault>      
            <jdk>1.8</jdk>
          </activation>
          <properties>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
            <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
          </properties>
        </profile> 
      </profiles>
    </settings>
    View Code

    二、jenkins配置maven编译

    (1)这里我们使用一种新的jenkins Item类型:Multibranch Pipeline

    (2)这里选择只配置Gitlab 数据源就可以了,默认使用Jenklinsfile作为流水线配置文件

    (3)GItlab 上传Jenkinsfile和maven工程

    给出pom.xml,jenkinsfile中maven构建参数会用到:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <!--模型版本-->
        <modelVersion>4.0.0</modelVersion>
        <!--组织名称,此处使用组织名称+项目名称-->
        <groupId>com.wjy</groupId>
        <!--项目名称-->
        <artifactId>mymaven</artifactId>
        <!-- 当前项目版本号:
            同一个项目开发过程中可以发布多个版本,此处标示1.0版。
            每个工程发布后可以发布多个版本,
            依赖时调取不同的版本,使用不同的版本号 -->
        <version>1.0.0</version>
        <!--名称与访问地址,可省略-->
        <name>hello-world</name>
        <url>http://maven.apache.org</url>
     
        <!--定义编码格式-->
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
     
        <!--依赖库-->
        <dependencies>
            <!--单元测试-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.10</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
        
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>
    View Code

    (4)每次修改Jenkinsfile文件都要刷一下:Scan Multibranch Pipeline Now  会使新修改的Jenkinsfile生效

    (5)通过Blue Ocean查看

    jenkins任务工作空间目录:

    [root@node106 HelloWorldTest_master]# tree
    .
    ├── mymaven
    │   ├── Jenkinsfile
    │   ├── pom.xml
    │   ├── README.md
    │   ├── src
    │   │   ├── main
    │   │   │   └── java
    │   │   │       └── com
    │   │   │           └── wjy
    │   │   │               └── App.java
    │   │   └── test
    │   │       └── java
    │   │           └── com
    │   │               └── wjy
    │   │                   └── AppTest.java
    │   └── target
    │       ├── classes
    │       │   └── com
    │       │       └── wjy
    │       │           └── App.class
    │       ├── generated-sources
    │       │   └── annotations
    │       ├── generated-test-sources
    │       │   └── test-annotations
    │       ├── maven-archiver
    │       │   └── pom.properties
    │       ├── maven-status
    │       │   └── maven-compiler-plugin
    │       │       ├── compile
    │       │       │   └── default-compile
    │       │       │       ├── createdFiles.lst
    │       │       │       └── inputFiles.lst
    │       │       └── testCompile
    │       │           └── default-testCompile
    │       │               ├── createdFiles.lst
    │       │               └── inputFiles.lst
    │       ├── mymaven-1.0.0.jar
    │       ├── surefire-reports
    │       │   ├── com.wjy.AppTest.txt
    │       │   └── TEST-com.wjy.AppTest.xml
    │       └── test-classes
    │           └── com
    │               └── wjy
    │                   └── AppTest.class
    └── mymaven@tmp
    
    30 directories, 15 files

    这里重点研究下Jenkinsfile 这里使用脚本式语法:

    node{
        def workspace=pwd()
        jar_name='mymaven'
        
        //拉取代码 或者使用 checkout scm
        stage 'checkout'
            println "checkout"
            dir('mymaven'){
                git branch: 'master', credentialsId: 'gitlab-wangjy', url: 'http://134.32.82.46:19527/wjy/maven-basic.git'
            }
            
        //编译 执行mvn命令
        stage 'build'
            println "build"
            sh """ 
            cd $workspace/mymaven
            /usr/local/apache-maven-3.6.3/bin/mvn clean install -U -P coverage
            """
            
        //备份 根据war包在备份目录制作一个tar包用来备份
        stage 'backup'
            println "backup"
            sh"""
            cd $workspace/'$jar_name'/target
            tar cfz /data/.jenkins/workspace/backup/'$jar_name'`date +%y%m%d-%s`.tar.gz '$jar_name'-1.0.0.jar
            """
        
        //删除目标主机
        
        //上传编译后打包
        
        //重启tomcat
    }

    注意:

    $workspace 可以直接引用,$jar_name需要加单引号'';
    maven参数-P coverage:-P maven将触发pom.xml文件中coverage环境的profile配置,在实际中可以设置为不同的研发版本设置,比如dev-开发版本,test-测试版本,uat-准生产版本,prod-生产版本

      关于自动构建过程中自动打包配置文件,可以参考:jenkins+maven动态打包配置文件

    引入一个完整版的Jenkinsfile 包含拉取代码,编译,打包,删除旧部署文件,上传新包,重启Tomcat,借助sshpass使用比较老的部署方式,目前都是使用Ansible插件、或者Docker打镜像。

    node{
        //工作空间
        def workspace=pwd()
        war_name='mymaven'
        
        //部署主机登录信息
        host='127.0.0.1'
        user='wjy'
        passwd='wjy'
        tomcat_home=''
        
        
        //拉取代码 或者使用 checkout scm
        stage 'checkout'
            println "checkout"
            dir('mymaven'){
                git branch: 'master', credentialsId: 'gitlab-wangjy', url: 'http://134.32.82.46:19527/wjy/maven-basic.git'
            }
            
        //编译 执行mvn命令
        stage 'build'
            println "build"
            sh """ 
            cd $workspace/mymaven
            /usr/local/apache-maven-3.6.3/bin/mvn clean install -U -P coverage
            """
            
        //备份 根据war包在备份目录制作一个tar包用来备份
        stage 'backup'
            println "backup"
            sh"""
            cd $workspace/'$war_name'/target
            tar cfz /data/.jenkins/workspace/backup/'$war_name'`date +%y%m%d-%s`.tar.gz '$war_name'-1.0.0.war
            """
        
        //删除目标主机 
        //StrictHostKeyChecking=no #主机key检查,当你第一次连接某台机器时,会出现交互式页面,避免出现这种情况 设置no
        stage 'delete_old'
            println "delete_old"
            sh """
            sshpass -p '$passwd' ssh -o StrictHostKeyChecking=no '$user'@'$host' "rm -rf  '$tomcat_home'/deploy/'$war_name'* "
            """
        
        //上传编译后打包
        stage 'upload'
            println "upload"
            sh """
                cd $workspace/'$war_name'/target
                sshpass -p '$passwd' scp -o StrictHostKeyChecking=no '$war_name'.jar '$user'@'$host':'$tomcat_home'/deploy/'$war_name'.war
            """
            
        //重启tomcat
        stage 'restart_tomcat'
            println "restart_tomcat"
            sh "sshpass  -p '$passwd' ssh -o StrictHostKeyChecking=no '$user'@'$host' 'bash /home/admin/if_tomcat.sh'"
        
        echo 'done_______________'
    }
    View Code

     三、Jenkins制品管理

    1、jenkins借助maven管理制品

    maven deploy plugin主要是为了用来将artifact部署到远程仓库中。

    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-deploy-plugin</artifactId>
            <version>2.8.2</version>
        </plugin>
    </plugins>

    使用Deploy插件发布需要以下几个步骤:
    (1)配置发布地址。在Maven项目的POM文件中加入:

    <distributionManagement>
            <repository>
                <id>releases</id>
                <name>public</name>
                <url>http://192.168.82.46:9999/nexus/content/repositories/releases/</url>
            </repository>
            <snapshotRepository>
                <id>releases</id>
                <name>Snapshots</name>
                <url>http://192.168.82.46:9999/nexus/content/repositories/snapshots/</url>
            </snapshotRepository>
        </distributionManagement>

    Deploy插件会根据Maven项目中定义的version值决定是使用nexus-snapshot仓库还是nexus-release仓库。当version值是以-SNAPSHOT后缀结尾时,则发布到nexus-snapshot仓库。

    (2)配置访问Nexus的用户名和密码。在Nexus中,我们配置了只有授权的用户名和密码才能发布制品。这时需要在Maven的settings.xml中加入配置:

    <servers>
        <server>
        <id>releases</id>
        <username>admin</username>
        <password>Aa123456</password>
        </server>
        <server>
        <id>snapshots</id>
        <username>admin</username>
        <password>Aa123456</password>
        </server>
      </servers>

    (3)执行命令mvn clean deploy 制品上传制品到nexus

    2、使用archiveArtifacts本地存档
    archiveArtifacts步骤能对制品进行归档,然后你就可以从Jenkins页面上下载制品了。
    (1)新建Multibranch Pipeline 项目,配置GitLab,默认使用Jenkinsfile构建。
    (2)这里使用声明式pipeline

    pipeline{
        agent any
        //安装maven3.6.3
        tools{
            maven 'mvn-3.6.3'
        }
        stages{
            stage('Build'){
                steps{
                    //打包
                    sh "mvn clean package"
                }
            }
        }
        //事后生成归档
        post{
            always{
                archiveArtifacts artifacts: 'target/**/*.jar',fingerprint: true
            }
        }
    }

    archiveArtifacts的参数:
    • artifacts(必填):字符串类型,需要归档的文件路径,使用的是Ant风格路径表达式。
    • fingerprint(可选):布尔类型,是否对归档的文件进行签名。
    • excludes(可选):字符串类型,需要排除的文件路径,使用的也是Ant风格路径表达式。
    • caseSensitive(可选):布尔类型,对路径大小写是否敏感。
    • onlyIfSuccessful(可选):布尔类型,只在构建成功时进行归档。
    archiveArtifacts步骤并不只用于归档JAR包,事实上,它能归档所有类型的制品

    (3)BlueOcean构建

    (4)页面提供归档文件下载连接

    实际就是连接到target下的生成的jar文件.

    [root@node106 target]# pwd
    /data/.jenkins/workspace/HelloWorldTest_master/mymaven/target
    [root@node106 target]# ll
    total 4
    drwxr-x--- 3 root root   17 Sep 14 16:34 classes
    drwxr-x--- 3 root root   25 Sep 14 16:34 generated-sources
    drwxr-x--- 3 root root   30 Sep 14 16:34 generated-test-sources
    drwxr-x--- 2 root root   28 Sep 14 16:35 maven-archiver
    drwxr-x--- 3 root root   35 Sep 14 16:34 maven-status
    -rw-r----- 1 root root 2523 Sep 14 16:35 mymaven-1.0.0.jar
    drwxr-x--- 2 root root   65 Sep 14 16:35 surefire-reports
    drwxr-x--- 3 root root   17 Sep 14 16:34 test-classes

    备注:这种方式是将部署包生成在本地保存,生产中用的不多。

    3、使用jenkins插件Nexus Platform

    (1)jenkins 安装Nexus Platform插件

    (2)在我们自己的nexus私服里创建一个hosted类型cicd-release制品仓库


    (3)在Jenkinsfile中加入nexusPublisher步骤。

    pipeline{
        agent any
        //默认含有checkout SCM,所以这里没有显式的拉取代码,如果是拉取其他版本的代码这里可以添加默认含有checkout
        stages{
            stage('Build'){
                steps{
                    //打包
                    sh "mvn clean test package"
                    nexusPublisher(
                        nexusInstanceId:'nexus3-82.46',
                        nexusRepositoryId: 'cicd-release',
                        packages: [
                            [
                                $class: 'MavenPackage',
                                mavenAssetList: [
                                    [
                                        classifier: '',
                                        extention: '',
                                        filePath: './target/mymaven-1.0.0.jar'
                                    ]
                                ],
                                mavenCoordinate:[
                                    artifactId: 'mymaven',
                                    groupId: 'com.wjy',
                                    packaging: 'jar',
                                    version: '1.0.0'
                                ]
                            ]
                        ],
                    )
                }
            }
        }
    }

    ​nexusPublisher的参数介绍:
    ​ • nexusInstanceId:在Jenkins中配置Nexus 3.x时的Server ID。
    ​ • nexusRepositoryId:发布到Nexus服务器的哪个仓库。
    ​ • mavenCoordinate:Maven包的坐标,packaging值与Maven中的packaging值一致,可以是jar、war、pom、hpi等。
    ​ • mavenAssetList:要发布的文件,如果是pom.xml,则extension必须填“xml”。
    此插件的缺点:
    ​ • 每个Maven项目都可能不同,必须为每个Maven项目写nexusPublisher方法。
    ​ • 对于多模块的Maven项目,nexusPublisher的参数写起来十分啰唆,而且容易写错,实际工作中用的也不多。

    (4)去仓库里查看上传的制品

    4、使用Nexus管理Docker镜像
    (1)在Nexus里创建Docker私有仓库
    进入Nexus的仓库列表页:Administration→Repository→Repositories,单击“docker(hosted)”

     

    (2)jenkins所在机器要安装docker

    使用docker制作镜像,然后将镜像推送到Nexus,然后后面k8s会从Nexus拉取镜像去部署。
    注意:由于是私有的非安全(HTTP)的仓库,所以需要配置Docker的daemon.json:否则会报错Error response from daemon: Get https://192.168.82.46:18083/v2/: http: server gave HTTP response to HTTPS client

    [root@node2 local]# vim /etc/docker/daemon.json
    {
        "insecure-registries":["192.168.82.46:18083"],
        "registry-mirrors": ["http://hub-mirror.c.163.com"]
    }

    参考:Docker部署安装 

    (3)编写pipiline

    pipeline{
        agent any
        environment{
            registry="http://192.168.82.46:18083"
            registryCredential='nexus3-82.46'
        }
        stages{
            stage('Build'){
                steps{
                    //制作镜像
                    withDockerRegistry([credentialsId: "${registryCredential}",url:"${registry}"]){
                        sh "docker build . -t 192.168.82.46:18083/hello:v1"
                        sh "docker tag 192.168.82.46:18083/hello:v1 192.168.82.46:18083/hello:v1"
                        sh "docker push 192.168.82.46:18083/hello:v1"
                    }
                }
            }
        }
    }

    ​withDockerRegistry步骤做的事情:

    先执行命令:docker login -u admin -p ******** http://192.168.82.46:18083;其间所生成的config.json文件会存储在工作空间中。然后再执行闭包内的命令。

    (3.1)在本地上传私有镜像的时候遇到的报错:http: server gave HTTP response to HTTPS client
    原因是:Docker自从1.3.X之后docker registry交互默认使用的是HTTPS,但是搭建私有镜像默认使用的是HTTP服务,所以与私有镜像交时出现以上错误。

    解决办法是:vim /etc/docker/daemon.json 增加 "insecure-registries":["192.168.82.46:18083"]

    (3.2)报错:Get https://192.168.82.46/v2/: dial tcp 192.168.82.46:443: connect: connection refused
    原因:没有指定镜像要上传的地址,站点。默认的是docker.io
    解决方法:
    docker tag <imagesname> <ip:port/image>
    docker push ip:port/image

    参考:docker上传的一些问题

    (4)去nexus查看镜像制品

    5、Nexus raw制品管理
    raw仓库可以被理解为一个文件系统,我们可以在该仓库中创建目录。

    (1)创建raw仓库

    (2)编写pipiline,上传制品,获取制品
    使用HTTP客户端就可以将制品上传到raw仓库中,我们使用Linux curl命令,如果目录不存在,nexus将会自动创建

    pipeline{
        agent any
        environment{
            nexusRawUsernamePassword=credentials('nexus3-82.46')
        }
        stages{
            stage('Build'){
                steps{
                    sh "curl --user '${nexusRawUsernamePassword}' --upload-file ./target/mymaven-1.0.0.jar http://192.168.82.46:8081/repository/cicd-raw-release/2/mymaven-1.0.0.jar"
                }
            }
        }
    }

    (4)在Jenkins pipeline中获取原始制品时,我们同样使用curl命令。

    sh "curl --user '${nexusRawUsernamePassword}' -o mymaven-1.0.0.jar http://192.168.82.46:8081/repository/cicd-raw-release/2/mymaven-1.0.0.jar"

    6、从其他pipeline中拷贝制品
    (1)jenkins安装Copy Artifact插件
    Copy Artifact Plugin插件是将某个job的构建物copy到当前job的工作空间,以此来将不同的job进行关联。
    注意构建物也就是构建后会进行存档的文件,使用此插件只能copy存档的文件,而不是直接copy工作空间.

    (2)HelloWorldTest编写pipiline归档文件,并赋权给archivetest允许拷贝

    pipeline{
        agent any
        //用来指定哪些任务可以拷贝
        options {
            copyArtifactPermission('archivetest*');
        }
        stages{
            stage('Build'){
                steps{
                    //打包
                    sh "mvn clean package"
                }
            }
        }
        //事后生成归档
        post{
            always{
                archiveArtifacts artifacts: 'target/**/*.jar',fingerprint: true
            }
        }
    }

    (3)archivetest拷贝HelloWorldTest编译成功的文件

    pipeline{
        agent any
        stages{
            stage('Copy Archive'){
                steps{
                    script {
                        echo env.JOB_NAME
                        copyArtifacts filter: 'target/*.jar', fingerprintArtifacts: true, projectName: 'HelloWorldTest/master', selector: lastSuccessful()
                    }
                }
            }
        }
    }

    在各脚本编写遇到很多问题,其实是可以参考 Pipeline Syntax,不会写pipeline 就去里面根据后面问号里提示填写 然后生成脚本复制进去就行了

    copyArtifacts步骤的参数详解:
    ​ • projectname(必填):字符串类型,Jenkins job或pipeline名称。
    ​ • selector:BuildSelector类型,从另一个pipeline中拷贝制品的选择器,默认拷贝最后一个制品。
    ​ • parameters:字符串类型,使用逗号分隔的键值对字符串(name1=value1,name2=value2),用于过滤从哪些构建中拷贝制品。
    ​ • filter:字符串类型,Ant风格路径表达式,用于过滤需要拷贝的文件。
    ​ • excludes:字符串类型,Ant风格路径表达式,用于排除不需要拷贝的文件。
    ​ • target:字符串类型,拷贝制品的目标路径,默认为当前pipeline的工作目录。
    ​ • optional:布尔类型,如果为true,则拷贝失败,但不影响本次构建结果。
    ​ • fingerprintArtifacts:布尔类型,是否对制品进行签名,默认值为true。
    ​ • resultVariableSuffix:上例中,无法得知我们到底拿的是core项目的哪次构建的制品。CopyArtifact 插件的设计是将其构建次数放到一个环境变量中。这个环境变量名就是在COPYARTIFACT BUILD NUMBER 后拼上resultVariableSuffix,比如resultVariableSuf fix值为corejob,那么就在pipeline中通过变量COPYARTIFACT BUILD NUMBER corejob拿到源pipeline的构建次数了。

    ​几种常用的获取选择器:
    • lastSuccessful:最后一次构建成功的制品。方法签名为lastSuccessful(boolean stable)。stable为true表示只取构建成功的制品,为false表示只要构建结果比UNSTABLE好就行。
    • specific:指定某一次构建的制品。方法签名为specific(String buildNumber)。buildNum ber表示指定取第n次构建的制品。
    • lastCompleted:最后一次完成构建的制品,不论构建的最终状态如何。方法签名为lastCompleted()。
    • latestSavedBuild:最后一次被标记为keep forever的构建的制品。方法签名为latestSavedBu ild()。

    参考:Copy Artifact plugin

    (4)构建

    拷贝结果:注意是将jar所在目录一起拷贝过来

    [root@node2 target]# pwd
    /data/.jenkins/workspace/archivetest_master/target
    [root@node2 target]# ll
    total 4
    -rw-r----- 1 root root 2521 Sep 15 15:20 mymaven-1.0.0.jar

    7、版本号管理

    语义化版本格式为:主版本号.次版本号.修订号。版本号递增规则如下:
    • 主版本号:当作了不兼容的API修改时。
    • 次版本号:当作了向下兼容的功能性新增时。
    • 修订号:当作了向下兼容的问题修正时。
    先行版本号及版本编译元数据可以加到“主版本号.次版本号.修订号”的后面,作为延伸。以下是常用的修饰词。
    • alpha:内部版本。
    • beta:测试版本。
    • rc:即将作为正式版本发布。
    • lts:长期维护。

    方便生成版本号的Version Number插件

    pipeline{
        agent any
        stages{
            stage('create version'){
                steps{
                    script{
                        def version=VersionNumber versionPrefix:"${JOB_NAME}-",versionNumberString: 'v1.1.1.${BUILDS_ALL_TIME}'
                        echo "${version}"
                    }
                }
            }
        }
    }

    VersionNumber步骤支持以下参数。

    • versionNumberString:字符串类型,版本号格式,用于生成版本号。只能使用单引号,以防格式中的占位符被转义。版本号格式支持多种占位符,稍后介绍。
    • versionPrefix:字符串类型,版本号的前缀。
    • projectStartDate:字符串类型,项目开始时间,格式为yyyy-MM-dd,用于计算项目开始后的月数和年数。
    • worstResultForIncrement:字符串类型,如果本次构建状态比上一次构建状态更糟糕,则BUILDS_TODAY、BUILDS_THIS_WEEK、BUILDS_THIS_MONTH、BUILDS_THIS_YEAR占位符的值不会增加。worstResultForIncrement可以设置的值有SUCCESS、UNSTABLE、FAILURE、ABORTED、NOT_BUILT(默认)。此参数较少使用。versionNumberString参数使用占位符生成版本号。部分占位符本身支持参数化。接下来分别介绍它们。
    • BUILD DATE FORMATTED:格式化的构建日期,支持参数化,如${BUILD DATEFORMATTED,"yyyy-MM-dd"}。
    • BUILD DAY:构建日期,支持X和XX参数。比如是12月2日,${BUILD DAY}将返回2,${BUILD DAY,X}将返回2,${BUILD DAY,XX}将返回03。
    • BUILD WEEK:今年构建的星期数,支持X和XX参数。
    • BUILD MONTH:今年构建的月数,支持X和XX参数。
    • BUILD YEAR:今年构建的年份。

    比如构建的时间为2018-12-02,那么BUILD_DAY的值为2,BUILD_WEEK的值为49,BUILD_MONTH的值为12,BUILD_YEAR的值为2018。

    接下来是一组和构建数相关的占位符:BUILDS TODAY、BUILDS THIS WEEK、BUILDS THISMONTH、BUILDS THIS YEAR,它们分别表示当天、本星期、本月、本年完成的构建数。
    BUILDS ALL TIME表示自从项目开始后完成的总构建数。MONTHS SINCE PROJECT START和YEARS SINCE PROJECT START分别表示自项目开始日期起已过去的日历月数和年数

    参考:翟志军 Jenkins2.X实践指南

    四、清理工作目录

    workspace:工作空间,可以随便删除,删除后再次构建时间可能会比较长,因为要重新获取一些资源;
    job:存放的是项目的配置、构建结果、日志等。不建议手动删除,手动删除的后果往往需要重新部署
    (1)对于自由风格project的配置中,General部分有个Discard old builds
    在这里,我选择给项目配置丢弃旧的构建这种模式,保持构建的天数和保持最大构建数根据项目的需要设置,保留了7天内构建的最多5次记录。配置完后,需要重新构建一次,才起作用,这时候我们的job空间会大大缩小。

    对于Multibranch Pipeline项目 设置Orphaned Item Strategy:


    (2)使用工作空间选项清理


    (3)安装Workspace Cleanup plugin插件
    对于自由风格project,在构建后操作Post-build Actions添加delete workspace when build is done

    如果使用pipeline:使用如下

    编写Jenkinsfile:

    pipeline{
        agent any
        stages{
            stage('Copy Archive'){
                steps{
                    script {
                        echo env.JOB_NAME
                        copyArtifacts filter: 'target/**/*.jar', fingerprintArtifacts: true, projectName: 'HelloWorldTest/master', selector: lastSuccessful()
                    }
                }
            }
        }
        post{
            always{
                cleanWs cleanWhenAborted: false, cleanWhenFailure: false, cleanWhenNotBuilt: false, cleanWhenUnstable: false
            }
        }
    }

    构建结果:

    查看工作空间:

    之前未清理:

    [root@node2 workspace]# ll
    drwxr-x--- 5 root root 128 Sep 15 18:11 archivetest_master
    drwxr-x--- 2 root root   6 Sep 15 18:11 archivetest_master@tmp
    -rw-r----- 1 root root  82 Sep 15 09:50 workspaces.txt

    添加清理步骤后:

    [root@node2 workspace]# ll
    drwxr-x--- 2 root root   6 Sep 15 18:11 archivetest_master@tmp
    -rw-r----- 1 root root  82 Sep 15 09:50 workspaces.txt

    参考:

    jenkins pipeline构建

    jenkins制品管理 

  • 相关阅读:
    第二次会议
    第五次团队会议
    作业六:团队项目——编写项目的Spec
    DFD数据流程图
    第四次会议
    精通 VC++ 实效编程280例 03 控制栏
    1.窗体与界面设计工具栏设计
    HTML5开发 Local Storage 本地存储
    1.窗体与界面设计菜单应用实例
    精通 VC++ 实效编程280例 02 菜单和光标
  • 原文地址:https://www.cnblogs.com/cac2020/p/13665952.html
Copyright © 2011-2022 走看看