自動化部署與持續(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é)項目打包播掷;
- 項目部署 :日澈唬可能使用ftp方式傳輸項目包拒啰,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)自動化部署口蝠。
簡單分析圖:
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)境部署
生產(chǎn)環(huán)境中防火墻可能不能關(guān)閉,那么則需要放行相關(guān)程序所需要的端口(jenkins默認(rèn)為8080)
下載jenkins rpm包:
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安裝與部署
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ù)制輸入初始密碼登陸
復(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策略
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),可查看全局的面板
Item roles欄
可根據(jù)環(huán)境(例如生產(chǎn)環(huán)境减响、測試環(huán)境等)來進(jìn)行項目分類
Role:分類名
Pattern:正則表達(dá)式匹配
例子:
.test* :匹配所有以test結(jié)尾的項目靖诗,并分配圖上的權(quán)限。注意使用通配符‘’時支示,需要在''前添加'.',否則無法保存并會報錯刊橘。例如:.*plat
配置Assign Roles
把具體用戶(prod、test)與Manage Roles中配置的角色權(quán)限關(guān)聯(lián)起來
注意:
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管理用戶的管理界面
test用戶的管理界面
prod用戶的管理界面
具體的權(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ù)器上 **
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)證
Jenkins ansible插件安裝
路徑:**Manage Jenkins - Manage Plugins - 可選插件 **
未找到可能是因為已經(jīng)安裝了纯路,在已安裝里尋找
2.4 其他補充部署
2.4.1 Jenkins關(guān)于jdk的部署
路徑:Manage Jenkins - Global Tool Configuration - JDK
JAVA_HOME填寫jre路徑(以自己實際路徑為準(zhǔn))
紅色警告無傷大雅,配置是正確的
2.4.2 Jenkins關(guān)于maven的部署
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/)
流水線example:https://jenkins.io/doc/pipeline/examples/
2.This project is parameterized(項目參數(shù)配置)
(1) 添加git分支選擇參數(shù) - Git Parameter
添加該參數(shù)的作用是在部署該Item時腔彰,部署人員可以動態(tài)選擇git remote branchs中的任意分支叫编,實現(xiàn)靈活部署
(2) 源碼管理 - Git/Multiple SCMs
預(yù)備:添加Git憑據(jù)
路徑:工作臺 - 憑據(jù) - Stores scoped to Jenkins - Jenkins - 全局憑據(jù) (unrestricted) - 添加一些憑據(jù)
填寫用戶名密碼保存即可
需要從git/svn拉取多個項目情況需要安裝Multiple SCMs plugin插件
$ + 前面設(shè)置的參數(shù)名(例如:$playbookBranch)
實現(xiàn)動態(tài)選擇遠(yuǎn)程分支的作用
(3) 構(gòu)建 - Maven
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配置