最近在研究 GitHub 上开源的区块链项目 TrueChain,借助这个项目,完整的了解并参与基于区块链从技术原理到工程代码实现整个项目过程,抱着学习的态度去做一些新的尝试。
持续化集成,延伸性很强,能各种不同类型不同的语言的项目实现自动化测试部署,这会带给我们很大的效率提升以及项目管理的安全,持续集成的方案有很多,例如 jenkins、Travis-CI 等等,此次使用的是 Travis-CI 持续集成方案,因为和 GitHub 结合的比较紧密,Travis-CI 仅支持 GitHub 的项目,大部分的 GitHub 项目都选择了 Travis-CI。
环境准备
Github 公开项目 ( Travis 对开源项目是免费,对私有项目是收费的 )
Linux 服务器 ( ECS 云服务器,系统是 CentOS 7.4 )
终端连接器(XShell)
自动化部署流程
本地修改代码,提交到指定分支
Travis 监听仓库改变
Travis 执行 install 和 script 任务(这里可以做一些安装测试构建任务的依赖和测试构建命令)
任务执行成功后,在 Travis 的 after_success 钩子里面用 ssh 免密登陆 服务器
自动在服务器上执行配置的脚本
完成自动部署
Travis 项目配置
持续集成的目的是,当我们进行需要进新项目发布的时候,想 master 分支进行 push 的时候,让 Travis 自动部署。
创建 GitHub 仓库,并完成项目的初始化,如果是已经有项目就可以直接开始部署,因之前有创建一个 onela-dome 项目,就以这个项目作为实例。
激活仓库
用 Github 账户登陆Travis-CI。Travis-CI 会同步你的 Github 上面的所有仓库信息。
登陆之后会列出你的所有仓库 :
默认都是没有激活的,点击激活按钮激活
SSH 连接服务器
# 新建用户,这里新建了一个 www 的账户 useradd www# 修改密码(应该不是必要,但是万一以后需要用密码登陆呢), 按照提示设置密码。passwd www# 为用户添加添加权限 vim /etc/sudoers
找到 #Allow root to run any commands anywhere 这一段注释,在下面新增一行:
www ALL= ( ALL ) ALL# 使用 root 账户修改 /etc/sudoers 如果出现了 E45: 'readonly' option is set ( add ! to override ) 错误 :wq! # 强制保存退出
[ root@trend ~ ] # su www [ www@trend root ] $ cd ~ [ www@trend ~ ] $ ssh-keygen -t rsaGenerating public/private rsa key pair.Enter file in which to save the key ( /home/www/.ssh/id_rsa ) : Created directory '/home/www/.ssh'.Enter passphrase ( empty for no passphrase ) : Enter same passphrase again: Your identification has been saved in /home/www/.ssh/id_rsa.Your public key has been saved in /home/www/.ssh/id_rsa.pub.The key fingerprint is:f1:ed:a6:ce:c0:88:13:f2:b9:a8:07:0b:f2:68:06:a1 www@trendThe key's randomart image is:+-- [ RSA 2048 ] ----+| || || . ||. o . ||... . S . . ||E o + o . ||+= = . o o ||ooo. o o o ||+o. . .+ |+-----------------+ [ www@trend ~ ] $
可以看到生成密钥对在用户家目录的 .ssh 文件夹 ( /home/www/.ssh ) 下面。
由于 Linux 权限的控制规则,文件的权限不是越大越好,所有需要设置合适的权限。这里需要把 .ssh 目录设置为 700 权限,给 .sshm= 目录下面的文件设置为 600 权限
[ www@trend ~ ] $ chmod 700 ~/.ssh/ [ www@trend ~ ] $ chmod 600 ~/.ssh/* [ www@trend ~ ] $ ls -altotal 24drwx------ 3 www www 4096 Sep 7 13:55 .drwxr-xr-x. 5 root root 4096 Sep 7 11:45 ..-rw-r--r-- 1 www www 18 Dec 7 2016 .bash_logout-rw-r--r-- 1 www www 193 Dec 7 2016 .bash_profile-rw-r--r-- 1 www www 231 Dec 7 2016 .bashrcdrwx------ 2 www www 4096 Sep 7 13:55 .ssh [ www@trend ~ ] $ ls ~/.ssh/ -altotal 16drwx------ 2 www www 4096 Sep 7 13:55 .drwx------ 3 www www 4096 Sep 7 13:55 ..-rw------- 1 www www 1675 Sep 7 13:55 id_rsa-rw------- 1 www www 394 Sep 7 13:55 id_rsa.pub [ www@trend ~ ] $
将生成的公钥添加为受信列表(重点)
[ www@trend ~ ] $ cd .ssh/ [ www@trend .ssh ] $ lsid_rsa id_rsa.pub# 公钥内容输出到 authorized_keys [ www@trend .ssh ] $ cat id_rsa.pub >> authorized_keys [ www@trend .ssh ] $ cat authorized_keysssh-rsa AAAAB3NzaC1yc**************************************************************** www@trend
新增 config 文件
Host testHostName 99.99.99.99 ( 你的服务器 ip ) # 登陆的用户名 User wwwIdentitiesOnly yes# 登陆使用的密钥 IdentityFile ~/.ssh/id_rsa
测试 SSH 登陆
# 测试 ssh test [ www@trend .ssh ] $ ssh testLast login: Sun Sep 9 18:51:57 2018Welcome to Alibaba Cloud Elastic Compute Service !
如果出现错误 Permission denied ( publickey,gssapi-keyex,gssapi-with-mic ) .
请参考如下做法
# 修改 sshd_config 配置文件 vim /etc/ssh/sshd_config# 修改如下内容 RSAAuthentication yes PubkeyAuthentication yes # 这两项为打开公钥模式 AuthorizedKeysFile .ssh/authorized_keys # 配置公钥记录文件 PasswordAuthentication yes # 打开密码验证模式 # 保存文件,然后重启 ssh/bin/systemctl restart sshd.service
在 Linux 服务器安装 Travis 客户端工具
安装 Travis 可以手动安装,依赖包是个麻烦事,所以这里使用使用了 gem 来装。gem 是 ruby 的管理工具,所以服务器必须安装 ruby,安装 ruby 的方式使用版本管理工具 rvm,入门自动收集服务器的依赖功能很好用,缺少的依赖会自动安装。
1. 先安装 rvm2. 利用 rvm 安装 ruby3. 使用 gem 工具安装 Travis
RVM 安装
RVM 是一个命令行工具,可以提供一个便捷的多版本 Ruby 环境的管理和切换。
https://rvm.io/
这里所有的命令都是再用户权限下操作的,任何命令最好都不要用 sudo.
$ gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3$ curl -sSL https://get.rvm.io | bash -s stable$ source ~/.bashrc$ source ~/.bash_profile# 安装完成之后检查是否安装成功 $ rvm versionrvm 1.29.4 ( latest ) by Michal Papis, Piotr Kuczynski, Wayne E. Seguin [ https://rvm.io ]
安装 ruby
# 使用 rvm 安装 ruby,安装等待时间较长,下载速度不是很快 $ rvm install ruby# 查看 ruby$ ruby --versionruby 2.5.1p57 ( 2018-03-29 revision 63029 ) [ x86_64-linux ]
【可选】修改 gem 镜像源,如果服务器能翻墙下载直接使用官方源(忽略这一步)
# 查询 gem 镜像源地址 $ gem sources -l*** CURRENT SOURCES ***https://rubygems.org/# 查看 gem 版本 $ gem -v2.7.7# 更换 gem 镜像源 $ gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/
安装 travis 命令行工具
# 安装 travis$ gem install travis# 执行 travistravis# 提示 Shell completion not installed. Would you like to install it now? |y|# 输入 y,安装外壳
添加加密的私钥至代码仓库
获取到了 github 代码之后,在项目文件目录登录 travis,然后创建 travis 加密证书,id_rsa.enc 这个证书是经过 travis 加密了的,因为是私钥暴露到 github 公网之上,就必须经过加密处理才能保证安全。
# 首先用 GitHub 账户登陆 travistravis loginWe 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:Password for *********@qq.com:***********Successfully logged in as zouwei!# 登录成功,解密私钥,--add 参数会把加密的私钥解密命令插入到 .travis.yml,Travis 解密时要用到的 $ travis encrypt-file ~/.ssh/id_rsa --addencrypting /home/www/.ssh/id_rsa for zouwei/onela-demostoring result as id_rsa.enc# 由于我之前生成过,所有这里提示是否覆盖 DANGER ZONE: Override existing id_rsa.enc? |no| yesstoring secure env variables for decryptionMake sure to add id_rsa.enc to the git repository.Make sure not to add /home/www/.ssh/id_rsa to the git repository.Commit all changes to your .travis.yml.# 可以看到已经生成了加密后的私钥 id_rsa.enc$ ls -al# 报文中出现出现私钥文件…… -rw-rw-r-- 1 www www 1680 Sep 9 17:11 id_rsa.enc …… -rw-rw-r-- 1 www www 201 Sep 9 17:11 .travis.yml#.travis.yml 中也自动添加了解密命令 $cat .travis.yml# 需要在 travis.yml 添加 before_install 之后的配置 language: node_jsnode_js:- '8'branchs: only: - masterbefore_install: # 下面的 encrypted_****,执行创建命令之后再服务器会自动成文件名,生成好的配置需要更新到项目里面去 openssl aes-256-cbc -K $encrypted_****_key -iv $encrypted_****_iv -in id_rsa.enc -out ~/.ssh/id_rsa -d
-in 参数指定待解密的文件,位于仓库的根目录 ( Travis 执行任务时会先把代码拉到 Travis 自己的服务器上,并进入仓库更目录 )
-out 参数指定解密后的密钥存放在 Travis 服务器的 ~/.ssh/id_rsa,如果你的后面需要的话可以取这个路径,我看到网上有的 SSH 登陆方式用到了这个文件
配置 after_success 钩子
前面的所有工作实都是准备工作,在 .travis.yml 中添加一些配置,主要是 after_success 钩子配置。修改之后的配置如下:
# .travis.ymllanguage: node_js # 项目语言,travis 能适配大部分语言 node_js:- 8.11.3 # 版本 branchs: only: - masterscript: - npm run test # 执行脚本,TrueChain 项目使用的是 make getrueaddons: ssh_known_hosts: - 114.55.249.*** # 服务器 IP 地址,我这里做了隐藏处理,替换成你自己服务器的 IPbefore_install:- openssl aes-256-cbc -K $encrypted_0690d495720c_key -iv $encrypted_0690d495720c_iv -in id_rsa.enc -out ~/.ssh/id_rsa -dafter_success:- chmod 600 ~/.ssh/id_rsa #Linux 文件权限问题 - ssh www@114.55.249.*** -o StrictHostKeyChecking=no '~/update.sh sso' # 使用 ssh 连接服务器
注意:使用 ssh 命令连接一定要设置 StrictHostKeyChecking=no,否则第一次连接时依然会要求你确认。后面引号的内容就是登陆你的 Linux 服务器之后,在你的服务器执行的命令,你也可以写成一个脚本。只要登陆上服务器之后,就随你操作了。
# /home/www,www 这个账户的权限必须控制,就算设置了 StrictHostKeyChecking=no# 仍然需要密码登录,是由于权限配置问题造成的, [ www@trend ~ ] $ chmod 700 ~/.ssh/ [ www@trend ~ ] $ chmod 600 ~/.ssh/*# 然后重启 ssh [ www@trend ~ ] $ /bin/systemctl restart sshd.service# 在 www 执行 ssh 重启必须输入 root 密码才能重启
写在最后
将加密的密钥文件和修改后的 .travis.yml 文件提交到 master 分支,访问Travis查看自动构建过程。过程任何一个小细节可能都会导致采坑,确实需要 linux 基本功的,这是个学习的过程,希望我与你一起,相互学习,一起成长。
linux 服务配置遇到无数坑,研究了几周时间(对 linux 不是很熟),仅仅是最后一步调试 travis 服务一直是错误、错误、错误,一路的艰辛。
成功了,也就成长了,继续努力加油
服务器日志跟踪,完成代码更新发布 & 重启
留言与评论(共有 0 条评论) |