Jenkins(六) Jenkins項目構建細節(jié)

內置觸發(fā)器

Jenkins內置4種構建觸發(fā)器:

  • 觸發(fā)遠程構建,通過一個遠程地址觸發(fā)項目的執(zhí)行
  • 其他工程構建后觸發(fā)(Build after other projects are build),就是需要前面一個項目構建完成后觸發(fā)我的項目構建
  • 定時構建(Build periodically),顧名思義就是 類似于 corn 表達式,定時執(zhí)行
  • 輪詢SCM(Poll SCM),會定時掃描本地代碼倉庫是否有變更,如果代碼有變更就觸發(fā)項目構建

遠程構建

在項目中的配置中,構建觸發(fā)器選中遠程構建。

通過瀏覽器訪問 http://192.168.81.102:7777/job/test01/build?token=6666 進行項目構建

其他工程構建后觸發(fā)

應用保存后,就可以構建 maven_project 了。

定時構建

定時字符串從左往右分別為: 分 時 日 月 周
一些定時表達式的例子:

每30分鐘構建一次:H代表形參(代表小時,測試用 *)
H/30 * * * * 10:02 10:32
每2個小時構建一次: 
H H/2 * * *
每天的8點,12點,22點,一天構建3次: (多個時間點中間用逗號隔開) 
0 8,12,22 * * *
每天中午12點定時構建一次 
H 12 * * *
每天下午18點定時構建一次 
H 18 * * *
在每個小時的前半個小時內的每10分鐘 H(0-29)/10 * * * *
每兩小時一次,每個工作日上午9點到下午5點(也許是上午10:38,下午12:38,下午2:38,下午4:38) H H(9-16)/2 * * 1-5

輪詢SCM

該構建觸發(fā)器,Jenkins會定時掃描本地整個項目的代碼,增大系統(tǒng)的開銷,不建議使用。

Git hook自動觸發(fā)構建

在Jenkins的內置構建觸發(fā)器中,輪詢SCM可以實現(xiàn)Gitlab代碼更新,項目自動構建,但是該方案的性能不佳。那有沒有更好的方案呢? 有的。就是利用Gitlab的webhook實現(xiàn)代碼push到倉庫,立即觸發(fā)項目自動構建。

安裝Gitlab Hook插件

需要安裝兩個插件:Gitlab Hook 和 GitLab,安裝好后在項目配置的構建觸發(fā)器中,會多一個選項

關于 Gitlab 之后的操作請百度,我這里使用的是 gitea。

gitea 需要下載 Generic Webhook Trigger 插件,安裝后到項目配置

配置完成后就可以測試了,只要提交了代碼就會構建項目。

Jenkins的參數(shù)化構建

有時在項目構建的過程中,我們需要根據(jù)用戶的輸入動態(tài)傳入一些參數(shù),從而影響整個構建結果,這時我們可以使用參數(shù)化構建。

Jenkins支持非常豐富的參數(shù)類型

String Parameter

這樣的方式只能適用于 pipeline 項目

這種方式輸入哪個分支,就構建哪個分支

配置郵箱服務器發(fā)送構建結果

安裝 Email Extension 插件

可以測試發(fā)送

如果 jenkins 報錯: Can't send command to SMTP host; 有可能是管理員的郵箱沒有填寫或者和認證者的郵箱不相同。

準備郵件內容

在項目根目錄編寫 email.html,并把文件推送git

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次構建日志</title>
</head>
<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4" offset="0">
<table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sansserif">
    <tr>
        <td>(本郵件是程序自動下發(fā)的,請勿回復!)</td>
    </tr>
    <tr>
        <td><h2>
            <font color="#0000FF">構建結果 - ${BUILD_STATUS}</font>
        </h2></td>
    </tr>
    <tr>
        <td><br/>
            <b><font color="#0B610B">構建信息</font></b>
            <hr size="2" width="100%" align="center"/>
        </td>
    </tr>
    <tr>
        <td>
            <ul>
                <li>項目名稱&nbsp;:&nbsp;${PROJECT_NAME}</li>
                <li>構建編號&nbsp;:&nbsp;第${BUILD_NUMBER}次構建</li>
                <li>觸發(fā)原因:&nbsp;${CAUSE}</li>
                <li>構建日志:&nbsp;
                    <a href="${BUILD_URL}console">${BUILD_URL}console</a>
                </li>
                <li>構建&nbsp;&nbsp;Url&nbsp;:&nbsp;
                    <a href="${BUILD_URL}">${BUILD_URL}</a>
                </li>
                <li>工作目錄&nbsp;:&nbsp;
                    <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a>
                </li>
                <li>項目&nbsp;&nbsp;Url&nbsp;:&nbsp;
                    <a href="${PROJECT_URL}">${PROJECT_URL}</a>
                </li>
            </ul>
        </td>
    </tr>
    <tr>
        <td><b><font color="#0B610B">Changes Since Last Successful Build:</font></b>
            <hr size="2" width="100%" align="center"/>
        </td>
    </tr>
    <tr>
        <td>
            <ul>
                <li>歷史變更記錄 : <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a></li>
            </ul>
            ${CHANGES_SINCE_LAST_SUCCESS,reverse=true, format="Changes for Build #%n:<br/>%c<br/>",showPaths=true,changesFormat="<pre>[%a]<br/>%m</pre>",pathFormat="&nbsp;&nbsp;&nbsp;&nbsp;%p"}
        </td>
    </tr>
    <tr>
        <td><b>Failed Test Results</b>
            <hr size="2" width="100%" align="center"/>
        </td>
    </tr>
    <tr>
        <td>
            <pre style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica,sans-serif">
                $FAILED_TESTS
            </pre>
            <br/>
        </td>
    </tr>
    <tr>
        <td><b><font color="#0B610B">構建日志 (最后 100行):</font></b>
            <hr size="2" width="100%" align="center"/>
        </td>
    </tr>
    <tr>
        <td>
            <textarea cols="80" rows="30" readonly="readonly"
                      style="font-family: Courier New">
                ${BUILD_LOG,maxLines=100}
            </textarea>
        </td>
    </tr>
</table>
</body>
</html>

這里的參數(shù)都為 Jenkins 的參數(shù),具體參數(shù)在 Jenkins 系統(tǒng)配置里可以看到,點擊如下的問號就行。

添加 post,post 意思是構建后操作,post 可以根據(jù) stage 的結果執(zhí)行不同的邏輯,比如 stages 里面都執(zhí)行完成,他會走 post 里的 success 代碼,如果失敗會走 failure 代碼。而 post 的語法該如何寫,可以到 流水線語法 中看到。

  • Always run, regardless of build status 無論構建的結果如何都會執(zhí)行
  • Run if the build status is "Failure" 構建失敗運行
  • Run if the build status is "Success" or hasnt been set yet 構建成功運行

至于,郵件的內容,可以在片段生成器中查出來

    post {
        always {
            emailext(
                # 可以使用 jenkins 里面的參數(shù)
                subject: '構建通知:${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}!',
                # 讀取 email.html 文件
                body: '${FILE,path="email.html"}',
                # 郵件的收件人
                to: 'xxxxxx@qq.com'
            )
        }
    }

${FILE,path="PATH"} 可以在系統(tǒng)配置中了解

然后去構建你的項目,就可以收到 構建項目的郵件了。

jenkins 配置 SonarQube(代碼審查)

SonarQube是一個用于管理代碼質量的開放平臺,可以快速的定位代碼中潛在的或者明顯的錯誤。目前支持java,C#,C/C++,Python,PL/SQL,Cobol,JavaScrip,Groovy等二十幾種編程語言的代碼質量管理與檢測。官網(wǎng):https://www.sonarqube.org/

軟件 版本
JDK 1.8
mysql 8.0
SonarQube 6.7.4

下載sonar壓縮包:https://www.sonarqube.org/downloads/

# 解壓 
unzip sonarqube-6.7.4.zip
# 創(chuàng)建sonar用戶,必須sonar用于啟動,否則報錯
useradd sonar 
# 更改sonar目錄及文件權限
chown -R sonar. /opt/software/sonar

修改sonar配置文件

vim /opt/software/sonar/conf/sonar.properties
sonar.jdbc.username=xxxx
sonar.jdbc.password=xxxxxx
jdbc:mysql://xxxxxxxxxxx:3306/sonar?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true&useConfigs=maxPerformance

啟動sonar

cd /opt/software/sonar/
# 啟動
su sonar ./bin/linux-x86-64/sonar.sh start 
# 查看狀態(tài)
su sonar ./bin/linux-x86-64/sonar.sh status 
# 停止
su sonar ./bin/linux-x86-64/sonar.sh stop 
# 查看日志
tail -f logs/sonar.log

7.9 以后不支持 mysql,只支持h2、mssql、postgresql ,7.9 以下也只支持 mysql5.7,所以這里就不在繼續(xù)了,大致說清楚就好,當安裝好后訪問web頁面,默認9000端口,得到一個token記錄下來。

1.在Jenkins中安裝 SonarQube Scanner 插件
2.在Jenkins->Manager Jenkins->Global Tool Configuration->SonarQube Scanner->新增 SonarQube Scanner

1. 填入 Name,名字可以自己隨便起
2. 勾選 Install automatically
3. 選擇安裝的版本
4. 點擊應用并保存

3.在Jenkins->Manager Jenkins->Configure System->SonarQube servers->Add SonarQube

1. 填入 Name,該名字可以隨便起
2. 填寫安裝 SonarQube 的 web 地址 IP:PORT
3. 添加證書,該證書就是訪問 SonarQube 獲取到的token,也可以在Jenkins的全局憑證里去添加這個證書,但類型需要是 Secret text
4. 應用并保存

4.非結構性項目檢查,到項目配置中找到構建,在正常的構建項目名錄后可以增加構建步驟,然后再下拉選項中找到 Execute SonarQube Scanner

1. 填寫Task to run,執(zhí)行 SonarQube 的命令,輸入 scan(觸發(fā)代碼掃描以及檢測)
2. 代碼需要的JDK環(huán)境,這個JDK環(huán)境是在全局配置中配置得到的
3. 在 Analysis properties 填如內容

# must be unique in a given SonarQube instance,項目標記
sonar.projectKey=web_demo
# this is the name and version displayed in the SonarQube UI. Was mandatoryprior to SonarQube 6.1.,項目名稱
sonar.projectName=web_demo
# 版本
sonar.projectVersion=1.0
# Path is relative to the sonar-project.properties file. Replace "\" by "/" on
Windows.
# This property is optional if sonar.modules is set. 掃描代碼的路徑 . 代表當前項目根目錄下掃描所有代碼及文件,也可以直接掃描指定包代碼,如 /src/main/**
sonar.sources=.
# 排除的一些文件不掃描
sonar.exclusions=**/test/**,**/target/**
# jdk版本
sonar.java.source=1.8
sonar.java.target=1.8
# Encoding of the source code. Default is default system encoding,編碼格式
sonar.sourceEncoding=UTF-8

4.應用并保存后構建項目

5.流水線項目添加 SonarQube 功能,可以把內容添加到項目中,防止 jenkins 意外的崩潰,導致配置丟失

1. 在項目中根路徑下新建 sonar-project.properties,并把內容復制過來
2. 到項目中的 Jenkinsfile 中編寫內容

pipeline {
    agent any

    stages {
        stage('pull code') {
            steps {
                echo 'master 分支的事情 參數(shù)是=${branch}'
                checkout([$class: 'GitSCM', branches: [[name: '*/${branch}']], extensions: [], userRemoteConfigs: [[credentialsId: '80dfe5c5-1684-47b1-a410-6f53ceb3c543', url: 'http://192.168.81.15:3000/biguncle/test.git']]])
            }
        }
        # 代碼檢查,可以把該步驟添加到任意位置
        stage('code checking') {
            steps {
                script {
                    # '' 這里寫的是在jenkins->Global Tool Configuration->SonarQube Scanner->新增的SonarQube Scanner的Name
                    scannerHome = tool 'sonar-scanner'
                }
                # () 里的內容是在 jenkins->Configure System->SonarQube servers->里的 Name
                withSonarQubeEnv('sonarqube6.7.4') {
                    # 這里是 jenkins 在配置 SonarQube Scanner的時候安裝的工具,他自己安裝的不需要我們管
                    sh "${scannerHome}/bin/sonar-scanner"
                }
            }
        }
        stage('build project') {
            steps {
                sh 'mvn clean package'
            }
        }
    }
    post {
        always {
            emailext(
                subject: '構建通知:${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}!',
                body: '${FILE,path="email.html"}',
                to: '875730567@qq.com'
            )
        }
    }
}

3. 提交后就可以到 jenkins 去構建項目,結果要去 SonarQube web 去看
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容