手动部署
部署也可以称为“发布”、“发版”、“上线”,一个接口,一个模块,一个功能,一个项目都能称之为部署。
开发周期
- 大版本一到俩个月
- 小版本小到一俩天,多到一俩周
可以使用jar包部署,借助docker镜像部署
1、项目打包
# maven原生方式打包 jar包中只有当前项目的文件 springboot项目使用springboot maven插件打成jar包:所有依赖的第三方的jar包会打包到一起
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
引入上述maven插件后,package打包
打包后的效果
把该jar包拖到桌面上,进入命令行窗口。下面是写的比较完整版的。额外加了一些jvm参数和指定端口号了
浏览器访问,没有一点毛病
我们这是在本机(windows)上部署的,是前台启动的方式
2、linux手动部署
linux 就可以使用nohup &,后台启动,以下是模板,比较全
# nohup:后台启动
# -Xmx500m -Xms500m: 堆内存大小配置
# -XX:+HeapDumpOnOutOfMemoryError: oom保存dump文件
# -jar xxx.jar 运行的jar包必须是springboot mvn插件打包的jar包
# >xxx.log 2>&1 挑选2级别和1级别的输出日志到xxx.log中
# & 表示命令结束
nohup java -Xmx500m -Xms500m -XX:+HeapDumpOnOutOfMemoryError -jar xxx.jar >xxx.log 2>&1 &
找个目录,把我们的jar包使用xftp拖过去,进入该目录后
貌似-jar这个参数可以放到前面也不影响
nohup java -jar -Xmx500m -Xms500m -XX:+HeapDumpOnOutOfMemoryError hello-world-0.0.1-SNAPSHOT.jar &
浏览器访问
停止运行的jar
ps -ef | grep java
根据进程号pid,结束进程(前面那个)
kill -9 22116
jenkins自动部署
程序员只需要关心写代码即可,剩下的代码编译 测试 打包 生成制品(将生成不同版本的包保存到仓库中) 将jar包和他需要的环境一起打包成docker镜像保存到镜像仓库 需要部署的服务器拉取镜像 部署运行 运行失败生成警报发送给程序员
1、devops 开发|运维
为了减少 开发和运维之间的沟通成本
开发流程:
1、获取任务:(获取任务和bug)
禅道(项目管理软件 开源项目管理软件 免费项目管理软件 - 禅道开源项目管理软件)
2、开发
借助IDEA
3、提交到远程仓库
github/gitlab/gitee /svn
4、构建
使用工具对仓库中的代码进行构建(clean compile test package)
mvn jenkins
5、单元测试
unit test
6、生成报告+制作制品
单元测试报告处理
制作制品:将项目打包按照本次的版本号提交到 mvn仓库中
7、制作docker镜像
使用6的制品 根据Dockerfile 构建镜像(要执行的jar包 和依赖的镜像 和其他的环境参数)
推送镜像到远程镜像仓库
8、远程服务器
pull镜像 运行容器
9、监控
监控容器运行的情况,可以发送警告给开发者
闭环
2、安装&初始化jenkins
Jenkins
安装jenkins
docker run \
-u root \
--restart=always \
--name=myjenkins \
-d \
-p 8080:8080 \
-p 50000:50000 \
-v jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/blueocean
# 查看jenkins容器日志,从日志中获取到初始化密码 docker logs 容器名称
docker logs myjenkins
如下:
浏览器访问jenkins: http://虚拟机ip:8080
输入上一步查询到的密码,点击继续
选中安装推荐的插件:
安装插件如果遇到以下错误(我没发生这个错)
解决方案:
拷贝cloudbees-folder.hpi到 Jenkins 容器的插件目录中即可:
docker cp /opt/cloudbees-folder.hpi jenkins容器名称:/var/jenkins_home/war/WEB-INF/detached-plugins
# 重启jenkins容器
docker restart jenkins容器名
如果还有插件安装失败,可以访问下面的地址 手动下载,按照上面的步骤下载插件上传到jenkins容器
https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/
新建用户
新建用户选择新建并完成
一路按照默认下一步,最后选择重启jenkins
使用新建账户登录
登录后界面
3、部署流水线
1.新建任务
2.流水线任务配置
记得选择 Hello World
3.执行流水线任务
这有点乱,自己找的点点吧
使用Blue Ocean
莫名其妙就成功了
流水线语法
springboot项目流水线部署
开发springboot项目,完成后推送项目到gitee远程仓库;
jenkins可以从gitee远程仓库中拉取项目的源码 进行编译测试打包,然后运行jar包
热部署
所谓热部署指的就是一旦jenkins通过webhook监听到代码仓库有push操作,自动执行拉取代码编译发布等功能
一般不采用热部署,一般是手动构建项目
1、将项目推送到远程仓库
在项目目录下创建deploy目录,目录下创建jenkinsfile文件,文件内容暂且简单如下
pipeline {
agent any
stages {
stage('pull code') {
steps {
sh 'pwd'
//查看当前所在的位置
echo 'pull code'
sh 'ls -l'
}
}
}
}
2、jenkins配置远程仓库
选择配置git远程仓库地址
注意:指定使用的jenkins脚本路径
保存任务并执行构建
3、安装jenkins安装docker插件
把前面4个下载
重启成功后,只要在系统管理中看到docker代表安装成功:
流水线语法中也多了:使用docker容器构建运行
4、准备mvn配置文件
在项目deploy目录下创建settings.xml配置文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>/mvn/repository</localRepository>
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
<profiles>
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
</settings>
5、在项目deploy下创建Dockerfile
通过Dockerfile打包docker镜像
# 基于openjdk:8镜像创建新镜像
FROM openjdk:8
# 镜像作者
MAINTAINER atguigu
# 创建镜像时的jar
COPY target/*.jar /demo.jar
# 声明需要暴露的端口
EXPOSE 9527
# 执行命令运行jar包(也可以使用RUN)
ENTRYPOINT ["nohup" ,"java" ,"-jar" ,"/demo.jar" ,"--server.port=9527" ,"&"]
6、准备jenkins脚本
//定义Jenkins如何自动化部署这个项目; groovy 脚本 gradle(groovy脚本)[maven]
pipeline {
agent any //使用任意一个安装了Jenkins的服务器执行下面脚本
parameters { //参数化构建
string(name: 'vernum', defaultValue: 'v1.0', description: '输入此次发布版本?')
}
stages { //定义很多阶段
stage('项目打包') {
steps {
//步骤 mvn clean package
sh 'echo 项目正在打包'
withDockerContainer(args: '-v /mvn/repository:/mvn/repository', image: 'maven:3.8-openjdk-8') {
// some block
//在maven中运行以下命令
sh 'mvn -v'
sh 'ls -al'
sh 'mvn -s "deploy/settings.xml" clean package -DskipTest' //打包不用测
sh 'ls -al target'
}
}
}
stage('项目测试') {
steps {
//
sh 'echo 项目正在测试'
withDockerContainer(args: '-v /app/mvn:/mvn/repos', image: 'maven:3.8-openjdk-8') {
// some block
//在maven中运行以下命令
sh 'ls -al'
sh 'mvn -s "deploy/settings.xml" test' //进行测试。并且生成测试报告
}
}
}
stage('制作镜像') {
steps {
sh 'echo 项目正在部署'
sh 'ls -al'
sh 'ls -al target'
sh "docker build -f deploy/Dockerfile -t demo:${vernum} ."
sh 'docker images|grep demo'
}
}
stage('项目部署') {
steps {
sh 'echo 项目正在部署'
sh "docker run -p 9527:9527 --restart=always -d --name=demo01 demo:${vernum}"
}
}
}
}
7、执行jenkins任务
运行jenkins任务
输入版本号,将项目打包按照本次的版本号提交到 mvn仓库中
经过一段时间
在浏览器访问测试