【課程14】持續集...概念.xmind0.6MBhtml
【課程14】持續集成...kins.xmind43.3KBjava
【課程14預習】持續...kins.xmind0.4MBmysql
程序員開發應用,開發後須要提交svn,而後從svn拉取代碼,進行構建,發佈到tomcat中,發佈,而後看呈現效果,這樣的工做是頻繁反覆的在進行的,浪費了程序員的大量時間,那麼能不能把這些工做自動化呢,只須要程序員更新代碼到svn,而後自動的構建,發佈,呈現效果,固然是能夠的,經過jenkins來實現。react
什麼是持續集成
互聯網軟件的開發和發佈,已經造成了一套標準流程,最重要的組成部分就是持續集成(Continuous integration,簡稱CI)。linux
持續集成指的是,頻繁地(一天屢次)將代碼集成到主幹。git
它的好處主要有兩個。程序員
(1)快速發現錯誤。每完成一點更新,就集成到主幹,能夠快速發現錯誤,定位錯誤也比較容易。web
(2)防止分支大幅偏離主幹。若是不是常常集成,主幹又在不斷更新,會致使之後集成的難度變大,甚至難以集成。spring
持續集成的目的,就是讓產品能夠快速迭代,同時還能保持高質量。它的核心措施是,代碼集成到主幹以前,必須經過自動化測試。只要有一個測試用例失敗,就不能集成。sql
這種作法的核心思想在於:既然事實上難以作到事先徹底瞭解完整的、正確的需求,那麼就乾脆一小塊一小塊的作,而且加快交付的速度和頻率,使得交付物儘早在下個環節獲得驗證。早發現問題早返工。
持續集成
持續集成強調開發人員提交了新代碼以後,馬上進行構建、(單元)測試。根據測試結果,咱們能夠肯定新代碼和原有代碼可否正確地集成在一塊兒。
持續交付
持續交付在持續集成的基礎上,將集成後的代碼部署到更貼近真實運行環境的「類生產環境」(production-like environments)中。好比,咱們完成單元測試後,能夠把代碼部署到鏈接數據庫的 Staging 環境中更多的測試。若是代碼沒有問題,能夠繼續手動部署到生產環境中。
持續部署
持續部署則是在持續交付的基礎上,把部署到生產環境的過程自動化。
總結就是
持續,就是說每完成一個完整的部分,就向下個環節交付,發現問題能夠立刻調整。是的問題不會放大到其餘部分和後面的環節。
集成,是指軟件我的研發的部分向軟件總體部分交付,以便儘早發現我的開發部分的問題;
部署,是代碼儘快向可運行的開發/測試節交付,以便儘早測試;
交付,是指研發儘快向客戶交付,以便儘早發現生產環境中存在的問題。
1)核心價值體如今:
a、持續集成中的任何一個環節都是自動完成的,無需太多的人工干預,有利於減小重複過程以節省時間、費用和工做量;
b、持續集成保障了每一個時間點上團隊成員提交的代碼是能成功集成的。換言之,任什麼時候間點都能第一時間發現軟件的集成問題,使任意時間發佈可部署的軟件成爲了可能;
c、持續集成還能利於軟件自己的發展趨勢,這點在需求不明確或是頻繁性變動的情景中尤爲重要,持續集成的質量能幫助團隊進行有效決策,同時創建團隊對開發產品的信心。
2)持續集成系統的組成
因而可知,一個完整的構建系統必須包括:
A、一個自動構建過程,包括自動編譯、分發、部署和測試等。
B、 一個代碼存儲庫,即須要版本控制軟件來保障代碼的可維護性,同時做爲構建過程的素材庫。
C、一個持續集成服務器。本文中介紹的 Jenkins/Jenkins 就是一個配置簡單和使用方便的持續集成服務器。
什麼是jenkins
Jenkins是一個開源的持續集成的服務器,Jenkins開源幫助咱們自動構建各種項目。Jenkins強大的插件式,使得Jenkins能夠集成不少軟件,可能幫助咱們持續集成咱們的工程項目。
Jenkins對於maven工程完整的編譯和發佈流程以下:
一、Jenkins從SVN上拉取代碼到指定的編譯機器上。
二、在編譯機器上觸發編譯命令或腳本。
三、編譯獲得的結果文件。
四、把結果文件傳到指定的服務器上。
五、重啓服務
jenkins環境安裝
首先安裝java環境
一、本地下載jdk8.tar.gz包,而後經過xshell和xftp工具上傳到/opt【可自定義】目錄。
二、使用tar -zxvf jdk8.tar.gz 解壓文件。
三、打開/etc/profile文件中配置java環境
export JAVA_HOME=/opt/jdk1.8.0_161
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
使用命令source /etc/profile 讓環境從新加載,輸入java -version堅持是否配置成功
安裝maven環境
一、查看地址
https://maven.apache.org/download.cgi
二、複製要下載的連接地址,使用linux的wget命令下載。切換到/opt目錄,直接下載:
wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.5.3/binaries/apache-maven-3.5.3-bin.tar.gz
三、使用tar -zxvf apache-maven-3.5.3-bin.tar.gz 解壓文件獲得apache-maven-3.5.3
四、/etc/profile配置環境,並使用命令source /etc/profile 讓環境從新加載
export MAVEN_HOME=/opt/apache-maven-3.5.3
export PATH=${MAVEN_HOME}/bin:$PATH
五、檢驗是否配置成功。
maven的配置setting.xml最好修改鏡像源:
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
安裝git環境
按照如下命名安裝:
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
wget https://www.kernel.org/pub/software/scm/git/git-1.8.3.1.tar.gz
tar xzf git-1.8.3.1.tar.gz
cd git-1.8.3.1
make prefix=/usr/local/git all
make prefix=/usr/local/git install
echo "export PATH=$PATH:/usr/local/git/bin" >>/etc/bashrc
source /etc/bashrc
git --version
mysql安裝
查看默認密碼:
grep 'temporary password' /var/log/mysqld.log
修改密碼:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'admin';
安裝jenkins
下載jenkins.war
直接下載war包,windows和linux環境通用。linux能夠經過wget命令直接下載到指定目錄。windows直接把連接複製到瀏覽器連接欄便可下載。
wget http://mirrors.shu.edu.cn/jenkins/war-stable/2.121.1/jenkins.war
下載完了以後能夠在當前目錄看到jenkins.war包,表示已經下載完成。
運行命令
jenkins.war包能夠有兩種運行方式:
- 第一種是把war包放到tomcat的webapps目錄下運行;
- 第二種是直接經過java -jar來啓動項目,由於jenkins.war包裏面已經內置了jetty服務器,能夠直接啓動,經過--httpPort來指定啓動端口,添加&表示以服務形式啓動。
java -jar jenkins.war --httpPort=8081 &
安裝過程
打開連接地址http://你的ip:8081,
獲取祕鑰:
cat /root/.jenkins/secrets/initialAdminPassword
新手最好直接選擇安裝推薦的插件就能夠,熟悉之後下次就能夠自定義插件安裝便可。
正在下載推薦的額插件
插件安裝完畢,跳轉到建立管理員。填入用戶名密碼。
jenkins安裝成功。
jenkins插件管理
本次課程主要講發佈maven項目到tomcat中。因此還須要安裝如下兩個插件:
打開管理插件頁面:
選擇,直接安裝!
jenkins全局配置
系統管理--》全局工具配置,須要把服務器的jdk、maven、git等環境配置好。
構建jar項目
共同配置
- 配置git或者svn地址,jenkins會自動從遠程倉庫拉去最新代碼。
若是是私有項目的話,須要加入用戶名密碼
- 開始maven打包構建的命令,能夠去掉test測試
clean install -Dmaven.test.skip=true -Ptest
jenkins與應用服務器同一臺機器
- 通過上一個步驟以後,jenkins會在默認路徑/root/.jenkins/workspace/上看到打包的項目,/root/.jenkins/workspace/homework/target目錄下有打包的jar文件。spring-boot-homework-0.0.1-SNAPSHOT.jar。所以咱們打包完成以後的工做就是要替換原來的jar文件,而後重啓項目。
這裏咱們使用shell腳原本完成。
- DIR表示存放jar文件、和啓動項目的文件夾。JAEFILE是指jar包的名稱。
- 接下來的工做其實就是殺掉原來的spring-boot-homework-0.0.1-SNAPSHOT.jar進程
- 備份原來的jar包
- 把新生成的jar覆蓋原來的
- 而後java -jar啓動項目
- BUILD_ID=dontKillMe表示jenkins不殺掉衍生的線程
shell腳本以下:
echo '開始啓動項目~~~~~~~~~'
DATE=$(date +%Y%m%d_%H%M)
export JAVA_HOME PATH CLASSPATH
JAVA_HOME=/opt/jdk1.8.0_181
PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH
DIR=/opt/jar
JARFILE=spring-boot-homework-0.0.1-SNAPSHOT.jar
if [ ! -d $DIR/backup ];then
mkdir -p $DIR/backup
fi
cd $DIR
ps -ef | grep $JARFILE | grep -v grep | awk '{print $2}' | xargs kill -9
mv $JARFILE backup/$JARFILE$DATE
mv -f /root/.jenkins/workspace/homework/target/$JARFILE .
BUILD_ID=dontKillMe nohup java -jar $JARFILE > out.log &
if [ $? = 0 ];then
sleep 30
tail -n 50 out.log
fi
cd backup/
ls -lt|awk 'NR>5{print $NF}'|xargs rm -rf
echo '結束啓動項目~~~~'
致此,項目就會自動部署,只須要點擊構建按鈕,jenkins就會自動拉去最新代碼,而後備份、重啓項目。
回顧一下流程:
- 打包文成以後執行shell實現切換jar,從新部署項目。
jenkins與應用服務器不一樣臺機器
上面的過程是當jenkins與應用服務器同一臺的時候才能直接複製過去,當服務器不一樣的時候就不能這樣作了,能夠經過ssh或者scp來傳輸jar包過去,而後再執行shell腳本。
爲了方便演示,我這裏用的仍是同一臺機器,不過再也不使用複製的方式,而是經過ssh吧文件傳輸給本身。
在配置以前,輸入ssh 127.0.0.1,會提示要輸入密碼。
ssh的配置可以使用密鑰,也可使用密碼,這裏咱們使用密鑰來配置,在配置以前先配置好jenkins服務器和應用服務器的密鑰認證。
jenkins服務器上生成密鑰對,使用ssh-keygen -t rsa命令。輸入下面命令 一直回車,一個矩形圖形出現就說明成功,在~/.ssh/下會有私鑰id_rsa和公鑰id_rsa.pub
ssh-keygen -t rsa
而後把生成的公鑰推進到應用服務器上,加入47.106.38.101是應用服務器的ip,由於這裏用的jenkins和應用服務器同一臺,因此ip是同樣的。
ssh-copy-id -i ~/.ssh/id_rsa.pub 47.106.38.101
第一次須要驗證密碼,輸入應用服務器的登陸免密。出現如下提示,說明成功了。
在應用服務器上重啓ssh服務,
service sshd restart
這時候再次ssh 47.106.38.101或者ssh 127.0.0.1就會直接登陸成功,再也不須要免密。
致此,免密登陸配置完成~
接下來的工做就是上次jar文件到應用服務器,而後執行shell實現重啓應用。
這裏使用一種比較簡單的方法,直接替換以前的命令行就行。
命令行的意思是經過scp命令把jar上次到遠程服務器的指定目錄,而後經過ssh免密登陸指定遠程的腳本。
cd target/
scp spring-boot-homework-0.0.1-SNAPSHOT.jar 127.0.0.1:/opt/jar/target/
ssh 127.0.0.1 "cd /opt/jar; ./republish.sh;"
遠程腳本以下:和以前的差很少,改了一下jar的目錄而已。
DATE=$(date +%Y%m%d_%H:%M:%S)
export JAVA_HOME PATH CLASSPATH
JAVA_HOME=/opt/jdk1.8.0_181
PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH
DIR=/opt/jar
JARFILE=spring-boot-homework-0.0.1-SNAPSHOT.jar
if [ ! -d $DIR/backup ];then
mkdir -p $DIR/backup
fi
cd $DIR
ps -ef | grep $JARFILE | grep -v grep | awk '{print $2}' | xargs kill -9
mv $JARFILE backup/$JARFILE$DATE
mv -f /opt/jar/target/$JARFILE .
java -jar $JARFILE > out.log &
if [ $? = 0 ];then
sleep 30
tail -n 50 out.log
fi
cd backup/
ls -lt|awk 'NR>5{print $NF}'|xargs rm -rf
另外一種方法,還沒測試成功。(暫時放棄)---------------------------------------------------------
配置jenkins的ssh傳輸
首先安裝publish over ssh插件
安裝以後,點擊系統管理 > 系統設置
選擇 Publish over SSH
- Path to key 寫上生成的ssh路徑:/root/.ssh/id_rsa
下面的SSH Servers是重點
- Name 隨意起名錶明這個服務,待會要根據它來選則
點擊test configuration以後,出現success,表示成功。
- 新建一個maven構建項目home_server_split。複製以前的項目配置。
大部分的配置都是和同一臺機器的同樣的,須要修改的地方是打包完成以後的操做。
- Source files配置:target/xxx-0.0.1-SNAPSHOT.jar 項目jar包名
- Remote directory:代碼應用服務器的目錄地址,
- Exec command: 應用服務器對應的腳本。
此種方法,還沒測試成功。(暫時放棄)---------------------------------------------------------
構建war項目(知道一下就行)
與發包jar項目的前面相同,不一樣的是打包構建以後的步驟不同,以前是使用shell來完成項目的從新部署,如今打成war以後咱們須要作的是替換原來的war包
springboot打包成war包請參考
tomcat設置容器帳號密碼
由於jenkins把項目打包成war包以後須要把項目發佈到tomcat的webapp目錄下運行,因此須要給tomcat這是發佈的帳號密碼。
- tomcat7在conf/tomcat-users.xml下添加以下代碼
<role rolename="tomcat"/>
<role rolename="manager-script"/>
<role rolename="manager"/>
<role rolename="admin"/>
<role rolename="admin-gui"/>
<role rolename="manager-gui"/>
<user username="admin" password="123456" roles="admin,admin-gui,manager-gui,manager-script,manager-gui"/>
- tomcat8和tomcat9還須要在打開webapps/manager/META-INF/context.xml,把一行代碼註釋掉,如圖:
- WAR/EAR files:是war包的相對路徑,如target/xxx.war
- content path:Tomcat的發佈路徑,即項目的上下文,用於訪問項目。如http://localhost:8080/heo,heo
- contaners :發佈到的容器,主要可發佈到tomcat、jboss、GlassFish
- deploy on failure:發生錯誤的時候是否發佈到tomcat
碼雲Hook自動構建
這裏要利用的實際上是碼雲的webhook功能。
- 首先jenkins安裝gitee插件,實現自動部署插件
- 添加碼雲連接配置
- 前往 Jenkins -> Manage Jenkins -> Configure System -> Gitee Configuration -> Gitee connections
- 在 Connection name 中輸入 Gitee 或者你想要的名字
- Credentials 中如還未配置碼雲 APIV5 私人令牌,點擊 Add - > Jenkins
- Domain 選擇 Global credentials
生成的令牌:
- ID, Descripiton 中輸入你想要的 ID 和描述便可。
- Credentials 選擇配置好的 Gitee APIV5 Token
- 點擊 Advanced ,可配置是否忽略 SSL 錯誤(適您的Jenkins環境是否支持),並可設置連接測超時時間(適您的網絡環境而定)
- 點擊 Test Connection 測試連接是否成功,如失敗請檢查以上 3,5,6 步驟。
點擊測試成功,標識gitee配置完成。
配置了gitee的連接以後,接下來就是使用。
分爲如下幾個步驟:
一、打開x項目的配置,而後Gitee連接處。選擇剛纔配置的連接id
二、配置構建觸發器:
生成hook密碼。
三、打開gitee上的項目,打開管理界面的webhooks。
url的配置須要注意一下,jenkins上建議的地址是Gitee webhook 觸發構建,須要在 Gitee webhook 中填寫 URL: http://47.106.38.101:8080/project/homework。可是個人jenkins端口實際上是8081,因此須要改回來。而後把jenkins上生成的gitee webhook密碼複製過來。
點擊測試,會發現,jenkins會自動開始構建完成項目發佈了。也就是說,之後只要發佈代碼到git上,jenkins就會自動構建了,完成了自動化過程。