CI/CD介紹
互聯網軟件的開發和發佈,已經造成了一套標準流程,假如把開發工做流程分爲如下幾個階段:java
編碼 → 構建 → 集成 → 測試 → 交付 → 部署node
正如你在上圖中看到,持續集成(Continuous Integration)、持續交付(Continuous Delivery)和持續部署(Continuous Deployment)有着不一樣的軟件自動化交付週期。linux
持續集成(CI)
上面整個流程中最重要的組成部分就是持續集成(Continuous integration,簡稱CI)。git
持續集成指的是,頻繁地(一天屢次)將代碼集成到主幹。將軟件我的研發的部分向軟件總體部分交付,頻繁進行集成以便更快地發現其中的錯誤。web
它的好處主要有兩個:docker
1. 快速發現錯誤。每完成一點更新,就集成到主幹,能夠快速發現錯誤,定位錯誤也比較容易;數據庫
2. 防止分支大幅偏離主幹。若是不是常常集成,主幹又在不斷更新,會致使之後集成的難度變大,甚至難以集成。
vim
持續集成並不能消除Bug,而是讓它們很是容易發現和改正。持續集成的目的,就是讓產品能夠快速迭代,同時還能保持高質量。它的核心措施是,代碼集成到主幹以前,必須經過自動化測試。只要有一個測試用例失敗,就不能集成。瀏覽器
持續交付
持續交付(Continuous delivery)指的是,頻繁地將軟件的新版本,交付給質量團隊或者用戶,以供評審。若是評審經過,代碼就進入生產階段。服務器
持續交付在持續集成的基礎上,將集成後的代碼部署到更貼近真實運行環境的「類生產環境」(production-like environments)中。持續交付優先於整個產品生命週期的軟件部署,創建在高水平自動化持續集成之上。
持續交付能夠看做持續集成的下一步。它強調的是,無論怎麼更新,軟件是隨時隨地能夠交付的。
持續部署(CD)
持續部署(continuous deployment)是持續交付的下一步,指的是代碼經過評審之後,自動部署到生產環境。
持續部署的目標是,代碼在任什麼時候刻都是可部署的,能夠進入生產階段。
持續部署的前提是能自動化完成測試、構建、部署等步驟。
總的來講,持續集成、持續交付、持續部署提供了一個優秀的 DevOps 環境。對於整個開發團隊來講,能很大地提高開發效率,好處與挑戰並行。不管如何,頻繁部署、快速交付以及開發測試流程自動化都將成爲將來軟件工程的重要組成部分。
Jenkins介紹
Jenkins概念
Jenkins是一個開源的、可擴展的持續集成、交付、部署(軟件/代碼的編譯、打包、部署)的基於web界面的平臺。容許持續集成和持續交付項目,不管用的是什麼平臺,能夠處理任何類型的構建或持續集成。
官網:https://jenkins.io/ 官方文檔:https://jenkins.io/doc/
Jenkins特性:
開源的java語言開發持續集成工具,支持CI,CD;
易於安裝部署配置:可經過yum安裝,或下載war包以及經過docker容器等快速實現安裝部署,可方便web界面配置管理;
消息通知及測試報告:集成RSS/E-mail經過RSS發佈構建結果或當構建完成時經過e-mail通知,生成JUnit/TestNG測試報告;
分佈式構建:支持Jenkins可以讓多臺計算機一塊兒構建/測試;
文件識別:Jenkins可以跟蹤哪次構建生成哪些jar,哪次構建使用哪一個版本的jar等;
豐富的插件支持:支持擴展插件,你能夠開發適合本身團隊使用的工具,如git,svn,maven,docker等。
Jenkins安裝
安裝最低配置:很多於256M內存,不低於1G磁盤,JDK版本>=8(openjdk也能夠)。
環境:
hostname:lzx ip:192.168.33.150 role:jenkins服務器
hostname:lzx1 ip:192.168.33.160 role:部署機器
安裝jenkins:
# yum install -y java-1.8.0-openjdk #安裝openjdk,jenkins基於java開發
# wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo #wget -O 下載文件並以指定的文件名保存
# cat /etc/yum.repos.d/jenkins.repo
[jenkins]
name=Jenkins
baseurl=http://pkg.jenkins.io/redhat
gpgcheck=1 #爲1時會檢測key
# rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key #安裝jenkins key
# yum install -y jenkins
啓動jenkins:
# systemctl start jenkins
# ps aux |grep jenkins
jenkins 1157 84.7 10.0 2320896 100884 ? Ssl 23:28 0:08 /etc/alternatives/
# less /var/log/jenkins/jenkins.log #查看jenkins日誌,截取部分
Jenkins initial setup is required. An admin user has been created and a password generated
.
Please use the following password to proceed to installation:
77faa20f2ad544f7bcb6593b1cf1436b #admin密碼,初始化安裝時會用到
This may also be found at: /var/lib/jenkins/secrets/initialAdminPassword #admin密碼也能夠在這裏查到
修改默認端口號:
# vim /etc/sysconfig/jenkins
找到 JENKINS_PORT="8080" ,JENKINS_AJP_PORT="8009",分別修改爲你須要的端口號。
# sudo service jenkins restart
打開瀏覽器,訪問ip:8089
進行安裝,ip爲服務器ip
提示須要輸入管理員密碼,輸入上面查到的admin密碼,點擊繼續
,會初始化一小段時間
這裏我選擇安裝推薦的插件
這裏就已經開始在安裝插件,咱們等它安裝完就行了。
上面等插件安裝完後,就進入到下面界面,提示要建立第一個admin用戶,並設置用戶名密碼
這裏我直接建立用戶名爲admin,密碼admin
點擊保存並完成
提示配置jenkins URL,這裏保持默認便可,繼續點擊保存並完成
提示jenkins已經就緒,開始使用jenkins
查看jenkins的配置文件:
# cat /etc/sysconfig/jenkins #查看jenkins的配置文件,定義了home、JAVA_CMD、user、port等基礎配置,保持默認便可
查看程序主目錄:
# ls /var/lib/jenkins/ #查看程序主目錄
config.xml nodes
hudson.model.UpdateCenter.xml plugins
hudson.plugins.git.GitTool.xml queue.xml.bak
identity.key.enc secret.key
jenkins.CLI.xml secret.key.not-so-secret
jenkins.install.InstallUtil.lastExecVersion secrets
jenkins.install.UpgradeWizard.state updates
jenkins.model.JenkinsLocationConfiguration.xml userContent
jobs users
logs workflow-libs
nodeMonitors.xml
上面,
jobs 瀏覽器上面建立的任務都會存放在這裏
logs 存放jenkins相關的日誌
nodes 多節點時用到
plugins 插件所在目錄
secrets 密碼祕鑰所在目錄 #jobs和plugins目錄比較重要
jenkins存放數據不依靠數據庫,因此在移植時只須要拷貝整個程序主目錄便可。
查看插件:
系統管理–>插件管理,「可選插件」是未安裝的插件,「已安裝」是已經安裝的插件,其中勾選爲灰色的是不可卸載的插件。
檢查是否有「Git plugin」和「Publish over SSH」兩個插件,若是沒有,在「可選插件」中安裝。發現「Publish over SSH」沒有,安裝它
安裝完插件後,直接在linux機器上重啓jenkins服務,而不是勾選空閒時重啓
# systemctl restart jenkins
從新在瀏覽器上登陸jenkins,並在linux機器上生成一對祕鑰
# cd ~/.ssh/
# ls #若是以前有生成過密鑰對,那能夠直接用,不須要再生成
authorized_keys known_hosts
# ssh-keygen -f ~/.ssh/jenkins #生成密鑰對
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): #直接回車,也能夠設置密碼
Enter same passphrase again: #直接回車
Your identification has been saved in /root/.ssh/jenkins.
Your public key has been saved in /root/.ssh/jenkins.pub.
The key fingerprint is:
SHA256:VF7nN5V6pPco5DDnm8PUeu8OEg3VMj/IkgfYkqd/Hx4 root@lzx
The key's randomart image is:
+---[RSA 2048]----+
| = . o.o|
| * = +ooo|
| . = = *=.|
| . .oooO =o|
| S .B+.+.o|
| .=ooE.|
| oo=+ o|
| *..+ |
| o ++|
+----[SHA256]-----+
# cat jenkins #查看私鑰
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAu+H7NOAvrPYWwNPur64cwZYJz80MZdmQP44KJy1Zcqsfmawt
axjbgzZSPyXSM9fDqo32dR4OR8PdqFdnSDWU8gXl2tgTcsUiy+y+1TB7ZdgzmI8Z
LAAGKQsrWOFMBB9GCfBlAL6eGg4nnsnc4bDT2sJhZuzgfW/qK5AyWSCIm2wvfFw5
1m2WcaslRzNwGkg2cFK4tuY0ZkiF/UfA+YC88RAhSbjFD5FQKLzSHmkZbxbSGC09
cYtsZb3g4VwmkZUEuU/jy5nBUpxv54B6NjkvMxCVx9M/zviiTSZt+yRDaMySISxB
/3Y9FP7R/3Rcf1ZXYGK32hmQ55pDlbcM0gCEFQIDAQABAoIBAD0uSFweiMfc1unx
2W7R1sFfN1C4p8nev+9CNKIvTUpe2Qp0m9GdJZYjsUKo8Ts6jpfSZKgcom/SIzL3
S0WjVR4+t2u9IxAji8I2FKpdgEFY1uxd5MeENn1VCseFjfhlqqv/4RQN/nPjmhlG
CKxhpYs98vPOPQf70phe+1Y0ludtEztiJEM7viIsF8PLlCwf6P7S1JFIXXOAo+xQ
JAHt3AlzUj+HVfq97SbS+cbhuR/MwvIMQs54AsyPOVtt1Q7AOniDw/bnX8JpE9mU
diww6KHn/qQIB0DSWgvfyGwC6qM6C3nUv+EyybdJBcEsYAUH3SgZpBvu3smT2XN9
MCAFegECgYEA524LrSj57hPSKdGO3RT/jVReq0fHJscqSELHAl40lPSKQm+vFK2L
Z20jnQhPg9ebJQjqdkZ/J8EHuwuZjtiqYAeWUERcp5cEEm/BQZ5fB+vYlTZ+QXNa
S6Z9ex2/+qBwY8bJeZR5LPEzVN2cENH8t6FiJO1/csgS3T+KAxnGZoECgYEAz9Ri
CyGwoJs9IpEb3y9Q1AVeFvUQ47XQGJo4xD5nivJ3W/4XApajJl6hXoVp96Z0gXIR
Hhqp+/d4MOlDSeAUPeHcW6gE0h8BYl25fXbvXSpA7rSv8QU+BtQ4vMpsKF5bpRNt
vQjeJrPtHLuFJrOZ6yzov3s4EXlt0AbOBlWXW5UCgYEAvmn6zXRjfxFr3+B97UUz
pnL+mWqrXyqLjXz0BOzB0rUJdPQzV44anvRbUv7dfZrOGcCmOL50LJ9T3wACTlfS
hsR3Vn+IxJMqVIkCtxy5D+lrAAogA3YHmyrXH48wv+N11YJfjtssgF/MXk0f9W7w
wZ3VBJEsRaJ8cvGuejKg3QECgYEAzvoAun1O3mQ8OlSxoVAJ+11tGwftThofqKDO
sAJGNEbNQDyIxfcnfGr54pyTsCOCG/hxu71qVJlchbmJXeVfw1FQl6d5RZnDUyds
N9te/zW5fQFNx4clAsAP0VT26i0ur/PtcjmGpJzEI71NGgH75A7RrQEWEbERAAAG
5qAPIRECgYEAjpNyIsvDYcEtBj/oCQCa3FdPsGqRaYmBZLqJ4nCP5DolYgJkewKx
n5+AIYsXYYKB7W4a0uPKN6gMVVAkm0Icletpf9UpT51uMSR5JpqIwqOFNgI0+NkV
+jlerYcD909WjV3OqrwZm7yPqwa2RPkIfCbeHnXbkAcv+DuWn4L8RdI=
-----END RSA PRIVATE KEY-----
系統管理
–>系統設置
,找到以前安裝的Publish over SSH
插件,Passphrase
填寫以前生成祕鑰時設置的密碼,沒有則留空,Path to key
留空,Key
粘貼/root/.ssh/jenkins
文件內容。
而後新增SSH Servers
,填入對應的hostname,這就是PHP代碼要發佈的機器
接下來還須要把公鑰拷貝到對應的hostname機器(lzx1)上
# cat jenkins.pub
到lzx1上粘貼jenkins.pub
# cd ~/.ssh/
# ls
authorized_keys
# vim authorized_keys #寫入下面內容
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC74fs04C+s9hbA0+6vrhzBlgnPzQxl2ZA/jgonLVlyqx+ZrC1rGNuDNlI/JdIz18OqjfZ1Hg5Hw92oV2dINZTyBeXa2BNyxSLL7L7VMHtl2DOYjxksAAYpCytY4UwEH0YJ8GUAvp4aDieeydzhsNPawmFm7OB9b+orkDJZIIibbC98XDnWbZZxqyVHM3AaSDZwUri25jRmSIX9R8D5gLzxECFJuMUPkVAovNIeaRlvFtIYLT1xi2xlveDhXCaRlQS5T+PLmcFSnG/ngHo2OS8zEJXH0z/O+KJNJm37JENozJIhLEH/dj0U/tH/dFx/VldgYrfaGZDnmkOVtwzSAIQV root@lzx
lzx上登陸lzx1測試
# ssh lzx1
root@lzx1's password:
Last login: Thu Sep 20 20:51:25 2018 from 192.168.33.1
#exit
logout
Connection to lzx1 closed.
[root@lzx .ssh]# #ssh登陸沒問題
瀏覽器上測試鏈接有沒有問題,點擊Test Configuration
,若是沒問題,左側會顯示Success,以下圖
這就說明咱們前面的配置是沒問題的。點擊應用
,出現「已保存」
若是有多臺web server ,能夠繼續新增,重複以上操做,最後點擊保存
。
回到首頁,點擊建立一個新任務
,自定義任務名稱,選擇構建一個自由風格的軟件項目
點擊肯定
描述自定義;源碼管理選擇Git(若是使用SVN就選擇Subversion);Repository URL選擇本身公共倉庫的地址,這裏爲了方便我使用別人的公共倉庫;Branches to build默認爲*/master,意思是發佈代碼的分支爲master分支;構建觸發器和構建環境留空;構建選擇Send files or execute commands over SSH,Name選擇對應的服務器,Source files填入**/**,表示要發佈的代碼爲所有文件,Remote directory填入/tmp/jenkins_test(自定義一個存放PHP代碼的文件夾名),Remove prefix和Exec command能夠留空
點擊Add Server
能夠增長更多臺服務器,在生產環境下一般也是多臺服務器一塊兒發佈代碼。點擊保存
點擊左側當即構建
,會出現構建歷史
,其中#1
表示第一次構建
點擊#1
,點擊控制檯輸出
能夠查看構建成功,一般構建完,不論是成功仍是失敗都會有郵件通知。這裏由於沒有配置郵件,因此沒辦法接收到郵件。
到lzx1上查看
# ll !$
ll /tmp/jenkins_test/
total 100
drwxr-xr-x 2 root root 66 Sep 21 02:42 D11Z
drwxr-xr-x 2 root root 260 Sep 21 02:42 D12Z
drwxr-xr-x 2 root root 24 Sep 21 02:42 D13Z
drwxr-xr-x 2 root root 4096 Sep 21 02:42 D14Z
和咱們發佈的源是一致的,以下圖
若是在源上面作了變動,繼續點擊當即構建
,若是構建成功,那麼在目標機器上也能夠看到變動的內容。
系統管理
→ 系統設置
,找到郵件通知
進行配置,這裏我使用的是163郵箱
發郵件的地址必須與管理員地址一致,不然發郵件會報錯。同時必須在163郵箱設置受權碼,而且在上面設置密碼的地方填入該受權碼,否則也是發送不了郵件。
點擊Test configuration
,若是顯示爲「Email was successfully sent",說明郵箱配置成功
到163郵箱查看是否收到剛剛測試的郵件
收到了,郵件配置成功。點擊保存
,進入到以前的任務中,點擊配置
找到構建後操做
,選擇E-mail Notification
,Recipients
這裏填入接收郵件的郵箱地址
勾選保持默認便可,點擊保存
如今來測試,故意讓構建不成功,看是否能接收郵件。
回到瀏覽器,點擊當即構建
,查看控制檯輸出
:
到163郵箱進行查看:
郵件收到,郵箱配置成功。
但這樣有一點很差,只有構建失敗纔會發郵件提示,我想讓它無論構建成功仍是失敗都發郵件提示。