使用travis-ci如何持续部署node.js应用详解

发布时间 - 2026-01-11 02:34:09    点击率:

前言

在开始之前,我们先来简单介绍下Travis-ci,Travis-ci是一款持续集成(Continuous Integration)服务,它能够很好地与Github结合,每当代码更新时自动地触发集成过程。

Travis-ci配置简单,很多nodejs项目都用它做自动测试。然而,对于持续集成,仅做到自动测试是不够的,还要有后续的自动部署,才能完成“提交代码 => 自动测试 => 自动部署”的集成链条。

本文以nodejs应用为例,来谈谈如何利用travis-ci完成自动部署。话不多说,来一起看看详细的介绍:

基本原理

从自动测试到自动部署的核心问题是测试机与生产服务器的信任问题,即如何安全地把程序包传输到生产服务器。市面上的部署工具如scp、ansible、chef,都绕不开这个核心问题。

以scp为例,测试机登录生产服务器的方式有两种:密码和秘钥。密码登录方式需要交互式地输入密码,总不能每次测试的时候,人为地输入密码吧,所以密码方式行不通。

秘钥的方式可以实现自动登录,但首次将测试机的公钥传输给生产服务器仍然需要密码。似乎走入了死胡同,但办法总是有的。我们知道开发机是可以登录到生产服务器的,那么我们就可以将开发机的公钥复制到生产服务器,将开发机的私钥复制到测试机,测试机通过私钥来伪装成开发机,自动地登录到生产服务器。

解决了自动登录的问题,另一个问题是怎么将开发机的私钥复制到测试机上。由于测试机每次都是新开的一个虚拟机,这个新开的虚拟机IP不固定,所以没办法直接登录上去。解决办法是将私钥文件作为代码库的一部分提交,这样测试机每次从代码库上拉取代码的同时也获取到了秘钥文件,通过这种方式就实现了私钥从开发机复制到测试机。

将私钥文件提交到代码库有一个很严重的安全性问题,即任何人只要得到了这个私钥文件,他就可以随心所欲的操纵生产服务器。幸好,travis-ci提供了加密方案,它能够将私钥文件加密,加密后的文件只在当前代码库有效。

总的来说,通过复制私钥完成自动登录以及对私钥加密来保障安全性,我们就可以建立起测试机与生产服务器的信任通道,测试机就可以安全地操作生产服务器完成自动部署。

配置

现在我以scp方式部署nodejs应用为例,来说明travis-ci做自动部署的配置。

首先,建立起开发机与生产服务器的信任关系:

ssh-copy-id username@host

然后,加密你的私钥,私钥文件通常在~/.ssh/id_rsa。加密私钥文件需要使用travis这个命令行工具,它是一个ruby包,使用gem安装:

gem install travis
travis login

输入账号密码登录成功后,使用travis encrypt-file加密:

travis encrypt-file ~/.ssh/id_rsa --add

上面命令执行完后,会生成一段解密命令并添加到.travis.yml中:

before_install:
 - openssl aes-256-cbc -K $encrypted_830d3b21a25d_key -iv $encrypted_830d3b21a25d_iv
 -in ~/.ssh/id_rsa.enc -out ~/.ssh/id_rsa -d

接下来,把加密后的私钥文件(id_rsa.enc)复制到代码库中,千万要注意不要错把未加密的私钥文件(id_rsa)复制到你的代码库中。然后把上面的解密命令的-in ~/.ssh/id_rsa.enc改为-in id_rsa.enc

通过上面的过程就基本建立测试机与生产服务器的信任关系,但还有一些小细节要处理。例如,降低id_rsa文件的权限,否则ssh处于安全方面的原因会拒绝读取秘钥;将生产服务器地址加入到测试机的信任列表中,否则连接时会询问是否信任服务器。更改后的配置如下:

before_install:
 - openssl aes-256-cbc -K $encrypted_830d3b21a25d_key -iv $encrypted_830d3b21a25d_iv
 -in id_rsa.enc -out ~/.ssh/id_rsa -d
 - chmod 600 ~/.ssh/id_rsa
 - echo -e "Host 102.201.64.94\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config

最后,测试机就可以愉快地操作生产服务器了,例如下面是一个nodejs应用的.travis.yml文件配置:

language: node_js
node_js:
 - '4.4.4'
before_install:
 - openssl aes-256-cbc -K $encrypted_830d3b21a25d_key -iv $encrypted_830d3b21a25d_iv
 -in id_rsa.enc -out ~/.ssh/id_rsa -d
 - chmod 600 ~/.ssh/id_rsa
 - echo -e "Host 102.201.64.94\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
script:
 - npm run test
after_success:
 - npm prune --production # 删除devDependencies
 - tar -jcf indoor-server.tar.bz2 * # 打包并压缩代码
 - scp indoor-server.tar.bz2 jingsam@102.201.64.94:~/ # 复制到生产服务器上
 - ssh jingsam@102.201.64.94 'mkdir -p indoor-server && tar -jxf indoor-server.tar.bz2 -C indoor-server' # 解压
 - ssh jingsam@102.201.64.94 'cd indoor-server && pm2 startOrReload pm2.json' # 重启pm2

总结

本篇文章讲的自动部署其实与nodejs关系不大,完全适用于各种语言的自动部署,其原理都是相通的。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持


# travis  # ci  # nodejs  # 部署  # 自动部署  # Node.js REPL (交互式解释器)实例详解  # Node.js 事件循环详解及实例  # 使用Node.js搭建静态资源服务详细教程  # 使用Node.js实现RESTful API的示例  # 利用node.js+mongodb如何搭建一个简单登录注册的功能详解  # Node.js 基础教程之全局对象  # 就可以  # 为例  # 都是  # 自动登录  # 问题是  # 新开  # 建立起  # 输入密码  # 库中  # 是一个  # 有一  # 公钥  # 很好  # 好了  # 首次  # 他就  # 要有  # 适用于  # 它是  # 没办法 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: JavaScript模板引擎Template.js使用详解  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  如何用搬瓦工VPS快速搭建个人网站?  C#如何调用原生C++ COM对象详解  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  如何快速搭建高效服务器建站系统?  详解Android中Activity的四大启动模式实验简述  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  利用JavaScript实现拖拽改变元素大小  如何用AI帮你把自己的生活经历写成一个有趣的故事?  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  Laravel如何生成API文档?(Swagger/OpenAPI教程)  高性能网站服务器部署指南:稳定运行与安全配置优化方案  如何用IIS7快速搭建并优化网站站点?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  Laravel模型关联查询教程_Laravel Eloquent一对多关联写法  Python正则表达式进阶教程_复杂匹配与分组替换解析  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  Linux系统命令中screen命令详解  Laravel如何实现数据库事务?(DB Facade示例)  详解jQuery停止动画——stop()方法的使用  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  Laravel如何保护应用免受CSRF攻击?(原理和示例)  如何快速搭建FTP站点实现文件共享?  大同网页,大同瑞慈医院官网?  活动邀请函制作网站有哪些,活动邀请函文案?  JS碰撞运动实现方法详解  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  南京网站制作费用,南京远驱官方网站?  详解MySQL数据库的安装与密码配置  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  如何注册花生壳免费域名并搭建个人网站?  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  Laravel如何使用Sanctum进行API认证?(SPA实战)  b2c电商网站制作流程,b2c水平综合的电商平台?  如何在宝塔面板中修改默认建站目录?  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  JavaScript数据类型有哪些_如何准确判断一个变量的类型  如何在阿里云虚拟服务器快速搭建网站?  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  黑客入侵网站服务器的常见手法有哪些?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?