1. 程式人生 > >持續整合之將程式碼自動部署至測試環境

持續整合之將程式碼自動部署至測試環境

將程式碼自動部署至測試環境

一:本文在上一篇文章的基礎之上繼續進行操作,上一篇實現了從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

[email protected]
The key's randomart image is:
+--[ RSA 2048]----+
| ...o |
| ...+ |
| ... |
| . ... |
| S o..E. |
| o.o .+. |
| ..oo . +.|
| oo.. + o|
| .o + |
+-----------------+
[[email protected] ~]$ cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDIvExDg2tXu3+XZVdjxuur/orC0C9G1vGFKd5c67mOkiJE+OI1eyDl4yoqsabJbp7aHJEDomfO7MjoJSQEQdhebgpCvG7/ron5IoF7Ql3RllhObDHmRmjhSuHbZqJCpM2qqIejkdwM4qpnkFcJUxOZLgdKfiVfNIaAjkY3BUbyKrt64GZ4pykoZXqTLX7fDHAOqzUJqy3IuCLhk0judRdlUWayWnrXOrBGXfuKiBuXiFIxhKbDvDr93ZldqcGXXCmscTLIlQ+yFAEeb11K+/z0uEQU6l9sKD4i8v5503KiFSVWSSfL40ZBFWcP20nK3prRH5CFD2piWbLPQBYVhzpL
[email protected]

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

[[email protected] ~]$ cat .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDIvExDg2tXu3+XZVdjxuur/orC0C9G1vGFKd5c67mOkiJE+OI1eyDl4yoqsabJbp7aHJEDomfO7MjoJSQEQdhebgpCvG7/ron5IoF7Ql3RllhObDHmRmjhSuHbZqJCpM2qqIejkdwM4qpnkFcJUxOZLgdKfiVfNIaAjkY3BUbyKrt64GZ4pykoZXqTLX7fDHAOqzUJqy3IuCLhk0judRdlUWayWnrXOrBGXfuKiBuXiFIxhKbDvDr93ZldqcGXXCmscTLIlQ+yFAEeb11K+/z0uEQU6l9sKD4i8v5503KiFSVWSSfL40ZBFWcP20nK3prRH5CFD2piWbLPQBYVhzpL [email protected]
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCsYf1pLYFBUhThXz5pqPMl9TVJxzKEkB/6vImEcDnBqDhrWZe+OqIWp+GTbkHNcXDejD1pBvvQScPIuxlz/r7OEBRTpTjmZOAaLCRMljhx2iMsgTdyjSqZFXMAXRI+F/ZPKKypDW2ZLMLjyqB6ZHK+9/SIMVGwzw/Ey3kqAQovI7UQMoL/59xjah+9zNGboTpZI613LX5vrgCghWUS5NHxU/DNUWjaxFuYJqr7ELKVrG/vZJcbtwmGpRDcCq03Kl2Mz0lHhkGZVDHWqhIPcyRjKrDh0/WqaTlPuIYZ3bZu33aQSxXV5GMGv6VqfIkYVU0uFewL4znPKFPa1z4mAJpR [email protected]

1.3.2:確認可以免密碼遠端登陸:
使用root和www使用者測試一下是否可以免祕鑰登陸,以便讓部署伺服器將使用者的key新增到know_keys,否則報錯Host key verification failed

ssh [email protected]
ssh [email protected]

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目錄下):

[email protected] $ vim dep.sh

#!/bin/bash
cd /home/www/web-demo_deploy/ #進入到原生代碼庫
git pull #從git伺服器更新程式碼
scp -r ./* [email protected]:/webroot/web_www #將程式碼部署至web伺服器
scp -r ./* [email protected]:/webroot/web_www
[email protected] $ chmod +x dep.sh

1.3.3.2:在jenkins呼叫指令碼:
#在專案的構建步驟呼叫,專案-配置-構建-增加構建步驟-Execute shell

訪問web頁面測試:

在git倉庫建立程式碼並更新至git伺服器:

[[email protected] web-demo_deploy]$ vim index.html # 新增www.chinasoft.com
[[email protected] web-demo_deploy]$ git add index.html
[[email protected] 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(-)
[[email protected] 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 [email protected]: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:測試,執行程式碼測試專案成功之後是否會自動執行程式碼部署專案:

控制檯輸出

1.6:pipeline外掛:
1.6.1:#安裝外掛,系統管理-管理外掛-可安裝外掛:

1.6.2:建立檢視:

1.6.3:自定義名稱:

1.6.4:配置pipeline資訊,點選OK之後,彈出如下檢視

點選儲存之後顯示的最終介面: