Jenkins | 進階篇 | 基於Maven構建一個Java專案
--昨夜西風凋碧樹,獨上高樓,望盡天涯路
-
環境準備
硬體準備:
256 MB RAM, 推薦 512MB
10 GB of 硬碟 (用於給Jenkins以及Docker)
-
執行Jenkins
下面通過docker執行Jenkins:
docker run \ --rm \ -u root \ -p 8888:8080 \ -v jenkins-data:/var/jenkins_home \ #掛載Jenkins容器中的/var/jenkins_home到宿主機jenkins-data,如果jenkins-data不存在,會自動建立 -v /var/run/docker.sock:/var/run/docker.sock \ #掛載docker.sock -v "$HOME":/home \ #掛載$Home jenkinsci/blueocean
瀏覽器訪問http://ip:8888/會看到需要啟用Jenkins:
初始密碼可以從log中檢視,或者從/var/jenkins_home/secrets/initialAdminPassword檔案中找:
選擇安裝推薦的外掛之後等待外掛安裝完成:
之後註冊賬號,一路儲存:
點選新建任務,建立一個pipeline任務:
編寫Jenkinsfile,這裡有兩種方式:
直接在Jenkons Web UI中編寫:
從SCM中讀取Jenkinsfile,首先要在git中新增Jenkinsfile檔案,之後填寫配置:
兩種方式都可以構建成功:
下面我們在藍海中操作一些步驟:
點選執行:
之後可以進入到本次構建介面檢視資訊:
Build成功之後的介面如下:
點選右上角回到經典頁面
-
新增test stage
修改配置檔案:
新新增的指令碼執行maven命令來在簡單的java應用程式上執行單元測試。
這個命令還生成一個jUnit xml報告,該報告儲存到目標/surefire-Reports目錄(在Jenkins容器的/var/jenkins_home/workspace/simple-java-maven-app目錄中)。
在Blue Ocean中,結果可以通過管道執行的測試頁面訪問。
POST部分包含這個jUnit步驟的條件確保步驟總是在測試階段完成時執行,而不管階段的結果如何。
pipeline {
agent {
docker {
image 'maven:3-alpine'
args '-v /root/.m2:/root/.m2'
}
}
stages {
stage('Build') {
steps {
git 'https://github.com/LUFFY-lucy/simple-java-maven-app'
sh 'mvn -B -DskipTests clean package'
}
}
stage('Test') {
steps {
sh 'mvn test'
}
post {
always {
junit 'target/surefire-reports/*.xml'
}
}
}
}
}
同理,進入Blue Ocean,點選執行,結果如下:
-
新增一個交付stage
修改指令碼如下,新加的stage中執行一個交付的指令碼檔案:
pipeline {
agent {
docker {
image 'maven:3-alpine'
args '-v /root/.m2:/root/.m2'
}
}
stages {
stage('Build') {
steps {
git 'https://github.com/LUFFY-lucy/simple-java-maven-app'
sh 'mvn -B -DskipTests clean package'
}
}
stage('Test') {
steps {
sh 'mvn test'
}
post {
always {
junit 'target/surefire-reports/*.xml'
}
}
}
stage('Deliver') {
steps {
sh './jenkins/scripts/deliver.sh'
}
}
}
}
該shell檔案位於:
執行shell可以保持pipeline程式碼(即jenkinsfile)的整潔。可以將複雜的構建步驟(特別是由2個或更多步驟組成的階段)放入單獨的shell指令碼檔案中。這最終使Pipeline程式碼的維護變得更容易。
進入Blue Ocean,點選執行,之後部署成功:
至此我們已經走完了“構建”、“測試”和“交付”,這是是使用Jenkins中的maven構建更復雜的java應用程式的基礎。
由於Jenkins是非常可擴充套件的,我們可以修改和配置它來處理構建編排和自動化的幾乎任何方面。