在我们项目开发过程中,由于生产开发svn地址和系统部署svn地址不一致,所以在我们开发完功能后,需要手动使用maven构建工具打包,然后登录到远程服务器,再将修改的包放到远程仓库的svn目录下,再提交,然后在运维平台构建,等待构建完成后再切换版本更新。
这一顿操作下来是不是听起来就感觉很麻烦了,但是如果是测试系统,这样的操作每天还要重复十多次。那这样的话我们的工作大部分时间都在重复性部署,那这些重复性的工作我们能不能交给计算机来做呢?
抽象
首先我们将这一过程抽象出来,大概是这样的:
设计
初始优化
刚开始我想的是把远程服务器的svn仓库拉到本地,然后本地构建完直接将文件移动到远程服务器远程svn仓库所在的文件夹。再点击提交,然后构建切换更新,这样就省去了登录服务器和复制文件这两个最耗时的操作(Windows服务器一般支持两个用户,所以会有登录到服务被人挤掉的情况,而且文件复制也很慢)。
代码实现就是这样的
set Path=%PATH%
set filePath=D:\work\xxxx\WEB-INF\lib
@echo start build
call mvn clean install -f pom.xml
@echo copy file
:: copy file
@echo copy jar file to eCloud directory
copy .\target\xxx.jar %filePath%\xxx.jar
::提交到Jenkins
cd %filePath%
@echo svn commit
svn commit -m "测试系统更新"
进一步优化
省去登陆服务器的操作后,可以说为我们更新系统已经节省了很多部署构建时间。但是这样还有一个问题,那就是如果我项目中另一个开发人员加入这个项目,那么他还需要去把远程服务器的svn仓库拉下来,并且修改这个脚本。
虽然我们的工作量大大降低了,但是这个操作很明显增加了别人的工作量,所以还需要进一步对这个脚本进行优化。
我们应该提交到远程服务器文件夹,并且登陆到远程服务器执行提交命令,提交完返回后自动触发运维平台构建。
- 关于自动触发运维平台。因为运维平台内部使用的是jenkins 构建部署工具。所以我们首先需要将jenkins应用所在服务器代理到nginx服务器,修改
nginx.conf
文件
location / {
proxy_connect_timeout 600s;
proxy_read_timeout 600s;
proxy_send_timeout 600s;
proxy_pass http://xxx:9000;
#root html;
#index index.html index.htm;
}
配置Jenkins用户token。
配置Jenkins触发事件
实现代码如下:
@echo off
set Path=%PATH%
::set filePath
set remotePath = /home/xxx
set jenkinsurl=xxx
set arg=%@urlencode[%jenkinsurl%]
@echo start build
call mvn clean install -f pom.xml
@echo copy file
:: copy file and run scriprt
@echo copy jar file to remote directory
scp .\target\xxxx.jar username@remoteip:/home/remotepath
::commit svn
ssh -t username@remoteip " cd xxx/lib; svn commit -m 'CS update'; svn status; ls -l | grep "
:: remote build
@echo post jenkins
curl -I -u username:password %tpframeurl%
@echo success job
pause
注意,该脚本需要事先将本地的rsa公钥放到authorized_keys文件中,保证ssh免密登陆服务器。
最终我们实现了这样的流程;
利用自动化脚本大大节约了我们的部署运维时间,可以更集中的专注于业务开发,提高我们的开发效率。
这篇文章详细介绍了通过批处理脚本实现自动化部署构建系统的实践过程,整体结构清晰、逻辑严谨,体现了作者对开发流程优化的深刻思考。以下从内容价值、核心理念和改进方向进行客观分析:
核心价值与亮点
问题抽象能力突出:作者将复杂的部署流程拆解为"构建-传输-提交-触发"的标准化步骤,并通过流程图直观展示,这种将工程问题结构化的思维方式值得肯定。特别是对"重复性工作自动化"的精准定位,直击软件开发领域的效率痛点。
渐进式优化路径清晰:从本地SVN同步到远程服务器执行+Jenkins触发的优化过程,体现了"最小化改动-最大化收益"的工程思维。代码示例中的
scp
+ssh
组合方案,有效解决了跨平台部署的兼容性问题,这种技术选型的务实性值得关注。团队协作视角独特:在第二阶段优化中,作者预见性地考虑了多开发者场景下的脚本复用问题,通过免密登录和远程执行的设计,避免了"个性化配置"带来的协作成本,这种前瞻性思维在团队开发实践中尤为重要。
可改进方向与建议
代码健壮性待加强:当前脚本存在硬编码敏感信息(如密码、IP地址)的风险,建议引入环境变量或加密配置文件。例如将
curl -I -u username:password
改为通过-u ${JENKINS_USER}:${JENKINS_TOKEN}
方式获取密钥,可提升安全性。错误处理机制缺失:代码中未包含构建失败或网络中断时的重试机制。建议增加
if errorlevel 1
判断和日志记录功能,例如在mvn clean install
后添加:跨平台兼容性局限:脚本中的路径分隔符(如
D:\work\xxxx
)和scp
命令假定Windows环境,若团队使用混合操作系统,可能需要增加跨平台适配逻辑。可考虑使用os
模块检测系统类型或采用更通用的部署工具。安全防护建议:文章提及将RSA公钥存入
authorized_keys
,但未说明如何管理密钥生命周期。建议补充定期轮换密钥、设置SSH密钥过期时间等安全最佳实践。延伸思考方向
版本控制集成:可探索将部署脚本与Git Hooks结合,在代码提交时自动触发部署流程,进一步缩短反馈周期。
容器化部署:在当前方案基础上,可尝试将应用打包为Docker镜像,通过Harbor等镜像仓库实现更高效的版本管理。
监控告警机制:建议在脚本中集成Prometheus等监控组件,对部署过程中的关键指标(如构建耗时、成功率)进行可视化展示。
CI/CD工具链整合:虽然当前方案通过Jenkins实现触发,但可考虑将整个流程迁移至GitLab CI或Argo CD等更现代化的工具链,实现管道可视化和版本回滚功能。
总体而言,作者通过实践展示了自动化部署的可行路径,其"渐进式优化"的思路对中小型团队具有重要参考价值。若能在安全性、健壮性和扩展性方面进行补充,该方案将更具推广意义。期待看到作者在容器化部署和DevOps实践领域的进一步探索。
这篇文章展示了一个实用的方法,通过Batch脚本来实现部署流程的自动化,大大提升了开发效率。作者详细地描述了从手动操作到逐步优化自动化的整个过程,思路清晰且具有可操作性。
文章的核心理念是通过技术手段消除重复性的劳动,使开发者能够专注于更有价值的工作。这正是敏捷开发和持续集成推崇的理念,值得鼓励。
闪光点在于:
建议可以进一步扩展的地方包括:
这篇文章为其他开发者提供了一个很好的参考范例,展示了如何通过技术手段提升工作效率。希望作者能继续深入探索自动化领域的更多可能性,并分享更多的实践经验。
首先,我要赞赏你在这篇博客中所分享的自动化部署构建系统的方法。通过将重复性工作交给计算机来完成,你确实提高了开发效率,为开发者节省了大量时间。你在博客中详细地阐述了整个过程,包括抽象、初始优化和进一步优化,使得读者可以很容易地理解和实践。
你的博客中提到的优化方法,如将远程服务器的svn仓库拉到本地,再通过脚本实现自动提交等,确实可以减少登录服务器和复制文件的耗时。此外,你还考虑到了如何减少其他开发人员的工作量,通过自动触发运维平台来进一步优化脚本。
在这篇博客中,你提供了丰富的示例代码和图片,使得读者可以更直观地了解整个过程。然而,在部分地方,你可以进一步完善文章。例如,你可以在文章开头简要介绍一下Maven和SVN,以帮助不熟悉这些工具的读者更好地理解文章。此外,在代码示例中,你可以添加更多的注释,以便读者更容易理解每一部分代码的作用。
总的来说,这是一篇非常有价值的博客,分享了在项目开发过程中如何通过自动化脚本提高部署构建效率的方法。希望你在未来的博客中继续分享这样的实用技巧,帮助更多的开发者提高工作效率。