Jenkins 自动化(CI/DI)部署
1. 背景介绍
在实际开发中,经常要一边开发一边测试,经常为了一个功能而不断更新版本,这些情况都会涉及到频繁的打包、部署;手动打包的涉及到项目上传、打包、发布等很多重复工作;
那么,有一种工具能够实现,将代码提交到git后就自动打包部署,替换手动认为打包,答案是肯定的:Jenkins ,当然除了Jenkins以外,也还有其他的工具可以实现自动化部署;
2. Jenkins服务器搭建于基本配置
2.1. Jenkins自动化/持续集成部署实现原理


2.2. Python3.0自动化发布脚本
DevOps_remote.py文件
#!/usr/bin/env python
#coding=utf- import paramiko import sys #shell 传入参数 sourcePath = sys.argv[]; #源目录 targetPath = sys.argv[]; #目标目录 jarName = sys.argv[]; #文件名 runPort = sys.argv[]; #运行端口 #部署服务器配置 serveHost = ["192.168.208.131","192.168.208.134","192.168.208.135"]; #目标服务器IP serveKey = {"192.168.208.131":"?","192.168.208.133":"?","192.168.208.134":"?","192.168.208.135":"?"}; #目标服务器密码 serveUser = {"192.168.208.131":"march","192.168.208.133":"march","192.168.208.134":"march","192.168.208.135":"march"}; #目标服务器登录用户名 serveSSHPort = {"192.168.208.131":,"192.168.208.133":,"192.168.208.134":,"192.168.208.135":}; #目标服务器SSH 端口 #监听invoke_shell 交互动态结果 #cmd 交互对象,endParam 结尾对象 def mutualResult(cmd,endParam): buff = ""; while not buff.endswith(endParam): line = cmd.recv(); try: #进行异常捕捉,如果解码有问题,则换一种解码方式 buff += line.decode("utf8"); except Exception : buff += line.decode("gb18030"); return buff; #kill 运行端口 def killPort(ssh,port): print ("run cmd >> " + "netstat -tunlp | grep "+port+" | awk '{print $7}' | awk -F'/' '{print $1}'"); stdin, stdout, stderr = ssh.exec_command("netstat -tunlp | grep "+port+" | awk '{print $7}' | awk -F'/' '{print $1}'"); pid = stdout.read().decode(); print(pid) if pid: print ("run cmd >> 关闭 java进程 进程ID: "+pid); ssh.exec_command("kill -9 "+pid); def deploy(): print("开始部署"+jarName); for ip in serveHost: print ("连接服务器IP:"+ip); #连接服务器 ssh =paramiko.SSHClient(); ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()); ssh.connect(hostname=ip,port=serveSSHPort[ip],username=serveUser[ip],password=serveKey[ip]); cmd = ssh.invoke_shell(); #连接交互 print (mutualResult(cmd,"$ ")); print ("开始复制"+jarName+" >> 服务:"+ip); print ("run cmd >> scp -r -P 5321 march@192.168.208.133:/var/lib/jenkins/workspace/" +sourcePath+ "/target/"+jarName+" "+ targetPath +"\n"); cmd.send("scp -r -P 5321 march@192.168.208.133:/var/lib/jenkins/workspace/" +sourcePath+ "/target/"+jarName+" "+ targetPath +"\n"); #监听交互并输入密码 mutualResult(cmd,"'s password: "); cmd.send("?\n"); mutualResult(cmd,"$ "); cmd.close(); print("run cmd >> scp suceess"); #kill运行进程 killPort(ssh,runPort); #启动服务 cmd = ssh.invoke_shell(); mutualResult(cmd,"$ "); print ("run cmd >> " + "nohup java -jar " + targetPath + "/" + jarName +" --server.port=" +runPort +" > " + targetPath + "/" + jarName + ".log 2>&1 & \n"); print ("等待服务器:" + ip + "启动"); cmd.send("nohup java -jar " + targetPath + "/" + jarName +" --server.port=" +runPort +" > " + targetPath + "/" + jarName + ".log 2>&1 & \n"); mutualResult(cmd,"$ "); print ("核心服务:" + ip + "发布成功"); cmd.close(); ssh.close(); if __name__ =="__deploy__": deploy() deploy()
DevOps_remote.sh脚本文件
#!/bin/bash python3 /var/lib/jenkins/workspace/dev_remote.py $ $ $ $
2.3. Jenkins 环境插件
2.3.1. 这里建议选择推荐安装,保证基本常用功能可以使用

2.3.2. 全局工具配置(Global Tool Configuration)


2.3.3. 系统配置
配置发布通知邮箱

2.3.4. 插件安装




3. Jenkins自动化部署
3.1. Springboot项目发布部署(git)



3.2. 构建完成后自动打Tag


3.3. Tag项目发布部署



使用参数构建:

3.4. 静态代码审查之fireline
配置:



代码审查结果:

3.5. 静态代码审查之checkstyle
pom.xml配置:
<dependency>
<groupId>com.puppycrawl.tools</groupId>
<artifactId>checkstyle</artifactId>
<version>8.33</version>
</dependency> <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.1.1</version>
<configuration>
<consoleOutput>true</consoleOutput>
<outputFileFormat>xml</outputFileFormat>
<!-- <configLocation>sun_checks.xml</configLocation>-->
<configLocation>google_checks.xml</configLocation>
<linkXRef>false</linkXRef>
</configuration>
<dependencies>
<dependency>
<groupId>com.puppycrawl.tools</groupId>
<artifactId>checkstyle</artifactId>
<version>8.33</version>
</dependency>
</dependencies>
</plugin> <reporting>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.1.1</version>
<configuration>
<configLocation>google_checks.xml</configLocation>
</configuration> </plugin> </plugins>
</reporting>
Jenkins配置:


代码审查结果:

3.6. WebHook自动触发构建

GITHub自动推送

3.7. 循环构建远程服务完成提示


Jenkins 自动化(CI/DI)部署的更多相关文章
- Jenkins自动化CI CD流水线之1--介绍与安装
第1章 大纲 CI/CD, DevOps介绍 Git安装与使用 Jenkins安装与使用 权限管理 参数化构建 Master-Slave 流水线(Pipeline) 邮件通知 应用案例 自动发布PHP ...
- gitlab+jenkins+tomcat CI/CD 部署
整个项目的框架为: gitlab的安装与使用(Centos7) gitlab的安装 新建yum源 vim /etc/yum.repos.d/gitlab-ce.repo [gitlab-ce] nam ...
- Jenkins自动化CI CD流水线之8--流水线自动化发布Java项目
一.前提 插件:Maven Integration plugin 环境: maven.tomcat 用的博客系统代码: git clone https://github.com/b3log/solo. ...
- Jenkins自动化CI CD流水线之4--Master-Slave架构
一.介绍 jenkins的Master-slave分布式架构主要是为了解决jenkins单点构建任务多.负载较高.性能不足的场景. Master/Slave相当于Server和agent的概念.Mas ...
- Jenkins自动化CI&CD流水线
1 环境说明 主机名称 IP cpu核数/内存/硬盘 安装软件 用途 controlnode 172.16.1.120 2/2/60 git 代码仓库 slavenode1 172.16.1.121 ...
- Jenkins自动化CI CD流水线之5--pipeline
一.概览 二.安装 在对jenkins进行初始化安装时,默认已经安装了jenkins的相关插件,如下图所示: 三.实操 新建任务: 编写pipeline脚本: 我们可以借助流水线语法去做. test流 ...
- Jenkins自动化CI CD流水线之3--参数化构建
一. 背景 如果只是简单的构建,jenkins自己默认的插件可以做,但是如果我们想要在构建过程中有更多功能,比如说:选择性构建.传参.项目指定变量等等其他功能,基础的参数化构建可以实现一些简单功能,但 ...
- Jenkins自动化CI CD流水线之7--流水线自动化发布PHP项目
一.前提 环境为:lnmp PHP项目:wordpress(此处我们下载一个wordpress的源码.将其模拟为我们的代码上传到我们的git仓库) 二.配置 1)创建job 2)参数化构建 3)配置p ...
- Jenkins自动化CI CD流水线之6--构建邮件状态通知
一. 前提 前提: 服务器开启邮箱服务: 二. 基础配置 需要安装一个插件: 插件: Email Extension Plugin 进行配置: 系统管理->系统设置-> 相关配置如下图: ...
- Jenkins自动化CI CD流水线之2--用户权限管理
一. 背景 针对开发.运维.测试针对不同角色进行不同权限划分, 基于插件: Role-based Authorization Strategy来实现. 一. 安装 安装该插件: 系统管理->管理 ...
随机推荐
- ModelAndView的部分回顾
ModelAndView的部分回顾 //@RestController @Controller //@SessionAttributes("user") //把modelandvi ...
- <WP8开发学习笔记>ApplicationBar(任务栏)的切换以及“黑条问题”
ApplicationBar(以下简称AppBar)是WP应用相当常见的控件,也很方便.常见的做法是pivot或者panorama的页面切换的时候,AppBar跟随切换对应的按钮或者不显示按钮,如下图 ...
- Java——选择、冒泡排序、折半查找
//选择排序对数据进行升序排序 public static void selectSortArray(int[] arr){ for(int i = 0; i<arr.length-1;i++) ...
- os:获取当前目录路径,上级目录路径,上上级目录路径
import os '''***获取当前目录***''' print(os.getcwd()) print(os.path.abspath(os.path.dirname(__file__))) '' ...
- HashSet扩容机制在时间和空间上的浪费,远大于你的想象
一:背景 1. 讲故事 自从这个纯内存项目进了大客户之后,搞得我现在对内存和CPU特别敏感,跑一点数据内存几个G的上下,特别没有安全感,总想用windbg抓几个dump看看到底是哪一块导致的,是我的代 ...
- 深入理解 EF Core:EF Core 写入数据时发生了什么?
阅读本文大概需要 14 分钟. 原文:https://bit.ly/2C67m1C 作者:Jon P Smith 翻译:王亮 声明:我翻译技术文章不是逐句翻译的,而是根据我自己的理解来表述的.其中可能 ...
- PHP丨PHP基础知识之流程控制WHILE循环「理论篇」
昨天讲完FOR循环今天来讲讲他的兄弟WHILE循环!进入正题: while是计算机的一种基本循环模式.当满足条件时进入循环,进入循环后,当条件不满足时,跳出循环.while语句的一般表达式为:whil ...
- 谷歌Chrome成最受欢迎的浏览器 它为啥好用?
毫无疑问,在搜索引擎领域,谷歌是绝对的主导者.但是,一般人却很容易低估我们受到的“控制”.比如,它的浏览器Chrome. 在不到九年的时间,谷歌Chrome浏览器已经成为全球使用最多的网页浏览器.目前 ...
- c#,pagerank算法实现一
PageRank让链接来"投票" 一个页面的“得票数”由所有链向它的页面的重要性来决定,到一个页面的超链接相当于对该页投一票.一个页面的PageRank是由所有链向它的页面(“链入 ...
- MyBatis入门学习-连接oracle实现CURD基本操作
目录 前言 导入oracle库 配置 环境配置 配置引用 配置映射 查询 单条件查询 多条件查询 通过类字段传递参数 通过Map接口传参 Param注解 插入 更新 删除 字段映射 参考文献 前言 本 ...