最近一直在忙实验室的事情,没有时间整理博客,有一些小的知识点直接用印象笔记记录了,之前使用svn进行服务器端开发的时候,觉得还是没有github好,远程git又不好操作,最近一个工作的朋友给我提了一下git也可以进行自动化部署,感觉很厉害,今天用 coding.net的webhook进行了自动化部署
coding.net
coding.net速度很快,操作很方便,功能很多,个人觉得,作为私有的git库很合适
基本操作和github类似
- 在服务器上生成用户公钥
ssh-keygen -t rsa -C "anzhengchao@gmail.com"
- 复制上面的/root/.ssh/id_rsa.pub的内容到个人设置页https://coding.net/user/setting/keys添加即可
- 生成部署公钥
sudo -Hu www ssh-keygen -t rsa # 请选择 "no passphrase",一直回车下去
- 复制用户公钥的内容并添加到Coding.net公钥:
选择项目 > 设置 > 部署公钥 > 新建 > 粘贴到下面框并确认
- 添加hook
选择项目 > 设置 > WebHook > 新建hook > 粘贴你的hook/index.php所在的网址。比如:http://example.com:3000/webhook, 令牌可选,但是建议写上。
- 在服务器端创建express,代码如下
之后需要在现有的或者新建的项目下面做如下操作
git init
git commit -m "first commit"
git remote add origin git@coding.net:zhanfang/xxx
git push -u origin master
在提交的过程中可能原本有文件存在,会发生冲突
解决办法:
强推,即利用强覆盖方式用你本地的代码替代git仓库内的内容
git push -f
先把git的东西fetch到你本地然后merge后再push
git pull
又会出现另外一个问题
[branch "master"]
remote = <nickname>
merge = <remote-ref>
[remote "<nickname>"]
url = <url>
fetch = <refspec>
这等于告诉git2件事:
- 当你处于master branch, 默认的remote就是origin。
当你在master branch上使用git pull时,没有指定remote和branch,那么git就会采用默认的remote(也就是origin)来merge在master branch上所有的改变
如果不想或者不会编辑config文件的话,可以在bush上输入如下命令行:git config branch.master.remote origin
git config branch.master.merge refs/heads/master
大功告成
完成这些后,试着修改一次,然后push
之后应该服务器会自动进行pull操作
注意
git config --global user.name "overtrue"
git config --global user.email "anzhengchao@gmail.com" # 邮箱请与conding上一致
由于网络用户是www,所以要需要部署密钥,生成方法如下:
//默认路径/alidata/www/.ssh/
sudo -u www ssh-keygen -t rsa
只有这样才能通过网络git pull
express代码
var express = require('express');
var process = require('child_process');
var bodyParser = require('body-parser');
var multer = require('multer');
var app = express();
app.use(bodyParser.json()); // for parsing application/json
app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded
app.use(multer()); // for parsing multipart/form-data
app.post('/webhook', function(req,res){
//console.log('print', req.body);
console.info(req.body["token"]);
if('xxx' === req.body['token'] ){
console.info(process);
process.exec('git pull', {'cwd':'/alidata/www/xxx'},
function (error, stdout, stderr) {
console.log('stdout========================\n' + stdout);
console.log('stderr========================\n' + stderr);
if (error !== null) {
res.send('<pre>fail!!!\n' + stdout + error + '</pre>');
} else {
res.send('<pre>done!!!\n' + stdout + '</pre>');
}
});
} else {
console.log(' failed token ')
res.send('<pre>token不正确?</pre>');
}
});
app.set('port', 3000);
var server = app.listen( 3000, function() {
console.log('Listening on port %d', server.address().port);
})