Gitea+Drone+SpringBoot实践
注意:构建的前提,已安装Gitea和Drone
1.新建一个SpringBoot项目
如果可以的话建议在Maven POM 文件中的Build -> finalName 指定打包完成后的文件名
<build> <finalName>coreqi</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build>
2.在项目根路径下创建entrypoint.sh文件【文件名可以随意】,该文件用于打包进Docker镜像中,使用该Shell脚本运行打包后的jar文件
#!/bin/sh java -Xms128m -Xmx128m -jar /app/coreqi*.jar if [ $? != 0 ]; then echo Failed to start java >&2 exit 1 fi
备注:在构建Docker镜像时,将会将jar包放到/app目录下。
3.在项目根路径下新建Dockerfile文件,用于构建Docker镜像。
FROM openjdk:8-jre-alpine3.9 ENV SERVICE_PORTS=7878 RUN mkdir -p /app/ WORKDIR /app COPY ./entrypoint.sh /app/ RUN chmod 755 -R /app/ COPY ./coreqi*.jar /app/ ENTRYPOINT ["/app/entrypoint.sh"]
备注:
1.我的SpringBoot Demo运行在7878端口上,因此开发那个端口需要自行修改
2.因为脚本中从当前路径下拷贝jar包,你可能关心jar包不在当前根目录下,因此构建会失败,不用担心,这个Dockerfile是由Drone来执行构建流程的,在构建前,我们会使用Drone将jar包放到和Dockerfile同路径下。
3.在项目根路径下新增run.sh文件,该文件用于删除旧的镜像及该镜像生成的容器,并根据Dockerfile构建新的镜像,同时调用该镜像生成新的容器。
#!/bin/sh # 定义应用组名 group_name='fanqi' # 定义应用名称 app_name='coreqi' # 定义应用版本 app_version='latest' echo '----copy jar----' docker stop ${app_name} echo '----stop container----' docker rm ${app_name} echo '----rm container----' docker rmi ${group_name}/${app_name}:${app_version} echo '----rm image----' # 打包编译docker镜像 docker build -t ${group_name}/${app_name}:${app_version} . echo '----build image----' docker run -p 7878:7878 --name ${app_name} \ -e TZ="Asia/Shanghai" \ -v /etc/localtime:/etc/localtime \ -d ${group_name}/${app_name}:${app_version} echo '----start container----'
备注:
1.这个shell文件是由Drone来执行的,在执行前,会使用Drone将Dockerfile文件放到与该shell文件同路径下。
4.在Drone中激活仓库并在仓库设置中开启Trusted,这可能需要Drone管理员权限,你需要在创建Drone时声明管理员,具体参考我博客中创建Drone流程。
5.在项目根路径中新增.drone.yml文件【注意文件名】,这和你在Drone中配置仓库时设置的文件名要保持一致。
kind: pipeline type: docker name: mypubdemo steps: - name: build-jar # 流水线名称 image: maven:3.8.5-openjdk-8 # 定义创建容器的Docker镜像 volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置 - name: maven-cache path: /mnt/maven/.m2 # 将maven下载依赖的目录挂载出来,防止重复下载 - name: maven-build path: /mnt/app/build # 将应用打包好的Jar和执行脚本挂载出来 commands: # 定义在Docker容器中执行的shell命令 - mvn clean package -DskipTests=true # 应用打包命 - cp target/coreqi.jar /mnt/app/build/coreqi.jar - cp entrypoint.sh /mnt/app/build/ - cp Dockerfile /mnt/app/build/ - cp run.sh /mnt/app/build/ - name: build-docker image: plugins/docker volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置 - name: maven-build path: /mnt/app/build # 将应用打包好的Jar和执行脚本挂载出来 - name: docker path: /var/run/docker.sock # 挂载宿主机的docker settings: dockerfile: /mnt/app/build/Dockerfile commands: # 定义在Docker容器中执行的shell命令 - cd /mnt/app/build - chmod +x run.sh - sh run.sh - docker ps volumes: # 定义流水线挂载目录,用于共享数据 - name: maven-build host: path: /mnt/maven/build # 从宿主机中挂载的目录 - name: maven-cache host: path: /mnt/maven/cache - name: docker host: path: /var/run/docker.sock
6.在README.md中添加构建状态图标【可选】
在仓库的配置中找到构建状态图标地址,添加到README.md文件中即可。
7.提交,触发构建流程。