如何通过GitLab CI/CD实现AWS EC2数据自动处理并推送至GitLab仓库
需求可行性确认
该需求完全可实现,GitLab CI/CD的bash runner支持主动拉取EC2实例上的文件,不需要依赖反向推送逻辑。
具体操作步骤
第一步:配置EC2访问凭证
- 在EC2实例上创建专用服务账号,不要使用root账号,仅给该账号分配Amppot日志sqlite文件的只读权限
- 生成CI专用SSH密钥对,不要使用个人日常使用的密钥:执行
ssh-keygen -t ed25519 -C "gitlab-ci-amppot" -f gitlab-ci-ssh-key,生成时全程不要设置密码 - 将生成的公钥
gitlab-ci-ssh-key.pub的内容,追加到EC2服务账号的~/.ssh/authorized_keys文件中 - 进入GitLab项目的「设置」-「CI/CD」-「变量」页面,新增三个变量:
EC2_SSH_PRIVATE_KEY:值为刚才生成的私钥gitlab-ci-ssh-key的全部内容,变量类型选择「文件」,勾选「保护变量」「掩码变量」EC2_USER:值为EC2上创建的专用服务账号的用户名EC2_HOST:值为EC2实例的公网IP或域名
第二步:上传处理脚本到GitLab项目
把你编写的sqlite转csv的Python脚本上传到项目根目录,脚本中的输入、输出路径统一使用相对路径,例如输入路径写./raw_data/amppot.db,输出路径写./processed_data/amppot_$(date +%Y%m%d).csv即可。
第三步:编写.gitlab-ci.yml配置文件
将以下内容保存为.gitlab-ci.yml放在项目根目录,按照注释替换成你自己的实际配置即可:
stages: - pull_data - process_data - push_result # 全局前置配置:安装运行依赖 before_script: - apt-get update && apt-get install -y openssh-client python3 python3-pip - pip3 install pandas sqlite3 # 你脚本用到的所有Python依赖都写在此处 - mkdir -p raw_data processed_data # 配置SSH免密访问EC2 - chmod 600 $EC2_SSH_PRIVATE_KEY - eval $(ssh-agent -s) - ssh-add $EC2_SSH_PRIVATE_KEY - echo "StrictHostKeyChecking no" >> /etc/ssh/ssh_config # 第一阶段:从EC2拉取sqlite原始文件 pull_ec2_data: stage: pull_data script: # 替换冒号后的路径为EC2上sqlite文件的实际存储路径 - scp $EC2_USER@$EC2_HOST:/path/to/your/amppot.db ./raw_data/ only: - schedules # 仅定时任务触发时运行,如需每次推送代码都运行可改为main # 第二阶段:运行Python脚本处理数据 process_amppot_data: stage: process_data script: # 替换成你自己的Python脚本文件名 - python3 your_process_script.py needs: - pull_ec2_data # 第三阶段:将生成的csv推送回仓库 push_csv_to_repo: stage: push_result script: - git config --global user.name "GitLab CI Bot" - git config --global user.email "ci-bot@your-domain.com" - git add processed_data/*.csv - git commit -m "chore: auto update amppot csv $(date +%Y%m%d)" - git push https://gitlab-ci-token:${CI_JOB_TOKEN}@${CI_SERVER_HOST}/${CI_PROJECT_PATH}.git HEAD:main needs: - process_amppot_data only: - schedules
第四步:配置定时触发规则
进入GitLab项目的「构建」-「流水线计划」页面,新建定时任务,按照你的需求设置运行频率即可,例如设置为每天凌晨2点运行,刚好拉取前一天的完整日志。
注意事项
- 如果EC2配置了安全组限制,需要将GitLab runner的公网IP添加到EC2安全组的SSH入站规则中,开放22端口访问权限
- 配置完成后可以手动触发一次流水线测试,排查路径、权限相关问题
- 如果生成的csv文件体积较大,建议配置Git LFS存储大文件,避免仓库体积过快膨胀
内容的提问来源于stack exchange,提问作者bustharime
相关产品推荐
相关产品推荐

