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

混合Java与Node.js Lambda时Serverless框架GitHub Action部署问题

问题解决步骤

核心原因

并非容器隔离问题——GitHub Action同一个Job下的所有步骤都运行在同一个runner实例的文件系统中,文件完全共享。问题出在Gradle生成的路径信息与Serverless部署时的路径不匹配,或Serverless配置未正确引用产物文件。


1. 修正Gradle的buildJson任务路径

当前buildJson生成的相对路径基于Gradle项目内部,而Serverless在项目根目录执行,导致路径无法匹配。修改buildJson任务,生成相对于项目根目录的正确路径:

task(buildJson) {
  println "in task(buildJson).."  
  doLast {
    // 生成相对于项目根目录的产物路径
    def relativeDistPath = shadowJar.archivePath.relativeTo(project.rootDir).toString()
    new File("$buildDir/build.json").newWriter().withWriter { w ->
      w << groovy.json.JsonOutput.toJson([distribution: relativeDistPath])
    }
  }
}

修改后,build.json中的路径会是类似build/libs/hello-todo-all.jar的格式,Serverless在根目录执行时能准确定位到产物文件。


2. 确保Serverless.yml正确引用产物

在serverless.yml中为Java Lambda函数配置正确的artifact路径,通过读取build.json的内容实现动态引用:

functions:
  # 替换为你的Java Lambda函数名称与实际配置
  javaLambda:
    handler: app.serverless.hello.HelloHandler
    runtime: java8
    package:
      artifact: ${file(./build/build.json):distribution}

3. 验证GitHub Action中的文件存在性(可选但推荐)

在Gradle构建步骤后添加验证步骤,确认产物生成成功,便于快速排查问题:

- name: Verify Gradle Build Outputs
  run: |
    ls -la build/libs/
    cat build/build.json

4. 优化GitHub Action的Serverless执行逻辑(可选)

当前Serverless步骤中的plugin install会在每次部署时重复执行,可将serverless-iam-roles-per-function提前添加到package.json的devDependencies中,让npm ci自动安装,简化部署流程:

修改package.json:

{
  "devDependencies": {
    "serverless": "^3.0.0",
    "serverless-iam-roles-per-function": "^3.2.0"
  }
}

简化后的Serverless部署步骤:

- name: Serverless Deploy
  uses: serverless/github-action@v3.2
  with:
    args: deploy --stage dev
  env:
    AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
    AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

内容的提问来源于stack exchange,提问作者1977

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 03:46:30