Capistrano 3.11, GitLab, PHP 本地自动发布
使用 capistrano 3.11 实现一个小的发布脚本
Capistrano是用ruby编写的可以在一台或多台服务器上运行脚本的开源工具,它主要用于部署web应用。它自动完成多台服务器上新版本的同步更新,包括数据库的改变。
Capistrano官网地址及文档地址 capistranorb.com
Capistrano工具怎么样?
这个问题各个不同的开发团队有各自的答案,不管网上说这个工具有多好,只有符合自己的需求才是最好。
未使用Capistrano之前,每次发布代码,都需要以下几个步骤
* 连接服务器: 通过SSH
登上 正式生产服务区, 进入项目目录
* 获取最新代码:执行git pull
获取master
分支最新代码
* 清除缓存:清除缓存
以往发布方式不足的地方
* 每次都是重复操作那几条相同的命令,机械,繁琐
* 出错 rollback 操作没有 Capistrano 简单
* 关键配置信息需要放在版本库中(数据库配置,接口配置信息)
* 个性化信息需要手动修改,或者手动发布。
Capistrano 安装
* 确保电脑安装好了 ruby 2.5以上, gem 2.7 以上
*gem install capistrano
如果装不上,考虑 ruby 版本 和 gem 版本是不是太低
*gem install bundle
初始化项目
- cap install
编写Capistrano脚本
- vim config/deploy.rb
lock "~> 3.11.0"
# 采用ssh 方式登录远程服务器
# remote server 是远程服务器器地址,一般是网站正式服务器地址
# server user 是登录到远程服务器的用户
# web, app, db 都是角色名,我三个都在同一个服务器,所以写在一起。
server 'remote server', user: 'server user', roles: %w{web app db}, primary: true
# release path 发布到正式服务器的路径,这个路径需要提前在服务器上创建好
set :deploy_to, "release path"
# application name 自定义的应用名称,没什么作用
set :application, "application name"
# 设置代码仓库地址, 我用的git
set :repo_url, "git lab"
# 设置代码版本控制工具
set :scm, "git"
# 设置获取哪个分支的代码,默认是 master
set :branch, "master"
# 设置发布采用缓存技术。这个很有用,如果未设置这个,每次发布都是全量发布,超慢,如果依赖的vendor多,会更慢。
set :repository_cache, "git_cache"
set :deploy_via, :remote_cache
# ssh 选项设置。 告诉 Capistrano , ssh key 在本机的位置。
set :ssh_options, {:forward_agent => true, user: fetch(:user), keys: %w( ssh key在本机的路径 ) }
set :format, :pretty
# 设置日志级别
set :log_level, :info
# 设置保存的版本数量,一般为5
set :keep_releases, 5
# 设置共享文件,常用于项目的配置文件,比如 env 文件,数据库配置文件等等
set :linked_files, %w{
.env
.database.yml
}
# 设置共享目录,常用于公共文件,比如说 vendor 目录
set :linked_dirs, %w{
vendor
}
# 自定义的一些任务
namespace :deploy do
# 清除缓存
desc "clear cache"
task :clear_cache do
on roles(:app, :web) do
execute("rm -rf #{deploy_to}/current/var/cache/")
execute("mkdir -p #{deploy_to}/current/var/cache/")
end
end
# 改变项目所属组
desc "change group"
task :change_group do
on roles(:app, :web) do
execute("sudo chown -R user:group #{deploy_to}/current")
end
end
# 上传配置文件 , 将本地文件上传到服务器. 警告:服务器的保存路径目录必须存在,不然会报错
desc "上传文件"
task :upload_file => '本地文件绝对路径' do |t|
on roles(:all) do
upload!(t.prerequisites.first, "服务器保存文件绝对路径+文件名")
end
end
#高级任务,根据用户输入信息来执行任务。比如说此次发布需要更新数据库不?
desc "更新数据库"
task :update_schema_datebase do
# 使用ack提示发布人需要更新数据库不?默认是 NO
ask(:update_database, "NO", prompt: "需要更新数据库吗? NO/YES")
on roles(:all) do
if "#{fetch(:update_database)}" == "YES" then
execute("执行数据库更新命令")
end
end
end
after :finishing, :upload_file
after :finishing, :clear_cache
after :finishing, :update_schema_database
end
```
Capistrano 检查命令,编辑好Capistrano脚本后。先自己运行命令检查
cap deploy:check
如果报错,编辑 Capfile 文件,在最后添加 Rake::Task[:production].invoke
查看Capistrano全部任务
cap -T
Capistrano 回滚
cap deploy:rollback
Capistrano 发布代码
cap production deploy
本作品采用《CC 协议》,转载必须注明作者和本文链接