1)Jenkins是一個開源持續集成工具。java
2)開發工具:JAVA。node
3)功能:提供了軟件開發的持續集成服務。linux
4)特色:支持主流軟件配置管理,配合實現軟件配置管理,持續集成功能。git
1)主流的運維開發平臺,兼容全部主流開發環境。github
2)插件市場可與海量業內主流開發工具實現集成。web
3)Job爲配置單位與日誌管理,使運維與開發人員能協同工做。shell
4)權限管理劃分不一樣Job不一樣角色。apache
5)強大的負載均衡功能,保證咱們項目的可靠性。centos
1)表明一個任務或者項目。tomcat
2)可配置與可執行。
3)執行後的記錄稱之爲Build。
4)日誌監控與記錄。
5)全部文件集中保存。
1)需在頁面添加模塊配置項與參數完成配置。
2)每一個Job僅能實現一個開發功能。
3)沒法將配置代碼化,不利於Job配置遷移與版本控制。
4)邏輯相對簡單,無需額外學習成本。
匹配持續集成(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"
}
}
}
}
}
}
複製代碼
安裝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所示。
安裝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
,結果如圖所示:
使用命令,關閉防火牆,防止防火牆影響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所示,將從本地文件生成的密碼複製到文本框中。 點擊安裝推薦的插件,等待全部的插件安裝完畢。 隨後建立我的管理員帳戶。建立完畢後主頁面如圖所示。1)點擊manage jenkin中的Configure System,如圖所示。
填寫git plugin信息,如圖所示。
2)添加憑據。首先點擊主頁面憑據,隨後點擊Jenkins,如圖所示,在全局憑據中加入我的信息。用戶名與密碼爲github郵箱與github密碼。
3) 點擊全局設置,添加jdk,git與maven,將自動安裝的勾勾去掉,如圖14所示。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是星期日。 |
要爲一個字段指定多個值,可使用如下運算符。按優先順序排列。
爲了容許按期計劃的任務在系統上產生均勻負載,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 * * *
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)點擊開始構建,構建成功,如圖所示。