web前端jenkins自動部署pipeline用法
前言
在前端開發專案中,我們可能會遇到很多頻繁重複的工作,尤其是是測試環境的缺陷修復與發版。手動部署多臺伺服器,也是一個體力活。而且很多公司規模並不是那麼大,可能沒有專門的團隊來做這件事。這個時候我們就需要一個自動化的工具,來提高我們的效率。最典型的工具就是Jenkins。 接下來,我們講探究一下怎麼使用jenkins部署。本次內容,我們將學習或者鞏固到如下知識點:
- 如何新增並啟動一個節點伺服器
- 運維神器【ansible】命令批量部署多臺伺服器
- Linux系統下java環境搭建規範(本文中Linux 是CentOS 的發行版)
- pipeline流水線方式部署的基本語法
〇、必備的環境及條件
- 若干Linux伺服器(伺服器之間最好能免密訪問)
- 已經搭建好的jenkins平臺
- 已經搭建好的git程式碼倉庫
- 勤勞的雙手
一、新建節點
節點,簡單來說就是一個拉取你的最新程式碼執行打包構建的伺服器。
【Manage Jenkins】--> 【Manage Nodes and Clouds】
節點列表頁面【新建節點】,節點命名 為 h5-slave,與配置填寫。
,指定工作目錄。(此處指定為/mnt)
配置填寫完畢,點選儲存,即返回到了節點列表頁面:
我們可以發現外面剛才見 h5-slave節點 有個紅色的叉,表面該節點不可用。服務還沒啟動。此前無法作為jenkins構建。
二、啟動節點伺服器
從節點列表點選該節點,進入到節點明細頁面我們可以看到如下
在瀏覽器中啟動節點 在命令列中啟動節點 java -jar agent.jar -jnlpUrl http://xxx.xxx.x.x:8080/computer/h5-slave/slave-agent.jnlp -secret 8973d1ffe40afad5d9003cbf5ae3639dc49626e89567845cb5aabb2ac75cedc4 -workDir "/mnt" Run from agent command line, with the secret stored in a file: echo 8973d1ffe40afad5d9003cbf5ae3639dc49626e89567845cb5aabb2ac75cedc4 > secret-file java -jar agent.jar -jnlpUrl http://xxx.xxx.x.x:8080/computer/h5-slave/slave-agent.jnlp -secret @secret-file -workDir "/mnt"
這像是一個操作指引,告訴我們在節點伺服器執行如下命令即可啟動成功。 同時,我們要想啟動節點伺服器,必須要具備如下環境與條件:
- java 環境
- 下載agent.jar包
nodejs環境對於web前端開發來說再熟悉不過了,但是Linux系統下java環境怎麼部署呢?也需要一個規範。這裡可以給出一個參考給大家:
java環境搭建
- 1、檢查是否已經安裝java環境
java -version
// 或者
yum list installed |grep java
從這個命令可以看到,我們確實沒有安裝java環境
- 2、下載依賴包,並解壓
首先,我們到官網上下載jdk8的穩定版本Jdk官網,開啟這個頁面,我們可以看到如下:
這些版本看起來眼花繚亂的,但是我們注意以下幾點:
- Linux ARM 針對移動端平臺的linux系統
- Linux x86 32位的
- Linux x64 64位的
一般情況下,選擇Linux x64就行了。
這裡下載也可以通過兩種方式下載:
- 規規矩矩的下載tar.gz檔案到本地,然後通過FTP上傳到Linux伺服器。
- 在Linux伺服器上直接通過wget命令下載。(前提是開通了網路許可權)。或者有內網的依賴包,類庫管理站,直接內網下載。
注意:這裡官網下載需要你註冊賬號,登入
我們將jdkxxx.tar.gz放到/usr/local
目錄下,然後解壓
// tar.gz檔案解壓:
tar -xzvf jdk.xxx.tar.gz
// zip檔案解壓
unzip jdk.xxx.zip
// 如果沒有zip命令,可以安裝
yum install unzip -y
- 3、配置jdk環境變數
開啟配置檔案
vi /etc/profile
在最後兩行新增:
export JAVA_HOME=/usr/local/jdk-xxxx
export PATH=$PATH:$JAVA_HOME/bin
隨即,我們讓配置生效
source /exr/profile
- 4、驗證java環境是否裝成功
利用第一步中的命令:
java -version
// 或者
yum list installed |grep java
下載agent.jar包
- 1、右鍵,複製超連結
- 2、到節點伺服器上、任意路徑上,下載
wget [右鍵複製超連結後的url]
- 3、啟動節點伺服器
拷貝此前新建節點後頁面提示的一長串命令,然後用nohup方式 啟動即可。
nohup java -jar agent.jar -jnlpUrl http://1xx.xx.1.2:8080/computer/h5-salve/slave-agent.jnlp -secret
2eb8b373985964a61d4a8fa40cd8b452bd575704254292510a2aeec4da18adfb -workDir "/mnt"&
注意:前面有一個nohup,結尾有一個&,且&前面不要有空格
節點啟動成功後,我們即可用該節點自動部署了。
四、新建item
- 1、【jenkins】 -->【新建item】-->【流水線】,點選確認
- 2、在配置中,其他先不管,只填寫【流水線】
填寫完後,一定要記得點選【應用】或者【儲存】。
我們來看看流水線的標準語法結構:
pipeline {
agent {
label '[節點名]'
}
stages {
stage('process name 1') {
steps {
// Get branch lastest code from a GitHub repository
echo 'pull code start: get latest code'
git branch: '1.0.0',
credentialsId: '59d70ec8-6236-4bba-add1-15447d212d62',
url: 'https://gitlab.xxx.com/hjqh/future-am-admin.git'
}
}
stage('process name2') {
steps {
}
}
stage('process name3') {
steps {
}
}
}
}
具體實際的配置,我們可以參考如下:
pipeline {
agent {
label 'h5-slave'
}
stages {
stage('Pull code') {
steps {
// Get branch lastest code from a GitHub repository
echo 'pull code start: get latest code'
git branch: '1.0.0',
credentialsId: '59sssc8-6236-4bba-add1-15447d212d62',
url: 'https://gitlab.xxxx.com/hjqh/future-am-admin.git'
}
}
stage('Build') {
steps {
// Get branch lastest code from a GitHub repository
echo 'build start......'
// 安裝依賴
sh 'npm install --registry=https://registry.npm.taobao.org'
// 打包構建
sh 'npm run build'
// 重新命名打包名
sh 'mv dist ./admin'
// 壓縮,方便更快傳輸到目標應用伺服器
sh 'tar -czvf admin.tar.gz admin'
// 控制檯列印
echo "build success..."
}
}
stage('Deploy') {
steps {
echo 'deploy start...'
// 用ansible命令備份應用伺服器上原有的檔案
sh 'ansible admin -i /mnt/hosts -m shell -a "mv /home/apps/admin /home/apps/backup/app-`date +%Y%m%d%H%M%S`"'
// 用ansible命令將節點伺服器部署包上傳至應用伺服器
sh 'ansible admin -i /mnt/hosts -m copy -a "src=/mnt/workspace/xxx/admin.tar.gz dest=/home/apps"'
// 用ansible命令操作應用伺服器,解壓應用伺服器上的部署包(解壓及完成部署)
sh 'ansible admin -i /mnt/hosts -m shell -a "tar -zxvf /home/apps/admin.tar.gz -C /home/apps/"'
// 用ansible命令操作應用伺服器,刪除節點伺服器上的部署包
sh 'rm -rf /mnt/workspace/xxx/admin.tar.gz /mnt/workspace/xxx/admin /home/apps/admin.tar.gz'
echo 'deploy success'
}
}
}
}
從上述的實際流水線指令碼,我們需要注意如下:
- 1、整個流水線語法的空格、縮排、換行,需要嚴格注意
- 2、一個stages裡面包含多個stage,可以理解為多個步驟
- 3、第一個步驟,一般都得指定git地址和分支、以及jenkins全域性配置的credentialsId 這樣才能拉取到制定分支的最新的程式碼。
- 4、執行shell命令 以sh 開頭,中間有空格,一行命令寫完後,注意換行。
- 用到了神奇的ansible命令工具。
理解ansible
首次看到ansible,是否是一頭霧水?先來看概念
ansible是新出現的自動化運維工具,基於Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程式部署、批量執行命令等功能。
從上述概念上,我們可以知道,ansible就是一個實現批量部署的工具。 假如你又10臺伺服器需要部署,部署的包、命令一模一樣,操作10次就太費勁了。引入ansible,就可提升效率。
1、下載安裝
yum install ansible -y
安裝後驗證一下:
ansible --version
2、新建一個ansible配置檔案
我們在節點伺服器的/mnt
目錄下,新建一個hosts檔案:
// 新建或者編輯hosts檔案
vi hosts
// 輸入如下配置,並儲存
[admin]
admin-01 ansible_connection=local
admin-02 ansible_connection=1xx.1xx.1xx.1
admin-03 ansible_connection=1xx.1xx.1xx.2
[h5]
h5-01 ansible_connection=local
h5-02 ansible_connection=1xx.1xx.1xx.1
h5-03 ansible_connection=1xx.1xx.1xx.2
從上述命令,我們可以推斷出這麼一個場景:
- 1、需要部署的應用系統有2個組,一個是admin,一個是h5,且每個組下面有三臺應用伺服器
- 2、ansible_connection=local 表示該jenkins節點,自己也同時作為一臺應用伺服器。
最終,我們的ansible配置如下:
3、ansile命令
由第二步,我們可以知道,ansible配置路徑為/mnt/hosts
,以此前我們用到的ansible命令為例
sh 'ansible admin -i /mnt/hosts -m copy -a "src=/mnt/workspace/xxx/admin.tar.gz dest=/home/apps"'
上述命令表示,將節點伺服器的mnt/workspace/xxx/admin.tar.gz
(src=xxx)檔案拷貝,批量上傳到admin這個組裡面的所有伺服器的home/apps
路徑下( dest=xxx)上去。admin這個組下面有哪些伺服器?通過-i /mnt/hosts
指定配置檔案來讀取。
sh 'ansible admin -i /mnt/hosts -m shell -a "tar -zxvf /home/apps/admin.tar.gz -C /home/apps/"'
上述命令,- m shell "[你的shell命令]"
,其實也很好理解。注意shell命令要有雙引號。
想了解更多的ansible相關的資訊,可點選Ansible中文權威指南。
五、jenkins構建
點選構建之前一定要確保節點伺服器 跟應用部署伺服器之間是免密訪問的(找運維人員處理即可)。 否者你的ansible命令就得重新寫,帶帶上登入使用者資訊才行。
再者,我們一直沒有強調節點伺服器搭建nodejs環境,這個也是必備的。 至於何如安裝nodejs環境,請參考Linux下nodejs環境搭建
我們開啟新建的item頁面,點選【build Now】
然後在構建任務列表,點選當前正在構建的任務
進入當前構建的詳情頁,--》【開啟 Blue Ocean】
我們可以看到上面的幾個步驟,就是我們流水線程式碼裡面的幾個stage,一一對應,模組層次分明。檢視構建日誌也方便,比傳統的Publish over SSH遠端部署方式要好很多。
結語
作為一個前端開發,我們應該學會用工具,來提升提升日常開發的效率。本篇以最繁瑣最笨的方式,來解決小公司小團隊的自動化部署問題。掌握了這種基本的技能,朝著devOps又更進一步了。當然,技術無所謂優劣,能解決你的實際問題的,就是好的技術。