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

为含多Lambda的单体仓库触发指定目录的GitHub Actions构建

实现单体仓库多Lambda的按需部署

核心思路

通过GitHub Actions的路径触发+变更目录判断,实现仅当目标Lambda目录下的代码合并到dev分支时,自动构建并部署对应的Lambda函数,避免无意义的全量部署。


步骤1:创建GitHub Actions工作流文件

在仓库根目录下创建.github/workflows/lambda-deploy.yml,配置触发规则和部署逻辑。

方案1:多Job独立配置(适合少量Lambda)

每个Lambda对应一个独立Job,通过if条件判断该目录是否有变更:

on:
  push:
    branches:
      - dev
    paths:
      - 'billing-lambda/**'
      - 'user-lambda/**'
      - 'order-lambda/**' # 列出所有Lambda顶层目录

jobs:
  # 部署billing-lambda
  deploy-billing:
    runs-on: ubuntu-latest
    # 仅当billing-lambda目录下有文件变更时执行
    if: contains(github.event.head_commit.modified, 'billing-lambda/')
    steps:
      - name: 拉取代码
        uses: actions/checkout@v4

      - name: 配置Node.js运行环境(根据你的Lambda运行时调整)
        uses: actions/setup-node@v4
        with:
          node-version: 20

      - name: 安装依赖
        working-directory: ./billing-lambda
        run: npm ci

      - name: 打包Lambda代码
        working-directory: ./billing-lambda
        run: zip -r billing-package.zip .

      - name: 部署到AWS Lambda
        uses: aws-actions/aws-cli@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: us-east-1 # 替换为你的AWS区域
        run: |
          aws lambda update-function-code \
            --function-name billing-lambda \
            --zip-file fileb://billing-lambda/billing-package.zip

  # 复制上述Job,修改对应目录和函数名即可部署其他Lambda
  deploy-user:
    runs-on: ubuntu-latest
    if: contains(github.event.head_commit.modified, 'user-lambda/')
    steps:
      - name: 拉取代码
        uses: actions/checkout@v4
      # ... 后续步骤参考deploy-billing,替换为user-lambda相关配置

方案2:矩阵策略(适合大量Lambda,更简洁)

用矩阵批量管理所有Lambda,通过git diff检查目录变更,避免重复代码:

on:
  push:
    branches:
      - dev
    paths:
      - 'billing-lambda/**'
      - 'user-lambda/**'
      - 'order-lambda/**'

jobs:
  deploy-lambda:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        # 定义所有Lambda的目录名和AWS函数名
        lambda:
          - dir: billing-lambda
            func: billing-lambda-dev
          - dir: user-lambda
            func: user-lambda-dev
          - dir: order-lambda
            func: order-lambda-dev
    steps:
      - name: 拉取代码
        uses: actions/checkout@v4

      - name: 检查当前Lambda目录是否有变更
        id: check-changes
        run: |
          # 对比本次push前后的代码变更,检查是否包含当前Lambda目录
          if git diff --name-only ${{ github.event.before }} ${{ github.sha }} | grep -q "^${{ matrix.lambda.dir }}/"; then
            echo "changed=true" >> $GITHUB_OUTPUT
          else
            echo "changed=false" >> $GITHUB_OUTPUT
          fi

      - name: 配置Node.js环境
        if: steps.check-changes.outputs.changed == 'true'
        uses: actions/setup-node@v4
        with:
          node-version: 20

      - name: 安装依赖
        if: steps.check-changes.outputs.changed == 'true'
        working-directory: ./${{ matrix.lambda.dir }}
        run: npm ci

      - name: 打包代码
        if: steps.check-changes.outputs.changed == 'true'
        working-directory: ./${{ matrix.lambda.dir }}
        run: zip -r lambda-package.zip .

      - name: 部署到AWS Lambda
        if: steps.check-changes.outputs.changed == 'true'
        uses: aws-actions/aws-cli@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: us-east-1
        run: |
          aws lambda update-function-code \
            --function-name ${{ matrix.lambda.func }} \
            --zip-file fileb://${{ matrix.lambda.dir }}/lambda-package.zip

关键注意事项

  1. AWS权限配置:在GitHub仓库的「Settings → Secrets and variables → Actions」中添加AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY,该AWS账号需要具备lambda:UpdateFunctionCode权限。
  2. 运行时适配:如果你的Lambda使用Python、Java等其他语言,修改对应的构建步骤:
    • Python:用pip install -r requirements.txt -t .安装依赖后打包
    • Java:用mvn package生成jar包,再部署
  3. 变更判断可靠性:矩阵方案中使用git diff对比github.event.before和github.sha,能覆盖合并多个提交的场景,比仅依赖github.event.head_commit.modified更准确。
  4. 路径触发优化:on.push.paths只列出Lambda目录,确保只有这些目录有变更时才触发工作流,节省资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 06:12:33