如今部署代码真的是一件天大的事。
开发人员努力敲代码,基本没有时间登录服务器并逐个运行部署脚本。但是开发人员知道他们的部署所需要花费的大概时间,对部署各个工作的轻重缓急十分了解。
因此,开发人员与运维人员一起参与部署工作将真正有助于产品发布成功。
下面我们谈谈用Git的方式更轻松的部署应用。
如果让开发人员使用自己的 Git 仓库工具做部署,这必须在Git配置文件中添加额外的远程Git 仓库地址。
就像这样:
[remote "origin"]
url = git@github.com:company/project.git
url = git@remote-server:project.git
fetch = +refs/heads/*:refs/remotes/origin/*
或者这样
[remote "deploy"]
url = git@remote-server:project.git
开发人员只需要在同一时间在推送代码到不同的地方就可以了。如代码示例,一个放在Codebase,另一个用于生产环境部署。
我们只需要配置我们的git服务器,使得每当 git push 事件触发时,Git 服务器就远程或本地自动运行部署脚本。
所以,我们需要先配置git 服务器。
首先在 git 服务器上安装 git-core
sudo apt-get install git-core
然后我们需要创建一个用于Git操作用户
sudo useradd git
passwd git
然后添加开发人员的主机的公钥文件,以便开发人员的电脑能够有权限访问 Git 服务器。
cat〜/ .ssh / id_rsa.pub | ssh git @ remote-server“mkdir -p〜/ .ssh && cat >>〜/ .ssh / authorized_keys”
然后在Git服务器上创建一个空的仓库
mkdir -p /home/user/project.git
cd /home/swapnil/project-1.git
git init --bare
这将创建一个git仓库,您可以看到名为 hooks文件夹,这里会存脚本用于接收文件后自动部署项目。
开发人员只需要在最开始的时候将 Git 服务器的项目仓库地址添加到他的项目中即可。
git remote add deploy git @ remote-server:project.git
git push deploy master
这样就直接部署了开发人员的代码。不过这似乎浪费了开发人员不必要的时间,所以我们应该使用 Ansible 来让部署更加轻松。
首先运行下列命令
ansible-galaxy install PrabhuVignesh.push_to_deploy
然后将开发机器的公钥保存在中即可。
$ cat publickeys.txt
ssh-rsa AAuyFUVFY65tYTFV567YTYTytytYTYTfyuV56FUYTVYTFYTVyTFYUG877686V767R76R67R76R6YTYTfyuVFUYTVYTFYTVyTFYUG877686V767R76R67R76R676V767676V76V768V876V76576V768V876V76Vv76V876VB76v7V76V76V6VBT9LLlNGtLo5pnEXIOPiz9X42ZdxBD721bG5XqDfPnz0JfgAYl6Zw4CXM0F6q0jiAQNJrtrfSNS92x1KMLY8CcVLKOZbpWdUHnouLdKCeM6dBHStpX7yjlb90fRKVZFch87eO0dyAoGWS3oBEYttFYL7s5dm/QV developer1@sample.com
ssh-rsa AAuyFUVFY65tYTFV567YTYTytytYTYTfyuV56FUYTVYTFYTVyTFYUG877686V767R76R67R76R6YTYTfyuVFUYTVYTFYTVyTFYUG877686V767R76R67R76R676V767676V76V768rrtrt54t46Vv76V876VB76v7V76V76V6VBT9LLlNGtLo5pnEXIOPiz9X42ZdxBD721bG5XqDfPnz0JfgAYl6Zb6sevtrrtyyw4CXM0F6q0jiAQNJrtrfSNS92x1KMLY8CcVLKOZbpWdUHnouLdKCeM6dBHStpX7yjlb90fRKVZFch87eO0dyAoGWS3oBEYttFYL7s5dm/QV developer1@sample.com
ssh-rsa AAuyFUVFY65tYTFV567YTYTytytYTYTfyuV56FUYTVYTFYTVyTFYUG877686V767R76R67R76R6YTYTfyuVFUYTVYTFYTVyTFYUG877686V767R76R67R76R63435343r4r3453434r34r34f34356trfhgjhgkjmnhi87t665rg6dvrdxdcser536c5456yvu675678br56er56v5v7y5y5gbr5576un8n78i8it0F6q0jiAQNJrtrfSNS92x1KMLY8CcVLKOZbpWdUHnouLdKCeM6dBHStpX7yjlb90fRKVZFch87eO0dyAoGWS3oBEYttFYL7s5dm/QV developer1@sample.com
接着在环境变量中添加 path_for_authorized_keys,git_repository_path,post_receive_script,pre_receive_script 中的路径。
---
roles:
- role: PrabhuVignesh.push_to_deploy
path_for_authorized_keys: /path/to/public_key/file
git_repository_path: /home/path/to/your/repo.git
post_receive_script: "script to deploy the code"
pre_receive_script: "Prepare storing code"
git服务器的所有配置将通过 Ansible 来完成。
当开发人员将代码推送到 git 服务器时,应用程序就会执行用于后接收和预接收运行的脚本,如“puppet deploy script”,“cap deploy …”等,并且将自动部署。
另外使用这样的方式,只有在推送Master分支的时候才会运行部署脚本,这就避免不必要的部署。
#!/bin/bash
do
if [[ $ref =~ .*/master$ ]];
then
echo "I am master branch push and i will run deployment script"
# Run deployment script.....
else
echo "Ref $ref successfully received. Doing nothing: only the master branch may be deployed on this server."
fi
done
GIT真的是一个令人赞叹的IT自动化工具,特别让开发和运维更好的协作,让发布新版本更加轻松。