Jenkins介紹
1)Jenkins是一個開源持續整合工具。
2)開發工具:JAVA。
3)功能:提供了軟體開發的持續整合服務。
4)特點:支援主流軟體配置管理,配合實現軟體配置管理,持續整合功能。
Jenkins的優勢和應用場景
1)主流的運維開發平臺,相容所有主流開發環境。
2)外掛市場可與海量業內主流開發工具實現整合。
3)Job為配置單位與日誌管理,使運維與開發人員能協同工作。
4)許可權管理劃分不同Job不同角色。
5)強大的負載均衡功能,保證我們專案的可靠性。
Jenkins Job介紹
1)代表一個任務或者專案。
2)可配置與可執行。
3)執行後的記錄稱之為Build。
4)日誌監控與記錄。
5)所有檔案集中儲存。
Freestyle Job:
1)需在頁面新增模組配置項與引數完成配置。
2)每個Job僅能實現一個開發功能。
3)無法將配置程式碼化,不利於Job配置遷移與版本控制。
4)邏輯相對簡單,無需額外學習成本。
Pipeline Job:
匹配持續整合(CI)與持續交付(CD)的幾個核心概念。
持續:“持續”用於描述遵循許多不同流程時間。這並不意味著“一直在執行”,而是“隨時可執行”。
快速失敗:管道的工作之一就是快速處理變更。另一個是監視建立釋出的不同任務和作業。由於編譯失敗或測試未通過的程式碼可以阻止管道繼續執行,因此快速通知使用者此類情況非常重要。快速失敗指的是在管道流程中儘快發現問題並快速通知使用者的方式,這樣可以及時修正問題並重新提交程式碼以便管道在此執行。通常在管道流程中可通過檢視歷史記錄來確定是誰做了那次修改並通知此人及團隊。
持續整合:持續整合(CI)是在原始碼變更後自動檢測、拉去、構建和進行單元測試的過程。持續整合是啟動管道的環節。檢測變更的工作通常由Jenkins負責。檢測的型別有:
1)輪詢:檢測程式反覆詢問程式碼管理系統是否有新變更。
2)定期:檢測程式配置為定期啟動構建,無論程式碼是否有變更,但若沒有變更,也不會增加額外成本。
3)推送:這與用於程式碼管理系統檢查的檢測程式相反,程式碼管理系統被配置為提交變更到倉庫時將“推送” 一個通知到檢測程式。
單元測試:單元測試是由開發人員編寫的小型的專項測試,以確保新程式碼獨立工作。所謂的獨立是指不依賴或呼叫其他不可直接訪問的程式碼,也不依賴外部資料或其他模組,如果必要的話可以用模擬(mock)表示。常見的單元測試框架有Java開發的JUnit。
持續交付:持續交付(CD)通常是指整個流程鏈(管道),它自動檢測原始碼變更並通過構建、測試、打包和相關操作執行它們以生成可部署的版本,基本上沒有任何人為干預。
特點:
1)所有模組,引數配置都可以體現為一個pipeline指令碼。
2)可以定義多個stage構建一個管道工作集。
3)所有配置程式碼化,方便Job配置遷移與版本控制。
4)需要pipeline指令碼語法基礎。
編寫規範:
基礎架構:
1)所有程式碼包裹在pipeline{}層內。
2)stages{}層用來包含該pipeline所有stage子層。
3)stage{}層用來包含具體我們需要編寫任務的steps{}子層。
4)steps{}層用來新增我們具體需要呼叫的模組語句。 agent區域:
1)agent定義pipeline在哪裡執行。
可以使用any,none,或具體的Jenkins node主機名等。
例如要特指在node1上執行,可以寫成agent {node{label 'node1'}}
environment區域:
1)”變數名稱=變數值“定義我們的環境變數。
2)可以定義全域性環境變數,應用所有stages任務。
3)可以定義stage環境變數,應用單獨的stage任務。
script區域(可選):
1)在steps內定義script{}。
2)groovy指令碼語言。
3)用來進行指令碼邏輯運算。
常用steps區域:
1)echo:列印輸出。
2)sh:呼叫Linux系統shell命令。
3)git url:呼叫git模組進行git相關操作。
pipeline{
agent any
environment{
host='test.example.com'
user='deploy'
}
stages{
stage('build'){
steps{
sh "cat $host"
echo $deploy
script{
def servers = ['node1','node2']
For(int i=0;i<server.size();i++){
echo "testing ${servers[i]} server"
}
}
}
}
}
}
複製程式碼
在linux配置git公鑰到github上
安裝git
安裝git的目的是在自動化部署前實時從git遠端倉庫中拉取最新的程式碼。在linux(centos7系統)安裝git:
yum install git
生成金鑰
使用命令:
ssh-keygen -t rsa -C "youremail@abc.com"
可以不用設定金鑰密碼,連續按三次回車,如圖所示。
新增金鑰
將/root/.ssh/id_rsa.pub中生成的金鑰新增到github上去。具體步驟如下:
1)開啟github,點選右上角個人頭像,點選setting。
2)找到Personal settings的SSH AND GPG KEYS一欄,點選New SSH key。
3)將剛剛在伺服器生成的ssh字串複製黏貼進文字框,點選Add SSH key即可,如圖3所示。
在linux安裝maven
安裝maven的目的是通過專案中的pom.xml檔案自動解決專案依賴問題,構建專案。將本地已下載好的maven壓縮包上傳至伺服器解壓即可。
具體步驟:
1)將本地maven包拖進XShell框內,進行上傳。如圖所示。
2) 使用命令進行解壓:tar -zxvf apache-maven-3.3.9-bin.tar.gz
3)配置環境變數。編輯etc/profile檔案,新增環境,新增完畢後儲存退出,source使其生效:
vi etc/profile
//在檔案中加入下述字串
export MAVEN\_HOME=/usr/local/maven/maven
export PATH=\$MAVEN\_HOME/bin:\$PATH
//使其生效
source /etc/profile
複製程式碼
4)檢查版本號,檢查環境是否已正確配置:mvn -v
,結果如圖所示:
在linux安裝Jenkins
使用命令,關閉防火牆,防止防火牆影響jenkins的工作:
systemctl stop firewalld
systemctl disable firewalld
複製程式碼
安裝方法一
關閉防火牆後,使用yum命令,安裝jenkins:
//下載YUM源
wget -O /etc/yum.repos.d/jenkins.repo
http://pkg.jenkins-ci.org/redhat/jenkins.repo
//新增YUM源
rpm \--import https://jenkins-ci.org/redhat/jenkins-ci.org.key
//YUM安裝
yum install -y jenkins
複製程式碼
安裝方法二
由於使用yum源安裝較慢,故直接使用官網提供的war包,如圖所示,複製至tomcat目錄下的webapps中。
登入網址:http://linux伺服器的ip:8081/jenkins/,如圖7所示,將從本地檔案生成的密碼複製到文字框中。 點選安裝推薦的外掛,等待所有的外掛安裝完畢。 隨後建立個人管理員賬戶。建立完畢後主頁面如圖所示。配置Jenkins
1)點選manage jenkin中的Configure System,如圖所示。
填寫git plugin資訊,如圖所示。
2)新增憑據。首先點選主頁面憑據,隨後點選Jenkins,如圖所示,在全域性憑據中加入個人資訊。使用者名稱與密碼為github郵箱與github密碼。
3) 點選全域性設定,新增jdk,git與maven,將自動安裝的勾勾去掉,如圖14所示。自動構建Maven的Freestyle Job專案
1)首先點選新建Item,如圖所示。
2)填寫名稱,並點選自由風格專案,最後點選確定,如圖所示。
3)可以填入構建引數描述,如圖所示。4)填入描述與git倉庫地址和Credentials,如圖所示。
5)點選構建,增加構建步驟,點選執行Shell,新增程式碼如下。\#!/bin/sh
export
PATH=\"/bin:/sbin:/user/bin:/user/sbin:/user/local/bin:/usr/local/sbin\"
\# Print env variable
echo \"The build is \$version\" \>\> test.properties
echo \"\[INFO\] Done\...\"
\# Check test properties
echo \"\[INFO\] Check test properties\"
if \[ -s test.properties\]
then
cat test.properties
echo \"\[INFO\] Done\...\"
else
echo \"test.properties is empty\"
fi
echo \"\[INFO\] Build finished\...\"
複製程式碼
6)點選增加構建步驟,點選呼叫頂層Maven目標,新增資訊如圖所示。
7)儲存退出後點選Build with Parameters,點選開始構建,即可開始專案的構建,如圖所示。8)點選左下角的小圓圈可以看見控制檯的日誌輸出,可以檢視構建已經成功。生成的Jar包可以在/root/.jenkins/workspace/maven-freestyle-job/target中檢視。如圖所示。
9)此外,jenkins還可以提供定時與輪詢構建。
1:輪詢:檢測程式反覆詢問程式碼管理系統是否有新變更。
2:定期:檢測程式配置為定期啟動構建,無論程式碼是否有變更,但若沒有變更,也不會增加額外成本。
設定定時任務如圖所示。
設定輪詢任務如圖20所示。
定時任務與輪詢任務可以相容,同時該欄位遵循cron的語法(略有不同)。具體來說,每行包含由TAB或空格分隔的5個欄位:
欄位 | 範圍 |
---|---|
分鐘 | 一小時內(0-59) |
小時 | 一天中的小時(0-23) |
DOM | 每月的某一天(1-31) |
月 | 月(1-12) |
DOW | 星期幾(0-7),其中0和7是星期日。 |
要為一個欄位指定多個值,可以使用以下運算子。按優先順序排列。
- * 指定所有有效值
- M-N 指定一系列值
- M-N/X或者*/X按X的間隔步長到指定範圍或整個有效範圍
- A,B,...,Z 列舉多個值
為了允許定期計劃的任務在系統上產生均勻負載,H應儘可能使用符號("雜湊")。例如,使用0 0 * * *十幾個日常工作將導致午夜大幅飆升。相比之下,使用H H * * *仍然會每天執行一次,但不能同時執行,更好地使用有限的資源。
所述H符號可以與範圍內使用。例如,H H(0-7) * * * 表示從凌晨12:00(午夜)到早上7:59之間的某個時間段。還可以使用H帶有或不帶範圍的步長間隔。
該H符號可以被認為是在一定範圍內的隨機值,但它實際上是作業名稱,而不是隨機函式的雜湊值,所以該值仍然是任何專案穩定。
請注意,對於月份欄位的日期,由於月份長度可變,短期週期(例如*/3或H/3將不會在大多數月份結束時始終如一地工作)。例如,*/3將在一個月的第1天,第4天,第31天,然後在下個月的第二天再次執行。雜湊總是在1-28範圍內選擇,因此H/3在月底之間產生3到6天之間的差距。(更長的週期也會有不一致的長度,但效果可能相對不太明顯。)
以句號開頭的空行和#行將被忽略。
此外,@yearly,@annually,@monthly, @weekly,@daily,@midnight,並且@hourly也支援方便的別名。這些使用雜湊系統進行自動平衡。例如,在一小時內的任何時間@hourly都是相同的H * * * *並且可能意味著。 @midnight實際上是指在凌晨12:00到凌晨2:59之間的某個時間段。
例子:
每十五分鐘一次(也許在:07:,22,:37,:52):
H / 15 * * * *
每小時上半場每十分鐘一次(三次,也許是:04,:14,:24):
H(0-29)/ 10 * * * *
每小時一次,每小時45分鐘,從上午9:45開始,每個工作日下午3:45結束:
45 9-16 / 2 * * 1-5
每個工作日上午9點到下午5點每兩小時一次(可能是上午10點38分,下午12點38分,下午2點38分,下午4點38分):
H H(9-16)/ 2 * * 1-5
每月1日和15日每天一次,12月除外:
H H 1,15 1-11 *
時區規範
定期任務通常在Jenkins主JVM(目前為亞洲/上海)的時區中的預定時間執行。通過在欄位的第一行中指定備用時區,可以選擇更改此行為。時區規範以TZ=,後跟時區的ID開頭。
具有時區規範的計劃的完整示例:
TZ =歐洲/倫敦
#這項工作需要在倫敦時間早上開始
H 8 * * *
#Butlers沒有五點鐘,所以我們再次開始工作
H(0-30)17 * * *
自動構建Maven的Pipeline Job專案
1)首先點選新建Item,如圖所示。
2)填寫名稱,並點選流水線專案,最後點選確定,如圖所示。3)將事先準備好的shell程式碼填入流水線,如圖所示。
pipeline{
agent {node{label 'master'}}
environment{
PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin"
}
parameters {
choice(
choices:'dev\nprod',
description:'choose deploy environment',
name:'deploy_env'
)
string (name:'version',defaultValue:'1.0.0',description:'build version')
}
stages{
stage("Checkout test repo"){
steps{
sh 'git config --global http.sslVerify false'
dir ("${env.WORKSPACE}"){
git branch:'master',credentialsId:"c1b21f21-edf9-44fb-9da6-c32169ffe2d9",url:'https://github.com/lamarsan/background-program.git'
}
}
}
stage("Print env variable"){
steps{
dir("${env.WORKSPACE}"){
sh """
echo "[INFO] Print env variable"
echo "Current deployment environment is $deploy_env" >> test.properties
echo "The build is $version" >> test.properties
echo "[INFO] Done..."
"""
}
}
}
stage("Check test properties"){
steps{
dir("${env.WORKSPACE}"){
sh """
echo "[INFO] Check test properties"
if [ -s test.properties ]
then
cat test.properties
echo "[INFO] Done..."
else
echo "test.properties is empty"
fi
"""
echo "[INFO] Build finished..."
}
}
}
}
}
複製程式碼
4)儲存退出,點選立即構建,結果會失敗,如圖所示。
5)失敗是由於沒有新增引數所致,返回到專案,點選Build with Parameters,如圖所示。同時,日誌提示沒有找到git命令,故去掉sh 'git config --global http.sslVerify false'
一行。
6)點選開始構建,構建成功,如圖所示。