Git/Maven + Jenkins + Ansible實現(xiàn)自動化部署與持續(xù)交付

自動化部署與持續(xù)交付

@[CentOS 7, Jdk 1.8, Git, Maven, Jenkins, Ansible]
日常工作中,每個程序員都會經(jīng)歷項目部署,而很多人在這時大多會經(jīng)歷以下環(huán)節(jié):

  • Git :分布式版本控制系統(tǒng),負(fù)責(zé)項目代碼的分支拉取與分支更新等;
  • Maven :項目管理工具,負(fù)責(zé)項目打包;
  • 項目部署 :日??赡苁褂胒tp方式傳輸項目包,Shell相關(guān)腳本部署,或者使用IDEA Alibaba Cloud Toolkit相關(guān)插件的部署功能等。

而以上內(nèi)容中比較傳統(tǒng)的方式有一個缺點,就是需要人為的銜接每一步,稍微掉以輕心,則部署就比較容易出問題。

而如今更需要一個自動化部署與持續(xù)交付的組合拳來分擔(dān)壓力,更為準(zhǔn)確和系統(tǒng)化的實現(xiàn)項目部署。接下來介紹一下Git/Maven + Jenkins + Ansible三劍客,能輕松解決這一難題,實現(xiàn)自動化部署。

簡單分析圖:


0.png

Git/Maven + Jenkins + Ansible自動化部署三劍客分工:

  • Git :分布式版本控制系統(tǒng),負(fù)責(zé)項目代碼的分支拉取與分支更新等工作;
  • Maven :項目管理工具,負(fù)責(zé)項目打包工作;
  • Ansible :自動化運維工具,實現(xiàn)了批量系統(tǒng)配置、批量程序部署、批量運行命令等功能;
  • Jenkins :持續(xù)集成工具,用于監(jiān)控持續(xù)重復(fù)的工作,通過插件管理來集成Git、Maven、Ansible來實現(xiàn)對應(yīng)功能;

接下來是文章目錄:

[TOC]

1. 版本清單

Item Version
CentOS 7
JDK 1.8
Python 3.6.5
Jenkins 2.204.1
Maven 3.6.3
Ansible 2.9.2

2. 安裝與部署

2.1 Jenkins安裝前的環(huán)境部署

1.png

2.png

生產(chǎn)環(huán)境中防火墻可能不能關(guān)閉,那么則需要放行相關(guān)程序所需要的端口(jenkins默認(rèn)為8080)

下載jenkins rpm包:

https://pkg.jenkins.io/redhat-stable/

2.1.1 jdk1.8安裝

參考鏈接中安裝jdk1.8的部分:
https://blog.csdn.net/qq_26368081/article/details/78984316

2.1.2 maven安裝

1.下載maven壓縮包
wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz

2.解壓mavan壓縮包
tar  -zxvf apache-maven-3.6.3-bin.tar.gz

3.查看maven版本號
進(jìn)入maven目錄
./mvn --version

2.2 Jenkins安裝與部署

3.png

JENKINS_USER = deploy表示jenkins的用戶
JENKINS_PORT = 8080表示jenkins的端口

啟動jenkins服務(wù):
systemctl start jenkins
開機自啟動jenkins服務(wù): 
systemctl enable jenkins

2.2.1 登陸jenkins管理平臺

接下來使用可以訪問到該服務(wù)器jenkins端口的電腦登陸:服務(wù)器ip + jenkins端口號
例如:http://192.168.10.132:8080

2.2.2 復(fù)制輸入初始密碼登陸

4.png
復(fù)制文件中的密碼
vi /var/lib/jenkins/secrets/initialAdminPassword

2.2.3 安裝插件

選擇推薦安裝的插件即可

2.2.4 創(chuàng)建管理員帳戶

創(chuàng)建平臺管理員帳戶

2.2.5 角色權(quán)限部署

0.目的:每個用戶只管理屬于自己的自動化部署項目
路徑:Manage Jenkins - Manage Plugins - 可選插件

1.安裝所需插件:
Role-based Authorization Strategy - 直接安裝
Authorize Project - 直接安裝

2.部署路徑:Manage Jenkins - Configure Global Security
按圖示開啟用戶登陸和選擇Role-Based Strategy策略

5.png

3.路徑:Manage Jenkins - Manage and Assign Roles

4.配置:

帳號準(zhǔn)備
新建三個帳號prod、test、abc分別表示生產(chǎn)環(huán)境帳號、測試環(huán)境帳號、未知帳號
路徑:管理平臺頁面 - 注銷 - 創(chuàng)建一個用戶帳號

配置Manage Roles
在Manage Roles中有兩種角色
Global roles:分配全局策略
Project roles:根據(jù)項目環(huán)境來分配項目權(quán)限

Global roles欄
可添加guest游客的角色,只賦予read權(quán)限(Overrall - Read),可查看全局的面板

6.png

Item roles欄
可根據(jù)環(huán)境(例如生產(chǎn)環(huán)境、測試環(huán)境等)來進(jìn)行項目分類

7.png

Role:分類名
Pattern:正則表達(dá)式匹配

例子:
.test* :匹配所有以test結(jié)尾的項目,并分配圖上的權(quán)限。注意使用通配符‘’時,需要在''前添加'.',否則無法保存并會報錯。例如:.*plat

配置Assign Roles
把具體用戶(prod、test)與Manage Roles中配置的角色權(quán)限關(guān)聯(lián)起來

8.png

注意:
Anonymous User不分配權(quán)限,只需要給admin分配管理員權(quán)限

驗證權(quán)限
新建Item:a.test和a.prod
路徑:管理平臺 - 新建Item - a.test - Freestyle project - 確定 - 返回管理平臺頁面

因為是測試Item,所以沒有繼續(xù)創(chuàng)建具體Item內(nèi)容

admin管理用戶的管理界面

9.png

test用戶的管理界面

10.png

prod用戶的管理界面

11.png

具體的權(quán)限在前面的Manage Roles - Item roles里根據(jù)需要進(jìn)行設(shè)置

關(guān)閉用戶注冊入口
路徑:Manage Jenkins - Configure Global Security - 訪問控制 - Jenkins’ own user database - 允許用戶注冊
取消√即可

2.3 Ansible安裝與部署

2.3.1 Ansible安裝前的環(huán)境部署

python安裝與部署

1.在安裝Python之前,需要先安裝一些后面遇到的依賴問題(如果有依賴問題,按照提示安裝):

yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel

2.python壓縮包下載

使用命令

wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz

or

**進(jìn)入該網(wǎng)址直接本地下載然后ftp方式傳輸至服務(wù)器上 **

https://www.python.org/ftp/python/

3.解壓、配置與編譯安裝

1.解壓文件
tar -xvf Python-3.6.5.tgz

2.包安裝在/usr/local/Python3(具體安裝位置看個人喜好)
mkdir -p /usr/local/Python3

3.配置
cd Python-3.6.5
./configure --prefix=/usr/local/python3

4.編譯安裝
make
make install

5.做軟鏈接
ln -s /usr/local/python3/bin/python3.6 /usr/bin/python3
設(shè)置pip軟連接
ln -s /usr/local/python3/bin/pip3.6 /usr/bin/pip3

6.測試是否安裝成功
python3 -V

7.因為yum源使用的Python2,替換為Python3以后,會導(dǎo)致其無法正常工作。需要修改以下信息:
修改yum配置文件:
vi /usr/bin/yum
第一行修改為#!/usr/bin/python2.7

8.驗證yum源正常使用
yum -y install vim 執(zhí)行兩次測試安裝與校驗

9.用pip安裝PyQuery包
pip3 install PyQuery

10.升級pip
pip3 install --upgrade pip

2.3.2 Ansible安裝部署

1.sudo yum install epel-release
2.sudo yum install ansible
3.pip install --upgrade pip
4.pip install paramiko PyYAML Jinja2 httplib2 six
5.pip install ansible       

ssh免密碼/密鑰認(rèn)證

1.本地機器上使用ssh-keygen產(chǎn)生公鑰私鑰對
ssh-keygen -t rsa 
(一路回車)

2.用ssh-copy-id將公鑰復(fù)制到遠(yuǎn)程機器(~/ .ssh/authorized_key.文件)中
ssh-copy-id -i /root/.ssh/id_rsa.pub 用戶名@192.168.x.xxx
(/root/.ssh/id_rsa.pub這個路徑有可能不同,以自身具體路徑準(zhǔn),詳見下方截圖)

3.輸入yes繼續(xù)連接,輸入遠(yuǎn)程服務(wù)器的密碼(密鑰文件的形式不需要輸入密碼,但)

4.ssh方式登錄遠(yuǎn)程服務(wù)器驗證免密是否生效
(1)密碼方式:
ssh 用戶名@192.168.x.xxx
(2)密鑰方式:
需要對密鑰文件權(quán)限進(jìn)行修改-禁止文件的訪問權(quán)限,否則系統(tǒng)會判斷該文件可能被篡改而無法使用該密鑰進(jìn)行登錄
chmod 700 filename
ssh -i 密鑰文件路徑 用戶名@192.168.x.xxx

5.完成ssh免密碼/密鑰認(rèn)證

12.png

Jenkins ansible插件安裝

路徑:**Manage Jenkins - Manage Plugins - 可選插件 **


13.png

未找到可能是因為已經(jīng)安裝了,在已安裝里尋找

2.4 其他補充部署

2.4.1 Jenkins關(guān)于jdk的部署

路徑:Manage Jenkins - Global Tool Configuration - JDK

14.png

JAVA_HOME填寫jre路徑(以自己實際路徑為準(zhǔn))

紅色警告無傷大雅,配置是正確的

2.4.2 Jenkins關(guān)于maven的部署

15.png

3. 新建Item完成自動化部署

3.1 新建Item

1.路徑:Jenkins工作臺 - 新建Item - 輸入任務(wù)名稱(例:abc.test) - 選擇Freestyle project - 確定

Freestyle在普通集成中一般足夠使用,如果現(xiàn)實業(yè)務(wù)中有復(fù)雜的邏輯而Freestyle無法滿足時,建議可以使用Jenkins 流水線(pipeline)編寫pipeline腳本來實現(xiàn)自定義邏輯。
流水線寫法可參考:ip地址:port端口號/job/pipeline.test/pipeline-syntax/(例:http://192.168.10.132:8080/job/pipeline.test/pipeline-syntax/)
流水線examplehttps://jenkins.io/doc/pipeline/examples/

2.This project is parameterized(項目參數(shù)配置)

16.png

(1) 添加git分支選擇參數(shù) - Git Parameter

添加該參數(shù)的作用是在部署該Item時,部署人員可以動態(tài)選擇git remote branchs中的任意分支,實現(xiàn)靈活部署

17.png

(2) 源碼管理 - Git/Multiple SCMs

預(yù)備:添加Git憑據(jù)
路徑:工作臺 - 憑據(jù) - Stores scoped to Jenkins - Jenkins - 全局憑據(jù) (unrestricted) - 添加一些憑據(jù)
填寫用戶名密碼保存即可

需要從git/svn拉取多個項目情況需要安裝Multiple SCMs plugin插件

18.png

$ + 前面設(shè)置的參數(shù)名(例如:$playbookBranch)
實現(xiàn)動態(tài)選擇遠(yuǎn)程分支的作用

(3) 構(gòu)建 - Maven

19.png

Maven構(gòu)建模塊可以用來對項目進(jìn)行install/package等操作

(4) 構(gòu)建 - Ansible playbook

Ansible Playbooks常用模塊介紹:

http://note.youdao.com/noteshare?id=0bfc53f1b967f11d8f7e26ce38cbb6d8

Playbooks框架與格式介紹:

http://note.youdao.com/noteshare?id=d0d98975bc335c3e12fa73274e62c41f

簡單的ansible task腳本例子:

  # 上傳jar包到遠(yuǎn)程服務(wù)器指定目錄下
  # {{appPkgSrcDir}} 這些參數(shù)在inventory文件中定義
  - name: upload jar file to server
    tags:
     - upload
     - test
    copy:
     src: "{{ appPkgSrcDir }}/{{appName}}"
     dest: "{{appDeployDest}}"

  # 得到指定應(yīng)用的pid
  - name: get pid of service
    shell: "ps -ef | grep -v grep | grep {{serviceName}} | awk '{print $2}'"
    register: pid

  # 展示pid
  - name: display pid
    debug: msg="{{pid.stdout}}"
  
  - name: source profile
    shell: "source /etc/profile"

  # 強制kill進(jìn)程(生產(chǎn)環(huán)境不建議直接這樣操作)
  - name: Force kill stuck processes
    shell: "kill -9 {{ pid.stdout }}"

  - name: sleep 2s 
    command: sleep 2s

  # 開啟服務(wù)
  - name: start {{serviceName}}
    shell: "cd /data/mbApp/pay-mgt;nohup /home/jdk/jdk1.8.0_152/bin/java -jar {{appName}} --spring.profiles.active=test > nohup.out 2>&1 &"

這個例子比較簡單,只適合在開發(fā)/測試環(huán)境進(jìn)行測試時為了便捷而使用

Jenkins Ansible配置

20.png

21.png

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • https://baijiahao.baidu.com/s?id=1621695863688073415&wfr=...
    催化劑閱讀 286評論 0 0
  • 2020-01-14 【日精進(jìn)打卡第 660 天 【知~學(xué)習(xí)】 《六項精進(jìn)》大綱 4 遍共 2496 遍 《大學(xué)》...
    隨心_892b閱讀 80評論 0 0
  • 1.打開7z官網(wǎng)https://sparanoid.com/lab/7z/ 2.下載安裝包 3.安裝 4.打開安裝...
    崇豹閱讀 489評論 0 0
  • 筆尖劃過泛黃的紙 至上至下 或輕或重 整晚 除了心跳聲、呼吸聲 就只聽那筆觸 沙沙 嘶嘶…… 是筆遇見了紙 是紙遇...
    檐下聽雨J閱讀 151評論 0 1
  • 自從開了讀書這扇門,我便走入了讀書的花園小道,兩邊白花紅花驚艷開放,讓我目不暇接。 而當(dāng)我決定要主動讀書的時候,卻...
    廣月尹閱讀 216評論 0 5

友情鏈接更多精彩內(nèi)容