學習Jenkins(二)

持續集成①安裝部署jenkins從git獲取代碼php

一:持續集成的概念:html

1.1:整體的歸納前端

持續集成Continuous Integration
持續交付Continuous Delivery
持續部署Continuous Deployment

 

1.2:什麼是持續集成:
持續集成是指開發者在代碼的開發過程當中,能夠頻繁的將代碼部署集成到主幹,並進程自動化測試java

1.3:什麼是持續交付:
持續交付指的是在持續集成的環境基礎之上,將代碼部署到預生產環境node

1.4:持續部署:
在持續交付的基礎上,把部署到生產環境的過程自動化,持續部署和持續交付的區別就是最終部署到生產環境是自動化的。python

1.5:關於安全:OWASP:每一年發佈top 10web漏洞:
top1:注入攻擊漏洞,例如SQL,OS 以及 LDAP注入。這些攻擊發生在當不可信的數據做爲命令或者查詢語句的一部分,被髮送給解釋器的時候。攻擊者發送的惡意數據能夠欺騙解釋器,以執行計劃外的命令或者在未被恰當受權時訪問數據。mysql

top2:失效的身份認證和會話管理:與身份認證和會話管理相關的應用程序功能每每得不到正確的實現,這就致使了攻擊者破壞密碼、密匙、會話令牌或攻擊其餘的漏洞去冒充其餘用戶的身份。linux

top3:跨站腳本(XSS):當應用程序收到含有不可信的數據,在沒有進行適當的驗證和轉義的狀況下,就將它發送給一個網頁瀏覽器,這就會產生跨站腳本攻擊(簡稱XSS)。XSS容許攻擊者在受害者的瀏覽器上執行腳本,從而劫持用戶會話、危害網站、或者將用戶轉向至惡意網站。
相關資料:http://www.owasp.org.cn/owasp-project/download/mobile-top-10-2013-2nginx

二:安裝部署持續集成工具jenkins:
2.1:安裝部分:
2.1.1:執行安裝:
下載jdk-8u111-linux-x64.rpmgit

# rpm -ivh jdk-8u111-linux-x64.rpm

# vim /etc/profile

export JAVA_HOME=/usr/java/jdk1.8.0_111 
export PATH=$JAVA_HOME/bin:$PATH

安裝jenkins
方法①yum方式安裝

# cd /etc/yum.repos.d/
# wget http://pkg.jenkins.io/redhat/jenkins.repo
# rpm --import http://pkg.jenkins.io/redhat/jenkins.io.key
# yum install -y jenkins
# systemctl start jenkins

方法②經過war包的方式安裝下載地址:http://updates.jenkins-ci.org/download/war/2.60.1/jenkins.war

複製代碼
unzip apache-tomcat-8.0.37.zip
mv apache-tomcat-8.0.37 /usr/local/
cd /usr/local
ln -s /usr/local/apache-tomcat-8.0.37 /usr/local/tomcat
useradd jenkins
# 將jenkins.war放到/usr/local/tomcat/webapps目錄下,解壓
unzip -d jenkins jenkins.war
chown -R jenkins.jenkins /usr/local/apache-tomcat-8.0.37
bin/startup.sh
複製代碼

 

2.1.2:打開web界面:第一次打開要輸入隨機生成的密碼:
http://192.168.3.199:8080/jenkins

查看密碼

$ cat /home/jenkins/.jenkins/secrets/initialAdminPassword
8743f91ff1474a85a0abcd841fc74eb6

 

輸入密碼點下確認以後選擇插件,選擇默認安裝插件便可,此過程須要一段時間,並且根據網絡不一樣有些插件安裝不成功,可是以後能夠本身再安裝便可

報錯:
An error occurred
An error occurred during installation: No such plugin: cloudbees-folder

解決辦法:
下載cloudbees-folder.hpi放在目錄/usr/local/tomcat/webapps/jenkins/WEB-INF/detached-plugins/下,重啓tomcat便可

設置用戶名密碼

3.1配置郵件通知,系統管理–系統設置

添加管理員郵箱,添加郵件

點擊保存或測試郵件,系統會給目標郵箱發送一封測試郵件:

安裝gitlab插件,系統管理–管理插件–可選插件

插件安裝界面,會額外安裝一些依賴關係的插件,jenkins基於ruby開發,因此會有ruby環境:

在gitlab管理界面將用戶添加到一個項目,下一步要用此用戶拉取項目代碼

三:使用jenkins:
3.1:添加一個認證用戶,拉取git代碼的時候使用:

建立任務 --> 構建一個自由風格的軟件項目

項目描述信息:

配置git項目地址,咱們先進行其餘配置,等會再繼續配置git相關的選項

系統管理 --> Global Tool Configuration

 

配置deploy-key
以下配置,jenkins服務器上root用戶生成密鑰對

複製代碼
[root@node1 ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
bf:1e:4d:b3:0f:fb:8b:71:cd:ef:d3:70:69:a4:46:ff root@node1.chinasoft.com
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| |
| . . |
| S + + .|
| . o =.*.|
| o * oo=|
| o B .E|
| .o o.+o+|
+-----------------+
[root@node1 ~]# cat .ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC3vhfbA4NdkP8g1WVyYkw93f1PZ04nWoyFnoerC9b40jIY5px+tkugdy/RZ3/bp4hMC5yNgV1S25Tm8RpzBJMp7pbJz8dO+LCKqUnXq9Eh0QhsZE0xlQN+J4awy9YIGiD2nFg7k/ZzeAtQRzNryrrPnKaWpXtg7tMGGTWBjeyLAVuqCOMU7euY94G26UmVfjDLIJkcJqB+8dwvodW3wpmUER32qVPKZLnSYSOCfoNed+P4Eujs5PBCLuzFvGyiDhY2Pwrk/4S11jWUa7TJItfoPXzeGc/ujaJi/o24dt8VXeFa/Rm4wywYLNW3TRjXy1mPpdVlob3701MMQ0bf3qPv root@node1.chinasoft.com
複製代碼

 

gitlab上配置web-demo項目設置private deploy key

把key複製進去,同時title起一個簡單明瞭的名字

在jenkins服務器192.168.3.199上測試下是否可以正常獲取代碼

複製代碼
[root@node1 tmp]# git clone git@192.168.3.198:web/web-demo.git
Cloning into 'web-demo'...
The authenticity of host '192.168.3.198 (192.168.3.198)' can't be established.
ECDSA key fingerprint is 9d:60:c3:8e:49:72:e8:9c:c0:d6:c8:d2:f1:b6:3a:74.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.3.198' (ECDSA) to the list of known hosts.
remote: Counting objects: 79, done.
remote: Compressing objects: 100% (79/79), done.
remote: Total 79 (delta 17), reused 0 (delta 0)
Receiving objects: 100% (79/79), 1.18 MiB | 0 bytes/s, done.
Resolving deltas: 100% (17/17), done.
複製代碼

 

jenkins拉取代碼沒問題,繼續配置jenkins的認證,這裏應該輸入私鑰

複製jenkins拉取git代碼服務器root的私鑰

複製代碼
[root@node1 ~]# cat .ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAt74X2wODXZD/INVlcmJMPd39T2dOJ1qMhZ6HqwvW+NIyGOac
frZLoHcv0Wd/26eITAucjYFdUtuU5vEacwSTKe6Wyc/HTviwiqlJ16vRIdEIbGRN
MZUDfieGsMvWCBog9pxYO5P2c3gLUEcza8q6z5ymlqV7YO7TBhk1gY3siwFbqgjj
FO3rmPeBtulJlX4wyyCZHCagfvHcL6HVt8KZlBEd9qlTymS50mEjgn6DXnfj+BLo
7OTwQi7sxbxsog4WNj8K5P+EtdY1lGu0ySLX6D183hnP7o2iYv6NuHbfFV3hWv0Z
uMMsGCzVt00Y18tZj6XVZaG9+9NTDENG396j7wIDAQABAoIBAEHMfCR9HJTsMMDk
SmDs3JqnHWhK+UzUe0/6VmEla0VNmI0cQFyMEYcUR3Z41uulEgURf22ZLv9WDPuq
yar4r26rtynsE1avbiEpwHzQVaMDhT2zqYUg9NA/fVdgl3PtT3KgyGQFd5MgIQUN
ileGkOF6GpoGBqnOvJkJfAS5+0RHi8EZ8RcufNExgan5QF42dtKNWOEdgZIp0+WY
jmI73YEpIadQzKxjL6PCOUmFAjfuNllw3It5QLePvYYlQeWKkl8QdROOADzOxgoj
6zCdzGo6ZqP4vK8gGioT7UybH1WJoN8of1ZBenKyT4+TagQYwqV0LXIpVBkHKgdD
5bxZIPkCgYEA4giWHweLYxmkZIXDx5VrOjIPmzTFqSfDMI9rDFQt57AbIr0hM4BW
6qmViWwuc9t28cLSXv+0FtycIfs4co8RvMinIMLykWddX8x3sniCr2+Pgn/G+RgQ
FK36wN0dVZwwr/6oPeIDCJlr4AqhDAJLJkcbRjc5i8kR9OPHIvkPJjsCgYEA0Bou
cmeOGYtrCW6t88xnmR26Sk8ybNWUdpju9SpEeCdz4jJnZC29AJ3qg8LilG0sDS/y
0cNT/iMP8x6FPeFqJnhI/l4C1H5WEqult/thMl1bZ+RFEO92EUcKEXZep0yu5Txr
6bHZzCnp9cYe56z9qsGk064LR2N9TR16xAzeud0CgYEArx0B2NZKeaNDBhHPxI8Q
/IwOJSs0O0Gv6a4iu/F3gviffUFTOIgkTjbFwCqMrnuHYfOSccDeb5vIZlcvuyj2
D/DP8gS2UknnQDGzRhQxAuOGJg8CQrcOtka3brWfZVTVL3Q2OYMg4Iej2HXDoP8h
42zRR4u/THmhLL1O6NxVjUMCgYBslKyVbuja9T61HjXPVmDbqIIyEZ6a4NnlA6jy
7Mnq85LofCosQB00vDDH7SCyF0B75P/KaSNjH8JLtSoKfpoXVn2nkz/gxcZ9WWhP
Ve+CCuoNjDJpQriVDT74m42Jt14uJ9eaiPy+JUR4w5YOhdmZhg5NkKs75XJUkUQk
FR8FVQKBgQDOWXJYF3VEYdCD1qIy/CsY3s4ARD9kery+5aOCu6TNd6auYEfqxsev
ie1jD+cvAgVR1aZ5aP3C8jEYhZa4xgn1+hxfRLWs79uMYnXXNGJ+FxKftDyhuV+m
efEQrUf8jh4MofW9Ee6Z7YjitIRY7SQ+kZl2Xms+QZlJotBzTG2DSA==
-----END RSA PRIVATE KEY-----
複製代碼

 

添加描述,點擊OK

繼續編輯配置

這樣就不報錯了,下面還能夠指定從哪一個分支拉取,默認從master拉取,有些公司使用release分支

源碼瀏覽器,去gitlab上找到http的url:http://192.168.3.198/web/web-demo.git

找出gitlab的版本,輸入url和版本,版本只支持2位,拉到最下面保存

[root@web01 ~]# rpm -qa|grep gitlab
gitlab-ce-8.10.5-ce.0.el7.x86_64

 

點擊當即構建,查看控制檯,能夠看到構建的詳細輸出

#######################################################################

持續集成之②:整合jenkins與代碼質量管理平臺Sonar並實現構建失敗郵件通知

一:Sonar是什麼?
Sonar 是一個用於代碼質量管理的開放平臺,經過插件機制,Sonar 能夠集成不一樣的測試工具,代碼分析工具,以及持續集成工具。與持續集成工具(例如 Hudson/Jenkins 等)不一樣,Sonar 並非簡單地把不一樣的代碼檢查工具結果(例如FindBugs,PMD等)直接顯示在Web頁面上,而是經過不一樣的插件對這些結果進行再加工處理,經過量化的方式度量代碼質量的變化,從而能夠方便地對不一樣規模和種類的工程進行代碼質量管理。在對其餘工具的支持方面,Sonar 不只提供了對 IDE 的支持,能夠在 Eclipse 和 IntelliJ IDEA 這些工具裏聯機查看結果;同時Sonar還對大量的持續集成工具提供了接口支持,能夠很方便地在持續集成中使用 Sonar,此外,Sonar 的插件還能夠對 Java 之外的其餘編程語言提供支持,對國際化以及報告文檔化也有良好的支持。

#官方網站:http://www.sonarqube.org/

Sonar部署
Sonar的相關下載和文檔能夠在下面的連接中找到:http://www.sonarqube.org/downloads/。須要注意最新版的Sonar須要至少JDK 1.8及以上版本

cd /usr/local/src
cd /usr/local/src/
wget https://sonarsource.bintray.com/Distribution/sonarqube//sonarqube-5.6.6.zip
unzip sonarqube-5.6.6.zip 
mv sonarqube-5.6.6 /usr/local/
ln -s /usr/local/sonarqube-5.6.6/ /usr/local/sonarqube

 

準備Sonar數據庫(mysql版本要等於5.6或者5.6以上,不然sonar沒法啓動)

mysql> CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql> GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar@341Jpw';
mysql> FLUSH PRIVILEGES;

配置Sonar

# cd /usr/local/sonarqube/conf/

 

修改配置文件的數據庫配置

# egrep '^[a-Z]' sonar.properties 
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar@pw
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance

 

啓動Sonar
你能夠在Sonar的配置文件來配置Sonar Web監聽的IP地址和端口,默認是9000端口。

# vim sonar.properties
sonar.web.host=0.0.0.0
sonar.web.port=9000

 

# 啓動有建立表和其餘操做,速度會有點慢

複製代碼
[root@node1 conf]# /usr/local/sonarqube/bin/linux-x86-64/sonar.sh start
Starting SonarQube...
Started SonarQube.

報錯:
org.sonar.api.utils.MessageException: Unsupported mysql version: 5.5. Minimal supported version is 5.6.
2017.07.01 11:16:27 ERROR web[o.a.c.c.StandardContext] One or more listeners failed to start. Full details will be found in the appropriate container log file
2017.07.01 11:17:09 INFO web[o.a.c.u.SessionIdGeneratorBase] Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [41,747] milliseconds.
2017.07.01 11:17:09 ERROR web[o.a.c.c.StandardContext] Context [] startup failed due to previous errors
2017.07.01 11:17:09 WARN web[o.a.c.l.WebappClassLoaderBase] The web application [ROOT] appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.lang.Object.wait(Native Method)
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
com.mysql.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:43)
2017.07.01 11:17:09 WARN web[o.a.c.l.WebappClassLoaderBase] The web application [ROOT] appears to have started a thread named [Timer-0] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.lang.Object.wait(Native Method)
java.util.TimerThread.mainLoop(Timer.java:552)
java.util.TimerThread.run(Timer.java:505)
2017.07.01 11:17:09 INFO web[o.a.c.h.Http11NioProtocol] Starting ProtocolHandler ["http-nio-0.0.0.0-9000"]
2017.07.01 11:17:09 INFO web[o.s.s.a.TomcatAccessLog] Web server is started
2017.07.01 11:17:09 INFO web[o.s.s.a.EmbeddedTomcat] HTTP connector enabled on port 9000
2017.07.01 11:17:09 WARN web[o.s.p.ProcessEntryPoint] Fail to start web
java.lang.IllegalStateException: Webapp did not start
at org.sonar.server.app.EmbeddedTomcat.isUp(EmbeddedTomcat.java:84) ~[sonar-server-5.6.6.jar:na]
at org.sonar.server.app.WebServer.isUp(WebServer.java:47) [sonar-server-5.6.6.jar:na]
at org.sonar.process.ProcessEntryPoint.launch(ProcessEntryPoint.java:105) ~[sonar-process-5.6.6.jar:na]
at org.sonar.server.app.WebServer.main(WebServer.java:68) [sonar-server-5.6.6.jar:na]
2017.07.01 11:17:09 INFO web[o.a.c.h.Http11NioProtocol] Pausing ProtocolHandler ["http-nio-0.0.0.0-9000"]
2017.07.01 11:17:16 INFO web[o.a.c.h.Http11NioProtocol] Stopping ProtocolHandler ["http-nio-0.0.0.0-9000"]
2017.07.01 11:17:30 INFO web[o.a.c.h.Http11NioProtocol] Destroying ProtocolHandler ["http-nio-0.0.0.0-9000"]
複製代碼

 

解決辦法:
升級mysql版本到5.6或者5.6以上

登錄:http://192.168.3.199:9000/

帳號密碼默認都是admin

 

#到此sonar就安裝完成了,下一步將進入配置使用階段。

二:配置並使用sonar
2.1:安裝插件部分:
2.1.1:默認的插件目錄:

# ll /usr/local/sonarqube-5.6.6/extensions/plugins/

#若是在線安裝插件不成功,能夠把插件下載後放在此目錄在重啓sonar服務也能夠實現安裝插件,jenkins也能夠經過此方式安裝,另外jenkins還支持上傳插件

2.1.2:安裝插件:
administration-system-update center-available,在後面的搜索框搜索插件名稱,而後點install安裝:


或在插件目錄/usr/local/sonarqube/extensions/plugins執行

wget https://github.com/SonarQubeCommunity/sonar-l10n-zh/releases/download/sonar-l10n-zh-plugin-1.11/sonar-l10n-zh-plugin-1.11.jar(中文插件:)而後重啓服務:

# /usr/local/sonarqube/bin/linux-x86-64/sonar.sh restart

Sonar插件安裝包下載地址:
https://sonarsource.bintray.com/Distribution/

主要的是sonar對代碼的分析是經過插件完成的,即分析java代碼要安裝java插件,分析php代碼要安裝php插件,分析什麼語言就安裝什麼語言的插件
本次咱們安裝了php、python、java語法檢測插件

root@node1 plugins]# pwd

複製代碼
/usr/local/sonarqube/extensions/plugins
[root@node1 plugins]# ll
total 12312
-rw-r--r-- 1 root root 128 Feb 16 18:19 README.txt
-rw-r--r-- 1 root root 4840602 Jul 4 17:05 sonar-java-plugin-4.11.0.10660.jar
-rw-r--r-- 1 root root 3733262 Jul 4 17:05 sonar-php-plugin-2.10.0.2087.jar
-rw-r--r-- 1 root root 4024311 Jul 4 17:05 sonar-python-plugin-1.8.0.1496.jar
複製代碼

2.1.3:代碼檢測測試,把sonar-scanner和sonarqube關聯起來

sonar-scanner下載地址:https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/

cd /usr/local/src
wget https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.0.3.778-linux.zip
unzip sonar-scanner-2.6.1.zip 
mv sonar-scanner-2.6.1 /usr/local/
cd /usr/local/
ln -s sonar-scanner-2.6.1 sonar-scanner

 

配置sonar-scanner:

[root@node1 conf]# vim /usr/local/sonar-scanner/conf/sonar-scanner.properties
sonar.host.url=http://localhost:9000
sonar.sourceEncoding=UTF-8
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar@341Jpw
sonar.jdbc.url=jdbc:mysql://192.168.3.12:3306/sonar?useUnicode=true&characterEncoding=utf8

檢測PHP項目,須要在sonar中先安裝SonarPHP插件,github搜索php-sonar-runner項目,對這個項目進行檢測
https://github.com/hasanyousuf/php-sonar-runner-unit-tests

unzip php-sonar-runner-unit-tests-master.zip
cd php-sonar-runner-unit-tests-master

[root@node1 php-sonar-runner-unit-tests-master]# pwd
/root/php-sonar-runner-unit-tests-master

 

# 直接在php目錄運行sonar-scanner,用於實現代碼質量分析

[root@node1 php-sonar-runner-unit-tests-master]# /usr/local/sonar-scanner/bin/sonar-scanner

 

在sonar管理界面查看掃描結果:
dashboard --> home 點項目名稱能夠查看更具體的信息

2.1.4:代碼規則:

2.4:如何讓jenkins關聯到sonar scanner?
有兩種方式保存配置文件,一是保存在項目裏面,二是在jenkins管理界面進行配置:
2.4.1:在jenkins插件安裝界面安裝SonarQuebe Scanner for Jenkins插件:

2.4.2將jenkins關聯sonar:
jenkins中操做:系統管理-系統設置,找到 SonarQube servers 部分

添加sonar訪問地址,而後點保存

2.4.3添加掃描器:
2.4.3.1:#系統管理–global-tool-ocnfigration --> 添加本地sonar scanner,而後點保存

2.5:配置jenkins項目構建操做:

2.5.1:複製以前sonar scanner的代碼檢測配置文件內容,如:

複製代碼
# cat /root/php-sonar-runner-unit-tests-master/sonar-project.properties

sonar.projectKey=org.sonarqube:php-ut-sq-scanner
sonar.projectName=PHP :: PHPUnit :: SonarQube Scanner
sonar.projectVersion=1.0
sonar.sources=src
sonar.tests=tests
sonar.language=php
sonar.sourceEncoding=UTF-8
複製代碼

 

2.5.1:選擇本身的項目(web-demo)-構建觸發器-構建-execute sonarqube scanner,將配置文件的內容修改爲以下格式填寫完成後點保存:

sonar.projectKey=web-demo
sonar.projectName=web-demo
sonar.projectVersion=1.0
sonar.sources=./
sonar.language=php
sonar.sourceEncoding=UTF-8

 

能夠看到,右邊多了個快捷方式

2.6:測試jenkins項目構建:
2.6.1:在jenkins選擇本身的項目點擊當即構建,如下是構建成功的界面:

2.6.2:在sonar查看是否有代碼掃質量分析結果:

2.7:添加構建後操做
2.7.1:添加郵件通知,當構建失敗後向指定的郵箱通知失敗信息:
#發件箱設置:

2.7.2:將github服務關閉,而後構建項目,因爲git服務沒法訪問因此確定會致使項目構建失敗觸發郵件通知:
2.7.2.1:關閉git服務:
# gitlab-ctl stop
2.7.2.2:構建項目,如下是構建失敗的控制檯輸出信息:

2.7.2.3:如下是失敗的郵件通知:

###########################################################################

持續集成之③:將代碼自動部署至測試環境

一:本文在上一篇文章的基礎之上繼續進行操做,上一篇實現了從git獲取代碼並進行代碼測試,本文將在上一篇的基礎之上實現將代碼部署至測試環境。
1.1:新建一個項目叫web-demo-deploy用於代碼發佈,上一個項目web-demo可用於代碼測試,當測試階段出現問題的時候也不會當即進行發佈,只有當測試經過以後才執行發佈的項目便可:

1.2:如何將代碼發佈到web服務器:
1.2.1:能夠經過執行命令或腳本的方式進行代碼發佈,在各web服務器建立一個www用戶,用於啓動web服務並進行代碼發佈:

複製代碼
# useradd www
# echo "123456" | passwd --stdin www
# su - www
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/www/.ssh/id_rsa): 
Created directory '/home/www/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/www/.ssh/id_rsa.
Your public key has been saved in /home/www/.ssh/id_rsa.pub.
The key fingerprint is:
bc:51:20:7d:cc:bb:de:e8:e4:11:d3:f7:1b:ec:0c:0d www@node1.chinasoft.com
The key's randomart image is:
+--[ RSA 2048]----+
| ...o |
| ...+ |
| ... |
| . ... |
| S o..E. |
| o.o .+. |
| ..oo . +.|
| oo.. + o|
| .o + |
+-----------------+
[www@node1 ~]$ cat .ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDIvExDg2tXu3+XZVdjxuur/orC0C9G1vGFKd5c67mOkiJE+OI1eyDl4yoqsabJbp7aHJEDomfO7MjoJSQEQdhebgpCvG7/ron5IoF7Ql3RllhObDHmRmjhSuHbZqJCpM2qqIejkdwM4qpnkFcJUxOZLgdKfiVfNIaAjkY3BUbyKrt64GZ4pykoZXqTLX7fDHAOqzUJqy3IuCLhk0judRdlUWayWnrXOrBGXfuKiBuXiFIxhKbDvDr93ZldqcGXXCmscTLIlQ+yFAEeb11K+/z0uEQU6l9sKD4i8v5503KiFSVWSSfL40ZBFWcP20nK3prRH5CFD2piWbLPQBYVhzpL www@node1.chinasoft.com
複製代碼

1.2.2:在git服務器將www用戶的公鑰添加至部署key,將root的公鑰添加至ssh key,以讓www用戶有獲取代碼權限,讓root用戶有提交代碼的權限:


ssh keys和deploy keys區別:
github帳戶的SSH keys,至關於這個帳號的最高級key,只要是這個帳號有的權限(任何項目),都能進行操做。
倉庫的Deploy keys,顧名思義就是這個倉庫的專有key,用這個key,只能操做這個項目,其餘項目都沒有權限。
說白了就至關於你有一所大別墅,SSH key能開別墅中的任何一個房間。而Deploy key只能開進別墅中的一個單間。

1.2.4:確認www用戶有拉取代碼權限:

1.3:關於shell腳本執行權限:

#稍後會經過jenkins執行一個腳本,從而完成代碼的發佈,可是默認執行的用戶是jenkins,須要賦予jenkins必定的權限,另外發布的腳本可能在本機也可能不在本機,本次設想不在本機保存腳本,則設置以下:

1.3.1:解決腳本運行問題:

#將腳本放在www用戶家目錄/home/www,git代碼也放在家目錄,所以須要jenkins服務器遠程到代碼發佈服務器執行遠程命令,須要作免登錄認證,將jenkins服務器root和www用戶的公鑰放在代碼部署服務器的www用戶家目錄.ssh/authorized_keys文件中,使jenkins服務器可以不輸入密碼就能夠調用部署服務器的腳本:

jenkins服務器:192.168.3.199
deploy部署服務器:192.168.3.12

複製代碼
$ chmod 600 authorized_keys
$ cat authorized_keys

[www@192.168.3.12 ~]$ cat .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDIvExDg2tXu3+XZVdjxuur/orC0C9G1vGFKd5c67mOkiJE+OI1eyDl4yoqsabJbp7aHJEDomfO7MjoJSQEQdhebgpCvG7/ron5IoF7Ql3RllhObDHmRmjhSuHbZqJCpM2qqIejkdwM4qpnkFcJUxOZLgdKfiVfNIaAjkY3BUbyKrt64GZ4pykoZXqTLX7fDHAOqzUJqy3IuCLhk0judRdlUWayWnrXOrBGXfuKiBuXiFIxhKbDvDr93ZldqcGXXCmscTLIlQ+yFAEeb11K+/z0uEQU6l9sKD4i8v5503KiFSVWSSfL40ZBFWcP20nK3prRH5CFD2piWbLPQBYVhzpL www@node1.chinasoft.com
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCsYf1pLYFBUhThXz5pqPMl9TVJxzKEkB/6vImEcDnBqDhrWZe+OqIWp+GTbkHNcXDejD1pBvvQScPIuxlz/r7OEBRTpTjmZOAaLCRMljhx2iMsgTdyjSqZFXMAXRI+F/ZPKKypDW2ZLMLjyqB6ZHK+9/SIMVGwzw/Ey3kqAQovI7UQMoL/59xjah+9zNGboTpZI613LX5vrgCghWUS5NHxU/DNUWjaxFuYJqr7ELKVrG/vZJcbtwmGpRDcCq03Kl2Mz0lHhkGZVDHWqhIPcyRjKrDh0/WqaTlPuIYZ3bZu33aQSxXV5GMGv6VqfIkYVU0uFewL4znPKFPa1z4mAJpR root@node1.chinasoft.com
複製代碼

 

1.3.2:確承認以避免密碼遠程登錄:
使用root和www用戶測試一下是否能夠免祕鑰登錄,以便讓部署服務器將用戶的key添加到know_keys,不然報錯Host key verification failed

ssh www@192.168.3.12
ssh www@192.168.3.13

 

1.3.3:解決jenkins沒有權限的問題,在jenkins服務器192.168.3.199上操做:

# vim /etc/sudoers
#Defaults requiretty #註釋掉,不須要tty
jenkins ALL=(ALL) NOPASSWD: /usr/bin/ssh

1.3.3:配置jenkins項目執行shell腳本:
1.3.3.1:腳本內容(須要放在部署服務器192.168.3.12的/home/www目錄下):

複製代碼
www@192.168.3.12 $ vim dep.sh

#!/bin/bash
cd /home/www/web-demo_deploy/ #進入到本地代碼庫
git pull #從git服務器更新代碼
scp -r ./* www@192.168.3.12:/webroot/web_www #將代碼部署至web服務器
scp -r ./* www@192.168.3.13:/webroot/web_www
www@192.168.3.12 $ chmod +x dep.sh
複製代碼

 

1.3.3.2:在jenkins調用腳本:
#在項目的構建步驟調用,項目-配置-構建-增長構建步驟-Execute shell

訪問web頁面測試:

在git倉庫建立代碼並更新至git服務器:

複製代碼
[www@master web-demo_deploy]$ vim index.html # 添加www.chinasoft.com
[www@master web-demo_deploy]$ git add index.html 
[www@master web-demo_deploy]$ git commit -m 'edit index.html add www.chinasoft.com'
[master 51f8f11] edit index.html add www.chinasoft.com
1 file changed, 1 insertion(+), 1 deletion(-)
[www@master web-demo_deploy]$ git push origin master
Counting objects: 5, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 313 bytes | 0 bytes/s, done.
Total 3 (delta 2), reused 0 (delta 0)
To git@192.168.3.198:web/web-demo_deploy.git
ac41e81..51f8f11 master -> master
複製代碼

 

再次在jenkins執行項目構建

能夠看到剛剛更新的代碼獲取成功

1.4:讓代碼測試項目管理代碼發佈項目,當代碼測試的項目執行成功以後自動調用代碼發佈的項目完成代碼部署:
1.4.1:安裝插件,jenkins的插件默認安裝路徑

# ll /var/lib/jenkins/plugins/

tomcat版本的安裝路徑:

/usr/local/tomcat/webapps/jenkins/WEB-INF/detached-plugins/

若是插件在線安裝不成功能夠下載插件到此目錄而後把屬主屬組改爲jenkins再重啓jenkins服務便可完成安裝:
#系統管理-管理插件-可選插件,搜索Parameterized:

1.4.2:配置項目demo的構建後操做,demo構建完成後自動構建demp-deploy項目:
#jenkins-->web-demo-->配置-->構建後操做:

1.4.3:配置以下:

1.5:測試,執行代碼測試項目成功以後是否會自動執行代碼部署項目:

控制檯輸出

複製代碼
Started by user admin
Building in workspace /home/jenkins/.jenkins/workspace/web-demo
> git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
> git config remote.origin.url git@192.168.3.198:web/web-demo.git # timeout=10
Fetching upstream changes from git@192.168.3.198:web/web-demo.git
> git --version # timeout=10
using GIT_SSH to set credentials gitlab_web-demo
> git fetch --tags --progress git@192.168.3.198:web/web-demo.git +refs/heads/*:refs/remotes/origin/*
> git rev-parse refs/remotes/origin/master^{commit} # timeout=10
> git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10
Checking out Revision b8f3be4385efdf64606158c23f9f1992bb2da1d3 (refs/remotes/origin/master)
Commit message: "add www.chinasoft.com"
> git config core.sparsecheckout # timeout=10
> git checkout -f b8f3be4385efdf64606158c23f9f1992bb2da1d3
> git rev-list b8f3be4385efdf64606158c23f9f1992bb2da1d3 # timeout=10
[web-demo] $ /usr/local/sonar-scanner/bin/sonar-scanner -e -Dsonar.host.url=http://192.168.3.199:9000/ -Dsonar.language=php -Dsonar.projectName=web-demo -Dsonar.projectVersion=1.0 -Dsonar.sourceEncoding=UTF-8 -Dsonar.projectKey=web-demo -Dsonar.sources=./ -Dsonar.projectBaseDir=/home/jenkins/.jenkins/workspace/web-demo
INFO: Scanner configuration file: /usr/local/sonar-scanner/conf/sonar-scanner.properties
INFO: Project root configuration file: NONE
INFO: SonarQube Scanner 2.6.1
INFO: Java 1.8.0_111 Oracle Corporation (64-bit)
INFO: Linux 3.10.0-514.el7.x86_64 amd64
INFO: Error stacktraces are turned on.
INFO: User cache: /home/jenkins/.sonar/cache
INFO: Load global repositories
INFO: Load global repositories (done) | time=172ms
WARN: Property 'sonar.jdbc.url' is not supported any more. It will be ignored. There is no longer any DB connection to the SQ database.
WARN: Property 'sonar.jdbc.username' is not supported any more. It will be ignored. There is no longer any DB connection to the SQ database.
WARN: Property 'sonar.jdbc.password' is not supported any more. It will be ignored. There is no longer any DB connection to the SQ database.
INFO: User cache: /home/jenkins/.sonar/cache
INFO: Load plugins index
INFO: Load plugins index (done) | time=3ms
INFO: SonarQube server 5.6.6
INFO: Default locale: "en_US", source code encoding: "UTF-8"
INFO: Process project properties
INFO: Load project repositories
INFO: Load project repositories (done) | time=97ms
INFO: Load quality profiles
INFO: Load quality profiles (done) | time=34ms
INFO: Load active rules
INFO: Load active rules (done) | time=380ms
WARN: SCM provider autodetection failed. No SCM provider claims to support this project. Please use sonar.scm.provider to define SCM of your project.
INFO: Publish mode
INFO: ------------- Scan web-demo
INFO: Language is forced to php
INFO: Load server rules
INFO: Load server rules (done) | time=71ms
INFO: Base dir: /home/jenkins/.jenkins/workspace/web-demo
INFO: Working dir: /home/jenkins/.jenkins/workspace/web-demo/.sonar
INFO: Source paths: .
INFO: Source encoding: UTF-8, default locale: en_US
INFO: Index files
INFO: 0 files indexed
INFO: Quality profile for php: Sonar way
INFO: Sensor Lines Sensor
INFO: Sensor Lines Sensor (done) | time=0ms
INFO: Sensor SCM Sensor
INFO: No SCM system was detected. You can use the 'sonar.scm.provider' property to explicitly specify it.
INFO: Sensor SCM Sensor (done) | time=0ms
INFO: Sensor Analyzer for "php.ini" files
INFO: Sensor Analyzer for "php.ini" files (done) | time=3ms
INFO: Sensor SonarJavaXmlFileSensor
INFO: Sensor SonarJavaXmlFileSensor (done) | time=0ms
INFO: Sensor Zero Coverage Sensor
INFO: Sensor Zero Coverage Sensor (done) | time=0ms
INFO: Sensor Code Colorizer Sensor
INFO: Sensor Code Colorizer Sensor (done) | time=0ms
INFO: Sensor CPD Block Indexer
INFO: DefaultCpdBlockIndexer is used for php
INFO: Sensor CPD Block Indexer (done) | time=0ms
INFO: Calculating CPD for 0 files
INFO: CPD calculation finished
INFO: Analysis report generated in 47ms, dir size=8 KB
INFO: Analysis reports compressed in 7ms, zip size=3 KB
INFO: Analysis report uploaded in 47ms
INFO: ANALYSIS SUCCESSFUL, you can browse http://192.168.3.199:9000/dashboard/index/web-demo
INFO: Note that you will be able to access the updated dashboard once the server has processed the submitted analysis report
INFO: More about the report processing at http://192.168.3.199:9000/api/ce/task?id=AV0YJcbrykzBCcoFv4Mt
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 43.045s
INFO: Final Memory: 42M/137M
INFO: ------------------------------------------------------------------------
Warning: you have no plugins providing access control for builds, so falling back to legacy behavior of permitting any downstream builds to be triggered
Triggering a new build of web-demo_deploy
Finished: SUCCESS
複製代碼

 

1.6:pipeline插件:
1.6.1:#安裝插件,系統管理-管理插件-可安裝插件:

1.6.2:建立視圖:

1.6.3:自定義名稱:

1.6.4:配置pipeline信息,點擊OK以後,彈出以下視圖

點擊保存以後顯示的最終界面:

########################################################################

持續集成之④:GitLab觸發jenkins構建項目

一:目的爲在公司的測試環境當中一旦開發向gitlab倉庫提交成功代碼,gitlab通知jenkins進行構建項目、代碼質量測試而後部署至測試環境,注意這只是測試環境,而生產環境依然須要手動部署代碼:

1.1:jenkins配置:
1.1.1:安裝Gitlab Hook Plugin插件:
#系統管理-管理插件-可選插件-Gitlab Hook Plugin和Build Authorization Token Root Plugin

1.1.2:生成隨機token:

# openssl rand -hex 12
0f2a47c861133916d2e299e3

 

1.1.3:建立項目觸發器:
#項目-配置-構建觸發器:
http://192.168.3.199:8080/jenkins/project/web-demo

1.2:配置github:
1.2.1:在git項目配置界面設置連接和token:

登陸gitlab,在這個項目下找到鉤子配置的地方


#選擇項目-設置-webhooks:
#插件使用介紹,https://wiki.jenkins-ci.org/display/JENKINS/Build+Token+Root+Plugin

http://192.168.3.199:8080/jenkins/buildByToken/build?job=web-demo&token=0f2a47c861133916d2e299e3
http://jenkins服務器地址:8080/buildByToken/build?job=項目名&token=token值

1.2.2:測試:

報錯:
hook executed successfully but returned http 404

本次是由於沒有在項目後面加上jenkins這個路徑

1.2.2:測試,看到顯示201表示成功

1.3:向git服務器提交代碼,驗證是否能夠自動部署:
1.3.1:提交代碼:

複製代碼
[www@master code]$ git clone git@192.168.3.198:web/web-demo.git
[www@master web-demo]$ echo "Build token root plugin" > index.html 
[www@master web-demo]$ git add 'index.html'
[www@master web-demo]$ git commit -m 'build token root plugin test'
[master beb37cb] build token root plugin test
1 file changed, 1 insertion(+), 1 deletion(-)
[www@master web-demo]$ git push origin master
Counting objects: 5, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 281 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To git@192.168.3.198:web/web-demo.git
c02523b..beb37cb master -> master
複製代碼

1.3.2:jenkins服務器的日誌記錄:

[root@node1 tomcat]# tail -f /usr/local/tomcat/logs/catalina.out

 

1.3.3:jenkins項目構建:

1.3.4:訪問web界面驗證代碼是否最新的:

1.3.5:jenkins控制檯輸出信息:

########################################################################

持續集成之⑤:jenkins結合腳本實現代碼自動化部署及一鍵回滾至上一版本

一:本文經過jenkins調用shell腳本的的方式完成從Git服務器獲取代碼、打包、部署到web服務器、將web服務器從負載均衡器刪除、解壓、複製配置文件、建立軟鏈接、測試每一臺web服務器、將web服務器添加至負載均衡、回滾到任意指定版本、一鍵回滾到上一版本等功能,腳本放在www用戶家目錄並使用www用戶身份執行,每一個web服務器也都使用www用戶運行web服務,且UID相同web目錄和權限都一致,更嚴格的標準化能夠帶來更安全的生產環境和更高的效率:
1.1:在jenkins項目配置中調用shell腳本與環境準備:
1.1.1:#jenkins-項目-配置:

1.1.2:www用戶家目錄中的腳本內容:

複製代碼
$ cat code_deploy.sh

#!/bin/bash

#Dir List 部署節點(即部署節點須要作的操做)
# mkdir -p /deploy/code/web-demo
# mkdir -p /deploy/config/web-demo/base
# mkdir -p /deploy/config/web-demo/other
# mkdir /deploy/tmp
# mkdir /deploy/tar

# chown -R www.www /deploy
# chown -R www.www /webroot
# chown -R www.www /opt/webroot/
# chown -R www.www /webroot

# 須要在客戶端節點作的操做
# mkdir /opt/webroot
# mkdir /webroot
# chown -R www.www /webroot
# chown -R www.www /opt/webroot/
# chown -R www.www /webroot
# [www@ ~]$ touch /webroot/web-dem

# Node List 服務器節點
PRE_LIST="192.168.3.12"        # 預生產節點
GROUP1_LIST="192.168.3.12 192.168.3.13"
GROUP2_LIST="192.168.3.13"
ROLLBACK_LIST="192.168.3.12 192.168.3.13"

# 日誌日期和時間變量
LOG_DATE='date "+%Y-%m-%d"' # 若是執行的話後面執行的時間,此時間是不固定的,這是記錄日誌使用的時間
LOG_TIME='date "+%H-%M-%S"'

# 代碼打包時間變量
CDATE=$(date "+%Y-%m-%d") # 腳本一旦執行就會取一個固定時間賦值給變量,此時間是固定的
CTIME=$(date +"%H-%M-%S")

# shell env 腳本位置等變量
SHELL_NAME="deploy.sh"    # 腳本名稱
SHELL_DIR="/home/www/"  # 腳本路徑
SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}.log" # 腳本執行日誌文件路徑

# code env 代碼變量
PRO_NAME="web-demo"    # 項目名稱的函數
CODE_DIR="/deploy/code/web-demo"    # 從版本管理系統更新的代碼目錄
CONFIG_DIR="/deploy/config/web-demo"    # 保存不一樣項目的配置文件,一個目錄裏面就是一個項目的一個配置文件或多個配置文件
TMP_DIR="/deploy/tmp"            # 臨時目錄
TAR_DIR="/deploy/tar"            # 打包目錄
LOCK_FILE="/tmp/deploy.lock" # 鎖文件路徑

usage(){ # 使用幫助函數
    echo $"Usage: $0 [ deploy | rollback [ list | emergency | version ]"
}

writelog(){ # 寫入日誌的函數
    LOGINFO=$1 # 將參數做爲日誌輸入
    echo "${CDATE} ${CTIME} : ${SEHLL_NAME} : ${LOGINFO}" >> ${SHELL_LOG}
}

# 鎖函數
shell_lock(){
    touch ${LOCK_FILE}
}

# 解鎖函數
shell_unlock(){
    rm -f ${LOCK_FILE}
}

# 獲取代碼的函數
code_get(){
    echo "code_get"
    writelog code_get
    cd $CODE_DIR && git pull # 進入到代碼目錄更新代碼,此處必須免密碼更新,此目錄僅用於代碼更新不能放其餘任何文件
    cp -rf ${CODE_DIR} ${TMP_DIR}/ # 臨時保存代碼並重命名,包名爲時間+版本號,準備複製到web服務器
    API_VERL=$(git show | grep commit | cut -d ' ' -f2)  
    API_VER=$(echo ${API_VERL:0:8})        # 版本號
}

code_build(){ # 代碼編譯函數
    echo code_build
}

code_config(){ # 配置文件函數
    writelog "code_config"
    /bin/cp -rf ${CONFIG_DIR}/base/* ${TMP_DIR}/"${PRO_NAME}" # 將配置文件放在本機保存配置文件的臨時目錄,用於暫時保存代碼項目
    PKG_NAME="${PRO_NAME}"_"$API_VER"_"${CDATE}-${CTIME}"    # 定義代碼目錄名稱
    cd ${TMP_DIR} && mv ${PRO_NAME} ${PKG_NAME}    # 重命名代碼文件爲web-demo_123-20170629-11-19-10格式
    
}

code_tar(){    # 對代碼打包函數
    writelog code_tar
    cd ${TMP_DIR} && tar czf ${PKG_NAME}.tar.gz ${PKG_NAME} --exclude=".git" # 將目錄打包成壓縮文件,便於網絡傳輸
    writelog "${PKG_NAME}.tar.gz packaged success"    # 記錄打包成功的日誌
}

code_scp(){ # 代碼壓縮包scp到客戶端的函數
    writelog  "code_scp"
    for node in $PRE_LIST;do # 循環服務器節點列表
        scp ${TMP_DIR}/${PKG_NAME}.tar.gz $node:/opt/webroot/ # 將壓縮後的代碼包複製到web服務器的/opt/webroot
    done

    for node in $GROUP1_LIST;do # 循環服務器節點列表
        scp ${TMP_DIR}/${PKG_NAME}.tar.gz $node:/opt/webroot/ # 將壓縮後的代碼包複製到web服務器的/opt/webroot
    done
}

cluster_node_add(){ #將web服務器添加至前端負載
    echo cluster_node_add
}

cluster_node_remove(){ # 將web服務器從集羣移除函數(正在部署的時候應該不處理業務)
    writelog "cluster_node_remove"
}

url_test(){
    URL=$1
    curl -s --head $URL |grep '200 OK'
    if [ $? -ne 0 ];then
        shell_unlock;
        writelog "test error" && exit;
    fi
}

pre_deploy(){ # 代碼解壓部署函數,預生產節點
    writelog "pre_deploy"
    for node in ${PRE_LIST};do # 循環預生產服務器節點列表
        cluster_node_remove  ${node} # 部署以前將節點從前端負載刪除
        echo  "pre_deploy, cluster_node_remove ${node}"
        ssh ${node} "cd /opt/webroot && tar zxf ${PKG_NAME}.tar.gz" #分別到web服務器執行壓縮包解壓命令
        ssh ${node} "rm -f /webroot/web-demo && ln -s /opt/webroot/${PKG_NAME} /webroot/web-demo" # 整個自動化的核心,建立軟鏈接
        done
}

pre_test(){ # 預生產主機測試函數
    for node in ${PRE_LIST};do # 循環預生產主機列表
        curl -s --head http://${node}:9999/index.html | grep "200 OK" # 測試web界面訪問
            if [ $? -eq 0 ];then  # 若是訪問成功
                writelog " ${node} Web Test OK!" # 記錄日誌
                echo " ${node} Web Test OK!"
                cluster_node_add ${node} # 測試成功以後調用添加函數把服務器添加至節點,
                writelog "pre,${node} add to cluster OK!" # 記錄添加服務器到集羣的日誌
            else # 若是訪問失敗
                writelog "${node} test no OK" # 記錄日誌
                echo "${node} test not OK"
                shell_unlock # 調用刪除鎖文件函數
            break # 結束部署
        fi
    done

}

group1_deploy(){ # 代碼解壓部署函數
    writelog "group1_code_deploy"
    for node in ${GROUP1_LIST};do # 循環生產服務器節點列表
        cluster_node_remove $node  
        echo "group1, cluster_node_remove $node"
        ssh ${node} "cd /opt/webroot && tar zxf ${PKG_NAME}.tar.gz" # 分別到各web服務器節點執行壓縮包解壓命令
        ssh ${node} "rm -f /webroot/web-demo && ln -s /opt/webroot/${PKG_NAME} /webroot/web-demo" # 整個自動化的核心,建立軟鏈接
    done
    scp ${CONFIG_DIR}/other/192.168.3.13.server.xml 192.168.3.13:/webroot/web-demo/server.xml  # 將差別項目的配置文件scp到此web服務器並以項目結尾
}    

group1_test(){ # 生產主機測試函數
    for node in ${PRE_LIST};do # 循環生產主機列表
        curl -s --head http://${node}:9999/index.html | grep "200 OK" #測試web界面訪問
        if [ $? -eq 0 ];then  #若是訪問成功
            writelog " ${node} Web Test OK!" #記錄日誌
            echo "group1_test,${node} Web Test OK!"
            cluster_node_add
            writelog " ${node} add to cluster OK!" #記錄將服務器 添加至集羣的日誌
        else #若是訪問失敗
            writelog "${node} test no OK" #記錄日誌
            echo "${node} test no OK"
            shell_unlock # 調用刪除鎖文件函數
            break # 結束部署
        fi
    done
}

emergency_code_get(){ #獲取代碼的函數
    writelog "code_get"
    cd ${CODE_DIR} && git reset --hard HEAD^   #進入到代碼目錄更新代碼,此處必須免密碼更新,此目錄僅用於代碼更新不能放其餘任何文件
    /bin/cp -rf ${CODE_DIR} ${TMP_DIR}/ #臨時保存代碼並重命名,包名爲時間+版本號,準備複製到web服務器
    API_VERL=$(git show | grep commit | cut -d ' ' -f2)
    API_VER=$(echo ${API_VERL:0:8}) #取八位
}

emergency(){  #緊急回退到上一個版本函數
    emergency_code_get #執行將代碼回退到上一個版本函數
    code_build; #若是要編譯執行編譯函數
        code_config; #cp配置文件
        code_tar; #打包
        code_scp; #scp到服務器
        cluster_node_remove;
        pre_deploy; #預生產環境部署
        pre_test; #預生產環境測試
        group1_deploy; #生產環境部署
        group1_test; #生產環境測試
        code_config; #cp差別文件
        #code_test; #代碼測試
        shell_unlock #執行完成後刪除鎖文件
}

rollback_fun(){ 
    for node in $ROLLBACK_LIST;do # 循環服務器節點列表
        # 注意必定要加"號,不然沒法在遠程執行命令
        ssh $node "rm -f /webroot/web-demo && ln -s /opt/webroot/$1 /webroot/web-demo" # 當即回滾到指定的版本,$1即指定的版本參數
        echo "${node} rollback success!"
        done
}

rollback(){ # 代碼回滾主函數
    if [ -z $1 ];then
        shell_unlock # 刪除鎖文件
        echo "Please input rollback version" && exit 3;
    fi
    case $1 in # 把第二個參數作當本身的第一個參數 
        list)
            ls -l /opt/webroot/*.tar.gz
            ;;
        *)
            rollback_fun $1
    esac
            
}

main(){
    if [ -f $LOCK_FILE ] ;then # 先判斷鎖文件在不在,若是有鎖文件直接退出
        echo "Deploy is running" && exit 10
    fi
    DEPLOY_METHOD=$1 # 避免出錯誤將腳本的第一個參數做爲變量
    ROLLBACK_VER=$2
    case $DEPLOY_METHOD in
        deploy) # 若是第一個參數是deploy就執行如下操做
            shell_lock; # 執行部署以前建立鎖。若是同時有其餘人執行則提示鎖文件存在
            code_get; # 獲取代碼
            code_build; # 若是要編譯執行編譯函數
            code_config; # cp配置文件
            code_tar;    # 打包
            code_scp;    # scp到服務器
            pre_deploy;  # 預生產環境部署
            pre_test;    # 預生產環境測試
            group1_deploy; # 生產環境部署
            group1_test;   # 生產環境測試
            shell_unlock; # 執行完成後刪除鎖文件
            ;;
        rollback) # 若是第一個參數是rollback就執行如下操做
            shell_lock; # 回滾以前也是先建立鎖文件
            rollback $ROLLBACK_VER;
            shell_unlock; # 執行完成刪除鎖文件
            ;;
        emergency)
        emergency; #緊急回退就不須要參數了,可是在執行的時候要確認一下是否要緊急回退,避免輸入錯誤 
        ;;
        *)
            usage;
    esac
}
main $1 $2
複製代碼

 

1.1.4:修改當前web頁面:

複製代碼
[www@master ~]$ cd web-demo
[www@master web-demo]$ echo "<h1>jenkins deploy test" > index.html 
[www@master web-demo]$ git add index.html 
[www@master web-demo]$ git commit -m "jenkins deploy test"
[master 9a43cf5] jenkins deploy test
1 file changed, 1 insertion(+), 1 deletion(-)
[www@master web-demo]$ git push -u origin master
Counting objects: 5, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 276 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To git@192.168.3.198:web/web-demo.git
beb37cb..9a43cf5 master -> master
Branch master set up to track remote branch master from origin.
複製代碼

 

1.4:回滾到任意版本:
1.4.1:在哪看回滾到的版本?:
$ ll /deploy/tmp/ #部署服務器,web服務器在nginx定義的目錄查看版本

1.4.3:在jenkins執行回滾:

複製代碼
[root@slave01 ~]# ll /opt/webroot/
total 20672
drwxr-xr-x 5 www www 4096 Jun 26 11:36 web-demo_123_2017-06-26-11-36-44
-rw-rw-r-- 1 www www 1243347 Jun 28 22:03 web-demo_123_2017-06-26-11-36-44.tar.gz
drwxr-xr-x 5 www www 4096 Jun 26 11:39 web-demo_123_2017-06-26-11-39-02
-rw-rw-r-- 1 www www 1243347 Jun 28 22:06 web-demo_123_2017-06-26-11-39-02.tar.gz
drwxr-xr-x 5 www www 4096 Jun 26 12:04 web-demo_123_2017-06-26-12-04-19
-rw-rw-r-- 1 www www 1243351 Jun 28 22:31 web-demo_123_2017-06-26-12-04-19.tar.gz
drwxr-xr-x 5 www www 4096 Jun 26 12:16 web-demo_123_2017-06-26-12-16-49
-rw-rw-r-- 1 www www 1243347 Jun 28 22:43 web-demo_123_2017-06-26-12-16-49.tar.gz
drwxr-xr-x 5 www www 4096 Jun 26 12:18 web-demo_123_2017-06-26-12-18-09
-rw-rw-r-- 1 www www 1243347 Jun 28 22:45 web-demo_123_2017-06-26-12-18-09.tar.gz
drwxr-xr-x 5 www www 4096 Jun 26 12:18 web-demo_123_2017-06-26-12-18-57
-rw-rw-r-- 1 www www 1243369 Jun 28 22:46 web-demo_123_2017-06-26-12-18-57.tar.gz
-rw-rw-r-- 1 www www 45 Jun 29 06:21 web-demo__2017-06-30-14-28-54.tar.gz
drwxrwxr-x 2 www www 4096 Jun 30 14:30 web-demo__2017-06-30-14-30-22
-rw-rw-r-- 1 www www 130 Jun 29 06:23 web-demo__2017-06-30-14-30-22.tar.gz
drwxrwxr-x 2 www www 4096 Jun 30 14:31 web-demo__2017-06-30-14-31-53
-rw-rw-r-- 1 www www 219 Jun 29 06:24 web-demo__2017-06-30-14-31-53.tar.gz
drwxrwxr-x 4 www www 4096 Jun 30 14:59 web-demo_75463f1b_2017-06-30-14-59-58
-rw-rw-r-- 1 www www 1236456 Jun 29 06:52 web-demo_75463f1b_2017-06-30-14-59-58.tar.gz
drwxrwxr-x 4 www www 4096 Jun 30 15:05 web-demo_75463f1b_2017-06-30-15-05-57
-rw-rw-r-- 1 www www 1236450 Jun 29 06:58 web-demo_75463f1b_2017-06-30-15-05-57.tar.gz
drwxrwxr-x 4 www www 4096 Jul 10 14:01 web-demo_75463f1b_2017-07-10-14-01-34
-rw-rw-r-- 1 www www 1236446 Jul 10 14:01 web-demo_75463f1b_2017-07-10-14-01-34.tar.gz
drwxrwxr-x 4 www www 4096 Jun 30 15:18 web-demo_78869143_2017-06-30-15-18-29
-rw-rw-r-- 1 www www 1236465 Jun 29 07:11 web-demo_78869143_2017-06-30-15-18-29.tar.gz
drwxrwxr-x 4 www www 4096 Jul 10 14:00 web-demo_78869143_2017-07-10-14-00-35
-rw-rw-r-- 1 www www 1236453 Jul 10 14:00 web-demo_78869143_2017-07-10-14-00-35.tar.gz
drwxrwxr-x 3 www www 4096 Jun 30 14:14 web-demo_91d09cc2_2017-06-30-14-14-42
-rw-rw-r-- 1 www www 1236371 Jun 29 06:06 web-demo_91d09cc2_2017-06-30-14-14-42.tar.gz
drwxrwxr-x 3 www www 4096 Jun 30 14:15 web-demo_91d09cc2_2017-06-30-14-15-16
-rw-rw-r-- 1 www www 1236382 Jun 29 06:08 web-demo_91d09cc2_2017-06-30-14-15-16.tar.gz
drwxrwxr-x 4 www www 4096 Jul 10 14:08 web-demo_9a43cf55_2017-07-10-14-08-46
-rw-rw-r-- 1 www www 1233708 Jul 10 14:08 web-demo_9a43cf55_2017-07-10-14-08-46.tar.gz
drwxrwxr-x 4 www www 4096 Jun 30 15:21 web-demo_b8f3be43_2017-06-30-15-21-55
-rw-rw-r-- 1 www www 1236454 Jun 29 07:14 web-demo_b8f3be43_2017-06-30-15-21-55.tar.gz
drwxrwxr-x 4 www www 4096 Jul 10 12:34 web-demo_b8f3be43_2017-07-10-12-34-00
-rw-rw-r-- 1 www www 1236462 Jul 10 12:34 web-demo_b8f3be43_2017-07-10-12-34-00.tar.gz
drwxrwxr-x 4 www www 4096 Jun 30 14:57 web-demo_dcfb44f0_2017-06-30-14-57-10
-rw-rw-r-- 1 www www 1236447 Jun 29 06:50 web-demo_dcfb44f0_2017-06-30-14-57-10.tar.gz
複製代碼

 

1.4.2:回滾任意版本就將版本的參數傳遞給腳本,腳本會將web-demo的連接從新指向傳遞的版本(參數),好比我要回滾到web-demo_78869143_2017-06-30-15-18-29這個版本,則jenkins的配置爲:

1.4.3:在jenkins執行回滾:
1.4.4:執行回滾的信息:

1.4.5:訪問web界面測試任意版本回滾是否成功:

相關文章
相關標籤/搜索