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

