解决GitHub Actions中Gradle构建产物被清理致Docker镜像构建失败问题
解决GitHub Actions中Gradle构建产物被清理导致Docker无法获取Jar包的问题
问题根源
GitHub Actions里,同一个Job的步骤默认共享工作目录,但如果Gradle构建后触发了自动清理(比如部分插件或自定义脚本),或者构建产物路径未被后续步骤正确识别,就会出现Docker找不到Jar包的情况。
完整工作流配置
以下是能正确衔接Gradle构建与Docker镜像构建的YAML配置:
name: Build & Deploy Spring Boot App on: push: branches: [ release ] jobs: build-deploy: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup JDK 17 uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' cache: gradle - name: Build executable Jar with Gradle run: ./gradlew bootJar --no-daemon # bootJar生成的Jar包默认在项目根目录的build/libs/下 - name: Verify build artifacts (可选,用于调试) run: ls -l build/libs/ - name: Setup Docker Buildx uses: docker/setup-buildx-action@v3 - name: Build Docker image run: docker build -t my-spring-boot-app:latest . # 需确保Dockerfile正确指向build/libs/下的Jar包 - name: Deploy to VPS uses: appleboy/ssh-action@v1.0.3 with: host: ${{ secrets.VPS_HOST }} username: ${{ secrets.VPS_USERNAME }} key: ${{ secrets.VPS_SSH_KEY }} script: | docker stop my-spring-boot-app || true docker rm my-spring-boot-app || true # 示例:传输本地构建的镜像到VPS并运行 docker save -o app-image.tar my-spring-boot-app:latest scp app-image.tar ${{ secrets.VPS_USERNAME }}@${{ secrets.VPS_HOST }}:/tmp/ ssh ${{ secrets.VPS_USERNAME }}@${{ secrets.VPS_HOST }} "docker load -i /tmp/app-image.tar && docker run -d --name my-spring-boot-app -p 8080:8080 my-spring-boot-app:latest"
关键配置说明
1. Gradle构建产物保留
使用bootJar任务构建的可执行Jar默认存放在build/libs/目录,只要不主动执行clean任务或删除该目录,产物会保留在工作目录中,供后续Docker步骤访问。
2. Dockerfile配置要点
确保Dockerfile中正确复制Jar包,示例如下:
FROM openjdk:17-jdk-slim WORKDIR /app # 复制build/libs下的所有Jar包(如果有多个,可指定具体名称) COPY build/libs/*.jar app.jar ENTRYPOINT ["java", "-jar", "/app/app.jar"]
3. 跨Job场景的产物传递(如果需要拆分构建和部署)
如果将构建和部署拆分为两个独立Job,需要用actions/upload-artifact和actions/download-artifact传递Jar包:
# 构建Job中的上传步骤 - name: Upload Jar artifact uses: actions/upload-artifact@v4 with: name: spring-boot-jar path: build/libs/*.jar # 部署Job中的下载步骤 - name: Download Jar artifact uses: actions/download-artifact@v4 with: name: spring-boot-jar path: build/libs/
4. 避免清理产物的注意事项
- 不要在Gradle构建步骤后添加
./gradlew clean之类的清理命令 - 检查是否使用了会自动清理构建目录的第三方Action,如有则禁用清理逻辑
- 确保工作目录的权限设置正确,避免后续步骤无法读取
build/libs/下的文件
内容的提问来源于stack exchange,提问作者user3111411
相关产品推荐
相关产品推荐

