一、目的

简单介绍下 CI/CD 概念:

持续集成 CI:是一种软件开发实践,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。
持续部署 CD:是一种软件工程方法,意指在软件开发流程中,以自动化方式,频繁而且持续性的,将软件部署到生产环境中,快速交付产品。

以我网站的个人作品页为例,是使用 Vue 制作的单页面,修改完成后需要手动编译和部署。

通过 CI/CD 的方式,在项目每次提交后进行自动构建和单元测试。并在检测通过后,自动部署到我的阿里云服务器中实现项目的快速发布。

还可以监听指定分支代码,每次提交后除了运行单元测试,还可以对代码风格进行检测,执行指定的脚本定时任务。一切通过后,自动合并到master分支、再自动部署到服务器进行发布。可以降低人为失误、简化流程,适合敏捷开发和快速迭代。

二、Travis 简介

Travis CI 是用 Ruby 开发的一个持续集成(CI - Continuous Integration)服务的平台,它会同步你在 GitHub 上托管的项目,现在 CI 已成为了项目的“标配”。

接着来说它的搭档 持续部署(CD - Continuous Deployment) 。其中最为广为熟知的或许是用 JAVA 开发的 Jenkins 。虽然 Jenkins 可以独自担当 CI&CD 的重任,对某些或个人项目来说过重,没有必要整这一套,外加那 复古 的界面。。。

Travis CI 最初就创建了两个平台 travis-ci.comtravis-ci.org,前者针对私有仓和付费组织,而后者针对公有仓

但从2018年5月起,新用户和新项目(无论是私有仓的还是公共仓)都只能使用 travis-ci.com

三、Travis 注册

新用户

这里所指的新用户,是指未使用过 travis-ci.org 的用户。

可以直接在 travis-ci.com 进行注册使用。

老用户

这里所指的老用户,是指在 travis-ci.org 注册并使用过的用户。

官方宣称会在未来的几个月内,陆续将 travis-ci.org 仓库和账户信息迁移到 travis-ci.com。但显然这个进展比较缓慢,目前为止有近2年时间,至少我的账号并没有自动迁移(迁移目前处于测试阶段)。

操作方法:

  • 使用同一个 Github 账号去注册 travis-ci.com,并在账户中进行激活
  • 然后前往 travis-ci.org,在账户页面中选择左侧的 Sign up for the beta 按钮,进行申请。
  • 申请成功后会收到一封电子邮件。
  • 可通过邮件中的按钮,直接进入 travis-ci.com 的 Migrate 页选择 travis-ci.org 中的项目进行迁移。

注意事项:
* 之前项目的构建历史将继续保留在 travis-ci.org 中,并不会被一起迁移至 travis-ci.com
* 已成功迁移的项目还会在 travis-ci.org 中显示,但不能进行操作,需要设置的话会跳转到 travis-ci.com

四、开始部署

为项目配置 Travis

1. 在项目根目录创建 .travis.yml 文件,并对其进行修改:

以下为 Node.js(Vue、React) 项目的配置示例,请根据自身项目属性进行调整。

# 设置编程语言
language: node_js
# 指定 NodeJs 版本,也可直接设为 stable
node_js: 10.14.1
# 缓存依赖
cache:
  directories:
    - node_modules
# 设置需要监听的分支
branches:
  only:
    - master
# 需要执行的脚本
script:
  - yarn build

2. 把该文件 push 上去。

3. 去 travis-ci.com 查看该项目的运行结果,通过测试会显示绿色状态。

至此,项目已成功被 Travis 监听。

创建 SSH 密钥对

注意事项:
* 密钥对 可以在本地生成,也可以在部署服务器上生成。
* 由于我是在本地生成,所以从下文直到后续操作如果没有特别说明,命令皆为在本地 终端 执行。

1. 在本地机器上使用 ssh-keygen 生成密钥对

# 方法一:
# 生成默认密钥对(一路回车,全都为默认即可)
ssh-keygen -t rsa

# 方法二:
# 不想默认生成,则可以使用以下命令生成一个新的密钥(回车)
ssh-keygen -t rsa -C "yourname@mail.com"
# 修改 rsa 文件名和存档位置(回车):
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/<用户名>/.ssh/id_rsa): /Users/<用户名>/.ssh/id_rsa_<自定义名称>

2. 将公钥复制到部署服务器

ssh-copy-id -i .ssh/id_rsa.pub <部署服务器用户名>@<部署服务器地址>

# 默认使用 22 端口,如需要指定端口号则使用以下命令
ssh-copy-id -i .ssh/id_rsa.pub <部署服务器用户名>@<部署服务器地址> -p <部署服务器ssh端口>

key 会被写到登录部署服务器的 ~/.ssh/authorized_key. 文件中,之后即可免密登录服务器

3. 测试一下 SSH 免密登陆

ssh <部署服务器用户名>@<部署服务器地址>

顺利的话本地终端直接进入了部署服务器,不需要每次再输入密码

使用 Rbenv 安装 Ruby

如果你在部署服务器上生成的密钥对,则需要安装 Ruby。

MAC 用户可以忽略安装(系统自带 Ruby ),可直接从下文 安装 travis 开始操作。

注意事项:
* CentOS 7 及以下版本 不建议使用 sudo yum install ruby 安装 Ruby,镜像源的本过于老旧,无法满足之后的续安装需求。
* 通过 yum 安装的后的对应版本为: gem v2.0.14.1、ruby v2.0.0p648 (2015-12-16) [x86_64-linux]。
* CentOS 8 用户,可通过 ndf 安装,以下步骤可以省略,直接到 安装 travis 步骤进行操作。

1. 安装 ruby-build 所需的依赖

sudo yum install git-core zlib zlib-devel gcc-c++ patch readline readline-devel libyaml-devel libffi-devel openssl-devel make bzip2 autoconf automake libtool bison curl sqlite-devel

2. 下载 rbenv-installer 脚本并执行

curl -sL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-installer | bash -

# 成功安装后会看到以下提示:
All done!
Note that this installer doesn't yet configure your shell startup files:
1. You'll want to ensure that `~/.rbenv/bin' is added to PATH.
2. Run `rbenv init' to see instructions how to configure rbenv for your shell.
3. Launch a new terminal window to verify that the configuration is correct.

3. 设置路径

echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
source ~/.bashrc

4. 安装指定版本

rbenv install 2.7.1

可以通过 rbenv install -l 命令列出所有可用的 Ruby 版本。

5. 将该版本设为默认使用版本

rbenv global 2.7.1

6. 查看 Ruby 版本,确认否安装成功

ruby -v

安装 travis

1. 先切换 gem 镜像源

gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/

Gem 是 Ruby 内的 Gems 包管理器。

2. 查看源是否切换成功

gem sources -l

确保只有 gems.ruby-china.com

3. 安装 travis

gem install travis

4. 登陆 Travis

travis login --com

登录 Github 账号密码,成功后会看到提示 Successfully logged in as zhonglimh!

为 Travis 配置免密登录

1. 进入项目根目录

cd path/you-project

2. 将 ssh 密钥写入 .travis.yml

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

出现提示输入 y 之后会重新格式化 .travis.yml 文件。

3. 打开 .travis.yml 文件会看到多了以下内容

before_install:
- openssl aes-256-cbc -K $encrypted_******_key -iv $encrypted_******_iv
  -in id_rsa.enc -out ~\/.ssh/id_rsa -d

需要将上面的 ~\/.ssh/id_rsa 修改为 ~/.ssh/id_rsa

4. 把需要部署的脚本添加进去,最终示例如下

# 设置编程语言
language: node_js
# 指定 NodeJs 版本,也可直接设为 stable
node_js: 10.14.1
# 缓存依赖
cache:
  directories:
    - node_modules
# 设置需要监听的分支
branches:
  only:
    - master
# 需要执行的脚本
script:
  - yarn build
before_install:
- openssl aes-256-cbc -K $encrypted_******_key -iv $encrypted_******_iv
  -in id_rsa.enc -out ~/.ssh/id_rsa -d
# 添加 SSH 信任列表
addons:
  ssh_known_hosts: <部署服务器IP>
# 执行部署脚本()
after_success:
  - rm -rf <部署服务器用户名>@<部署服务器地址>:/home/xxx/project-file/*
  - scp -o stricthostkeychecking=no -r ./dist/* <部署服务器用户名>@<部署服务器地址>:/home/xxx/project-directory

此时可以修改下项目“代码/内容“作为测试,与 .travis.yml 文件一起提交代码。
回到 travis-ci.com 查看并等待项目运行结果,该条记录显示为绿色表面一切顺利。
然后打开网址,可以看到网站内容已经同步更新。

五、回顾部署流程

  • Travis 监听指定分支的代码
  • 每次提交后自动构建和测试
  • 测试通过后利用 SSH 登陆到目标服务器
  • 执行配置脚本将生产环境代码拷贝过去
  • 自动部署结束

六、参考文档

What's the difference between travis-ci.org and travis-ci.com?
How to Install Ruby on CentOS 7
RubyGems 镜像 - Ruby China
使用 Travis CI 实现 GitHub + Server 自动部署

感谢您的阅读,本文由 蓝色梦想 版权所有。如若转载,请注明出处:蓝色梦想 - Travis CI 自动部署 Github 项目至远程服务器