本人PHP開發者,項目組大多是PHP,少量java項目。
因公司目前服務器和項目的管理比較混亂,與領導商量后,決定嘗試 gitlab+jenkins自動化部署(之前用的svn FTP手動部署代碼),解放生產力。
其實僅gitlab自己就可以實現代碼的自動化部署,gitlab有自己的CI,甚至只用gitlab的webhook(新版本叫 Integrations )+ 服務器端shell腳本就可以實現自動化部署。
但我們為什么還要用jenkins呢,
1、提供一個可視化的操作界面,對部署結果一目了然,運維與開發人員不需過多的參與。
2、便於管理,當公司的項目足夠多的時候,jenkins的好處更明顯,多項目,多分支,分布式服務器節點,等等。如果沒有一個管理軟件,后期就是一個災難。
嘗試之前, 你最好做過webhook鈎子函數調用shell命令自動部署或者對於git的分支了解的比較透徹。
PS:由於第一次做jenkins,忘記截圖,所以圖全是盜的。。。哈哈
前置條件:
1、gitlab的搭建和使用,參考之前的博客 https://www.cnblogs.com/lz0925/p/10768048.html
2、git的安裝和秘鑰的配置:
https://www.cnblogs.com/lz0925/p/10791147.html git在linux下的安裝
https://www.cnblogs.com/lz0925/p/10794616.html git的公鑰和私鑰的配置
完成以上兩步后,開始安裝jenkins (ps: 嘗試了下docker安裝,但是找不到最新版本的jenkins,導致各種報錯,無法進行,最終選擇正常模式安裝)
1、jenkins的安裝
(1)、首先安裝java環境 (2019-05,在centos7.5上使用這個版本的java環境就可以)
yum -y install java-1.8.0 java-devel-1.8.0
(2)安裝jenkins
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 或者用service命令
(3)修改端口號(PS:如果不需要修改則直接看第四步)
#新版和舊版所在文件不一樣 vim /etc/sysconfig/jenkins #我們使用新版 #舊版貌似在 vim /etc/init.d/jenkins #進來后查找 JENKINS_PORT="8080" #我的在56行,因個人愛好,修改成9999
systemctl restart jenkins #如果修改端口,則重啟服務
(4)訪問jenkins
通過瀏覽器 http://IP:8080 訪問 jenkins
第一次登陸需要初始密碼,密碼位置圖片上有,密碼在安裝jenkins的時候也在命令行給出來過
cat /var/lib/jenkins/secrets/initialAdminPassword
點擊continue
(4)選擇安裝的插件:
可以選擇 Install suggested plugins 默認安裝, 也可以只安裝 gitlab plugin,git plugin,還有ssh plugin插件。
gitlab 和 git 插件用來與gitlab溝通進行拉取代碼等代碼管理工作。
ssh插件,可以讓jenkins在其它的遠程服務器上執行shell命令
這里我選擇默認安裝, 然后等待安裝完成(jenkins版本低的安裝插件會失敗),我后來換了最新版本,一次全部成功
(5)設置賬號密碼
密碼創建完成之后就可以登錄jenkins了。
(6)繼續安裝插件
如果在安裝jenkins的時候沒有安裝相關插件,可以按照如下方式安裝(已經安裝,則不需要)
直接在系統管理>插件管理中搜索gitlab或SSH相關插件安裝即可
2、jenkins秘鑰配置
(1)jenkins生成密鑰對 設置jenkins 的shell終端為 /bin/bash
grep jenkins /etc/passwd
jenkins:x:993:990:Jenkins Continuous Integration Server:
/var/lib/jenkins
:
/bin/bash //有的系統中最后 /bin/false 修改成 /bin/bash 即可
切換到jenkins用戶,生成秘鑰,因為權限問題,有的博客說修改jenkins的默認用戶為root,我個人並不推薦
[root@node1 ~]# su - jenkins bash-4.2$ ssh-keygen -t rsa bash-4.2$ cat .ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCwIdUk3+V8aL2/oMfvwCxp5AiyctL4bnYFnsKOcQz8w/MuAehy9/EEeT0HNQCSs0NQ3veFurWlKUB4tntNA7bMcZS/UWBSXh2uAJQCMcXbIWfdngaQwVVP+s5WvDbtL5Jk6mQch22aIIw4JaJh4L8dl1oyviwoBgOnscXVC/kDWgFM4BrHC4QNyzt6PdtuzX3RkMa4w7bqDvUWMqIyRBScW1fbfJeAwAK1tCQ7ZjfAoTcWpmoBlurH1P6SuWR3rYIPyhGDqjPQnlohqSX/vCrLWoHoYazETHfW2azzzBSGqMeCw3hlbSV/12kRQv0kGfnbhmnHZ1CBgX23N3ktqtzL jenkins@node1.fblinux.com
把這個密鑰添加到gitlab還有jenkins服務器的root用戶,這里建議 gitlab 和 jenkins不在一台服務器,不然設置秘鑰時,可能會有點暈。
(1)添加公鑰到gitlab服務器,用來clone代碼
添加完之后,從gitlab服務器clone下自己的工程,會在.ssh/known_hosts添加gitlab服務器記錄
-bash-4.2$ git clone ssh://git@192.168.50.41:22root/jenkins_test.git
(2)添加公鑰到jenkins服務器的root用戶,將來可能用來執行部署腳本
在jenkins的workspace目錄下執行
-bash-4.2$ ssh-copy-id -i .ssh/id_rsa.pub root@172.168.50.41 root@172.168.50.41's password:
3、jenkins觸發式構建
PS: 需要在全局工具配置中,設置一下git命令的執行路徑
(1)准備一個測試腳本,並不做實際的工作,如有需要直接在腳本內執行業務腳本
vim /shell/deploy/test/jenkins_trigger.sh //文件名隨意 #!/bin/sh -l echo "部署腳本被執行" > /root/test.txt echo "測試\n" >> /root/test.txt
(2)常見一個觸發構建的項目,選擇自由軟件風格,名字跟上面部署腳本的名字一致,保持一一對應
(3)源碼管理選擇git, 然后在repository url中輸入git倉庫地址,這里我新建了一個專用的測試項目(PS:注意分支,根據需要填寫分支,與(7)中gitlab填寫的分支對應)
下面的Credentials 是憑據, 需要自己添加,選擇ssh那個,只需把自己jenkins目錄下/var/lib/jenkins/.ssh/id_rsa 中的私鑰填上去就行,其他選項隨意填。
如果執行仍然報權限問題,請將 jenkins加入到root組中 gpasswd -a root jenkins 試一下。
(4)構建,選擇execute shell,執行部署腳本即可,
這里我們執行剛才的 /shell/deploy/test/jenkins_trigger.sh 文件
(5)觸發器配置:即gitlab有提交操作,則自動部署,這里只需要設置一個認證的token即可,這個token就是gitlab那邊也要用一下,可以自己隨意設置
gitlab調用觸發器,需要使用 JENKINS_URL/job/new_cms/build?token=TOKEN_NAME即可
(6)在系統管理–>用戶管理–>查看用戶id和token,需要把用戶id和API Token加入觸發器中,做用戶驗證,這里的apitoken 和 上面的 任務中的token 不一樣,這個更全局一些, 任務中的token 只針對一個任務。
另外在用戶管理生成apiToken時,需要立即保存, 不然就找不到了,還得重新生成一遍。此處的APIToken,用來憑借觸發url用的。
根據第五步和第六步的觸發器驗證令牌和用戶id+token 等信息組織成一個連接,gitlab在有push事件時訪問該連接,jenkins就可以執行自動化構建
http://lizheng:32cb9d7fe2e0534cebb3a4d924a96be905@172.168.50.41:9999/job/jenkins_trigger/build?token=hehe
(7)gitlab配置webhooks(現在目錄名稱為 Integrations ),每次提交代碼就訪問這個url,執行構建
(This URL will be triggered by a push to the repository , 再下面有個輸入框,要與(3)中jenkins填入的分支名稱一致)
URL這里輸入上面上面用戶ID+API token+job token生成的URL地址即可。觸發工作選擇,push event,merge request event即可。
如果報錯: url is blocked: requests to localhost are not allowed,解決方法如下,各個版本所在目錄不同,但都叫做Outbound,找不到的自己多找找
(8)在jenkins全局在jenkins全局安全設置中取消勾選“防止跨站點請求偽造,不然jenkins會認為gitlab的請求不合法。
(9)添加完成測試:在gitlab剛添加url的頁面點擊test模擬提交操作,看看是否會執行自動構建,(PS : test上面那個Enable SSL verification 按鈕, 取消勾選)
如果執行成功會返回如下顯示,說明執行鈎子成功(push事件觸發了鈎子函數,訪問上面的url,觸發了jenkins的自動構建)
Jenkins查看 控制台輸出,可以看到構建也是成功的。
到這里為止,代碼已經可以自動化部署到我們的jenkins所在的服務器,目錄為jenkins的workspace目錄(可自行修改)
感覺並不是想象中的那么隨心所欲,難道我要在每台服務器上都部署一遍jenkins嗎?顯然不科學。
下面講一下如何通過一台jenkins服務器構建后將代碼分發到其他的遠程服務器,即jenkins自動部署代碼到多台服務器。