You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 20:45:24