Git/Maven + Jenkins + Ansible实现自动化部署与持续交付

自动化部署与持续交付

@[CentOS 7, Jdk 1.8, Git, Maven, Jenkins, Ansible]
日常工作中,每个程序员都会经历项目部署,而很多人在这时大多会经历以下环节:

  • Git :分布式版本控制系统,负责项目代码的分支拉取与分支更新等;
  • Maven :项目管理工具,负责项目打包;
  • 项目部署 :日常可能使用ftp方式传输项目包,Shell相关脚本部署,或者使用IDEA Alibaba Cloud Toolkit相关插件的部署功能等。

而以上内容中比较传统的方式有一个缺点,就是需要人为的衔接每一步,稍微掉以轻心,则部署就比较容易出问题。

而如今更需要一个自动化部署与持续交付的组合拳来分担压力,更为准确和系统化的实现项目部署。接下来介绍一下Git/Maven + Jenkins + Ansible三剑客,能轻松解决这一难题,实现自动化部署。

简单分析图:


0.png

Git/Maven + Jenkins + Ansible自动化部署三剑客分工:

  • Git :分布式版本控制系统,负责项目代码的分支拉取与分支更新等工作;
  • Maven :项目管理工具,负责项目打包工作;
  • Ansible :自动化运维工具,实现了批量系统配置、批量程序部署、批量运行命令等功能;
  • Jenkins :持续集成工具,用于监控持续重复的工作,通过插件管理来集成Git、Maven、Ansible来实现对应功能;

接下来是文章目录:

[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安装前的环境部署

1.png

2.png

生产环境中防火墙可能不能关闭,那么则需要放行相关程序所需要的端口(jenkins默认为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版本号
进入maven目录
./mvn --version

2.2 Jenkins安装与部署

3.png

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

启动jenkins服务:
systemctl start jenkins
开机自启动jenkins服务: 
systemctl enable jenkins

2.2.1 登陆jenkins管理平台

接下来使用可以访问到该服务器jenkins端口的电脑登陆:服务器ip + jenkins端口号
例如:http://192.168.10.132:8080

2.2.2 复制输入初始密码登陆

4.png
复制文件中的密码
vi /var/lib/jenkins/secrets/initialAdminPassword

2.2.3 安装插件

选择推荐安装的插件即可

2.2.4 创建管理员帐户

创建平台管理员帐户

2.2.5 角色权限部署

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.配置:

帐号准备
新建三个帐号prod、test、abc分别表示生产环境帐号、测试环境帐号、未知帐号
路径:管理平台页面 - 注销 - 创建一个用户帐号

配置Manage Roles
在Manage Roles中有两种角色
Global roles:分配全局策略
Project roles:根据项目环境来分配项目权限

Global roles栏
可添加guest游客的角色,只赋予read权限(Overrall - Read),可查看全局的面板

6.png

Item roles栏
可根据环境(例如生产环境、测试环境等)来进行项目分类

7.png

Role:分类名
Pattern:正则表达式匹配

例子:
.test* :匹配所有以test结尾的项目,并分配图上的权限。注意使用通配符‘’时,需要在''前添加'.',否则无法保存并会报错。例如:.*plat

配置Assign Roles
把具体用户(prod、test)与Manage Roles中配置的角色权限关联起来

8.png

注意:
Anonymous User不分配权限,只需要给admin分配管理员权限

验证权限
新建Item:a.test和a.prod
路径:管理平台 - 新建Item - a.test - Freestyle project - 确定 - 返回管理平台页面

因为是测试Item,所以没有继续创建具体Item内容

admin管理用户的管理界面

9.png

test用户的管理界面

10.png

prod用户的管理界面

11.png

具体的权限在前面的Manage Roles - Item roles里根据需要进行设置

关闭用户注册入口
路径:Manage Jenkins - Configure Global Security - 访问控制 - Jenkins’ own user database - 允许用户注册
取消√即可

2.3 Ansible安装与部署

2.3.1 Ansible安装前的环境部署

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

**进入该网址直接本地下载然后ftp方式传输至服务器上 **

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
设置pip软连接
ln -s /usr/local/python3/bin/pip3.6 /usr/bin/pip3

6.测试是否安装成功
python3 -V

7.因为yum源使用的Python2,替换为Python3以后,会导致其无法正常工作。需要修改以下信息:
修改yum配置文件:
vi /usr/bin/yum
第一行修改为#!/usr/bin/python2.7

8.验证yum源正常使用
yum -y install vim 执行两次测试安装与校验

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免密码/密钥认证

1.本地机器上使用ssh-keygen产生公钥私钥对
ssh-keygen -t rsa 
(一路回车)

2.用ssh-copy-id将公钥复制到远程机器(~/ .ssh/authorized_key.文件)中
ssh-copy-id -i /root/.ssh/id_rsa.pub 用户名@192.168.x.xxx
(/root/.ssh/id_rsa.pub这个路径有可能不同,以自身具体路径准,详见下方截图)

3.输入yes继续连接,输入远程服务器的密码(密钥文件的形式不需要输入密码,但)

4.ssh方式登录远程服务器验证免密是否生效
(1)密码方式:
ssh 用户名@192.168.x.xxx
(2)密钥方式:
需要对密钥文件权限进行修改-禁止文件的访问权限,否则系统会判断该文件可能被篡改而无法使用该密钥进行登录
chmod 700 filename
ssh -i 密钥文件路径 用户名@192.168.x.xxx

5.完成ssh免密码/密钥认证

12.png

Jenkins ansible插件安装

路径:**Manage Jenkins - Manage Plugins - 可选插件 **


13.png

未找到可能是因为已经安装了,在已安装里寻找

2.4 其他补充部署

2.4.1 Jenkins关于jdk的部署

路径:Manage Jenkins - Global Tool Configuration - JDK

14.png

JAVA_HOME填写jre路径(以自己实际路径为准)

红色警告无伤大雅,配置是正确的

2.4.2 Jenkins关于maven的部署

15.png

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

3.1 新建Item

1.路径:Jenkins工作台 - 新建Item - 输入任务名称(例:abc.test) - 选择Freestyle project - 确定

Freestyle在普通集成中一般足够使用,如果现实业务中有复杂的逻辑而Freestyle无法满足时,建议可以使用Jenkins 流水线(pipeline)编写pipeline脚本来实现自定义逻辑。
流水线写法可参考: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(项目参数配置)

16.png

(1) 添加git分支选择参数 - Git Parameter

添加该参数的作用是在部署该Item时,部署人员可以动态选择git remote branchs中的任意分支,实现灵活部署

17.png

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

预备:添加Git凭据
路径:工作台 - 凭据 - Stores scoped to Jenkins - Jenkins - 全局凭据 (unrestricted) - 添加一些凭据
填写用户名密码保存即可

需要从git/svn拉取多个项目情况需要安装Multiple SCMs plugin插件

18.png

$ + 前面设置的参数名(例如:$playbookBranch)
实现动态选择远程分支的作用

(3) 构建 - Maven

19.png

Maven构建模块可以用来对项目进行install/package等操作

(4) 构建 - Ansible playbook

Ansible Playbooks常用模块介绍:

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

Playbooks框架与格式介绍:

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

简单的ansible task脚本例子:

  # 上传jar包到远程服务器指定目录下
  # {{appPkgSrcDir}} 这些参数在inventory文件中定义
  - name: upload jar file to server
    tags:
     - upload
     - test
    copy:
     src: "{{ appPkgSrcDir }}/{{appName}}"
     dest: "{{appDeployDest}}"

  # 得到指定应用的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进程(生产环境不建议直接这样操作)
  - name: Force kill stuck processes
    shell: "kill -9 {{ pid.stdout }}"

  - name: sleep 2s 
    command: sleep 2s

  # 开启服务
  - 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 &"

这个例子比较简单,只适合在开发/测试环境进行测试时为了便捷而使用

Jenkins Ansible配置

20.png

21.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • https://baijiahao.baidu.com/s?id=1621695863688073415&wfr=...
    催化剂阅读 222评论 0 0
  • 2020-01-14 【日精进打卡第 660 天 【知~学习】 《六项精进》大纲 4 遍共 2496 遍 《大学》...
    随心_892b阅读 64评论 0 0
  • 1.打开7z官网https://sparanoid.com/lab/7z/ 2.下载安装包 3.安装 4.打开安装...
    崇豹阅读 423评论 0 0
  • 笔尖划过泛黄的纸 至上至下 或轻或重 整晚 除了心跳声、呼吸声 就只听那笔触 沙沙 嘶嘶…… 是笔遇见了纸 是纸遇...
    檐下听雨J阅读 110评论 0 1
  • 自从开了读书这扇门,我便走入了读书的花园小道,两边白花红花惊艳开放,让我目不暇接。 而当我决定要主动读书的时候,却...
    广月尹阅读 195评论 0 5