Github Actions部署Java应用提示JAR文件不存在问题排查
问题:Github Actions部署阶段提示JAR文件不存在
我正在为Java应用搭建基于Github Actions的CI/CD流水线,分为构建和部署两个任务:
构建任务配置
build: runs-on: ubuntu-latest steps: - name: Checkout Repository uses: actions/checkout@v2 - name: Set up JDK 17 uses: actions/setup-java@v2 with: distribution: 'temurin' java-version: 17 cache: 'maven' - name: Build and Package run: mvn clean package
部署任务配置
deploy: runs-on: ubuntu-latest needs: build steps: - name: Configure SSH run: | mkdir -p ~/.ssh echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa ssh-keyscan -H ${{ secrets.VM_HOST }} >> ~/.ssh/known_hosts - name: Copy JAR to VM run: scp -i ~/.ssh/id_rsa $GITHUB_WORKSPACE/target/flexipages-backend-0.0.1-SNAPSHOT.jar ${{ secrets.VM_USERNAME }}@${{ secrets.VM_HOST }}:/root/artifact2 # - name: SSH into VM and Restart App # run: | # ssh -i ~/.ssh/id_rsa ${{ secrets.VM_USERNAME }}@${{ secrets.VM_HOST }} 'cd /root/artifact && java -jar flexipages-backend-0.0.1-SNAPSHOT.jar'
错误日志
Run scp -i ~/.ssh/id_rsa $GITHUB_WORKSPACE/target/flexipages-backend-0.0.1-SNAPSHOT.jar ***@***:/***/artifact2 scp -i ~/.ssh/id_rsa $GITHUB_WORKSPACE/target/flexipages-backend-0.0.1-SNAPSHOT.jar ***@***:/***/artifact2 shell: /usr/bin/bash -e {0} /home/runner/work/FlexiPages-backend/FlexiPages-backend/target/flexipages-backend-0.0.1-SNAPSHOT.jar: No such file or directory Error: Process completed with exit code 1.
调试时已在构建任务中确认JAR文件生成,但部署阶段仍报错,请问遗漏了什么配置?
解决方案
核心问题是Github Actions的不同Job之间默认不共享文件系统,构建Job生成的JAR仅存在于自身的Runner环境中,部署Job无法直接访问。需要通过「上传构件+下载构件」的方式在Job间传递文件:
步骤1:在构建任务中添加上传构件动作
修改build Job,在编译打包步骤后添加JAR上传:
build: runs-on: ubuntu-latest steps: - name: Checkout Repository uses: actions/checkout@v2 - name: Set up JDK 17 uses: actions/setup-java@v2 with: distribution: 'temurin' java-version: 17 cache: 'maven' - name: Build and Package run: mvn clean package # 新增:上传编译好的JAR作为构件 - name: Upload Build Artifact uses: actions/upload-artifact@v3 with: name: java-app-jar path: target/flexipages-backend-0.0.1-SNAPSHOT.jar
步骤2:在部署任务中添加下载构件动作
修改deploy Job,在SSH配置步骤前添加JAR下载:
deploy: runs-on: ubuntu-latest needs: build steps: # 新增:下载构建阶段上传的JAR构件 - name: Download Build Artifact uses: actions/download-artifact@v3 with: name: java-app-jar path: target/ # 将JAR下载到target目录,和构建阶段路径保持一致 - name: Configure SSH run: | mkdir -p ~/.ssh echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa ssh-keyscan -H ${{ secrets.VM_HOST }} >> ~/.ssh/known_hosts - name: Copy JAR to VM run: scp -i ~/.ssh/id_rsa $GITHUB_WORKSPACE/target/flexipages-backend-0.0.1-SNAPSHOT.jar ${{ secrets.VM_USERNAME }}@${{ secrets.VM_HOST }}:/root/artifact2
额外注意事项
- 上传和下载的
name参数必须一致(示例中均为java-app-jar),否则无法匹配构件 - 如果JAR文件名随版本变动,可改用通配符匹配路径,比如
path: target/*.jar,避免硬编码文件名 - 构件在Github Actions中默认保留90天,足够完成部署流程
内容的提问来源于stack exchange,提问作者Bihi23
相关产品推荐
相关产品推荐

