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

自动化部署与持续交付

@[CentOS 7, Jdk 1.8, Git, Maven, Jenkins, Ansible]

日常工作中,每个程序员都会经历项目部署,而很多人在这时大多会经历以下环节:

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

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

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

简单分析图:


基于Git+Jenkins+Ansible实现自动化部署与持续交付_第1张图片

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

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

接下来是文章目录:

文章目录

  • 自动化部署与持续交付
    • 1. 版本清单
    • 2. 安装与部署
      • 2.1 Jenkins安装前的环境部署
        • 2.1.1 jdk1.8安装
        • 2.1.2 maven安装
      • 2.2 Jenkins安装与部署
        • 2.2.1 登陆jenkins管理平台
        • 2.2.2 复制输入初始密码登陆
        • 2.2.3 安装插件
        • 2.2.4 创建管理员帐户
        • 2.2.5 角色权限部署
      • 2.3 Ansible安装与部署
        • 2.3.1 Ansible安装前的环境部署
        • 2.3.2 Ansible安装部署
      • 2.4 其他补充部署
        • 2.4.1 Jenkins关于jdk的部署
        • 2.4.2 Jenkins关于maven的部署
    • 3. 新建Item完成自动化部署
      • 3.1 新建Item

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

基于Git+Jenkins+Ansible实现自动化部署与持续交付_第2张图片
基于Git+Jenkins+Ansible实现自动化部署与持续交付_第3张图片

生产环境中防火墙可能不能关闭,那么则需要放行相关程序所需要的端口(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安装与部署

基于Git+Jenkins+Ansible实现自动化部署与持续交付_第4张图片

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 复制输入初始密码登陆

基于Git+Jenkins+Ansible实现自动化部署与持续交付_第5张图片

复制文件中的密码
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策略
基于Git+Jenkins+Ansible实现自动化部署与持续交付_第6张图片

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),可查看全局的面板
image

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

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

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

配置Assign Roles
把具体用户(prod、test)与Manage Roles中配置的角色权限关联起来
基于Git+Jenkins+Ansible实现自动化部署与持续交付_第7张图片

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

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

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

admin管理用户的管理界面
基于Git+Jenkins+Ansible实现自动化部署与持续交付_第8张图片

test用户的管理界面
基于Git+Jenkins+Ansible实现自动化部署与持续交付_第9张图片

prod用户的管理界面
基于Git+Jenkins+Ansible实现自动化部署与持续交付_第10张图片

具体的权限在前面的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免密码/密钥认证

基于Git+Jenkins+Ansible实现自动化部署与持续交付_第11张图片

Jenkins ansible插件安装

路径:**Manage Jenkins - Manage Plugins - 可选插件 **
基于Git+Jenkins+Ansible实现自动化部署与持续交付_第12张图片

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

2.4 其他补充部署

2.4.1 Jenkins关于jdk的部署

路径:Manage Jenkins - Global Tool Configuration - JDK
基于Git+Jenkins+Ansible实现自动化部署与持续交付_第13张图片
JAVA_HOME填写jre路径(以自己实际路径为准)

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

2.4.2 Jenkins关于maven的部署

基于Git+Jenkins+Ansible实现自动化部署与持续交付_第14张图片

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(项目参数配置)

基于Git+Jenkins+Ansible实现自动化部署与持续交付_第15张图片

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

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

基于Git+Jenkins+Ansible实现自动化部署与持续交付_第16张图片

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

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

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

基于Git+Jenkins+Ansible实现自动化部署与持续交付_第17张图片

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

(3) 构建 - Maven
基于Git+Jenkins+Ansible实现自动化部署与持续交付_第18张图片

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配置
基于Git+Jenkins+Ansible实现自动化部署与持续交付_第19张图片

基于Git+Jenkins+Ansible实现自动化部署与持续交付_第20张图片

你可能感兴趣的:(基于Git+Jenkins+Ansible实现自动化部署与持续交付)