Jenkins 自动部署 java 项目
安装基础平台安装GitLab :GitLab 安装及使用安装Jenkins :Jenkins 安装和卸载安装Harbor:Harbor 安装持续集成Jenkins插件安装
文章目录
CI/CD的总流程
流程图:
流程简述:
1 用户提交代码
2.1 从 gitlab 拉取最新代码
2.2 使用 maven 构建成 jar
2.3 制作镜像
2.4 推送镜像到 Harbor
3.1 从 Harbor 拉取镜像
3.2 运行镜像
基础环境
安装GitLab : GitLab 安装及使用
安装Jenkins :Jenkins 安装和卸载
安装Harbor: Harbor 安装
安装Docker: Docker安装
初步持续集成
Jenkins配置
Jenkins插件安装
系统管理->插件管理
安装内容为:Maven、Gitlab、SSH、Docker
安装Maven插件
安装Gitlab
安装SSH
安装Docker
添加凭据
进入凭证配置界面
新增凭证
新增成功
配置SSH远程服务器
SSH remote hosts,当我们需要使用ssh命令对发布服务器进行操作时,需要先配置发布服务器
场景:构建完成后,需要在发布服务器拉取镜像进行部署
输入对应的信息,并校验是否连接成功!成功后,点击应用,保存。可配多个,配置方式一样
全局工具配置
项目使用SpringBoot,需要配置安装JDK、Maven、Docker、Git,勾选自动安装
安装JDK
安装Git
安装Maven
安装Docker
全局安全配置
不要防止跨站点请求伪造功能
新建Jenkins任务
新建任务,选择“构建一个Maven项目”,任务名称自定义
配置源码管理
选择Git,从gitlab复制克隆地址粘贴到Repository URL中,没有报错就表示OK的
注意:这里克隆的是HTTP方式的地址,如果用ssh,需要配置 API Token
配置构建触发器
需要记录 URL 和 TOKEN,供 gitlab 配置 webhook 使用
配置触发条件
点击高级,配置webhook策略,生成 TOKEN
配置构建环境
勾选后可以看到控制台打印的信息,属于可选配置
配置构建命令
使用springboot项目的构建命令
clean package
GitLab配置webhook
进入项目,进入webhook配置界面
填写记录好的 URL 和 TOKEN
按需勾选 webhook 的触发事件
关闭ssl验证
点击 Add webhook,如图表示成功添加了 webhook,可以点击 Test 进行测试
添加webhook报错
Url is blocked: Requests to the local network are not allowed
解决办法:Admin area => Settings => Network
允许从webhook和服务向本地网络发出请求
配置到这里,已经实现初步的持续集成了,效果是,分支提交后,自动打成jar包,剩下持续部署的任务就是运行这个jar包
但我们的方案不是直接运行这个jar包,而是构建成镜像,所以继续往下
镜像的持续集成
配置Harbor
新建项目
新建项目
新建用户
配置成员权限,按角色分配
配置构建服务器
现在直接推送镜像到 Harbor,会有若干报错,挨个解决
1)报错:Got permission denied while trying to connect to the Docker daemon socket
原因:没有权限,因为用户Jenkins无法执行docker
解决方案:将jenkins用户加入docker组,重启Jenkins服务
sudo gpasswd -a jenkins docker
sudo service jenkins restart
2)报错: xxx server gave HTTP response to HTTPS client 或 Error response from daemon:xxx request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).
原因:连接不上Harbor
解决方案:配置可访问
1、编辑 daemon.json,没有则创建一个
vim /etc/docker/daemon.json
内容如下,有端口需要加上端口
{
"insecure-registries": ["http://192.168.1.1:端口"]
}
重启
systemctl daemon-reload
systemctl restart docker
2、编辑 /usr/lib/systemd/system/docker.service
vim /usr/lib/systemd/system/docker.service
添加内容
EnvironmentFile=-/etc/sysconfig/docker
ExecStart=/usr/bin/dockerd $OPTIONS
3)报错:Loaded: error (Reason: Invalid argument)
原因:/lib/systemd/system/docker.service 文件中 ExecStart 有两个值
解决方案:注释其中一个 ExecStart
配置 Dockerfile
Dockerfile 放在根目录下
指定jar包名称,修改pom文件
<build>
<finalName>app</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.6.4</version>
</plugin>
</plugins>
</build>
SpringBoot 项目的 Dockerfile 配置
# 基础镜像
FROM java:8
# 制作人
MAINTAINER xxx
# 将工程的jar打包到镜像中
COPY target/app.jar demo.jar
# 暴露的端口
EXPOSE 7001
# 镜像启动后执行的命令
ENTRYPOINT java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /demo.jar
构建后发现镜像的大小高达500多M,经过努力搜索资料,换成使用镜像 openjdk:8-jre-alpine
alpine镜像用的是Alpine Linux内核,比ubuntu内核要小很多
注意:进入容器时,后面的路径不是/bin/bash,而是 /bin/sh
$ docker exec -it container_name /bin/sh
新构建出来的镜像100多M,若有更好的镜像,大家互相交流
配置 Jenkins
选择执行shell
shell脚本内容
Harbor部署地址为:192.168.1.1:8082,MAINTAINER为xxx
# 进入工作目录
cd $WORKSPACE
# 构建镜像
docker build -t xxx/app:v1 .
# 标记镜像
docker tag xxx/app:v1 192.168.1.1:8082/xxx/app:v1
# 查看镜像
docker images
# 登录 Harbor
docker login 192.168.1.1:8082 -u admin -p Harbor12345
# 推送到 Harbor
docker push 192.168.1.1:8082/xxx/app:v1
持续发布
配置发布服务器
安装Docke环境r:Docker安装
配置harbor服务器连接
vim /etc/docker/daemon.json
内容如下,有端口需要加上端口
{
"insecure-registries": ["http://192.168.1.1:端口"]
}
重启
systemctl daemon-reload
systemctl restart docker
配置Jenkins
进入工程配置界面,选择“Execute shell script on remote host using ssh”
ssh内容
-p:主机(宿主)端口:容器端口,–name 自定义的容器名称
# 拉取镜像
docker pull 192.168.1.1:8082/xxx/app:v1
# 根据容器名称停止容器
docker stop app
# 根据容器名称删除容器
docker rm app
# 运行镜像,假设java项目端口为9999
docker run -p 9999:9999 -d --name app 192.168.1.1:8082/xxx/app:v1
开放发布服务器防火墙的端口
启停防火墙
systemctl start firewalld
systemctl stop firewalld
开放9999端口
firewall-cmd --zone=public --add-port=9999/tcp --permanent
重启防火墙:
systemctl reload firewalld
检查是否已开放
firewall-cmd --query-port=9999/tcp
报错记录
报错
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock:
原因: jenkins 用户没有执行 docker 的权限
解决方案:docker.sock 赋予权限
chmod 777 /var/run/docker.sock
报错
unauthorized: unauthorized to access repository: xxxx, action: push
原因:没有 push 的权限
解决方案 :先登录 harbor,再 push
docker login 192.168.140.xx:xx -u admin -p Harbor12345
更多推荐
所有评论(0)