likes
comments
collection
share

Go 开发自动拉取 git 的 vitepress 文档并编译部署的简单脚本

作者站长头像
站长
· 阅读数 63

Go 开发自动拉取 git 的 vitepress 文档并编译部署的简单脚本

前言

项目或产品都有文档,大多数都是 Excel / PPT 的文档居多。 不过有的时候感觉有些文档没必要写成 Excel 的,使用 Markdown 就能表达清楚。 然后再用 vitepress / hugo 之类的做成静态站点,浏览文档的效率能提高很多。 找到一个一个的 Excel ,肯定不如直接点链接出来页面来得迅速。

之前用过 vuepress ,后面研究了一阵子 hugo ,没研究明白(hugo的检索没整明白)。 然后看到有 vitepress ,于是把之前用 vuepress 整个文档迁移成用 vitepress 了。

功能

其实一开始想得很简单,就是在自己的电脑上提交了代码后,文档部署的服务器能定期拉取代码,然后编译部署即可。

即:

  • 定时拉取代码
  • 编译
  • 部署

文档的静态服务使用的是 nginx 。

相关库

简单逻辑

  1. 程序需要传递三个参数

    1. 文档的 git 仓库所在目录

      本例中 git 仓库所在目录为 F:\hello_vitepress

    2. 要部署的目录

      本例中为 F:\hello_vitepress

    3. vitepress 编译结果相对于 1 的位置

      本例中 docs\.vitepress\dist

  2. 定时任务

    下面的代码里是设置得 每3分钟执行一次,其实不需要这么频繁,开发工具时为了快速看到效果,设置成了3分钟一次。

    不同的设置可以参照官方文档。

    定时任务开始后不会立即执行一次,会在到达第一次间隔时间后执行一次,之后再按照定时的周期执行。

  3. 拉取 git

    这里使用的 go-git 说是从底层上尽可能实现了针对 git 的操作。

  4. 编译

    使用 go 的 os/exec 运行命令。 这里是使用的 yarn , 需要事前安装好 yarn 。 当然也可以根据喜好使用 npm

  5. 部署

    这里是简单地把编译好的文件直接复制到 nginx 配置文件中指向的静态资源。 下面配置内容的 location /hello 部分。

    nginx.conf

     server {
         listen       80;
         server_name  localhost;
    
         location / {
             root   html;
             index  index.html index.htm;
         }
         
         location /hello {
             alias   E:\hello_doc;
             index  index.html index.htm;
         }
         
         # ...
      }
    

运行命令

命令

> .\main.exe F:\hello_vitepress E:\hello_doc docs\.vitepress\dist

控制台输出:

> .\main.exe F:\hello_vitepress E:\hello_doc docs\.vitepress\dist
2023/04/11 13:03:35 === 定时任务(3分钟间隔) ===
2023/04/11 13:06:35 === 定时任务开始 ===
2023/04/11 13:06:35 仓库路径:F:\hello_vitepress
2023/04/11 13:06:35 部署路径:E:\hello_doc
2023/04/11 13:06:35 编译结果相对仓库路径:docs\.vitepress\dist
2023/04/11 13:06:35 定位 Git 仓库
2023/04/11 13:06:35 获取仓库工作目录
2023/04/11 13:06:35 拉取当前分支(git pull origin)
2023/04/11 13:06:35 already up-to-date
2023/04/11 13:06:35 添加前端依赖(yarn)
2023/04/11 13:07:10 编译前端(yarn build)
2023/04/11 13:07:38 编译信息
2023/04/11 13:07:38 yarn run v1.22.19
$ vitepress build docs

  vitepress v1.0.0-alpha.63

  🔎 Indexing...
  🔎 Done.
build complete in 25.49s.
Done in 27.52s.

2023/04/11 13:07:38 复制到目标目录
2023/04/11 13:07:43 === 任务完成 ===

go 代码

package main

import (
   "fmt"
   "github.com/go-git/go-git/v5"
   cp "github.com/otiai10/copy"
   "github.com/robfig/cron/v3"
   "log"
   "os"
   "os/exec"
)

func main() {
   // 创建定时任务Cron
   c := cron.New()

   // 定时任务周期及处理函数
   Info("=== 定时任务(3分钟间隔) ===")
   c.AddFunc("@every 3m", PullBuildDeploy)

   // 启动定时任务
   c.Start()

   ch := make(chan string)
   <-ch
}

func PullBuildDeploy() {
   Info("=== 定时任务开始 ===")

   s := os.Args
   pathRepo := s[1]   // F:\hello_vitepress
   pathDeploy := s[2] // E:\hello_doc
   pathBuild := s[3]  // `docs.vitepress\dist`

   log.Println(fmt.Sprintf("仓库路径:%s", pathRepo))
   log.Println(fmt.Sprintf("部署路径:%s", pathDeploy))
   log.Println(fmt.Sprintf("编译结果相对仓库路径:%s", pathBuild))

   // 定位 Git 仓库
   Info("定位 Git 仓库")
   r, err := git.PlainOpen(pathRepo)
   CheckIfError(err)

   // 获取仓库工作目录
   Info("获取仓库工作目录")
   w, err := r.Worktree()
   CheckIfError(err)

   // 拉取当前分支
   Info("拉取当前分支(git pull origin)")
   err = w.Pull(&git.PullOptions{RemoteName: "origin"})
   if err != nil {
      log.Println(err)
   }

   // 编译前端
   Info("添加前端依赖(yarn)")
   cmd := exec.Command("yarn")
   cmd.Dir = pathRepo
   out, err := cmd.Output()
   if err != nil {
      log.Println(err)
   }

   // 编译前端
   Info("编译前端(yarn build)")
   cmd = exec.Command("yarn", "build")
   cmd.Dir = pathRepo
   out, err = cmd.Output()
   if err != nil {
      log.Println(err)
   }

   Info("编译信息")
   log.Println(string(out))

   // 复制到目标目录
   Info("复制到目标目录")
   err = cp.Copy(fmt.Sprintf(`%s%s`, pathRepo, pathBuild), pathDeploy)
   if err != nil {
      log.Println(err)
   }

   Info("=== 任务完成 ===")
}

func CheckIfError(err error) {
   if err == nil {
      return
   }

   log.Printf("\x1b[31;1m%s\x1b[0m\n", fmt.Sprintf("error: %s", err))
   os.Exit(1)
}

func Info(format string, args ...interface{}) {
   log.Printf("\x1b[34;1m%s\x1b[0m\n", fmt.Sprintf(format, args...))
}

后记

本例中对于错误没有进行严谨处理,可根据实际情况自己改造。


转载自:https://juejin.cn/post/7220623225775685693
评论
请登录