1. 程式人生 > >在滴滴雲上使用 Jenkins 搭建基於 GitHub 的持續整合環境

在滴滴雲上使用 Jenkins 搭建基於 GitHub 的持續整合環境

簡介

Jenkins 是一個可擴充套件的持續整合引擎,主要用於持續、自動地構建/測試軟體專案,還可用於監控一些定時執行的任務。

本文將介紹如何在滴滴雲上,使用 Jenkins 作為持續整合伺服器,Git 倉庫作為程式碼儲存庫,實現工程的自動構建、部署等過程。

安裝

以下均基於滴滴雲 CentOS 7.4 映象進行安裝。

yum install -y java-1.8.0-openjdk   //首先安裝jdk1.8或以上版本
sudo wget -O /etc/yum.repos.d/jenkins.repo http://jenkins-ci.org/redhat/jenkins.repo  //需要新增jenkins的yum源
sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
yum install -y jenkins               //安裝jenkins

執行

執行以下命令,啟動 Jenkins 程序:

systemctl start jenkins

服務啟動後,檢視 /var/log/jenkins/jenkins.log 得到管理員密碼。

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

9811815bdf454944aea7a505de2c1d30

This may also be found at: /var/lib/jenkins/secrets/initialAdminPassword //也可以在這個目錄下找到管理員密碼

Jenkins 預設監聽 8080 埠,也可通過修改配置 vim /etc/sysconfig/jenkins 更換。
通過 http://公網IP:8080 來訪問。

這裡出現了無法訪問的情況:netstat -anp | grep 8080
檢視程序存在,原來是被安全組攔住了,在滴滴雲介面上新增一條安全組規則允許 8080 埠訪問。
在這裡插入圖片描述

再次訪問,可以登入,輸入之前獲得的管理員密碼進入 Jenkins 的 web 頁面。
在這裡插入圖片描述

安裝外掛、設定使用者資訊、設定 Jenkins URL 後,終於登陸到 Jenkins 主介面。
在這裡插入圖片描述
安裝完成後,接下來開始自動部署的配置。

使用 Webhook 方式實現自動部署

生成 GitHub Access Token

首先,為了使 Jenkins 能夠正確訪問 GitHub 的 API,在 GitHub 頁面上依次點選 Setting ->Developer Settings -> Personal Access Token -> Generate new token
在這裡插入圖片描述
在這裡插入圖片描述

選擇 repo 和 admin:repo_hook 兩種許可權,第一個是為了正確訪問GitHub 倉庫,第二個是為了使用 GitHub 的 hook 機制來實現對程式碼更新的感知。
在這裡插入圖片描述

生成好的 Token 如圖所示,此 Token 只能在生成時看到,如果關閉頁面就無法再看到了,所以要謹慎儲存。
在這裡插入圖片描述

配置 Jenkins 的 GitHub 外掛

對於 Jenkins 的 GitHub plugin,之前在初始化 Jenkins 進入介面之前一般會預設勾選,並自動安裝這個外掛。如果沒有安裝也可以在 Jenkins 的 系統管理->外掛管理->可選外掛 中找到 GitHub plugin 這個外掛。

安裝完畢後,需要在 系統管理->系統設定->GitHub 選項卡中新增一個GitHub Server,點選 Add GitHub Server
在這裡插入圖片描述

選擇新增憑據,選擇 Secret Text 型別,並把剛才在 GitHub 上獲取的 Access Token 填入,點選新增。
在這裡插入圖片描述

新增完畢後,在 Git Server 一欄選擇剛才新增的 Secret Text,然後點選連線測試,提示: Credentials verified for user xxx, rate limit 4998 ,表示連線成功。
在這裡插入圖片描述

新增構建任務

在 Jenkins 介面上,選擇新建任務,選擇構建一個自由風格的軟體專案。
在這裡插入圖片描述

勾選 GitHub 專案,填入需要自動構建的 GitHub 專案地址。
在這裡插入圖片描述

在原始碼管理一項,勾選 Git。填入專案地址,並在 Credentials 項新增一個有訪問許可權的賬戶。在 原始碼庫瀏覽器 一項選擇 githubweb,並依舊填入專案地址。
在這裡插入圖片描述

為了實現 push 自動構建,還需要在構建觸發器中選擇 GitHub hook trigger for GITScm polling ,並在構建環境中選擇 Use secret text(s) or file(s) 新增之前編輯的 Secret Text(Access Token) 。
在這裡插入圖片描述

接下來編輯具體專案的構建命令。我在這裡使用的示例程式碼是基於 Go 語言的,向頁面發起請求會返回當前 IP 以及版本號。

export GOPATH=/home/dc2-user/gopath     //設定GOPATH
rm -rf $GOPATH/src/github.com/songtm93/deployExample
ln -s $JENKINS_HOME/workspace/deployExample $GOPATH/src/github.com/songtm93/deployExample   //連結
cd $GOPATH/src/github.com/songtm93/deployExample
rm -rf ./output/*   //刪除上次編譯輸出
go build -v -o output/deployExample main.go //編譯
make stop   //停止上次程序
./output/deployExample &    //執行

選擇 構建步驟->執行shell ,編輯構建命令。
在這裡插入圖片描述

Jenkins 的工作空間為 JENKINS_HOME ,預設為 /var/lib/jenkins ,可以在 系統管理->系統設定->主目錄 下看到。
Jenkins 儲存所有的資料檔案在這個目錄下,可以通過設定 JENKINS_HOME 環境變數或者更改 Jenkins.war 內的 web.xml 設定檔案來修改。這個值在 Jenkins 執行時是不能更改的,這裡不做修改,將 Jenkins pull 下來的程式碼作軟鏈到 $GOPATH 目錄下確保程式能夠正常編譯。

執行構建

至此一個簡單的自動構建專案已經配置完畢。點選自動構建進行第一次構建。
在這裡插入圖片描述

這裡普遍會遇到一個問題,在 Jenkins 的構建過程中,使用 shell 啟動 web 服務程序後,在構建任務完成時,Jenkins 會把構建中啟動的所有子程序殺掉,導致 web 程序也 down 掉了。這個問題可以通過在執行 web 程序的命令前臨時更改構建任務的 $BUILD_ID 來解決。

OLD_BUILD_ID=$BUILD_ID  //記錄當前BUILD_ID
BUILD_ID=DONTKILLME     //更改當前BUILD_ID
make run                //啟動web程序
BUILD_ID=$OLD_BUILD_ID  //改回BUILD_ID

提示構建成功後,訪問對應的滴滴雲主機 IP+ 埠,終於得到正確的返回值。

{"ip":"10.255.20.171","version":"1.0"}

更改當前版本號為"2.0",並 Git push,成功觸發了自動構建。
在這裡插入圖片描述

使用 Publish Over Ssh Plugin 實現批量自動部署

安裝 Publish Over Ssh Plugin 外掛

在 Jenkins 執行構建完畢後,可以使用外掛實現批量自動部署到多臺伺服器。首先,在 系統管理->外掛管理->可選外掛 中找到 Publish Over SSH 外掛直接安裝並重啟 Jenkins。

配置 Publish Over SSH

首先在控制檯建立兩臺 DC2,作為程式碼釋出的目標節點,由於是內網訪問,可以使用內網 IP,以之前建立的那臺 DC2 為跳板,因此不建立 EIP 例項。
在這裡插入圖片描述

然後在 系統管理->系統設定 中找到 Publish Over SSH 的配置項,選擇新增 SSH Server。這裡 Passphrase 為目標伺服器的登入密碼, Path to key 和 key 為可用於登入目標伺服器的 sshkey 私鑰。但要注意在密碼和私鑰兩項中,如果填了私鑰就會預設優先使用私鑰登入,若沒有事先拷貝公鑰到目標伺服器,則會一直導致登入失敗,筆者就遇到了這個問題。

配置完畢後,點選 Test Configuration 可以測試是否可以連線目標伺服器。
在這裡插入圖片描述

另外,也可以在具體的 SSH Server 下新增對應其的密碼或私鑰。注意 Remote Directory 裡必須填此使用者有許可權的目錄。
在這裡插入圖片描述

配置自動構建任務

更改好配置後,回到剛才的構建任務, 更改配置->構建後操作->增加構建後操作步驟->Send build artifacts over SSH
在這裡插入圖片描述

這裡選擇剛才新增的目標伺服器,並編輯配置。
在這裡插入圖片描述

執行

配置好服務後,之後就可以驗證自動部署的叢集是否可以正常工作了。使用 SLB 能夠方便的進行節點間的負載均衡,在控制檯建立一個 SLB 例項。
在這裡插入圖片描述

建立好 SLB 之後,多次請求 SLB 的 EIP,看是否能夠將請求分發到不同伺服器上,以及不同伺服器是否均部署完畢:

curl http://117.51.157.199/
{"ip":"10.255.20.171","version":"2.0"}
curl http://117.51.157.199/
{"ip":"10.255.20.47","version":"2.0"}
curl http://117.51.157.199/
{"ip":"10.255.20.154","version":"2.0"}
curl http://117.51.157.199/
{"ip":"10.255.20.171","version":"2.0"}
curl http://117.51.157.199/
{"ip":"10.255.20.47","version":"2.0"}
curl http://117.51.157.199/
{"ip":"10.255.20.154","version":"2.0"}

證明叢集的自動部署均已成功。

參考

  1. Jenkins 使用 Publish Over SSH 外掛實現遠端自動部署

  2. Jenkins linux 作業系統一鍵部署多節點

  3. 構建基於 Jenkins + GitHub 的持續整合環境

  4. 實戰:向 GitHub 提交程式碼時觸發 Jenkins 自動構建

  5. 解決 Jenkins 自動殺掉程序大坑