=================
交作业:hello-world级的自动化部署(Maven+Git+Docker+Jenkins),因为内容稍微有点儿多,分两篇,这是第二篇——构建工程。
=================
环境:
CentOS7-64
已安装JAVA8(Jekins需要)
Git
Maven
Jenkins
创建SpringBoot项目,并上传到github上
我已建立了一系列SpringCloud工程(当然都是HelloWorld级别的),github地址:
https://github.com/wangjuns8/spring-cloud-study.git
(内容基于长克同学的教程、代码及指导,非常非常感谢,更多helloworld级的SpringCloud的教程文末列出链接)
我的工程是一个parent project,下面有多个model,这次以eureka和provider-user 为例。
项目整合Docker
在model的src/main目录下创建docker文件夹,再新建一个Dockerfile文件
内容如下:
---------------------------------
#基于openjdk:8
FROM openjdk:latest
#把jar包copy到的工作目录下
COPY ./microservice-discovery-eureka/target/microservice-discovery-eureka.jar /work/project/microservice-discovery-eureka.jar
# 指定当前操作目录
WORKDIR /work/project
#容器启动后执行的操作
CMD java -jar microservice-discovery-eureka.jar
---------------------------------
说明:
1. Dockerfile不一定放在项目下,只要jenkins编译时能访问到的地方就行,放在项目下是为了便于管理;
2. microservice-discovery-eureka.jar是打包的名字,可以在pom.xml里设置:
---------------------------------
<build>
<finalName>microservice-discovery-eurekafinalName>
build>
---------------------------------
创建Jenkins任务:
>> 点击主页面左侧菜单栏的“新建任务”
>> 输入任务名称
>> 选择“构建一个maven项目”
如果没有这个选项,则安装Maven Integration plugin先(详见上篇作业)
>> 确定,进入配置界面
填写jenkins配置
因为我要构建的是parent工程下的eureka model,所以指定到model下的pom.xml
为了提高package效率,可以给它加几个参数:
clean package -T 1C -Dmaven.test.skip=true -Dmaven.compile.fork=true
说明:
1、跳过测试代码:-Dmaven.test.skip=true
2、多线程进行编译:-Dmaven.compile.fork=true
3、如果你用的Maven是3.×以上版本,可以增加 -T 1C 参数,表示每个CPU核心跑一个工程;
添加构建后执行脚本(docker构建):
填写脚本如下:
#!/bin/sh
#docker 镜像/容器名字都命名为jar包的名字
SERVER_NAME=microservice-discovery-eureka
#容器id
CID=$(docker ps | grep "$SERVER_NAME" | awk '{print $1}')
#镜像id
IID=$(docker images | grep "$SERVER_NAME" | awk '{print $3}')
#当前日期
DATE=`date +%Y%m%d`
#清除旧容器
if [ -n "$CID" ]; then
echo "存在$SERVER_NAME容器,CID=$CID"
echo "停止旧容器"
docker stop $SERVER_NAME
echo "删除旧容器"
docker rm $SERVER_NAME
fi
# 清除旧镜像
if [ -n "$IID" ]; then
echo "存在$SERVER_NAME镜像,IID=$IID"
echo "删除镜像"
docker rmi $IID
fi
#构建镜像,注意build最后面的“.”不能省略
echo "开始构建镜像"
docker build -f ./$SERVER_NAME/src/main/docker/Dockerfile -t $SERVER_NAME .
echo "构建镜像成功!"
# 运行docker容器
echo "创建并启动$SERVER_NAME容器..."
docker run --name $SERVER_NAME -d -p 8761:8761 $SERVER_NAME:v${DATE}
echo "$SERVER_NAME容器启动完成"
-------------------
说明:server_name\port\路径等,要根据个人情况填写
-------------------
保存退出。
左侧菜单->立即构建
左侧菜单->构建历史(Build History)第一条,显示构建进度,点击进度条,查看后台日志。
左侧菜单->工作空间,查看所有该工程下的文件和目录结构
位置:/var/lib/jenkins/workspace
构建的任务都在这下面。
jenkins工作过程:
1. 把源码从git全部下载下来
2. 在本地用mvn编译、打包
3. 顺序执行构建后shell脚本(docker部分)
构建过程中,出现各种异常,主要是找不到文件(路径不对),网络不通,内存不足之类的……
解决办法,参见后面“补充”。
创建第二个jenkins任务
有个偷懒儿的办法,在新建页面最下面,有个拷贝已存在的任务。
拷贝过来,改一改就能用了,哈哈。
效果展示:
先构建wj-tets-eureka,再构建provider-user。
访问:http://49.232.150.148:8761/
遗留问题:
1. 因为我的git工程是一个parent工程下面多个model,所以,在构建model的时候,jenkins会把所有parent代码下载下来(虽然没有影响,但总觉得浪费空间)。目前还不知道怎么解决。
2. 一个docker启动大约用掉200M内存,我的虚拟机最多只能启动俩服务……,后面会尝试给docker减个肥
git上同样有很多入门的SpringCloud教程,详见:
《史上最简单的 SpringCloud 教程》系列:
https://github.com/forezp/SpringCloudLearning
Spring Cloud Examples
内容跟《史上最简单的 SpringCloud 教程》极度相似,互有补充内容
https://github.com/ityouknow/spring-cloud-examples
Maven多模块编译慢的问题
=================补充=====================
1. docker构建镜像异常:
错误信息:
/usr/bin/docker-current: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.26/containers/create?name=microservice-discovery-eureka: dial unix /var/run/docker.sock: connect: permission denied.
See '/usr/bin/docker-current run --help'.
原因:
Jenkins默认用户使用的是jenkins,没有操作 /var/run/docker.sock的权限。
解决:
方法一,修改默认用户为root(权限更大):
vi /etc/sysconfig/jenkins
JENKINS_USER="jenkins"
改成:
JENKINS_USER="root"
方法二,给jenkins用户操作权限
1)添加docker用户组
groupadd docker
2)把当前用户加入docker用户组
gpasswd -a ${USER} docker
3)查看是否添加成功
cat /etc/group | grep ^docker
4)重启docker
serivce docker restart
5)更新用户组
newgrp docker
2. Docker容器启动报WARNING: IPv4 forwarding is disabled. Networking will not work
转自:https://cloud.tencent.com/developer/article/1552661
解决方法
vim /etc/sysctl.conf
或者
vi /usr/lib/sysctl.d/00-system.conf
添加如下代码:
net.ipv4.ip_forward=1
重启network服务
systemctl restart network
查看是否修改成功
sysctl net.ipv4.ip_forward
如果返回为“net.ipv4.ip_forward = 1”则表示成功了 重启容器即可。
3. ERROR: Maven JVM terminated unexpectedly with exit code 137
解决:
虚拟内存不够了。。。增加内存容量。
4. 常用docker命令:
1)查看docker的所有镜像:
docker images
2)列出所有运行中容器
docker ps
列出所有容器
docker ps -a
3)启动一个一直停留在后台运行的容器
docker run -dit 720cc49ec610 /bin/bash
4)登录docker容器:
docker exec -it b87ac4fe6fbc /bin/bash