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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!