Jenkins簡(jiǎn)介及部署及應(yīng)用
介紹
jenkins是一個(gè)開(kāi)源的、提供友好操作界面的持續(xù)集成工具(CI),起源于Hudson(Hudson是商用的),主要用于持續(xù)、自動(dòng)的構(gòu)建/測(cè)試軟件項(xiàng)目、監(jiān)控一些定時(shí)執(zhí)行的任務(wù)。Jenkins用Java語(yǔ)言編寫(xiě),可在Tomcat等流行的servlet容器中運(yùn)行,也可獨(dú)立運(yùn)行。通常與版本管理工具(SCM)、構(gòu)建工具結(jié)合使用:常用的版本控制工具有SVN、GIT,構(gòu)建工具有Maven、Ant、Gradle。
持續(xù)集成
開(kāi)發(fā)中,我們經(jīng)常遇到一些奇怪問(wèn)題,比如本地可以編譯成功的代碼但是同事們更新代碼后編譯出錯(cuò),或者在項(xiàng)目有多個(gè)Target的時(shí)候,資源文件只添加到了當(dāng)前的Target,另外一個(gè)Target這個(gè)時(shí)候是不能正常編譯的,再比如寫(xiě)的工具類,被同事改了,或者自己有改動(dòng),很多地方用到了,怎么保證這個(gè)類的行為沒(méi)有發(fā)生變化而影響到項(xiàng)目中的其它模塊呢?諸如此類。
那么這些問(wèn)題原因在哪,可否避免呢?當(dāng)然是可以避免的,如果代碼有新的改動(dòng),提交到版本庫(kù)中的時(shí)候,有一個(gè)人幫我們檢查必要事項(xiàng),然后做做測(cè)試不就好了,這個(gè)當(dāng)然是可以的,前提是老板同意專門(mén)招一個(gè)這樣的人。
引起各種奇怪問(wèn)題的原因有很多,比如開(kāi)發(fā)環(huán)境比較復(fù)雜不干凈,IDE的bug,提交前有一些必要的檢查需要做,但是開(kāi)發(fā)時(shí)因?yàn)楦鞣N原因沒(méi)做,這些機(jī)械重復(fù)的事情我們可以找一個(gè)工具來(lái)幫我們完成,而且這個(gè)工具跑在一個(gè)專門(mén)的服務(wù)器上,該服務(wù)器環(huán)境相對(duì)干凈,可以運(yùn)行一些自動(dòng)化操作,而自動(dòng)編譯,代碼檢查,測(cè)試等環(huán)節(jié),那么這種東西,就是接下來(lái)講的[持續(xù)集成]。
是什么
持續(xù)集成是一種軟件開(kāi)發(fā)實(shí)踐,即團(tuán)隊(duì)開(kāi)發(fā)成員經(jīng)常集成他們的工作,通過(guò)每個(gè)成員每天至少集成一次,也就意味著每天可能會(huì)發(fā)生多次集成,每次的集成都通過(guò)自動(dòng)化的構(gòu)建(包括編譯,發(fā)布,自動(dòng)化測(cè)試)來(lái)驗(yàn)證,從而盡早發(fā)現(xiàn)集成錯(cuò)誤。簡(jiǎn)單來(lái)說(shuō),就是持續(xù)的定時(shí)的在多個(gè)團(tuán)隊(duì)成員的工作中進(jìn)行集成,并且給予反饋。
持續(xù)集成需要開(kāi)發(fā)人員一天多次的將代碼集成到主干,并進(jìn)行自動(dòng)化編譯、測(cè)試等操作,由于這種頻繁集成,以及集成后及時(shí)開(kāi)始的編譯和測(cè)試,可以有效避免我們?cè)谔峤淮a時(shí)沒(méi)有進(jìn)行必要檢查而導(dǎo)致的錯(cuò)誤,以及一些超出預(yù)期效果的更改,從而保證代碼的質(zhì)量。
由于這種及時(shí)性,如果在一次提交后項(xiàng)目集成失敗,可以快速的在這次提交中查找問(wèn)題所在,縮小了找問(wèn)題的范圍,從而減少了一些debug時(shí)間。同時(shí)如果按照這種實(shí)踐,那么我們的主干代碼時(shí)刻都是正確的,這樣我們可以更頻繁的交付。
為什么
一般規(guī)模較小的項(xiàng)目,對(duì)外部系統(tǒng)的依賴和服務(wù)調(diào)用很小,對(duì)于軟件的集成不是問(wèn)題。但是隨著軟件復(fù)雜度的增加,對(duì)集成提出了更多的要求,持續(xù)集成的好處就體現(xiàn)出來(lái)了。
1> 對(duì)重復(fù)的編譯發(fā)布等操作進(jìn)行抽象,減少重復(fù)過(guò)程。 2> 及早發(fā)現(xiàn)各種沖突和錯(cuò)誤,減少風(fēng)險(xiǎn)。 3> 任何時(shí)間、任何地點(diǎn)生成可部署的軟件
怎么做
基本要求:要將這種實(shí)踐付諸實(shí)際,需要一些必要的條件,如下
1> 一個(gè)自動(dòng)構(gòu)建過(guò)程,包括自動(dòng)編譯、分發(fā)、部署和測(cè)試等
2> 一個(gè)代碼存儲(chǔ)庫(kù),即需要版本控制軟件來(lái)保障代碼的可維護(hù)性,同時(shí)作為構(gòu)建過(guò)程的素材庫(kù)。
3> 一個(gè)持續(xù)集成服務(wù)器。
自動(dòng)化構(gòu)建成過(guò)程,可幫助我們節(jié)省大量時(shí)間,完成這個(gè)過(guò)程的自動(dòng)化后,在以后的開(kāi)發(fā)過(guò)程中,我們需要做的,就是只是提交代碼到版本庫(kù)中,構(gòu)建自動(dòng)完成,基本不再需要人工干預(yù)。
代碼倉(cāng)庫(kù)作為構(gòu)建的素材庫(kù),構(gòu)建所需的代碼從代碼庫(kù)中獲得。
最好有一臺(tái)服務(wù)器單獨(dú)作為持續(xù)集成服務(wù)器,一方面保證了環(huán)境的純凈,一方面不影響開(kāi)發(fā),而且持續(xù)集成服務(wù)器一般是隨時(shí)準(zhǔn)備開(kāi)始構(gòu)建的,所以一般也不關(guān)機(jī)。
[首先要有統(tǒng)一的代碼庫(kù),服務(wù)器不斷從版本控制服務(wù)器上檢查代碼狀態(tài),看代碼是否有更新。如果發(fā)現(xiàn)有代碼更新,那么就從版本控制服務(wù)器下載最新的代碼。等代碼完全更新以后,調(diào)用自動(dòng)化編譯腳本,進(jìn)行代碼編譯。然后運(yùn)行所有的自動(dòng)化測(cè)試,并且進(jìn)行代碼分析。如果其中任何一個(gè)步驟失敗,就表示build失敗,持續(xù)集成服務(wù)器會(huì)給予響應(yīng)的反饋。每次代碼提交之后,都會(huì)在持續(xù)集成服務(wù)器上觸發(fā)一個(gè)定時(shí)構(gòu)建,然后進(jìn)行編譯、部署。]
原則
1.開(kāi)發(fā)人員必須及時(shí)向版本控制庫(kù)中提交代碼,也必須經(jīng)常性地從版本控制庫(kù)中更新代碼到本地;
2.需要有專門(mén)的集成服務(wù)器來(lái)執(zhí)行集成構(gòu)建。根據(jù)項(xiàng)目的具體實(shí)際,集成構(gòu)建可以被軟件的修改來(lái)直接觸發(fā),也可以定時(shí)啟動(dòng),如每半個(gè)小時(shí)構(gòu)建一次;
3.必須保證構(gòu)建的成功。如果構(gòu)建失敗,修復(fù)構(gòu)建過(guò)程中的錯(cuò)誤是優(yōu)先級(jí)最高的工作。一旦修復(fù),需要手動(dòng)啟動(dòng)一次構(gòu)建。
4.不更新構(gòu)建失敗的代碼
開(kāi)發(fā)人員及時(shí)的提交代碼進(jìn)行構(gòu)建是符合上述實(shí)踐的,及時(shí)拉取代碼可以防止工作中的分支偏離主干分支太多。定時(shí)觸發(fā)構(gòu)建或者通過(guò)檢測(cè)代碼的修改情況在觸發(fā)構(gòu)建都是可以的,主要是根及時(shí)的構(gòu)建新的代碼。如果構(gòu)建失敗,則必要及時(shí)處理導(dǎo)致失敗的問(wèn)題,修復(fù)后重新構(gòu)建。當(dāng)然構(gòu)建失敗的代碼就不要拉到本地了,會(huì)污染一個(gè)本來(lái)是可以運(yùn)行的工作區(qū)。
持續(xù)集成工具
常見(jiàn)的持續(xù)集成工具如下: jenkins travis gitlab buddybuild
僅列舉了一些典型的,Jenkins 是傳統(tǒng)型的工具,前身是 Hudson,04 年到現(xiàn)在已經(jīng)有十多年的歷史,后幾個(gè)是最近幾年出現(xiàn)的新一批,多少都和容器技術(shù)有點(diǎn)關(guān)系,這里我們主要介紹 Jenkins,因?yàn)檫@個(gè)工具比較常用,各種開(kāi)發(fā)實(shí)踐都可以通過(guò)大量的插件來(lái)組合實(shí)現(xiàn),可定制性好很多。
Jenkins有哪些功能
1.定時(shí)拉取代碼并編譯2.靜態(tài)代碼分析3.定時(shí)打包發(fā)布測(cè)試版4.自定義額外的操作,如跑單元測(cè)試等5.出錯(cuò)提醒
基本上都是持續(xù)集成實(shí)踐中的要求和周邊的一些實(shí)現(xiàn)措施,如提醒功能等,出錯(cuò)后及時(shí)提醒開(kāi)發(fā)者修復(fù),Jenkins 中通過(guò)配置 SMTP 配置信息(這個(gè)一般的郵件服務(wù)提供商都有提供),郵件模板等,創(chuàng)建事件觸發(fā)器,在事件(如編譯失?。┌l(fā)生時(shí),及時(shí)發(fā)送郵件通知開(kāi)發(fā)者,挺方便的。
Jenkins 有很多種觸發(fā)構(gòu)建的方式,如 webhook,定時(shí)更新代碼等,同時(shí)可以在觸發(fā)構(gòu)建后執(zhí)行自定義的構(gòu)建操作,通過(guò)編輯自定義的構(gòu)建腳本,幾乎可以進(jìn)行任何構(gòu)建操作。
* CentOS 7.3* git-2.9.5.tar.gz* Jenkins 2.203.war* apache-tomcat-9.0.12.tar.gz* jdk-8u151-linux-x64.tar.gz* apache-maven-3.5.4-bin.tar.gz
mkdir -p /etc/yum.repos.d/backupmv /etc/yum.repos.d/CentOS-* /etc/yum.repos.d/backupcurl -o /etc/yum.repos.d/163.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo &>/dev/nullcurl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repoyum -y install ntpdatentpdate -b ntp1.aliyun.comsetenforce 0sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/configsystemctl stop firewalldsystemctl disable firewalldsed -i '/^GSSAPIAu/ s/yes/no/' /etc/ssh/sshd_configsed -i '/^#UseDNS/ {s/^#//;s/yes/no/}' /etc/ssh/sshd_config
# Jenkins支持的git最低版本是1.8,使用rpm安裝版本是1.8,這里采用源碼安裝使用2.9版本# git官網(wǎng)下載最新版本GIT:# https://mirrors.edge.kernel.org/pub/software/scm/git/# 安裝git 依賴包yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMakerrpm -e git --nodeps # 卸載掉老版本gittar xvf git-2.9.5.tar.gz -C /usr/local/src/cd /usr/local/src/git-2.9.5/make prefix=/usr/local/git allmake prefix=/usr/local/git install# 修改/etc/bashrc配置文件末尾加入下面一行環(huán)境變量(建議針對(duì)用戶生效,否則使用其他用戶時(shí)候容易出問(wèn)題)tail -1 /etc/bashrcexport PATH=$PATH:$HOME/bin:/usr/local/git/binsource /etc/bashrc# 測(cè)試是否安裝成功git --versiongit version 2.9.5
# jenkins對(duì)jdk版本有要求,不能用jdk9和10,且需要將系統(tǒng)自帶的java環(huán)境清楚掉# jdk下載地址# http://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8-2177648.html# 卸載系統(tǒng)自帶的java環(huán)境[root@jenkins-8 git-2.9.5]# rpm -qa |grep jdk[root@jenkins-8 git-2.9.5]# javabash: java: 未找到命令# 解壓安裝jdktar xvf jdk-8u151-linux-x64.tar.gz -C /usr/local/cd /usr/local/mv jdk1.8.0_151/ jdk# 修改/etc/bashrc配置文件,末尾加入下面一行環(huán)境變量.tail -2 /etc/bashrcJAVA_HOME=/usr/local/jdkexport PATH=$PATH:$JAVA_HOME/binsource /etc/bashrcjava -version # 盡量不要用openjdkjava version "1.8.0_151"Java(TM) SE Runtime Environment (build 1.8.0_151-b12)Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)
# Maven官方下載地址# http://mirror.bit.edu.cn/apache/maven/maven-3/3.5.4/binaries/# 解壓部署tar xvf apache-maven-3.5.4-bin.tar.gz -C /usr/local/mv /usr/local/apache-maven-3.5.4/ /usr/local/maven# 修改/etc/bashrc配置文件,末尾加入下面一行環(huán)境變量tail -3 /etc/bashrcexport M2_HOME=/usr/local/mavenexport M2=$M2_HOME/binexport PATH=$M2:$PATH:$HOME/bin:/usr/local/git/binsource /etc/bashrc # 測(cè)試maven是否安裝成功mvn -versionApache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-18T02:33:14 08:00)Maven home: /usr/local/mavenJava version: 1.8.0_151, vendor: Oracle Corporation, runtime: /usr/local/jdk/jreDefault locale: zh_CN, platform encoding: UTF-8OS name: "linux", version: "3.10.0-514.el7.x86_64", arch: "amd64", family: "unix"
# tomcat官方下載地址: http://tomcat.apache.org/# 解壓部署tar xvf apache-tomcat-9.0.12.tar.gz -C /usr/local/mv /usr/local/apache-tomcat-9.0.12/ /usr/local/tomcattail -1 /etc/profileCATALINA_HOME=/usr/local/tomcatsource /etc/profile# 增加熵池大小,解決Tomcat在CentOS7巨慢的問(wèn)題,具體原因請(qǐng)看Tomcat章節(jié)yum -y install rng-toolssystemctl start rngd && systemctl enable rngd# 測(cè)試tomcat是否安裝成功/usr/local/tomcat/bin/startup.shUsing CATALINA_BASE: /usr/local/tomcatUsing CATALINA_HOME: /usr/local/tomcatUsing CATALINA_TMPDIR: /usr/local/tomcat/tempUsing JRE_HOME: /usr/local/jdkUsing CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jarTomcat started.lsof -i:8080COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEjava 14054 root 49u IPv4 34484 0t0 TCP *:webcache (LISTEN)# cp jenkins.war /usr/local/tomcat/webapps/# 停掉tomcat在啟動(dòng)一遍# 將Jenkins的war放到tomcat的webapps下面,重啟一下tomcat自己就解壓了,但是訪問(wèn)可能有點(diǎn)慢
cat /root/.jenkins/secrets/initialAdminPassword # 這個(gè)密碼以后可能會(huì)用到最后記下來(lái),這個(gè)文件往后初始化就沒(méi)有了2775b0adf72e42a5bdea22297b81dd822> 復(fù)制密碼上面進(jìn)入下一步會(huì)出現(xiàn)一個(gè)頁(yè)面安裝插件圖2,我們不弄太復(fù)雜,就安裝推薦的插件,安裝時(shí)間較長(zhǎng),請(qǐng)準(zhǔn)備良好的網(wǎng)絡(luò)環(huán)境
# 可能因?yàn)榫W(wǎng)絡(luò)波動(dòng),會(huì)安裝失敗,重試幾次,# 如果還不行換服務(wù)器,比如云服務(wù)器?;蛘呤謾C(jī)開(kāi)熱點(diǎn),圖3
至此,就可以開(kāi)始使用Jenkins了
此時(shí),我們能看到反向代理設(shè)置有誤,但此時(shí)我們不配置反向代理,忽略即可
通過(guò)點(diǎn)擊Jenkins里面的構(gòu)建項(xiàng)目能自動(dòng)拉取GitLab代碼
* Jenkins 參照剛初始化環(huán)境即可* GitLab 參考之前的GitLab安裝
***
1.打開(kāi)初始化好的Jenkins,點(diǎn)擊系統(tǒng)管理,進(jìn)入下一個(gè)頁(yè)面
到可選插件裝上GitLab Hook和GitLab兩個(gè)插件,圖2
2.回到初始化好的GitLab,此時(shí)我們沒(méi)有項(xiàng)目的,我們創(chuàng)建一個(gè)項(xiàng)目
此時(shí)我們點(diǎn)擊Create project后會(huì)出現(xiàn)圖4中的報(bào)錯(cuò),我們已經(jīng)有了Jenkins了,不需要GitLab自帶的CI,我們?nèi)グ阉P(guān)掉,默認(rèn)是開(kāi)啟的,圖4
至于第一行報(bào)錯(cuò)說(shuō)將SSH密鑰添加到個(gè)人資料前,你將無(wú)法通過(guò)SSH提取或推送項(xiàng)目代碼,這個(gè)我們待會(huì)把Jenkins密鑰填進(jìn)去就好了.
我們找到Auto DevOps,點(diǎn)擊Expand就會(huì)出現(xiàn)下面的擴(kuò)展菜單,我們把Auto DevOps管道的鉤去掉,然后點(diǎn)擊保存更改即可,因?yàn)槲覀冇辛薺enkins,所以不需要GitLab自帶的CI集成消耗性能.
創(chuàng)建一個(gè)gitlab新用戶Jenkins并添加至項(xiàng)目中具備管理權(quán)限
因?yàn)樵诠芾韱T賬號(hào)里面創(chuàng)建還要郵箱驗(yàn)證改密碼麻煩,我們直接退出管理員賬戶,通過(guò)GitLab首頁(yè)快速創(chuàng)建一個(gè)Jenkins用戶,并退出,切換到root用戶,將剛剛創(chuàng)建的jenkins拉到項(xiàng)目里面,圖4
這里我們可以看到剛剛下拉欄剛剛創(chuàng)建的用戶.
此時(shí)我們可以看到項(xiàng)目中有了Jenkins成員
接下來(lái)我們要將添加Jenkins服務(wù)器的(公鑰)密鑰到GitLab創(chuàng)建項(xiàng)目的Repository,讓Jenkins對(duì)這個(gè)項(xiàng)目具有拉取代碼的權(quán)限
我們到Jenkins生成一下公鑰,并取出來(lái)ssh-keygencat /root/.ssh/id_rsa.pubssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDrv0SM S8FR6NFMQbgYwEbeWOw54aSCthBqTnF4noswiItmPANslrQrzq469bicijLXyPZMASCwtpCupBUoirxNNEl WN8i2RJxQjXgMC2J1HJKXxTtwamr6xUDQyXtI2fZ5nty04dXfZScFB50GqO2KRp/o577fe i5 aMs3egDA1A2HosKcjjAChTj9LAa4V2tR23C9ANFEa1F7b2 SRewByzP163RVpB4XHSjMpe snS7JVwFQWrMwvNTFdwrGbj73mcLbQ5HHZunGJzxgO96sBGQc7Vj Tf18VYIu1iq2nSb5KDes4wPBaY9SuDX6M zDU8/FWiI7n2WjWBQAF root@jenkins**接下來(lái)復(fù)制好公鑰,按圖5走
接下來(lái)我們驗(yàn)證下Jenkins能不能拉取代碼,克隆該項(xiàng)目地址,到Jenkins機(jī)器
服務(wù)器第一次連接新服務(wù)器可能會(huì)出現(xiàn)yes和no,修改下面配置文件StrcHostKeyChecking ask 為下面哪一行,重啟sshd服務(wù)就行了
vim /etc/ssh/ssh_config# StrictHostKeyChecking no # systemctl restart ssdd [root@jenkins ~]# git clone git@192.168.144.139:root/jenkins-test-project.gitCloning into 'jenkins-test-project'...remote: Enumerating objects: 3, done.remote: Counting objects: 100% (3/3), done.remote: Compressing objects: 100% (2/2), done.remote: Total 3 (delta 0), reused 0 (delta 0)Receiving objects: 100% (3/3), done.Checking connectivity... done.[root@jenkins ~]# cat jenkins-test-project/README.md# Jenkins Test Project # 這個(gè)就是我們剛剛創(chuàng)建項(xiàng)目的備注,說(shuō)明Jenkins拉取GitLab代碼免密是成功的.# 接下來(lái)我們修改這個(gè)文件,并提交echo "touch /root/zhou" >> jenkins-test-project/README.mdgit config --global user.name "jenkins"[root@jenkins ~]# git config --global user.email "jenkins@admin.com"[root@jenkins ~]# cd jenkins-test-project/[root@jenkins jenkins-test-project]# git add .[root@jenkins jenkins-test-project]# git commit -m "add createfile.sh"[master a2ce49e] add createfile.sh1 file changed, 2 insertions( ), 1 deletion(-)[root@jenkins jenkins-test-project]# git push -u origin masterCounting objects: 3, done.Delta compression using up to 2 threads.Compressing objects: 100% (2/2), done.Writing objects: 100% (3/3), 288 bytes | 0 bytes/s, done.Total 3 (delta 0), reused 0 (delta 0)To 192.168.144.139:root/jenkins-test-project.git 62e54ed..a2ce49e master -> masterBranch master set up to track remote branch master from origin.# 此處上傳沒(méi)有輸入密碼,說(shuō)明Deploy Key是成功的.
接下來(lái)我們將Jenkins服務(wù)器的私鑰保存到Jenkins的web中,用于讓Jenkins本身可以使用服務(wù)器私鑰進(jìn)行交互.
此處我們看到 Gitlab Hook Plugin插件警告報(bào)錯(cuò)了,讓我們將Gitlab API令牌以純文本形式存儲(chǔ),此時(shí)我們先不管他,后面再弄
我們點(diǎn)擊憑據(jù)配置,
此處我們選擇私鑰,我們?nèi)enkins找到私鑰,復(fù)制到Private Key中[root@jenkins ~]# cat /root/.ssh/id_rsa-----BEGIN RSA PRIVATE KEY-----MIIEpAIBAAKCAQEA679EjPkvBUejRTEG4GMBG3ljsOeGkgrYQak5xeJ6LMIiLZjwDbJa0K86uOvW4nIoy18j2TAEgsLaQrqQVKIq8TTRJfljfItkScUI14DAtidRySl8U7cGpq sVA0Ml7SNn2eZ7ctOHV32UnBQedBqjtikaf6Oe 33voufmjLN3oAwNQNh6LCnI4wAoU4/SwGuFdrUdtwvQDRRGtRe29vkkXsAcsz9et0VaQeFx0ozKXvrJ0uyVcBUFqzMLzUxXcKxm4 95nC20ORx2bpxic8YDverARkHO1Y/k39fFWCLtYqtp0m Sg3rOMDwWmPUrg1 jPsw1PPxVoiO59lo1gUABQIDAQABAoIBAECNEd8sCAUBFaLHhuOAGHiGZ5az/rQUhhyMksYtelixG5yyqOCHOrizkne6FA/TRHpTZcR9km6fnhXxcb3K3clINhCY1fXvURml wLPPXVjFNDpLCLcFdUkeyJUpGMRzEmem5ZyOcRuyxjNqiuAtvzAM1zWl/s1MMYbAyu8x4QpvPoVl8dYv3vq7nu6J6V5ssIRUE1DU6pP/7A2C/7b QiJgBs7h1/2CHg4u1UnxdO5hubGC3488P0UyHV9pwnI27/tRzVho0dIgx0WtLDpjjZzmTlQILbtTaIgtQ2HosLGMux4igyUts2c3rJ HZB9T5PgA2/5KSj6eQDUZcl7rq0CgYEA mlSWcLX4ie6EYwPLI1VU3BZ OJkvto5IPuzbYi2nbWrNQFyV0NN/WeWC9fk1noSvtzoXy 62yJ3/WydctRf/ dSo7 4S2pSWgCXWxIJTHYZbysQKnR2EvgRz5FdGB1hi8Rs8OlnUajcgAKMguz cCCyrxfeXrhHVQipkd5IyxsCgYEA8QIqHzsUvs 0SKmzmvTG9Nz/D YSgmvVwSUU0FRNNVU8E8ndSXQngOmsbdM4LrayE57mQKuWAqz nk884LYYlwQKjnN1WLatG2CmjOTRJiuxzORhic5dbzGdE9PkZ600DM5Xd3BGdQIm4nM/ll0zLSnEgDK2LOL IluB TUV818CgYBnhxmz4JlOd w2ivhPDBOlzoJ0Im1Sdng CbHx7B7L7yrcXD/AkiPxS10 gkCq54dOf5hWmi4foQ2IqdoiemlCLIn/BymTjF6FtU7eKQPNJ9p2GpCxbLrQNt1uOoQJj0Qf 9Kqe2Tq3uxixCsBiifbhbk6KJ0X/goHvvAUTZk81wKBgQDD3Tt4SB6S9 APUYM6goWSiGvtctBGF/cO0eD5chmRJ2T8vAhP4ssb9EwCsS6uoCFW2sNLeWcfY5JF/CWAhdy0Fj yB1ktsMA8SK7yQB9NgyMrXct7IDBE5rA Zezw6Q0s/yCMW72W6BnL3VenDrVBlfkxKoVtM0jPiUi2zBK7xwKBgQDvdxxpenLjUC96z8HoReqr5yNrQZmxt3ZJko7XJNqUaT421 NOSf2H pNFxN6HNlDck5MYJ3jfuiWa8JD2h7vlM8mAmNHk8djK3voXrZeuFpp5JZhqXQH4qDIChcpsBteyhzOm fy5Wh05eWpmb2/fsX5IY49s56a7p50KPeGRLg==-----END RSA PRIVATE KEY-----
此時(shí),我們就獲得了一個(gè)ssh認(rèn)證的私鑰文件,像一把要是去解gitlab上的公鑰
接下來(lái)我們創(chuàng)建一個(gè)新項(xiàng)目,用來(lái)測(cè)試我們做的對(duì)不對(duì)
我們往下拉,點(diǎn)擊git,下面做完記得點(diǎn)保存
此刻我們看到是成功的
接下來(lái)我們?nèi)enkins的工作空間看有沒(méi)有GitLab的項(xiàng)目
[root@jenkins ~]# cd /root/.jenkins/workspace/you-men[root@jenkins you-men]# cat README.md# Jenkins Test ProjectThis is Jenkins Test Projecttouch /root/zhou# 此刻,說(shuō)明我們做的Jenkins自動(dòng)拉取GitLab上代碼是成功的
Jenkins點(diǎn)擊構(gòu)建項(xiàng)目能自動(dòng)去GitLab上拉取代碼并以Jenkins為中控機(jī)連接到測(cè)試環(huán)境并部署相關(guān)項(xiàng)目
往下拉,找到Build(構(gòu)建)里面, 點(diǎn)擊Execule shell(使用shell),這里面可以執(zhí)行一條命令,是由jenkins執(zhí)行,回車作為命令分隔符.
此處的39.108.140.0為中控機(jī),但此處作為一個(gè)webserver使用,讓他本地構(gòu)建一次.當(dāng)我們點(diǎn)擊完save保存,這個(gè)項(xiàng)目就創(chuàng)建好了,我們需要到webserver(中控機(jī))機(jī)器上創(chuàng)建wangle用戶并設(shè)置密碼.
[root@testa ~]# useradd wangle[root@testa ~]# echo "123456" |passwd --stdin wangleChanging password for user wangle.passwd: all authentication tokens updated successfully.[root@testa ~]# ssh-keygen # 生成root用戶的密鑰對(duì),root用戶上傳的是ssh-key是對(duì)整個(gè)倉(cāng)庫(kù)有修改刪除的權(quán)限,# 全權(quán)限.(如已經(jīng)創(chuàng)建并使用,則無(wú)需再次創(chuàng)建)[root@testa ~]# su - wangle # 切換到wangle用戶[wangle@testa ~]$ ssh-keygen # 生成wangle用戶的密鑰對(duì),wangle用戶我們需要讓他添加到deploy key里面,# 讓我們有拉取的權(quán)限,讓開(kāi)發(fā)者有拉取并上傳上去的權(quán)限.
若此處出現(xiàn)403報(bào)錯(cuò),權(quán)限問(wèn)題拒絕,則按f5刷新頁(yè)面重新登錄操作,原因是jenkins登錄超時(shí)了。
此刻我們看到每創(chuàng)建一個(gè)項(xiàng)目這個(gè)管道都是默認(rèn)開(kāi)啟,我們把它關(guān)掉,占用系統(tǒng)資源,而且我們有Jenkins集成,不用他自帶的,進(jìn)入提示的設(shè)置將ta關(guān)掉,或者進(jìn)入項(xiàng)目齒輪(Settings)設(shè)置找到CI/CD里面的Auto DevOps,參照J(rèn)enkins流水線一.
接下來(lái)我們找到項(xiàng)目的Repository,找到里面的Deploy Keys,將剛剛我們webserver機(jī)器上的wangle用戶的公鑰添加到這里.
[wangle@testa ~]$ cat /home/wangle/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDUWa54eoOiEYTZKalbSeH3b3eIxc8Qu6Mbu9Tf/5FGQMdPjygdwycIyn2fRhM4VLO67GZg805dsNY0OVvyBtPwTr fjHtvH/qJPhRRQhkaZchg8lEaHcDE06Q5z/NPFdTzVbwsx/IuMfaqXeO1PmhFf4ovt2iSokjd94AKYgImuVRcKCMOyCPiVnp2AJVUPThZ1tcZO/6tkf4bcsYsATQl8emUvDZM56aK4enTl2dOwDmqyCxPkYfggUrXP7FnARuDYV0IWm1QD5ip1zDogN7NFjESJWySePYG9QZkCu/102oKvKpgHwy5DtMoL/V v1r4PMjYDTM1 rZ73RrED9p5 wangle@testa
接下來(lái)我們新建一個(gè)wangle用戶,給開(kāi)發(fā)用,為了避免郵箱驗(yàn)證改密碼,我們直接注銷再創(chuàng)建一個(gè),并登陸進(jìn)去,然后退出登錄,切換到root用戶登陸.
我們剛剛創(chuàng)建的wangle的GitLab用戶添加到項(xiàng)目里面并給他開(kāi)發(fā)者權(quán)限,配置什么時(shí)候到期.
webserver服務(wù)器切換成root用戶裝git,待會(huì)克隆倉(cāng)庫(kù)用,普通用戶還沒(méi)有管理員權(quán)限,裝好后我們切換回去
[root@testa ~]# yum -y install git[root@testa ~]# su - wangle[wangle@testa ~]$ git clone git@116.196.83.113:root/wordpres.git Cloning into 'wordpres'...remote: Enumerating objects: 3, done.remote: Counting objects: 100% (3/3), done.remote: Total 3 (delta 0), reused 0 (delta 0)Receiving objects: 100% (3/3), done.[wangle@testa ~]$ ls wordpres/ # 至此,說(shuō)明拉取代碼免密是沒(méi)有問(wèn)題的README.md# 接下來(lái)我們模擬上傳一個(gè)網(wǎng)站php代碼[wangle@testa ~]$ git config --global user.name "wangle" # 此時(shí)的用戶名為之前GitLab創(chuàng)建的普通用戶,開(kāi)發(fā)[wangle@testa ~]$ git config --global user.email "wangle@163.com"[wangle@testa ~]$ curl -o wordpress.tar.gz https://wordpress.org/latest.tar.gz # 我們?nèi)ハ螺d一個(gè)wordpress網(wǎng)站源碼[root@testa ~]# wget https://wordpress.org/latest.tar.gz # 速度可能有點(diǎn)慢.# 下載源碼wordpress網(wǎng)站出了點(diǎn)問(wèn)題,報(bào)錯(cuò)429請(qǐng)求過(guò)多[wangle@testa ~]$ ls # 此時(shí)當(dāng)前目錄有兩個(gè)wordpres,一個(gè)是源碼,一個(gè)是git倉(cāng)庫(kù),還有一個(gè)是project,是為了把wordpress-4.8.tar.gz源碼包解壓出來(lái)的源碼放到project做一個(gè)中轉(zhuǎn),不要弄混淆了project wordpres wordpress-4.8.tar.gz[wangle@testa ~]$ tar xvf wordpress-4.8.tar.gz -C project/[wangle@testa ~]$ ls project/wordpress[wangle@testa ~]$ cp -rf project/wordpress/* wordpres/ # 將project目錄下wordpress下的源碼放到git倉(cāng)庫(kù)里面再提交.[wangle@testa ~]$ cd wordpres[wangle@testa wordpres]$ lsindex.php wp-admin wp-cron.php wp-mail.phplicense.txt wp-blog-header.php wp-includes wp-settings.phpreadme.html wp-comments-post.php wp-links-opml.php wp-signup.phpREADME.md wp-config-sample.php wp-load.php wp-trackback.phpwp-activate.php wp-content wp-login.php xmlrpc.php# 因?yàn)槲覀兪孪戎琅渲茫覀兿劝褦?shù)據(jù)庫(kù)什么先修改好[wangle@testa wordpres]$ vim wp-config-sample.phpdefine('DB_NAME', 'wordpres');/** MySQL database username */define('DB_USER', 'nginx');/** MySQL database password */define('DB_PASSWORD', 'flying');/** MySQL hostname */define('DB_HOST', 'localhost');# 在此之前需要為一臺(tái)機(jī)器準(zhǔn)備一個(gè)LNMP環(huán)境
[root@testa ~]# cat lnmp.sh#!/usr/bin/env bashsystemctl stop firewalldecho "firewalld stop"echo "shut SELinux"sed -r '/^SELINUX/c\SELINUX=disabled' /etc/selinux/configsetenforce 0if [ ! -d /etc/yum.repos.d/backup ];then mkdir /etc/yum.repos.d/backup -pfiif ! ping -c2 www.baidu.com &>/dev/nullthen echo "You can't get on the net" exitfiecho "Download 163 source ..."echo "Download nginx Source package ..."yum -y install wgetwget -O /etc/yum.repos.d/163.repo http://mirrors.163.com/.help/CentOS7-Base-163.repoyum repolistif [ ! -f /etc/yum.repos.d/nginx.repo ];thencat > /etc/yum.repos.d/nginx.repo <<EOF[nginx-stable]name=nginx stable repobaseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/gpgcheck=1enabled=1gpgkey=https://nginx.org/keys/nginx_signing.keyEOFfirpm -qa |grep nginx &> /dev/nullif [ ! $? -eq 0 ] ;then echo "dafew" yum -y install nginxfised -ri '/ *# *proxy *the *PHP/,/ *# *proxy_pass/ d' /etc/nginx/conf.d/default.confsed -ri '/ *#location/,/ *#\}/ s/( *)#/\1/' /etc/nginx/conf.d/default.confsed -ri s/" "*root" "*html\;/\\troot"\t"\\/usr\\/share\\/nginx\\/html\;/ /etc/nginx/conf.d/default.confsed -ri s/" "*index" "*index.html" "*index.htm\;/"\t\t"index" "index.php" "index.html" "index.htm\;/ /etc/nginx/conf.d/default.confsed -ri '/SCRIPT_FILENAME/c\\t\t fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name\;' /etc/nginx/conf.d/default.confsed -i '/ *location *~ * \/\\\.ht/,/ *}/ d' default.confsystemctl start nginx################## 安裝PHP / *######################## ** //yum -y install php php-fpm php-mysql php-gd gdecho "switch to the PHP terminal..."systemctl start php-fpm###################### 安裝Mysql #####################yum -y install mariadb-serversystemctl start mariadbsystemctl enable mariadbmysqladmin password '123456'mysql -uroot -p123456 -e "grant all on *.* to nginx@'%' identified by 'flying';"cd /usr/share/nginx/htmlcat >index.php <<EOF<?php phpinfo();?>EOF
# 接下來(lái)上傳代碼:[wangle@testa wordpres]$ git add .[wangle@testa wordpres]$ git commit -m "add wordpress project."[wangle@testa wordpres]$ git push -u origin master# 看到下圖有那么多代碼文件說(shuō)明上傳成功.
此刻,wangle用戶對(duì)webserver拉取和上傳代碼都是免密,但是webserver的root用戶還沒(méi)有對(duì)GitLab免密.我們將root用戶的公鑰放到GitLab上剛剛給開(kāi)發(fā)創(chuàng)建的wangle用戶,這樣只要是開(kāi)發(fā)項(xiàng)目,開(kāi)發(fā)對(duì)這個(gè)項(xiàng)目就是完全免密.
[root@testa html]# cat /root/.ssh/id_rsa.pubssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDLvKKqqAnCAcwwuwGjAuSfq4y/0Q ZNTPm0vx7w9LqjrBnO801T3m9MBORftDQod3Q7GutC2Gin0fsVM/3QaHtv FXMoMhJnRSFJJ5bEITEktrXGJAaTYByERTurLuagdDnTj7V5PDr2nrFL023NF0HutR7ckGPF Ong2PAF3exUbUTnYIPPXoPXqZ7FkVhTi lK1cysoJZ0rQXeGIWKgAadTM6WOfBg4 Apt0PeDNog3esNdJqw IKXvmj8 Z0vPiE7nAQwZo4yxYtllpd9VsbmzNoAlaBXkkUAMHHSoJN3crfJEMAyMdx37QaeOH35IyeSfhOPeRW3 SEs2VShf3 root@testa我們登陸到GitLab的wangle用戶
~接下來(lái)將wangle用戶提升為管理員權(quán)限,因?yàn)榭紤]到生產(chǎn)環(huán)境不能用root進(jìn)行操作,因此我們對(duì)于普通用戶的文件傳輸,需要添加到wheel組中
[root@testa html]# usermod -aG wheel wangle[root@testa html]# id wangleuid=1001(wangle) gid=1001(wangle) groups=1001(wangle),10(wheel)[root@testa html]# vim /etc/sudoers.d/wangle# 加入下面其中一行文件.wangle ALL=(ALL) NOPASSWD: /usr/sbin/sshwangle ALL=(ALL) NOPASSWD: ALL # 目前盡量使用ALL,如果使用上面哪一行還要考慮腳本內(nèi)容中的命令sudo提權(quán),比如將wangle用戶git clone下的代碼復(fù)制到nginx根目錄下,如果不給cp 提權(quán)就沒(méi)法cp過(guò)去.# 接下來(lái)我們?cè)囋囀欠窨梢云胀ㄓ脩籼釞?quán)免密[root@testa html]# su - wangle[wangle@testa ~]$ ssh root@39.108.140.0root@39.108.140.0's password:# 至此說(shuō)明sudo提權(quán)是沒(méi)有問(wèn)題的.接下來(lái)我們?nèi)?xiě)一個(gè)腳本,[wangle@testa ~]$ cat Deploy.sh#!/usr/bin/env bash# Author: ZhouJian# Mail: 18621048481@163.com## 拉取遠(yuǎn)程的倉(cāng)庫(kù),GitLab的ssh的倉(cāng)庫(kù)地址git clone git@116.196.83.113:root/wordpres.gitcd wordpres# 由于我們多次部署,為了保證每次是最新的狀態(tài),進(jìn)入到項(xiàng)目中,獲取他的增量git pull # grant to wangle user permission.sudo setfacl -m u:wangle:rwx /usr/share/nginx/htmlsudo \cp -rf /home/wangle/wordpres/* /usr/share/nginx/html/# 注意此處的wordpress,因?yàn)橹皠?chuàng)建項(xiàng)目少了個(gè)s,所以后面都要少了個(gè)s,總之要確定項(xiàng)目名一致.# 因?yàn)槭瞧胀ㄓ脩簦瑘?zhí)行任何管理員相關(guān)命令,必須加上sudo ,否則到時(shí)構(gòu)建項(xiàng)目容易報(bào)錯(cuò)權(quán)限拒絕.# 因?yàn)楫?dāng)前這臺(tái)機(jī)器可以當(dāng)成一個(gè)中控端,只需要有一個(gè)腳本就行了,我們給腳本一個(gè)權(quán)限,然后把項(xiàng)目代碼都刪掉,以達(dá)到項(xiàng)目效果.[wangle@testa ~]$ chmod a x Deploy.sh[wangle@testa ~]$ rm -rf wordpres*# 接下來(lái)將Jenkins的root用戶密鑰認(rèn)證到webserver的wangle用戶,ssh-copy[root@jenkins ~]# ssh-copy-id wangle@39.108.140.0[root@jenkins ~]# ssh wangle@39.108.140.0Last login: Sat Nov 9 12:41:11 2019 from 47.92.24.137Welcome to Alibaba Cloud Elastic Compute Service ![wangle@testa ~]$ # 測(cè)試成功,接下來(lái)測(cè)試下webserver能否解析php代碼[wangle@testa ~]$ sudo cat /usr/share/nginx/html/index.php<?php phpinfo(); ?> [wangle@testa ~]$ elinks --dump 39.108.140.0/index.php# 如果出來(lái)很多信息關(guān)于PHP版本相關(guān)信息,說(shuō)明可以執(zhí)行php文件[wangle@testa ~]$ cat /usr/share/nginx/html/index.php<?php$link=mysql_connect('39.108.140.0','nginx','flying');if ($link) echo "Successfully";else echo "Failed";mysql_close();?># 至此,說(shuō)明執(zhí)行php文件和數(shù)據(jù)庫(kù)訪問(wèn)都是沒(méi)有問(wèn)題的[wangle@testa ~]$ elinks --dump 39.108.140.0/index.php Successfully# 接下來(lái)我們直接去Jenkins里面構(gòu)建項(xiàng)目,然后去觀看控制臺(tái)輸出,根據(jù)提示解決報(bào)錯(cuò),當(dāng)然最好一次成功.# 接下來(lái)訪問(wèn)webserver的網(wǎng)址,看能不能直接訪問(wèn)到網(wǎng)站
至此說(shuō)明我們的Jenkins的一鍵部署是沒(méi)有問(wèn)題的
開(kāi)發(fā)push代碼,自動(dòng)把代碼發(fā)布到LNMP環(huán)境中,GitLab直接出發(fā)Jenkins構(gòu)建
# Build Authorization Token Root# 在Jenkins產(chǎn)生一個(gè)令牌,這個(gè)令牌可以發(fā)放到GitLab服務(wù)器上,# 當(dāng)開(kāi)發(fā)人員上傳代碼,GitLab會(huì)告訴Jenkins,# 我項(xiàng)目改變了,你趕緊過(guò)來(lái)拉,產(chǎn)生了一個(gè)通信(隧道通信)
安裝Build Authorzation Token Root插件
[root@jenkins ~]# openssl rand -hex 12 # 生成一個(gè)令牌2357086b89dc205d2333712d[root@jenkins ~]# echo "2357086b89dc205d2333712d" > token.txt# 我們將該令牌保存好,免得終端斷了或者其他網(wǎng)絡(luò)原因令牌弄丟了[root@jenkins ~]# cat token.txt2357086b89dc205d2333712d# 接下來(lái)我們?nèi)ヅ渲弥暗膚ordpres項(xiàng)目,構(gòu)建觸發(fā)器,
接下來(lái)配置GitLab webhook<點(diǎn)擊Test顯示200,201則表示成功>
進(jìn)入GitLab調(diào)整一下網(wǎng)絡(luò)認(rèn)證身份,因?yàn)镚itLab經(jīng)過(guò)9版本后,對(duì)于GitLab和Jenkins的配合必須使用https配合,如果不是需要調(diào)整一下本地之間允許http認(rèn)證
# 接下來(lái)我們進(jìn)入wordpres項(xiàng)目,找到Settings,二級(jí)菜單找里面的Integrations(集成)# 此處Token有兩種方法,# 方法一(手動(dòng))# 里面的URL是填寫(xiě)Jenkins的URL地址,此處URL以Jenkins的回調(diào)地址為準(zhǔn),不管Test403,404都能到Jnekins看到,見(jiàn)圖3# http://<IP||域名>:8080/jenkins/project/wordpress/buildByToken/build?job=項(xiàng)目名稱&token=身份令牌token值http://47.92.24.137:8080/jenkins/project/wordpress/buildByToken/build?job=wordpress&token=2357086b89dc205d2333712d
此時(shí),多數(shù)會(huì)報(bào)403錯(cuò)誤,說(shuō)明匿名滅有對(duì)項(xiàng)目的權(quán)限,我們到全局安全配置里面給匿名用戶權(quán)限即可.
至此,整個(gè)Jenkins差不多完事了,還有一種Token方法,見(jiàn)方法二
# 如果開(kāi)發(fā)用戶,push代碼報(bào)錯(cuò),沒(méi)有權(quán)限的話,去圖下面去開(kāi)啟一下
# 接下來(lái)我們準(zhǔn)備一臺(tái)Development機(jī)器,模擬開(kāi)發(fā)上傳代碼,看jenkins能不能自動(dòng)構(gòu)建到生產(chǎn)環(huán)境[root@develoment ~]# mkdir project[root@develoment ~]# cd project[root@develoment project]# yum -y install git &>/dev/null &[1] 11437# 我們用此機(jī)器模擬程序員的電腦向GitLab提交代碼,接下來(lái)我們把此機(jī)器的公鑰上傳到GitLab[root@develoment project]# ssh-keygen[root@develoment project]# cat /root/.ssh/id_rsa.pubssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC2/r4mcwmNI0LC0ga3QiT9Ykz4MGAHcsNIBg1x8oRRv1YMgO36HHkAUunUIiL6JpkVm74Fhb0zL 23Y31fRNugomYZnwjHnEtMvv/4a/bpemdmDqAVWfG2tcJz2m8wSpL9ro0gGu8RdyLJg8dPyxv4KfOYo92KAdV9vzpJ2mxmONpv8H0QbYAc/KXK1XrlyXVTYb6CR1GYTmJEPCqTxSoGO9Cg WtVjy1bGf5ttWAgSDMGowYTjI8TEG5plUqU6X2AsoNRdQ2cvLcccAE/pE4Afh0BPWm/tiPr9mf6unpAv3Empvfp7G2hvqoZ5wg4VZzDIpzhqzpZO0MfFNRZfmgz root@develoment# 復(fù)制好此公鑰,然后到GitLab創(chuàng)建一個(gè)用戶Develoment1,然后退出來(lái)切換到管理員將剛剛創(chuàng)建的用戶Develoment1加入到項(xiàng)目.
接下來(lái)我們切換到Develoment1開(kāi)發(fā),讓我們以開(kāi)發(fā)身份登錄到GitLab,然后把開(kāi)發(fā)機(jī)器的公鑰上傳到開(kāi)發(fā)者的GitLab的Settings
# 接下來(lái)我們?cè)囋嘍eveloment開(kāi)發(fā)這臺(tái)機(jī)器能不能拉取GitLab倉(cāng)庫(kù)項(xiàng)目代碼.[root@develoment project]# git clone git@116.196.83.113:root/wordpres.git[root@develoment project]# ls wordpres/index.php wp-admin wp-cron.php wp-mail.phplicense.txt wp-blog-header.php wp-includes wp-settings.phpreadme.html wp-comments-post.php wp-links-opml.php wp-signup.phpREADME.md wp-config-sample.php wp-load.php wp-trackback.phpwp-activate.php wp-content wp-login.php xmlrpc.php# 至此說(shuō)明拉取代碼是成功的# 接下來(lái)我們修改一下代碼,然后上傳看jenkins能不能自動(dòng)構(gòu)建項(xiàng)目[root@develoment project]# echo you-men >> wordpres/README.md[root@develoment wordpres]# git config --global user.email "Develoment1@163.com"[root@develoment wordpres]# git config --global user.name "Develoment1"[root@develoment project]# cd wordpres/[root@develoment wordpres]# git add .[root@develoment wordpres]# git commit -m "modiy README.md file"[root@develoment wordpres]# git push -u origin masterCounting objects: 5, done.Compressing objects: 100% (2/2), done.Writing objects: 100% (3/3), 316 bytes | 0 bytes/s, done.Total 3 (delta 1), reused 0 (delta 0)To git@116.196.83.113:root/wordpres.git 8cec4a5..a99149f master -> masterBranch master set up to track remote branch master from origin.# 將代碼上傳上去,然后去管理員賬號(hào)的GitLab和Jenkins構(gòu)建有不有變化
# 至此說(shuō)明GitLab代碼的確能上傳到管理員的項(xiàng)目倉(cāng)庫(kù),并且Jenkins構(gòu)建也是成功的,然后我們登陸到lnmp的test生產(chǎn)環(huán)境看代碼有不有變化,[root@testa ~]# cat /usr/share/nginx/html/README.md# wordpresDeploy a PHP websiteyou-men# 至此說(shuō)明現(xiàn)在只要開(kāi)發(fā)那天機(jī)器上傳代碼,Lnmp環(huán)境都能實(shí)時(shí)部署更新# 接下來(lái)我們真實(shí)修改一下wordpress并實(shí)時(shí)查看網(wǎng)頁(yè)變化.
比如說(shuō)我覺(jué)得這個(gè)username不好聽(tīng),我們?nèi)コ绦騿T電腦修改項(xiàng)目代碼上傳看能不能實(shí)時(shí)更新.
進(jìn)入vim里面/查找username修改為ZHOUjian,然后Push上傳,看看測(cè)試環(huán)境的lnmp的Nginx網(wǎng)站根目錄能不能實(shí)時(shí)更新.
[root@develoment wordpres]# git add . [root@develoment wordpres]# git commit -m "modiy install.php" [master 05e3f02] modiy install.php 1 file changed, 1 insertion( ), 1 deletion(-) [root@develoment wordpres]# git push -u origin master
[root@testa ~]# cat /usr/share/nginx/html/wp-admin/install.php |grep ZHOUjian <th scope="row"><label for="user_login"><?php _e('ZHOUjian'); ?></label></th>
生產(chǎn)環(huán)境也實(shí)時(shí)能更新開(kāi)發(fā)上傳的代碼,可以修改網(wǎng)站的一些表現(xiàn),能在瀏覽器查看實(shí)時(shí)更新,效果更明顯
jenkins服務(wù)器 http://172.16.1.207:8080/jenkins/ Jenkins ver. 2.203 git version 1.8.3.1gitlab 服務(wù)器 http://172.16.1.227:81/ gitlab 10.0jar包測(cè)試服務(wù)器 172.16.1.206# 原理講解:在jenkins里面創(chuàng)建一個(gè)項(xiàng)目,在Gitlab Hook插件的幫助下,# 開(kāi)發(fā)人員把代碼推送到git某個(gè)分支里面,比如是master分支,# jenkins首先可以把gitlab這個(gè)項(xiàng)目分支的代碼拉回到自己的工作區(qū),# 之后我們創(chuàng)建構(gòu)建操作,把拉回來(lái)的代碼利用maven打包成一個(gè)jar包,# 之后執(zhí)行我們寫(xiě)好的腳本,jenkins就會(huì)把jar包推送到測(cè)試環(huán)境里面,# 并且執(zhí)行測(cè)試環(huán)境里面的shell腳本進(jìn)行服務(wù)啟動(dòng)。(shell腳本需要我們根據(jù)測(cè)試環(huán)境自行定義)
Maven Integration plugin :此插件可以讓我們創(chuàng)建maven項(xiàng)目,也可以進(jìn)行Maven打包。Gitlab Hook:允許使用Gitlab web掛鉤觸發(fā)Gitlab項(xiàng)目上的SMC輪詢(jenkins就可以檢測(cè)到開(kāi)發(fā)提交新代碼,并且第一時(shí)間拉回來(lái))GitLab :這個(gè)插件允許GitLab觸發(fā)Jenkins構(gòu)建并在GitLab UI中顯示其結(jié)果
憑據(jù)配置
在Jenkins里面配置一個(gè)自己的密鑰,之后在終端把公鑰推送到gitlab,這樣連接gitlab就不需要密碼了
此時(shí)來(lái)到gitlab的那個(gè)項(xiàng)目里面
在Jenkins機(jī)器上面執(zhí)行下條命令,并且復(fù)制公鑰
[root@java01-uat-slave ~]# cat /root/.ssh/id_rsa.pubssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC3nJqkm jcv5ue0HCgzhDBolhsAH05m5xeTTSOmq3gzLSmAw0LFuPdRiEQRcjqrMAnwqr0W/eE/SUBwEvXPuTDwbW n2Q8Obl gklYW8nqcQeLHCma Kg/F9w7ASG1f12W3L5cgnLFs27p4WA3pTh0PZpS4QA4yKGsbuFVjkwOfaCcSVIasJPXcVHQAHs6co0jWYedRRpf3/acM3Il hsUTtQe34jRGTSV3Oi4yrkpad9GfWV e5KzIcGGYoMtXBgHzzYw2iVVDyNvI6BSgouaD3Q8ZVFhTuRrjn4Ptx0BF DshkAuKnaG sfyXRNmE2/OgyRTCtc6GoSNTthEQTnx root@java01-uat-slave
點(diǎn)擊add添加就好了,這時(shí)我們回到Jenkins里面配置git的內(nèi)容
到這里我們就可以測(cè)試一下是否jenkins可以拉取gitlab上面的代碼了。我們進(jìn)入保存上面的配置信息。來(lái)到項(xiàng)目里面
這個(gè)時(shí)候我們來(lái)到j(luò)enkins服務(wù)器上面看看這個(gè)代碼是否拿回來(lái)了。
[root@java01-uat-slave ~]# ls .jenkins/workspace/jar-test
可以看到j(luò)enkins在自己的工作路徑下創(chuàng)建了一個(gè)以項(xiàng)目為名字的文件夾,我們點(diǎn)進(jìn)去看看吧。
jar包集成完畢了,我們就可以進(jìn)行觸發(fā)項(xiàng)了,也就是說(shuō)開(kāi)發(fā)提交代碼到git上面,觸發(fā)項(xiàng)配置后就可以自動(dòng)生成jar包了接下來(lái)就可以在jenkins里面把包推到測(cè)試環(huán)境,利用測(cè)試環(huán)境自己寫(xiě)的腳本,來(lái)實(shí)現(xiàn)持續(xù)部署
再來(lái)到j(luò)enkins
這個(gè)時(shí)候再來(lái)到gitlab上面。
再回到Jenkins
Root POM填寫(xiě) 這個(gè)項(xiàng)目的pom.xml文件路徑
[root@java01-uat-slave jar-test]# pwd/root/.jenkins/workspace/jar-test[root@java01-uat-slave jar-test]# lsmvnw mvnw.cmd pom.xml src target tzy.mdGoals and options 這個(gè)填寫(xiě)上面的內(nèi)容即可。(clean package -Puat -Dmaven.test.skip=true)
接下來(lái)選擇執(zhí)行shell
這是我的腳本內(nèi)容僅供參考一下
scp -o "StrictHostKeyChecking no" /root/.jenkins/workspace/${JOB_NAME}/target/appmanage-0.0.1-SNAPSHOT.jar root@172.16.1.206:/home/wangxuetong/ssh -o "StrictHostKeyChecking no" root@172.16.1.206 sh /opt/bash/wangxuetongapp.sh
這個(gè)是我測(cè)試環(huán)境里面的腳本
[root@java01-uat-slave bash]# lswangxuetongapp.sh[root@java01-uat-slave bash]# cat wangxuetongapp.sh#!/bin/bash##############################################################此腳本用于jenkins自動(dòng)化集成網(wǎng)學(xué)通appjar包 ##############################################################source /etc/profilelujing=/opt/wangxuetong/jar=appmanage-0.0.1-SNAPSHOT.jarrm -fr /home/wangxuetong/nohup.outif [ "`ls /home/wangxuetong`" = "$jar" ];then echo "/home/wangxuetong/下面有jar包,集成開(kāi)始。" ps -ef|grep jav[a]|grep app |awk '{print $2}'|xargs kill -9 #用9的原因是如果-15殺不掉,后面啟動(dòng)就會(huì)沖突。 rm -f /opt/wangxuetong/$jar mv /home/wangxuetong/$jar /opt/wangxuetong/ nohup java -jar /opt/wangxuetong/$jar /opt/wangxuetong/nohup.out & a=`ps -ef|grep jav[a]|grep app |awk '{print $2}'` [[ "$a" =~ ^[0-9] $ ]] if [ $? -eq 0 ];then echo "啟動(dòng)jar包成功" else nohup java -jar /opt/wangxuetong/$jar /opt/wangxuetong/nohup.out & ps -ef|grep jav[a]|grep app |awk '{print $2}' echo "有PID輸出則啟動(dòng)成功" fielse echo "沒(méi)有jar包,集成失??!退出。" exitfi
ok,到這里基本就算完成了,但是jenkins自動(dòng)構(gòu)建的話,我們不可能實(shí)時(shí)查看,所以我們需要設(shè)置一下構(gòu)建后操作。我這里選擇的郵件方式通知,網(wǎng)上文檔很多,其他通知方式可以進(jìn)行自定義。
我們首先要保證有 Email Extension Plugin插件
jenkins自帶的郵件通知只允許構(gòu)建失敗的時(shí)候通知,而且內(nèi)容很少。不夠友好,但是這個(gè)插件非常友好,它甚至可以把構(gòu)建內(nèi)容以文稿的方式發(fā)送給你,ok,我們來(lái)配置。
Email Extension Plugin插件配置郵件通知
同樣在點(diǎn)擊左邊的“系統(tǒng)管理”菜單,選擇右邊的“系統(tǒng)設(shè)置”,找到Extend E-mail Notification進(jìn)行全局配置。
同樣填好SMTP Server的信息,點(diǎn)擊"高級(jí)" 進(jìn)行SMTP鑒權(quán)的配置,配置郵件人的用戶名,密碼等信息
默認(rèn)收件人填需要發(fā)送郵件通知的人,如有多個(gè)用空格分隔,還可以抄送,反正功能很強(qiáng)大,在配置的后面的?點(diǎn)擊有詳細(xì)的指示。
點(diǎn)擊最右下角的"Default Triggers ..."按鈕設(shè)置默認(rèn)的觸發(fā)郵件通知的事件。
保存全局的配置信息后到項(xiàng)目中進(jìn)行項(xiàng)目的配置。
可以再" Advanced Settings"中針對(duì)該項(xiàng)目進(jìn)行個(gè)性化的配置
設(shè)置完點(diǎn)擊保存,就可以去驗(yàn)證是否可以郵件通知了
通過(guò)測(cè)試工程構(gòu)建后,Jenkins的郵件通信接收人可以正常收到構(gòu)建信息的郵件通知
這里使用的是國(guó)產(chǎn)軟件foxmailr軟件,不用登錄網(wǎng)頁(yè)版,到這里,整個(gè)項(xiàng)目就構(gòu)建完成了
這這里是使用的國(guó)產(chǎn)軟件foxmail軟件 ,不用登陸網(wǎng)頁(yè)版,到這里,整個(gè)項(xiàng)目就構(gòu)建完成了。
來(lái)源:https://www.icode9.com/content-1-710751.html最后看一下效果,jenkins寫(xiě)著是哪個(gè)人推的代碼,什么時(shí)候集成開(kāi)始的,jenkins真香。
聯(lián)系客服