關於gitlab+jenkins自動部署代碼的實現


本人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自動部署代碼到多台服務器。

 https://www.cnblogs.com/lz0925/p/10860460.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM