如何实现私有Git仓库推送代码时触发SageMaker Pipeline?
私有Git仓库推送触发SageMaker Pipeline的解决方案
一、先解决post-receive钩子无效的核心问题
你当前的脚本无法运行,核心原因是post-receive(服务器端钩子)的参数逻辑和pre-commit(客户端钩子)完全不同,加上配置细节缺失,导致钩子未正确执行:
1. 修正钩子的参数逻辑
post-receive不通过命令行参数接收状态,而是从标准输入读取推送的提交信息(格式为旧提交ID 新提交ID 分支名)。你原来的脚本用$1判断是错误的,以下是修正后的post-receive脚本:
#!/bin/bash # 日志函数,输出到固定文件方便调试 log_message() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> /var/log/git-sagemaker-hook.log } # 读取推送的分支信息(仅处理main分支,可按需修改目标分支) while read oldrev newrev refname; do branch=$(git rev-parse --symbolic --abbrev-ref $refname) if [ "$branch" = "main" ]; then log_message "检测到推送到main分支,触发SageMaker Pipeline..." # 确保AWS CLI能读取到配置,若服务器是EC2可绑定IAM角色,否则指定凭证路径 export AWS_CONFIG_FILE="/home/git/.aws/config" export AWS_SHARED_CREDENTIALS_FILE="/home/git/.aws/credentials" # 触发Pipeline pipeline_execution_output=$(aws sagemaker start-pipeline-execution \ --pipeline-name "你的Pipeline名称" \ 2>&1) if [ $? -eq 0 ]; then log_message "Pipeline触发成功" else log_message "Pipeline触发失败:$pipeline_execution_output" fi fi done
2. 确保钩子的正确配置
- 将脚本放到服务器端Git仓库的
.git/hooks目录下,命名为post-receive(不能加后缀) - 给脚本添加可执行权限:
chmod +x .git/hooks/post-receive - 验证服务器端权限:确保运行Git的用户(如git用户)有权限调用SageMaker API,可手动执行
aws sagemaker start-pipeline-execution --pipeline-name "你的Pipeline名称"测试
二、替代实现方案
如果服务器端钩子无法修复,可选择以下替代方案:
1. 私有Git服务器Webhook转发(推荐)
若你的私有Git服务器支持Webhook(如Gitea、GitLab CE、自建Gogs等),配置Webhook触发AWS Lambda函数:
- 在Lambda中编写代码调用
StartPipelineExecutionAPI - 给Lambda配置具备SagePipeline执行权限的IAM角色
- 在Git服务器中设置推送事件触发该Lambda的API Gateway地址
2. 客户端post-push钩子触发
适合小团队,要求每个开发者在本地仓库的.git/hooks目录下添加post-push脚本,推送完成后触发Pipeline:
#!/bin/bash aws sagemaker start-pipeline-execution --pipeline-name "你的Pipeline名称"
注意:需确保每个开发者本地已配置AWS凭证,且仅在成功推送后触发
3. 定时轮询Git仓库
用CloudWatch Events定时触发Lambda,Lambda拉取Git仓库的最新提交ID,与上次存储在S3/Parameter Store的ID对比,若有更新则触发Pipeline:
- Lambda逻辑:拉取仓库最新提交 → 对比历史提交ID → 若不同则调用SageMaker API
- 优势:无需修改Git服务器配置,适合无法访问服务器的场景
内容的提问来源于stack exchange,提问作者Developer
相关产品推荐
相关产品推荐

