使用Github的webhook完成自动部署网站

之前用到hexo部署静态站点到github.io。由于其服务器在境外且域名被墙的原因,稳定性极差,无法正常访问。本文将详细描述使用Github的webhook完成自动部署网站到国内服务器。

github - webhook 配置

  1. 登录github站点,打开你的*.github.io仓库
  2. 点击setting - webhook - create - add
  3. 配置接口地址 https://yhorz.cn/*/**
  4. 当仓库中有代码更新时,会调用配置的接口地址

脚本编写

  1. api是在koa项目中编写
  2. 判断是否存在静态项目文件夹
  3. 若不存在文件夹,使用nodegit执行clone命令拉取仓库到指定目录
  4. 若存在文件夹,则执行pull进行更新
  5. 若是多次pull命令失败,则删除指定目录,重新clone(待完善)
    tips: 将 * 替换一下即可
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    // 更新csorz.github.io代码
    router.get('/github/*/update', (ctx) => {
    let exists = true
    const filePath = path.resolve(__dirname, '../../static/*/')
    const gitUrl = 'http://github.com/*/*.github.io.git'
    try {
    // http://nodejs.cn/api/modules/dirname.html
    // http://nodejs.cn/api/fs.html#fs_fs_fstatsync_fd_options
    fs.statSync(filePath)
    } catch (err) {
    exists = false
    }
    if (exists) {
    // http://nodejs.cn/api/child_process.html#child_process_child_process_exec_command_options_callback
    childProcess.exec('git pull', { cwd: filePath }, (error, stdout, stderr) => {
    if (error) {
    console.error(`执行的错误: ${error}`)
    return
    }
    console.log(`stdout: ${stdout}`)
    console.error(`stderr: ${stderr}`)
    })
    } else {
    childProcess.execSync(`git clone ${gitUrl} ${filePath}`, {
    stdio: [0, 1, 2]
    })
    // Clone a given repository into the `filePath` folder.
    # Git.Clone(gitUrl, filePath).catch((err) => {
    # console.log('nodegit clone error: ', err)
    # })
    }
    ctx.body = api.ok('', '更新*.github.io成功!')
    })

使用Github的webhook完成自动部署网站
http://example.com/20201116-git-1/
作者
csorz
发布于
2020年11月16日
许可协议