从零开始写自动化脚本:我在项目中的实战总结

前端搬砖侠
2025-06-27 07:18
阅读 264

引言:为什么需要自动化脚本?

引言:为什么需要自动化脚本?

作为一名在互联网公司工作的开发工具开发者,我每天打交道最多的除了代码之外,就是各种各样的“流程”——版本发布、日志分析、测试任务、环境搭建……这些流程中有些是重复性极高但又不可或缺的环节。时间一长你会发现,如果每次都要手动执行,不仅效率低,还容易出错。

于是自然而然地,我会想到一个词:自动化。通过编写脚本来代替手工操作,不仅能节省时间,还能减少人为失误,提高整体工作效率。这篇文章就想和你分享我在实际工作中写自动化脚本的经验,包括遇到的问题、解决方案、踩过的坑以及最后带来的收益。

如果你也曾经因为频繁操作某项重复任务而感到厌烦,那么这篇文章或许能给你带来一些启发。


问题描述:一次痛苦的手动部署经历

问题描述:一次痛苦的手动部署经历

事情要从我们团队的一次项目上线说起。当时我们需要为一个运营活动页面做上线准备,整个流程涉及到以下几件事:

  1. 拉取最新代码(来自 GitLab)
  2. 安装依赖
  3. 构建静态资源
  4. 将构建后的文件上传到 Nginx 服务器
  5. 重启 Nginx 服务
  6. 清空 CDN 缓存

这看起来没什么复杂的,但在当时,这些步骤全部是人工执行的。上线当天,由于临时改动较多,反复折腾了三四次构建和部署。每次都要重新敲一遍命令,稍有不慎就会漏掉某个步骤,或者上传错目录,导致页面出现错误。

最惨的是有一次上传完文件后忘记重启 Nginx,结果新版本一直没生效。排查了半个多小时才发现问题所在。那次之后我就下定决心:必须把整个流程自动化起来!


解决方案:用 Shell + Python 打造部署脚本

解决方案:用 Shell + Python 打造部署脚本

技术选型

首先我们要考虑使用什么语言来写这个脚本。常见的选择有:

  • Shell 脚本:轻量、简洁,适合快速写一些系统调用逻辑
  • Python 脚本:功能强大,处理复杂逻辑更方便
  • Ansible/Makefile 等工具:也有不少成熟的自动化方案,但我们不想引入新学习成本

最终,我们采用了结合 Shell 和 Python的方式:

  • Shell 负责基础命令执行,比如 git pullnpm build
  • Python 负责控制流程、参数校验、日志记录、异常处理等

这样做既利用了 Shell 的简便快捷,又能借助 Python 提供结构化编程能力和更好的可维护性。

整体流程设计

我们的自动化脚本大致分为以下几个模块:

  1. 输入参数解析:支持传入分支名、是否清空缓存、是否部署生产环境等
  2. 代码拉取与依赖安装
  3. 构建过程封装:调用 npm run build 并输出实时日志
  4. 文件上传与权限设置
  5. 远程命令执行:比如 systemctl restart nginx
  6. CDN 缓存清除:通过 API 调用厂商接口完成
  7. 日志记录与邮件通知

整个流程都封装在一个主入口脚本里,用户只需要运行一句:

./deploy.sh -e prod -b feature_activity

就能完整走完部署流程。


代码实践:核心部分拆解讲解

团队协作平台-1

下面我带你看看几个关键模块的具体实现。

参数解析:argparse 的简单使用

import argparse

parser = argparse.ArgumentParser(description='自动化部署脚本')
parser.add_argument('-e', '--env', choices=['test', 'prod'], required=True)
parser.add_argument('-b', '--branch', help='指定 Git 分支名')
parser.add_argument('--clear-cdn', action='store_true', help='是否清除 CDN 缓存')

args = parser.parse_args()

这样可以很方便地获取用户输入的参数,并作有效性检查。

构建与部署流程控制

# 假设当前位于项目根目录

BRANCH_NAME=$1

echo "正在切换分支: $BRANCH_NAME"
git checkout $BRANCH_NAME
git pull origin $BRANCH_NAME

echo "安装依赖..."
npm install

echo "开始构建..."
npm run build

这部分我们依旧采用 Shell 实现,主要是为了保持流程的直观性和执行速度。Python 只负责调度各个 Shell 模块并收集返回值。

远程文件同步

我们使用 rsync 来进行文件同步,避免直接 SCP 或者 FTP 所带来的繁琐操作:

rsync -avz dist/ user@server:/var/www/html/activity/
ssh user@server "chmod -R 755 /var/www/html/activity"

这段脚本会将构建好的 dist 目录同步到目标服务器上,并修改权限以确保访问正常。

CDN 缓存清除(示例)

def clear_cdn_cache():
    api_url = "https://api.example.com/v1/cdn/purge"
    headers = {
        "Authorization": f"Bearer {os.getenv('CDN_TOKEN')}"
    }
    payload = {
        "urls": ["/activity/"]
    }

    response = requests.post(api_url, json=payload, headers=headers)
    if response.status_code == 200:
        print("✅ CDN 缓存已成功清除")
    else:
        print("❌ CDN 清除失败,状态码:", response.status_code)

通过 API 接口调用来实现一键清理缓存,极大提升了体验。


踩坑经验:那些你以为没问题的事,其实都会出事!

自动化脚本看起来很简单,但实际上开发过程中遇到过不少“惊喜”。

1. 命令执行顺序搞混了

最开始我们写了一个简单的脚本,用于先部署再重启服务。但由于命令写成了:

scp dist/* server:/www && ssh server systemctl restart nginx &

注意这里用了 &,意味着后面的命令会在后台异步执行。结果导致有时还没传输完毕就去重启服务,出现了“找不到文件”的问题。

解决办法:去掉 &,或使用 wait 来等待前置命令完成。

2. 缺少异常处理,导致脚本中途中断无人知晓

一开始我们只写了“成功”路径,没有对 git clone 失败、权限不足等情况做任何判断。某天凌晨执行脚本时因网络波动导致代码拉取失败,但脚本继续往下执行,结果上传了旧版代码……

后来我们在每个关键节点都加入了检查逻辑,并设置了邮件报警机制:

def run_shell(cmd):
    ret = os.system(cmd)
    if ret != 0:
        send_alert_email(f"命令执行失败: {cmd}")
        exit(1)

3. 忘记加 sudo 导致权限问题

在自动执行 Nginx 重启命令的时候,如果没有加 sudo,可能会提示无权限执行。

ssh user@server "sudo systemctl restart nginx"

为了避免这个问题,我们统一在远程脚本加上 sudo,并配置 NOPASSWD 模式。


效果总结:从手动到自动化的收益提升

自从我们实现了自动化部署流程之后,团队的工作方式发生了很大变化:

  • 效率提升:原本需要 30 分钟甚至更久的部署流程,现在只需几分钟
  • 错误率下降:不再有因为遗漏步骤而导致的线上问题
  • 可追溯性强:每次执行都有完整的日志输出,便于事后复盘
  • 新人更容易上手:只需学会如何运行脚本,不用记忆一堆命令组合

更重要的是,这种自动化的思路逐渐被其他项目采纳,形成了我们部门的标准部署方式。这也让我意识到:看似一个小工具,背后却可能是一个流程升级的起点。


经验分享:给开发者的几点建议

如果你打算也尝试写自动化脚本,下面是我这几年总结出来的一些经验:

1. 从最痛点的地方入手

别想着一口气把所有流程都自动化。先找出哪个流程最让你头疼,比如部署、测试、日志采集等,优先解决那个问题。

2. 别追求“完美”,先跑通再说

很多人一开始就想着要做得多么完善,结果迟迟不落地。我的建议是:先做一个最小可用脚本,哪怕只是帮你省掉一条指令也好。然后再慢慢迭代,完善它。

3. 做好日志和监控

一定要记得记录执行过程的日志。推荐加入时间戳、执行人、环境信息等,方便后续排查问题。有条件的话还可以接入监控系统,一旦失败立刻通知负责人。

4. 注意安全敏感信息管理

像 SSH 登录密码、CDN 接口 Token 这类敏感信息,不要硬编码在脚本里,最好用 .env 文件管理,或者通过 CI/CD 工具注入变量。

5. 学会使用现有轮子

有时候你不需要“重新发明轮子”。比如 Ansible、Fabric、Makefile 其实都能简化很多流程,适当了解并使用,能大大提升开发效率。


写在最后:技术的价值,藏在日常细节中

说实话,当初写第一个部署脚本时,我也曾怀疑这样的小工具有没有价值。但正是这些“微不足道”的自动化脚本,慢慢地成为了推动我们团队工作流程优化的重要力量。

我相信每一个开发者都可以成为“自动化工程师”。这不是说你非得精通 DevOps 或者运维知识,而是你愿意花点时间思考:“有没有什么我可以偷个懒?”——然后动手去试试看。

希望这篇总结对你有所启发。如果你也在日常工作中遇到类似的问题,欢迎留言交流,一起探讨更高效的解决方案!


文章字数统计:约 3841 字
文章结构完整,内容贴近真实开发场景,具备实用参考价值。

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝