利用coding进行自动化部署

最近一直在忙实验室的事情,没有时间整理博客,有一些小的知识点直接用印象笔记记录了,之前使用svn进行服务器端开发的时候,觉得还是没有github好,远程git又不好操作,最近一个工作的朋友给我提了一下git也可以进行自动化部署,感觉很厉害,今天用 coding.net的webhook进行了自动化部署

coding.net

coding.net速度很快,操作很方便,功能很多,个人觉得,作为私有的git库很合适

基本操作和github类似

  1. 在服务器上生成用户公钥 ssh-keygen -t rsa -C "anzhengchao@gmail.com"
  2. 复制上面的/root/.ssh/id_rsa.pub的内容到个人设置页https://coding.net/user/setting/keys添加即可
  3. 生成部署公钥 sudo -Hu www ssh-keygen -t rsa # 请选择 "no passphrase",一直回车下去
  4. 复制用户公钥的内容并添加到Coding.net公钥:

选择项目 > 设置 > 部署公钥 > 新建 > 粘贴到下面框并确认

  1. 添加hook

选择项目 > 设置 > WebHook > 新建hook > 粘贴你的hook/index.php所在的网址。比如:http://example.com:3000/webhook, 令牌可选,但是建议写上。

  1. 在服务器端创建express,代码如下

之后需要在现有的或者新建的项目下面做如下操作

git init
git commit -m "first commit"
git remote add origin git@coding.net:zhanfang/xxx
git push -u origin master

在提交的过程中可能原本有文件存在,会发生冲突
解决办法:

  1. 强推,即利用强覆盖方式用你本地的代码替代git仓库内的内容

    git push -f

  2. 先把git的东西fetch到你本地然后merge后再push

    git pull

又会出现另外一个问题

[branch "master"] 
remote = <nickname> 
merge = <remote-ref> 
[remote "<nickname>"] 
url = <url> 
fetch = <refspec>

这等于告诉git2件事:

  1. 当你处于master branch, 默认的remote就是origin。
  2. 当你在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);
})