目录
- 前言
- 项目目录结构
- 目录结构
- 测试文件
- 文件内容
- Dockerfile
- run.sh
- drone.yml
- 测试
- 打包部署中
- 查看容器
- 访问项目成功
- 常见问题
- Gogs 推送 URL 被解析到默认禁用的本地网络地址
- 1、drone登录没有权限
- 2、cannot ping the remote server
- 3、推送代码以后不能自动clone
- 4、maven编译报错Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile
- 5、cp: cannot stat 'air-app/docker/Dockerfile': No such file or directory
- 6、Error response from daemon: Head "https://registry-1.docker.io/v2/appleboy/drone-ssh/manifests/latest"
- 7、no main manifest attribute, in xxx.jar(jar中没有主清单属性)
前言
测试环境频繁的部署,既浪费时间又没有什么技术含量,在项目模块多的时候,部署一次要花半小时的时间,每天都要部署测试,时间长了浪费的时间还是挺多的,人为部署有时候还可能误操作。基于种种原因,萌生了自动打包测试工具drone,drone与gogs还有docker完美结合,实现自动打包,自动部署非常完美,现在让我们来感受一下吧!
项目目录结构
目录结构
一个未使用自动打包部署的项目,只需要添加这三个文件就可以实现自动部署。
测试文件
文件内容
Dockerfile
# 该项目镜像需要依赖的基础镜像
FROM java:8
# 将当前目录下的jar包复制到docker容器的根目录下
ADD air-app.jar /air-app.jar
# 指定docker容器启动时运行jar包,在容器启动的时候运行命令,来启动我们的项目
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/air-app.jar","-Xms128m","-Xmx128m","-c"]
# 指定维护者的名字
MAINTAINER air
run.sh
#!/usr/bin/env bash
#定义应用的组名
group_name='air'
#定义应用名称
app_name='air-app'
#定义应用版本
app_version='1.0.0'
#容器端口
app_in_port='5001'
#宿主端口
app_out_port='5001'
echo '----stop container----'
docker stop ${app_name}
echo '----rm container----'
docker rm ${app_name}
echo '----rm image----'
docker rmi docker.io/${app_name}:${app_version}
echo '----build image----'
docker build -t docker.io/${app_name}:${app_version} .
echo '----start container----'
docker run -d --restart=always --network=host \
-p ${app_out_port}:${app_in_port} \
-v /data/logs/${group_name}:/logs \
-e "spring.profiles.active=test" \
--name ${app_name} docker.io/${app_name}:${app_version}
drone.yml
kind: pipeline # 定义对象类型,还有secret和signature两种类型
type: docker # 定义流水线类型,还有kubernetes、exec、ssh等类型
name: air-app-drone # 定义流水线名称
clone:
disable: false
#指定打包分支和触发事件
#trigger:
# branch:
# - master
# event:
# - push
steps: # 定义流水线执行步骤,这些步骤将顺序执行
1. name: package # 流水线名称
image: maven:3-jdk-8 # 定义创建容器的Docker镜像
volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置
- name: maven-cache
path: /root/.m2 # 将maven下载依赖的目录挂载出来,防止重复下载
- name: maven-build
path: /app/build # 将应用打包好的Jar和执行脚本挂载出来
commands: # 定义在Docker容器中执行的shell命令
- mvn clean package # 应用打包命令
- cp air-app/target/air-app-1.0.0.jar /app/build/air-app.jar
- cp air-app/docker/Dockerfile /app/build/Dockerfile
- cp air-app/run.sh /app/build/run.sh
2. name: build-start
image: appleboy/drone-ssh # SSH工具镜像
settings:
host: 192.168.0.100 # 远程连接地址
username: root # 远程连接账号
password:
from_secret: ssh_password # 从Secret中读取SSH密码
port: 22 # 远程连接端口
command_timeout: 5m # 远程执行命令超时时间
script:
- cd /mydata/maven/build # 进入宿主机构建目录
- chmod +x run.sh # 更改为可执行脚本
- ./run.sh # 运行脚本打包应用镜像并运行
volumes: # 定义流水线挂载目录,用于共享数据
3. name: maven-build
host:
path: /mydata/maven/build # 从宿主机中挂载的目录
4. name: maven-cache
host:
path: /mydata/maven/cache # 从宿主机中挂载的目录
注意 ssh_password为服务器ssh的登录密码,该参数在drone控制面板配置
测试
将修改的代码提交到gogs,不一会drone就开始clone,package部署了
打包部署中
查看容器
访问项目成功
常见问题
Gogs 推送 URL 被解析到默认禁用的本地网络地址
Payload URL resolved to a local network address that is implicitly
bloc Gogs 推送 URL 被解析到默认禁用的本地网络地址
解决办法参考:https://blog.51cto.com/u_1472521/5981347
1、drone登录没有权限
目前的解决办法:登录gogs将drone对应的token删除,只要将token删除后就可以登录了。
2、cannot ping the remote server
Drone-runner-docker日志打印:
time=“2023-06-24T00:51:21Z” level=error msg=“cannot ping the remote
server” error=“Post “http://192.168.0.100:3080:3080/rpc/v2/ping”:
dial tcp: lookup 192.168.0.100:3080: no such host”
该问题是创建Drone-runner-docker容器的时候,把drone 的访问地址弄错造成的,修改正确即可解决。
3、推送代码以后不能自动clone
这个问题很容易解决,只需要在【drone.yml】文件配置一下启用自动clone即可
4、maven编译报错Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile
配置一下pom插件即可:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
5、cp: cannot stat ‘air-app/docker/Dockerfile’: No such file or directory
原因:Dockerfile文件位置放错了
将其话到air-app/docker目录下即可解决
6、Error response from daemon: Head “https://registry-1.docker.io/v2/appleboy/drone-ssh/manifests/latest”
访问超时,配置一下代理即可
先安装 dig指令
yum -y install bind-utils
参考:https://blog.csdn.net/p1279030826/article/details/126186916
7、no main manifest attribute, in xxx.jar(jar中没有主清单属性)
打包的问题,配置一下pom插件即可
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
以上问题,每个人配置不一定都遇到得到,这里只是为了记录而已,如果你遇到了,那恭喜你,按照上面的方法准能解决。