自动化部署与持续交付
@[CentOS 7, Jdk 1.8, Git, Maven, Jenkins, Ansible]
日常工作中,每个程序员都会经历项目部署,而很多人在这时大多会经历以下环节:
- Git :分布式版本控制系统,负责项目代码的分支拉取与分支更新等;
- Maven :项目管理工具,负责项目打包;
- 项目部署 :日常可能使用ftp方式传输项目包,Shell相关脚本部署,或者使用IDEA Alibaba Cloud Toolkit相关插件的部署功能等。
而以上内容中比较传统的方式有一个缺点,就是需要人为的衔接每一步,稍微掉以轻心,则部署就比较容易出问题。
而如今更需要一个自动化部署与持续交付的组合拳来分担压力,更为准确和系统化的实现项目部署。接下来介绍一下Git/Maven + Jenkins + Ansible三剑客,能轻松解决这一难题,实现自动化部署。
简单分析图:
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安装前的环境部署
生产环境中防火墙可能不能关闭,那么则需要放行相关程序所需要的端口(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安装与部署
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 复制输入初始密码登陆
复制文件中的密码
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策略
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),可查看全局的面板
Item roles栏
可根据环境(例如生产环境、测试环境等)来进行项目分类
Role:分类名
Pattern:正则表达式匹配
例子:
.test* :匹配所有以test结尾的项目,并分配图上的权限。注意使用通配符‘’时,需要在''前添加'.',否则无法保存并会报错。例如:.*plat
配置Assign Roles
把具体用户(prod、test)与Manage Roles中配置的角色权限关联起来
注意:
Anonymous User不分配权限,只需要给admin分配管理员权限
验证权限
新建Item:a.test和a.prod
路径:管理平台 - 新建Item - a.test - Freestyle project - 确定 - 返回管理平台页面
因为是测试Item,所以没有继续创建具体Item内容
admin管理用户的管理界面
test用户的管理界面
prod用户的管理界面
具体的权限在前面的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免密码/密钥认证
Jenkins ansible插件安装
路径:**Manage Jenkins - Manage Plugins - 可选插件 **
未找到可能是因为已经安装了,在已安装里寻找
2.4 其他补充部署
2.4.1 Jenkins关于jdk的部署
路径:Manage Jenkins - Global Tool Configuration - JDK
JAVA_HOME填写jre路径(以自己实际路径为准)
红色警告无伤大雅,配置是正确的
2.4.2 Jenkins关于maven的部署
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/)
流水线example:https://jenkins.io/doc/pipeline/examples/
2.This project is parameterized(项目参数配置)
(1) 添加git分支选择参数 - Git Parameter
添加该参数的作用是在部署该Item时,部署人员可以动态选择git remote branchs中的任意分支,实现灵活部署
(2) 源码管理 - Git/Multiple SCMs
预备:添加Git凭据
路径:工作台 - 凭据 - Stores scoped to Jenkins - Jenkins - 全局凭据 (unrestricted) - 添加一些凭据
填写用户名密码保存即可
需要从git/svn拉取多个项目情况需要安装Multiple SCMs plugin插件
$ + 前面设置的参数名(例如:$playbookBranch)
实现动态选择远程分支的作用
(3) 构建 - Maven
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配置