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

 更新时间:2017年07月30日 16:40:44   作者:jingsam  
最近在学习使用 travis-ci 对项目进行持续集成测试,所以下面这篇文章主要给大家介绍了关于使用travis-ci如何持续部署node.js应用的相关资料,文中介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。

前言

在开始之前,我们先来简单介绍下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关系不大,完全适用于各种语言的自动部署,其原理都是相通的。

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

相关文章

  • Koa 使用小技巧(小结)

    Koa 使用小技巧(小结)

    这篇文章主要介绍了Koa 使用小技巧(小结),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • 微信小程序搭载node.js服务器的简单教程

    微信小程序搭载node.js服务器的简单教程

    小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验,下面这篇文章主要给大家介绍了关于微信小程序搭载node.js服务器的简单教程,需要的朋友可以参考下
    2022-12-12
  • NodeJS搭建HTTP服务器的实现步骤

    NodeJS搭建HTTP服务器的实现步骤

    NodeJS中用来创建服务的模块是http核心模块,本篇就来介绍关于使用http模块搭建HTTP服务器和客户端的方法,以及模块的基本 API,非常具有实用价值,需要的朋友可以参考下
    2018-10-10
  • node.js文件上传重命名以及移动位置的示例代码

    node.js文件上传重命名以及移动位置的示例代码

    本篇文章主要介绍了node.js文件上传重命名以及移动位置的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Node.js全局可用变量、函数和对象示例详解

    Node.js全局可用变量、函数和对象示例详解

    JavaScript中有一个特殊的对象,称为全局对象(Global Object),它及其所有属性都可以在程序的任何地方访问,即全局变量,下面这篇文章主要给大家介绍了关于Node.js全局可用变量、函数和对象的相关资料,需要的朋友可以参考下
    2023-03-03
  • Nodejs爬虫进阶教程之异步并发控制

    Nodejs爬虫进阶教程之异步并发控制

    这篇文章主要介绍了Nodejs爬虫进阶教程之异步并发控制的相关资料,需要的朋友可以参考下
    2016-02-02
  • 全面解析Node.js 8 重要功能和修复

    全面解析Node.js 8 重要功能和修复

    5月30日12点,Node.js 8正式发布了,这个版本具有一系列新功能和性能改进,并且这些功能和改进将获得长期支持(LTS)。下面就来介绍Node.js 8版本中最重要的功能和修复
    2017-06-06
  • 史上无敌详细的Node.Js环境搭建步骤记录

    史上无敌详细的Node.Js环境搭建步骤记录

    Node.js是一个事件驱动I/O服务端JavaScript环境,由于其拥有异步非阻塞、环境搭建简单、实践应用快等特性,使得其在新一代编程开发中更为流行,下面这篇文章主要给大家介绍了关于Node.Js环境搭建步骤记录的相关资料,需要的朋友可以参考下
    2023-03-03
  • node.js降低版本的方式详解(解决sass和node.js冲突问题)

    node.js降低版本的方式详解(解决sass和node.js冲突问题)

    这篇文章主要介绍了node.js降低版本的方式(解决sass和node.js冲突),本文是因为sass版本和node版本不匹配(可以找一下对应的版本),本文给大家详细讲解,需要的朋友可以参考下
    2023-02-02
  • 详解NodeJs支付宝移动支付签名及验签

    详解NodeJs支付宝移动支付签名及验签

    本文主要介绍了NodeJs支付宝移动支付签名及验签的方法,具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01

最新评论