【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制品管理 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM