Travis CI 系列:自动化部署博客

Travis CI 是在软件开发领域中的一个在线的,分布式的持续集成服务,用来构建及测试在GitHub托管的代码。php

travis ci

对于 GitHub 的集成 Travis 作得很好,与 Jenkis 不一样,Travis 不须要本身在服务器部署服务,而且是高度集成 GitHub 的,因此对于开源项目仍是很是友好的。html

注册配置 Travis

注册成功,登陆,而后添加本身的 GitHub 上的 repogit

add repo

选择其中一个或多个你须要集成的项目,开启 build,也就是点击叉叉变成勾勾的过程。github

假设如今已经对某个项目开启了 Travis,那么先去看看 Settings 里默认开启的那几项,根据本身实际需求进行设置,没什么特殊需求默认的设置就能够了。shell

接下来的步骤很清楚,官方也有配图说明:bootstrap

build step

添加 .travis.yml

说白了接下来的事情都是如何去写这个配置文件,由于 Travis 全是根据这个配置文件去执行相应动做的。api

根据你的语言不一样,配置也会有较大差别,由于个人博客使用 PHP 的流行框架 Laravel 写的,因此这里也拿它做为例子,官方给出的最精简的 PHP 配置文件是:安全

language: php

php:
 - 7.1.9
 - nightly
复制代码

触发构建

接下来如上面所说的第三步,将这个 .travis.yml 文件提交到 GitHub,那么 Travis 就会自动触发构建任务。ruby

我就知道第一次不会这么简单的,失败了。。。bash

报错缘由是执行 phpunit 时提示:

PHP Warning:  require(/home/travis/build/stephencode/super-admin/bootstrap/../vendor/autoload.php): failed to open stream: No such file or directory in /home/travis/build/stephencode/super-admin/bootstrap/autoload.php on line 17
复制代码

一看是本身项目的 composer 依赖包的 autoload.php 文件没找到,那应该是没有执行 composer up 之类的操做,结合网上找的资料,比较好的解决方式是在 install 层添加一行:

install:
  - composer install --prefer-dist --optimize-autoloader --quiet
复制代码

这样就不会报上面这个错了,而后会报接下来的一个错。。。

1) Tests\Feature\RouteTest::testBasicTest
RuntimeException: No application encryption key has been specified.
复制代码

其实这个是我在 Laravel 里面的 phpunit.xml 没有配置好的缘故。将 <env name="APP_KEY" value="base64:xxxxxx="/> 补上就好,在 <php></php> 标签里,这个 key 你本身去生成。

在通过五六次 build failed 以后,总算天不负我了。

build failed

自动部署到远程服务器

如今已经能够自动构建了,那么接下来的一步就是部署到远程服务器。Travis 提供 after_success 来实现这步骤。

等等,咱们要部署到远程服务器,那么势必须要让 Travis 登陆到远程服务,那么登陆密码怎么处理才能保证安全?这是首先要解决的问题,明文确定是不行的。

加密登陆密码

那看来先得解决这个问题,Travis Docs 里也帮我考虑到了这个避不开的问题的解决方案(Encrypting Files

咱们一块儿来实践一下:

首先经过 Ruby 的 gem 安装 travis

gem install travis
复制代码

哎,重试了几回发现敲完这段 shell 如同石沉大海通常,屁都不放一个。。。就算开了代理仍是纹丝不动,没办法只能换镜像了。

$ gem sources -l

*** CURRENT SOURCES ***

https://rubygems.org/
复制代码

查看一下当前的镜像,这货(rubygems)国内出奇的难以访问,网上一搜国内的镜像源,Ruby China 的应该很显眼吧~

$ gem update --system
$ gem sources --add https://gems.ruby-china.org/
复制代码

而后再查看一下 gem 镜像,确保只有 Ruby China 的 gem 源。

好了,如今能够愉快的安装 travis 了

$ sudo gem install travis
复制代码

接下来让咱们先在命令行中登陆 Travis

$ travis login

We need your GitHub login to identify you.
This information will not be sent to Travis CI, only to api.github.com.
The password will not be displayed.

Try running with --github-token or --auto if you don't want to enter your password anyway. Username: xxx@xxx.xxx Password for xxx@xxx.xxx: *** Successfully logged in as demo! 复制代码

会要求你输入 GitHub 的帐号密码,这个是走 GitHub 的服务,因此不用担忧密码泄露。

将目录切换到项目根目录下,也就是 .travis.yml 目录下。由于咱们须要让 travis 远程登陆本身的服务器,因此须要将本地保存着的 SSH 私钥进行加密处理(默认你也是经过 SSH 免密登陆的模式哦,不清楚能够参考我这一篇 《SSH 免密登陆》)。

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

Detected repository as xxx/xxx, is this correct? |yes| yes
encrypting ~/.ssh/id_rsa for xxx/xxx
storing result as id_rsa.enc
storing secure env variables for decryption

Make sure to add id_rsa.enc to the git repository.
Make sure not to add ~/.ssh/id_rsa to the git repository.
Commit all changes to your .travis.yml.
复制代码

这个时候去看一下当前目录下的 .travis.yml,会多出几行

before_install:
  - openssl aes-256-cbc -K $encrypted_d89376f3278d_key -iv $encrypted_d89376f3278d_iv
  -in id_rsa.enc -out ~\/.ssh/id_rsa -d
复制代码

为保证权限正常,多加一行设置权限的 shell

before_install:
  - openssl aes-256-cbc -K $encrypted_d89376f3278d_key -iv $encrypted_d89376f3278d_iv
    -in id_rsa.enc -out ~/.ssh/id_rsa -d
  - chmod 600 ~/.ssh/id_rsa
复制代码

还有一点可能会用上,由于 travis 第一次登陆远程服务器会出现 SSH 主机验证,这边会有一个主机信任问题。官方给出的方案是添加 addons 配置:

addons:
  ssh_known_hosts: your-ip
复制代码

到这里,travis 就可以免密登陆本身的远程服务器啦~

自动部署

既然已经能够免密登陆服务器了,那么写一个部署脚本,在登陆时执行该脚本就能够了,一切就是这么顺其天然就好~

写部署脚本

我写 Shell 脚本的水平颇有限,这边也就给出一个最精简的 Demo 能够参考一下:

#!/bin/bash
cd /path/to/your-project
git pull origin master
echo 'travis build done!'
复制代码

执行部署脚本

.travis.yml 配置文件中写下这么两行:

after_success:
  - ssh your-user@your-ip "./your-shell-script"
复制代码

记得将其中的 your-useryour-ipyour-shell-script 都替换成本身的哦!

高大上标志

辛苦奋斗了一天,老是但愿别人看到本身的劳动成果的,除了写这篇文章意外还能作点什么呢?那天然是给本身的这个项目在 GitHub 上的 README.md 中显示一个高大上的 build:passing 标志,就像这样:

build tag

总结

此次过程当中基本都是从不会到会的一个学习过程,从中了解到很多新东西,也发现一些本身的短板,好比写 shell 脚本。。。

最后,贴出我本身的 .travis.yml,里面有关涉及我的隐私的部分我会注释并说明:

language: php

php:
 - 7.1.9
 - nightly

env:
 - APP_DEBUG=false

before_install:
 - openssl aes-256-cbc -K $encrypted_d89376f3278d_key -iv $encrypted_d89376f3278d_iv
 -in id_rsa.enc -out ~/.ssh/id_rsa -d
 - chmod 600 ~/.ssh/id_rsa

install:
 - composer install --prefer-dist --optimize-autoloader --quiet

notifications:
 email:
 recipients:
 - stephenfxl@gmail.com
 on_success: always
 on_failure: always

script:
 - phpunit -c phpunit.xml --coverage-text

after_success:
 - ssh xxx@xxxx.xxxx.xxxx.xxxx "./travis_build" # 请替换成本身的登陆IP和登陆用户

addons:
 ssh_known_hosts: xxxx.xxxx.xxxx.xxxx # 请替换成本身的服务器IP

复制代码

本文参考连接:

相关文章
相关标签/搜索