使用 Capistrano 进行自动化部署
最近在折腾这个,弄了好多次都不成功,看了官方文档和很多博客,都没有说清楚,因此,我觉得有必要把它记录下来,以帮助更多像我这样被弄得烦躁的人。
首先是安装,其实 Ubuntu 上面安装 Capistrano 非常简单:
gem install capistrano
然后,进入项目目录,运行下面命令生成 Capistrano 的配置文件:
cap install
这个命令会创建下面这些文件:
Capfile
config/
deploy/
production.rb
staging.rb
deploy.rb
lib/
capistrano/
tasks/
在 config
中存放的的各个环境的配置文件,而我,就是在配置这个的时候产生的问题。
deploy
文件配置如下:
# config valid for current version and patch releases of Capistrano
lock "~> 3.11.0"
set :application, "KFB"
set :repo_url, "git@<my-server-1>:<my-account>/<my-project>.git"
# Default branch is :master
# ask :branch, `git rev-parse --abbrev-ref HEAD`.chomp
set :branch, "dev"
# Default deploy_to directory is /var/www/my_app_name
set :deploy_to, "/home/KFB-API"
而 staging.rb
文件如下:
# server-based syntax
# ======================
# Defines a single server with a list of roles and multiple properties.
# You can define all roles on a single server, or split them:
# server "example.com", user: "deploy", roles: %w{app db web}, my_property: :my_value
# server "example.com", user: "deploy", roles: %w{app web}, other_property: :other_value
# server "db.example.com", user: "deploy", roles: %w{db}
# role-based syntax
# ==================
# Defines a role with one or multiple servers. The primary server in each
# group is considered to be the first unless any hosts have the primary
# property set. Specify the username and a domain or IP for the server.
# Don't use `:all`, it's a meta role.
# role :app, %w{deploy@example.com}, my_property: :my_value
# role :web, %w{user1@primary.com user2@additional.com}, other_property: :other_value
# role :db, %w{deploy@example.com}
role :web, %w{<my-user>@<my-server>}
就配置这一行就可以了。按照注释所说,它有两种方式配置,但其实都只干了一件事,就是配置部署服务器。
我之前错误就是在这里配了两个设置,然后执行
cap staging deploy
时始终会报这几个错:
#错误一:fatal: unable to access 'http://<my-server>/<my-account>/<my-project>.git/': The requested URL returned error: 500
#错误二:fatal: repository 'http://<my-server>/<my-account>/<my-project>.git/' not found
#错误三:Net::SSH::AuthenticationFailed: Authentication failed for user <my-user>@<my-project>
#错误四:Permission denied (publickey,password)
发生错误根本原因有两个,一个是本地连接远程服务器不通,第二个是远程服务器连接 Git 服务器不通,因为 Capistrano 的运行原理就是从本地连接远程服务器,然后在远程服务器上执行 Git 命令,克隆最新代码到远程服务器的发布目录上面。这里都是使用的 ssh key 的方式进行连接。
本地连接远程服务器不通,可以参考 设置_SSH_Key_登录服务器和_Git_服务器 在本地生成两个 Key,把公钥放服务器上,私钥放本地。这里还有一个坑,如果你在生成密钥文件时指定了文件名的话,那是不能直接使用的,具体如何使用我暂时没弄清楚,所以直接使用默认的文件名 id_rsa 就行啦。
对于连接 Git 服务器的问题,此时的 Git 服务器是用 Gitlab 搭建的一个项目,可以通过 Web 访问;用上面同样的方法生成两个 Key,公钥在 Gitlab 中的个人设置中(下图)设置,私钥放在远程服务器访问 Git 服务器的用户目录的 .ssh/
目录下面。
配置完之后,可以先用 git clone git@<my-server>:<my-account>/<my-project>.git
测试一下,正常的话应该能直接克隆项目而不需要再输入密码了。
最后全部配置好了之后,再运行
cap staging deploy
输出一大堆命令,最后显示成功。根据先前的设置,自动部署之后的远程服务器上的代码目录结构是这样的:
KFB-API/
revisions.log
releases/
0180703070947/
# 这里是项目的具体内容,相当于原来的 KFB-API/ 下面的内容
current/ -> ./releases/20180703070947
repo
shared
PS - 个人博客原文:使用_Capistrano_进行自动化部署
使用 Capistrano 进行自动化部署的更多相关文章
- 使用_Capistrano_进行自动化部署(2)
之前的一篇文章是为了解决问题而写的,很多东西都没有介绍清楚,这一篇文章就是完整介绍一下 Capistrano,主要的参考来源是 Modern PHP 这本书. Capistrano 是用于自动部署应用 ...
- MySQL主从复制原理及配置详细过程以及主从复制集群自动化部署的实现
一.复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重 ...
- python+paramiko库+svn写的自动化部署脚本
第一篇博文 直接开门见山的说了. 这是件什么事?:每次部署都是复制本地的文件粘贴到服务器端,因为路径复杂,所以费时且手工容易出漏洞. 一直在想有什么办法可以解决这种,因为以前在微软的一个牛人同事做过一 ...
- ASP.NET MVC 从零开始 - 自动化部署(其二)
这篇文章是从我的 github 博客 http://lxconan.github.io 导入的. 这是这个系列的第五篇了,前四篇请参见: ASP.NET MVC 从零开始 – Create and R ...
- ASP.NET MVC 从零开始 - 自动化部署(其一)
本文是从我的 github 博客 http://lxconan.github.io 导入的. 这是这个系列的第四篇了,前三篇请参见: ASP.NET MVC 从零开始 – Create and Run ...
- 比Ansible更吊的自动化运维工具,自动化统一安装部署_自动化部署udeploy 1.0
新增功能: 2015-03-11 除pass(备份与更新)与start(启动服务)外,实现一切自动化. 注:pass与start设为业务类,由于各类业务不同,所以无法实现自动化.同类业务除外,如更新的 ...
- 比Ansible更吊的自动化运维工具,自动化统一安装部署自动化部署udeploy 1.0 版本发布
新增功能: 逻辑与业务分离,完美实现逻辑与业务分离,业务实现统一shell脚本开发,由框架统一调用. 并发多线程部署,不管多少台服务器,多少个服务,同时发起线程进行更新.部署.启动. 提高list规则 ...
- jenkins+git+maven搭建自动化部署项目环境
简介 折腾了两个晚上,趁着今晚比较有空,把jenkins+git+maven搭建自动化部署项目环境搭建的过程记录一下,这里我把github作为git的远程仓库(https://github.co ...
- 使用Cargo实现自动化部署
Cargo是一组帮助用户操作Web容器的工具,它能帮助用户实现自动化部署,而且它几乎支持所有的Web容器,如Tomcat.JBoss.Jetty和Glassfish.Cargo通过cargo-mave ...
随机推荐
- devstack install attributeError: 'module' object has no attribute '__version__'
work around: edit the file /usr/local/lib/python2.7/dist-packages/openstack/session.py and remove th ...
- Openstack镜像和密码
#!/bin/sh passwd ubuntu<<EOF ubuntu ubuntu EOF sed -i 's/PasswordAuthentication no/PasswordAut ...
- win7cmd静态绑定arp
netsh -c "172.16.3.1" "f4-ea-67-8b-91-cc"
- Bash 脚本 getopts为什么最后一个參数取不到
看以下的Bash脚本: #!/bin/bash interval=0 count=0 pid="" while getopts "p:d:n" arg do c ...
- Linux配置防火墙,开启80port、3306port 可能会遇到的小问题
vi /etc/sysconfig/iptables -A INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT(同意80端口通 ...
- 动态提交使用jQuery 完成ajax 文件下载----后端php
1.js代码 // Ajax 文件下载 //当不用传参时,可以将data去掉 jQuery.download = function(url, data, method){ // 获得url和data ...
- win7笔记本电脑怎么做wifi热点
win7设置wifi热点后非常方便,可以给其他笔记本和手机之类支持无线上网的移动设备使用,接下来请看超简单的详细设置方法. 方法/步骤 1 第一步先打开“控制面板” 2 点击“网络和Internet” ...
- Phpcms v9专题分类增加模板设置的方法
Phpcms v9专题设置里面,默认专题子分类是无模板设置的,本文教你通过官方论坛给出的教程实现专题分类增加模板设置.先来看看默认专题子分类设置界面: 修改后的的专题子分类设置界面多了模板设置: 修改 ...
- 第四章 Spring.Net 如何管理您的类___对象、对象工厂和应用程序上下文
在前面一章我们介绍了依赖注入,控制反转的概念,以及自己动手搭建了一下Spring.Net的环境.通过这些操作,我们知道了Spring.Net 的核心是使用依赖注入或控制反转这种思想来管理业务对象,降低 ...
- POJ 1141 Brackets Sequence(区间DP, DP打印路径)
Description We give the following inductive definition of a “regular brackets” sequence: the empty s ...